Γενικές οδηγίες

Στη σειρά ασκήσεων αυτή θα συμπληρώσετε τον κώδικα Python που βρίσκεται στο αρχείο hw1.py, ως εξής:

  1. Κατεβάστε το αρχείο hw1.py στον υπολογιστή σας. (Σημειώστε τον κατάλογο όπου τοποθετήθηκε.)
  2. Μέσα από οποιονδήποτε editor για συγγραφή κώδικα (πχ, Notepad++) ανοίξτε το hw1.py (File > Open)
  3. Το αρχείο που βλέπετε περιέχει συναρτήσεις των οποίων το σώμα πρέπει να συμπληρώσετε.
  4. Συμπληρώστε τα κενά (_____) ή κώδικα σύμφωνα με τις περιγραφές που σας δίνονται σε σχόλια (ανάμεσα στα """ .... """"). Στα σχόλια κάθε συνάρτησης δίνονται παραδείγματα (doctests) για την αναμενόμενη τιμή ή παρενέργεια (side-effect) για διάφορες τιμές ορισμάτων. (Στην συμπλήρωση κενών _________ δεν μπορείτε να χρησιμοποιήσετε επιπλέον γραμμές.)
  5. Όταν τελειώσετε με τις προσθήκες σας, αποθηκεύστε τις αλλαγές (στο ίδιο αρχείο hw1.py). (Δεν χρειάζεται να συμπληρώσετε το σώμα όλων των συναρτήσεων πριν προχωρήσετε σε έλεγχο ορθότητας/δοκιμές, μπορείτε να το κάνετε για μια συνάρτηση τη φορά.)

Μπορείτε να καλέσετε τις συναρτήσεις στο hw1.py από το διαδραστικό περιβάλλον της Python ως εξής:

  1. Εκκινήστε το διαδραστικό περιβάλλον (εντολή python (Windows) ή python3 (Linux/MacOS) στη γραμμή εντολών) από τον ίδιο κατάλογο που περιέχει το hw1.py.
  2. Για να μπορείτε να καλέσετε όλες τις συναρτήσεις γράψτε (μετά τα >>>):
    >>> from hw1 import *

    Εάν θέλετε να δοκιμάσετε μόνο μια συνάρτηση, πχ., την f της Άσκησης 1, γράφετε:

    >>> from hw1 import f
  3. Δοκιμάστε αν οι συναρτήσεις έχουν σωστή συμπεριφορά, πχ.
    >>> f(-1)
    0.5

Εναλλακτικά, μπορείτε να εκτελέσετε τους αυτόματους ελέγχους για ορθότητα κώδικα (doctests)  που περιέχονται στα σχόλια αμέσως μετά τους ορισμούς συναρτήσεων.  Σε Windows από τη γραμμή εντολών γράψτε:

python -m doctest -v hw1.py

 Σε Linux/MacOS γράψτε στο shell/terminal:

python3 -m doctest -v hw1.py

Στο τερματικό σας θα εμφανιστεί αναλυτική αναφορά λαθών.

Αν εμφανιστεί μήνυμα λάθους από τον διερμηνευτή ή η συνάρτηση δεν κάνει τον σωστό υπολογισμό/παρενέργεια, επιστρέψτε στον text editor και αλλάξτε τον κώδικά σας. Έπειτα, πάλι αποθηκεύστε τις αλλαγές και δοκιμάστε τον κώδικα όπως παραπάνω, κοκ. Συνεχίστε μέχρι οι συναρτήσεις να έχουν τη συμπεριφορά που περιγράφεται στα σχόλια κάθε συνάρτησης. (Προσοχή: δεν αρκεί να δίδεται το σωστό αποτέλεσμα μόνο για τα παραδείγματα στα σχόλια! Θα πρέπει να λειτουργεί σωστά για κάθε τιμή ορισμάτων/εισόδων όπως περιγράφεται στην εκφώνηση).

Παραδίδετε τις απαντήσεις σας ανεβάζοντας στο eclass (μέσα από τον χώρο εργασιών) μόνο το τελικό hw1.py αρχείο.

Μπορείτε να παραδίνετε απαντήσεις (με τον παραπάνω τρόπο) χωρίς να έχετε συμπληρώσει το σώμα όλων των συναρτήσεων.

Σημείωση: Διαβάστε τις γενικές οδηγίες (ισχύουν για όλες τις σειρές ασκήσεων)

Άσκηση 1

Συμπληρώστε τα κενά _______ του κώδικα της συνάρτησης f ώστε η κλήση f(x) να υπολογίζει την τιμή της παράστασης 1/(2 + 3/(x+4) + 1/x) για οποιονδήποτε αριθμό x χρησιμοποιώντας μόνο εκφράσεις κλήσης, δηλ. εκφράσεις που δεν περιέχουν ενθεματικούς τελεστές (+, /, ...).

def f(x):
"""
x -- ari8mos

Epistrefei tin timi 1/(2 + 3/(x+4) + 1/x).

>>> f(-1)
0.5
>>> round(f(-2), 4)
0.3333
>>> round(f(-8), 4)
0.8889
"""
""" Xrhsimopoihste MONO ekfraseis klhshs,
p.x., stis add, mul, pow, sqrt, truediv, ...
OXI en8ematikous telestes (+, /, ...) """

return _______(______________________________)

Άσκηση 2

Συμπληρώστε τα κενά _______ του κώδικα της συνάρτησης g ώστε η κλήση g(x, y) να υπολογίζει την τιμή της έκφρασης sqrt(add(pow(add(x, y), 2), pow(sub(x, y), 2))) για οποιουσδήποτε αριθμούς x, y χρησιμοποιώντας μόνο ενθεματικούς τελεστές (+, *, /, ** κτλ.) χωρίς να περιέχονται εκφράσεις κλήσης.

def g(x, y):
"""
x,y -- ari8moi

Epistrefei timi isi me sqrt(add(pow(add(x, y), 2), pow(sub(x, y), 2)))

>>> g(1, 1)
2.0
>>> g(1.5, 1.5)
3.0
>>> round(g(3, 1), 5)
4.47214
"""

""" Xrhsimopoihste en8ematikous telestes(+, -, *, **, ...)
OXI ekfraseis klhshs """

_________________________________________

Η απάντησή σας δεν πρέπει να χρησιμοποιεί περισσότερες γραμμές από τις γραμμές που καταλαμβάνουν τα κενά ________. (Ούτε να χρησιμοποιείτε πολλαπλές εντολές ή εκφράσεις σε μια γραμμή χωριζόμενες με ; ή , )

Άσκηση 3

Συμπληρώστε τα κενά _______ του κώδικα της how ώστε η κλήση how() να εμφανίζει 1 2 3 όπως περιγράφεται στα σχόλια.

def how():
"""Symplhrwste ta kena wste na didetai to
akolou8o apotelesma

>>> how()
1 2 3
"""
x = ______
y = ______
__________

x, y, z = y, z, -x
x, y, z = y, z, -x

print(x, y, z)

Η απάντησή σας θα πρέπει να γραφεί μόνο στο χώρο που καταλαμβάνουν τα κενά __________ (ο ακριβής αριθμός τους δεν έχει σημασία.) (Όπου τα κενά καταλαμβάνουν ολόκληρη γραμμή δεν πρέπει να χρησιμοποιούνται περισσότερες γραμμές ούτε να χρησιμοποιούνται πολλαπλές εντολές ή εκφράσεις σε μια γραμμή χωριζόμενες με ; ή , ) Επίσης, δεν πρέπει να αλλάξετε τον υπόλοιπο κώδικα ή να αποφύγετε την εκτέλεση του.

Άσκηση 4

Συμπληρώστε τα κενά _______ του κώδικα της συνάρτησης func0 ώστε η τιμή της έκφρασης

func0('I') + ' ' + func0('Bi') + ' ' + 'Spider' 

να είναι η συμβολοσειρά 'Itsy Bitsy Spider'.

def func0(s):
"""Symplhrwste ta kena wste na didetai to
akolou8o apotelesma

>>> func0('I') + ' ' + func0('Bi') + ' ' + 'Spider'
'Itsy Bitsy Spider'
"""

return ___________________

Η απάντησή σας θα πρέπει να γραφεί μόνο στο χώρο που καταλαμβάνουν τα κενά __________ (ο ακριβής αριθμός τους δεν έχει σημασία.) Επίσης, δεν πρέπει να αλλάξετε τον υπόλοιπο κώδικα ή να αποφύγετε την εκτέλεση του.

Άσκηση 5

Συμπληρώστε την κενή γραμμή _______ του κώδικα της func1 ώστε οι εκφράσεις στα σχόλια να έχουν το αναγραφόμενο αποτέλεσμα.

def func1(n, c, s):
"""Symplhrwste ta kena wste:

>>> func1(1, '*', '-')
'*'
>>> func1(2, '*', '-')
'**-**'
>>> func1(3, '*', '-')
'***-***-***'
>>> func1(4, 'z', 'Z')
'zzzzZzzzzZzzzzZzzzz'
>>> func1(1, '-', '*') == '-'
True
"""
_________________________________

Η απάντησή σας δεν πρέπει να χρησιμοποιεί περισσότερες γραμμές από τις γραμμές που καταλαμβάνουν τα κενά ________. (Ούτε να χρησιμοποιείτε πολλαπλές εντολές ή εκφράσεις σε μια γραμμή χωριζόμενες με ; ή , )

Άσκηση 6

Συμπληρώστε την κενή γραμμή _______ του κώδικα της func2 ώστε οι εκφράσεις στα σχόλια να έχουν το αναγραφόμενο αποτέλεσμα.

def func2(s):
"""Symplhrwste ta kena wste na didetai to
akolou8o apotelesma

>>> func2('la')
'la-la'
>>> func2(func2('la'))
'la-la-la-la'
>>> func2(func2(func2('la')))
'la-la-la-la-la-la-la-la'
"""
_____________________________________

Η απάντησή σας δεν πρέπει να χρησιμοποιεί περισσότερες γραμμές από τις γραμμές που καταλαμβάνουν τα κενά ________. (Ούτε να χρησιμοποιείτε πολλαπλές εντολές ή εκφράσεις σε μια γραμμή χωριζόμενες με ; ή , )

Άσκηση 7

Συμπληρώστε τα κενά _______ του κώδικα της add_inputs ώστε η κλήση add_inputs() να:

  1. Ζητάει από τον χρήστη να εισάγει δύο ακέραιους αριθμούς (έναν σε κάθε γραμμή, χωρίς μήνυμα προτροπής) με κλήσεις στη συνάρτηση input.
  2. Επιστρέφει το άθροισμα των δυο αριθμών που έδωσε ο χρήστης.
def add_inputs():
"""Ypologizei to a8roisma dyo akeraiwn pou dinei o xrhsths

>>> add_inputs() #doctest: +SKIP
3
4
7
>>> print(add_inputs()) #doctest: +SKIP
9
10
19

H eisodos apo ton xristi einai oi ari8moi poy briskontai sthn 1h kai 2h
seira meta thn klisi add_inputs().
"""
return _______________________________

Η απάντησή σας δεν πρέπει να χρησιμοποιεί περισσότερες γραμμές από τις γραμμές που καταλαμβάνουν τα κενά ________. (Ούτε να χρησιμοποιείτε πολλαπλές εντολές ή εκφράσεις σε μια γραμμή χωριζόμενες με ; ή , ) Η είσοδος του χρήστη στα παραδείγματα είναι οι αριθμοί με έντονη εμφάνιση.

Άσκηση 8

Συμπληρώστε τα κενά _______ του κώδικα της parrot ώστε η κλήση parrot() να ζητάει και να επαναλαμβάνει την είσοδο του χρήστη 4 φορές, όπως θα έκανε ένας παπαγάλος που επαναλαμβάνει τις προτάσεις που ακούει. Θα πρέπει να συμπεριφέρεται όπως στο παράδειγμα που περιέχεται στα σχόλια. (Η είσοδος του χρήστη είναι με έντονη εμφάνιση. H παύλα - και το κενό που ακολουθεί δεν εισάγεται από τον χρήστη.)

def parrot():
"""Epanalambanei tin eisodo tou xristi gia 4 fores, opws
akribws sta paradeigmata:

>>> parrot() #doctest: +SKIP
- Hello
- "Hello"
- Who are you?
- "Who are you?"
- I'm losing my patience...
- "I'm losing my patience..."
- OK, forget it
- "OK, forget it"

H eisodos apo ton xristi einai i symboloseira stin 1h, 3h, 5h kai 7h
grammi meta tin klisi parrot(). H eisodos den perilambanei to - kai to
keno pou akolou8ei.
"""

print('- "' + input(______________________) + '"')

Η απάντησή σας θα πρέπει να γραφεί μόνο στο χώρο που καταλαμβάνουν τα κενά __________ (ο ακριβής αριθμός τους δεν έχει σημασία.) Επίσης, δεν πρέπει να αλλάξετε τον υπόλοιπο κώδικα ή να αποφύγετε την εκτέλεση του.

Άσκηση 9

Συμπληρώστε το σώμα της draw_number ώστε η κλήση draw_number(x) να εμφανίζει στο τερματικό x χαρακτήρες + ή x χαρακτήρες - εάν αντίστοιχα το x είναι θετικός ή αρνητικός αριθμός. Στην περίπτωση που το x είναι 0 δεν εμφανίζεται τίποτα. Η draw_number(x) επιστρέφει None.

def draw_number(x):
"""Emfanizei ton xarakthra + 'h - x fores

>>> draw_number(5)
+++++
>>> draw_number(0)
>>> draw_number(-3)
---
>>> draw_number(2) == None
++
True
"""
""" GRAPSTE TON KWDIKA SAS APO KATW """

Άσκηση 10

Αλλάξτε τον κώδικα της fix_me ώστε η κλήση fix_me() να εμφανίζει στο τερματικό ακριβώς τα ίδια αποτελέσματα χωρίς όμως να επαναλαμβάνεται παρόμοιος κώδικας. Για τον σκοπό αυτό μπορείτε να χρησιμοποιήσετε κλήσεις σε δικές σας συναρτήσεις που θα ορίσετε μετά τη fix_me.

def fix_me():
"""Alla3te ti synartisi poy apokou8ei wste na min
epanalambanetai o idios ypologismos/kwdikas polles fores.
Mporeite na xrhsimopoihsete klhseis se synarthseis poy 8a orisete
amesws meta to swma tis fix_me.

>>> fix_me()
Emvado kyklou aktinas 1 = 3.141592653589793 me perifereia = 6.283185307179586
Emvado kyklou aktinas 2 = 12.566370614359172 me perifereia = 12.566370614359172
Emvado isoskelous or8ogwniou trigwnou me ka8eti pleura 1 = 0.5 me perifereia = 3.414213562373095
Emvado isoskelous or8ogwniou trigwnou me ka8eti pleura 5 = 12.5 me perifereia = 17.071067811865476
"""
""" ALLA3TE TON PARAKATW KWDIKA """
print('Emvado kyklou aktinas', 1, '=', 3.141592653589793 * 1**2,
'me perifereia =', 2 * 3.141592653589793 * 1)
print('Emvado kyklou aktinas', 2, '=', 3.141592653589793 * 2**2,
'me perifereia =', 2 * 3.141592653589793 * 2)
print('Emvado isoskelous or8ogwniou trigwnou me ka8eti pleura', 1,
'=', 0.5 * 1 ** 2,
'me perifereia =', 2 * 1 + sqrt(2 * 1**2))
print('Emvado isoskelous or8ogwniou trigwnou me ka8eti pleura', 5,
'=', 0.5 * 5 ** 2,
'me perifereia =', 2 * 5 + sqrt(2 * 5**2))