Οδηγίες

Στη σειρά ασκήσεων αυτή θα συμπληρώσετε τον κώδικα 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 και αλλάξτε τον κώδικά σας. Έπειτα, πάλι αποθηκεύστε τις αλλαγές και δοκιμάστε τον κώδικα όπως παραπάνω, κοκ. Συνεχίστε μέχρι οι συναρτήσεις να έχουν τη συμπεριφορά που περιγράφεται στα σχόλια κάθε συνάρτησης. (Προσοχή: δεν αρκεί να δίδεται το σωστό αποτέλεσμα μόνο για τα παραδείγματα στα σχόλια! Θα πρέπει να λειτουργεί σωστά για κάθε τιμή ορισμάτων/εισόδων όπως περιγράφεται στην εκφώνηση).

 

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

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

 

Έλεγχος ορθότητας

Η βαθμολόγηση των ασκήσεων θα βασιστεί σε ελέγχους ορθότητας παρόμοιους με αυτούς που περιέχονται στο αρχείο hw1_tests.txt που βρίσκεται στα έγγραφα του eclass.

Για να εκτελέσετε τους ελέγχους από τη γραμμή εντολών των Windows δώστε:

> python -m doctest -v hw1_tests.txt

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

> python3 -m doctest -v hw1_tests.txt

(Σιγουρευτείτε ότι τρέχετε την εντολή αυτή από κατάλογο που περιέχει τόσο hw1.py όσο και το hw1_tests.py.)

 

 

Τρόπος παράδοσης

Θα παραδώσετε μόνο το τελικό αρχείο hw1.py.

  1. Οι φοιτητές που έχουν εγγραφεί στο eclass θα παραδόσουν την εργασία από εκεί.
  2. Οι φοιτητές που δεν έχουν ακόμη εγγραφεί στο eclass (πχ, δεν έχουν λογαριασμό στο ΟΠΑ) θα την παραδώσουν με email στο dimakis@aueb.gr με θέμα (subject): [2025 - ΑΣΚΗΣΗ 1] (με τις αγκύλες) που πρέπει να αναγράφεται το ονοματεπώνυμο τους στο σώμα του μηνύματος και σε σχόλιο μέσα στο 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

Συμπληρώστε το σώμα της 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 """

Άσκηση 8

Συμπληρώστε το σώμα της calculate ώστε η κλήση calculate() να ζητά δύο αριθμούς από τον χρήστη, μια αριθμητική πράξη που θα εφαρμόσει και έπειτα να εμφανίζει στο τερματικό το αποτέλεσμα της εφαρμογής της στους αριθμούς. Ο χρήστης δίνει + για πρόσθεση, - για αφαίρεση, * για πολλαπλασιασμό, / για διαίρεση και ** για ύψωση σε δύναμη (του πρώτου αριθμού στον δεύτερο).

def calculate():
"""kompiouteraki
Paradeigmata:
>>> calculate()
Give number A: 2
Give number B: 3
Give operator: +
5
>>> calculate()
Give number A: 7
Give number B: 2
Give operator: /
3.5
>>> x = calculate()
Give number A: -3
Give number B: 2
Give operator: **
9
>>> print(x)
None
"""
""" GRAPSTE TON KWDIKA SAS APO KATW """

Στα παραπάνω παραδείγματα, τα συμβολα με έντονη εμφάνιση είναι η είσοδος του χρήστη.

 

 

Άσκηση 9

Να ορίσετε συνάρτηση hailstone η οποία εμφανίζει στο τερματικό τους όρους της επονομαζόμενης «ακολουθίας του χαλαζιού» οι οποίοι δημιουργούνται ως εξής,

  1. Επιλέξτε οποιοδήποτε θετικό ακέραιο n ως αρχική τιμή.
  2. Εάν ο n είναι άρτιος, διαιρέστε τον με το 2.
  3. Εάν ο n είναι περιττός, πολλαπλασιάστε τον με το 3 και προσθέστε 1.
  4. Επαναλάβετε από το βήμα 2 έως ότου η τιμή του n γίνει 1.

και επιστρέφει το πλήθος των όρων που εμφανίστηκαν.

 

Για παράδειγμα,
>>> a = hailstone(4)
4
2
1
>>> a
3
>>> a = hailstone(10)
10
5
16
8
4
2
1
>>> a
7