Στην άσκηση αυτή θα συμπληρώσετε τον κώδικα Python που βρίσκεται στο αρχείο hw2.py, ακολουθώντας τις ίδιες οδηγίες (δείτε και εδώ) με αυτές που δόθηκαν στη Σειρά Ασκήσεων 1.

Στην αρχή του hw2.py δίνεται ο ορισμός της συνάρτησης sum_sequence την οποία μπορείτε να χρησιμοποιείτε σε εκφράσεις κλήσης στις απαντήσεις σας (χωρίς όμως να την αλλάξετε).

def sum_sequence(n, term):
    """A8roisma arxikwn orwn akolou8ias                             
                                                                    
    n -- deikths teleutaiou orou (deikths prwtou = 1)               
    term -- synarthsh: term(i) einai o i-ostos oros                 

    Epistrefei tin timi term(1) + term(2) + ... + term(n).          
    """
    i, sum = 2, term(1)
    while i <= n:
        sum += term(i)
        i += 1
    return sum

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

Θα παραδώσετε το αρχείο hw2.py.

  1. Οι φοιτητές που έχουν εγγραφεί στο eclass θα παραδόσουν την εργασία από εκεί.
  2. Οι φοιτητές που δεν έχουν εγγραφεί στο eclass θα την παραδώσουν με email στο dimakis@aueb.gr με θέμα (subject): [2024 - ΑΣΚΗΣΗ 2] (με τις αγκύλες) που επίσης περιέχει το ονοματεπώνυμο τους στο σώμα του μηνύματος και σε σχόλιο μέσα στο hw2.py.

Άσκηση 1

Συμπληρώστε τα κενά _______ του κώδικα ώστε η digit_sum(x) να επιστρέφει το άθροισμα των ψηφίων του x. (Υπόδειξη: η έκφραση x % 10 είναι ίση με το δεξιότερο ψηφίο του x, ενώ η x // 10 μετακινεί τα ψηφία του x κατά μια θέση προς τα δεξιά.)

def digit_sum(x):
"""Ypologizei to a8roisma twn (dekadikwn) pshfiwn tou x

x -- 8etikos akeraios

>>> digit_sum(10000)
1
>>> digit_sum(615)
12
>>> digit_sum(23) == 5
True
"""
s = ________
while ________:
s = __________
x = __________

return ________

Άσκηση 2

Συμπληρώστε τον κώδικα της count_digit ώστε η κλήση count_digit(x, i) να επιστρέφει το πλήθος εμφανίσεων του ψηφίου του x που βρίσκεται στην i-οστή θέση (απο δεξιά).

def count_digit(x, i):
"""Ypologizei to plh8os twn emfanisewn enos pshfiou

x -- 8etikos akeraios
i -- pshfio (1 = 1o pshfio apo dexia, 2 = 2o apo dexia, ktl.)

>>> count_digit(1000, 1)
3
>>> count_digit(12944342, 2)
3
>>> count_digit(121,1) == 2
True
"""
""" GRAPSTE TON KWDIKA SAS APO KATW """

Άσκηση 3

Συμπληρώστε τα κενά _______ του κώδικα ώστε η paei_pi(n) να επιστρέφει το άθροισμα των n πρώτων όρων της ακολουθίας 4, -4/3, 4/5, -4/7, 4/9, -4/11, 4/13,... κτλ.

def paei_pi(n):
    """A8roisma n orwn tis akoloy8ias
              4, -4/3, 4/5, -4/7, 4/9, -4/11, 4/13, ... ktl.

    n -- 8etikos akeraios >= 1

    Epistrefei to a8roisma twn orwn 1 ews kai n.

    Paradeigmata:
    >>> paei_pi(1)
    4.0
    >>> paei_pi(2)
    2.666666666666667
    >>> paei_pi(3)
    3.466666666666667
    >>> paei_pi(1000)
    3.140592653839794
    >>> paei_pi(10000)
    3.1414926535900345
    """
    def _____________(____):
        return _____________________

    return sum_sequence(________, _________)

Άσκηση 4

Συμπληρώστε τα κενά ______ στο σώμα της συνάρτησης stars_horizontal ώστε η κλήση stars_horizontal(n) να επιστρέφει string με n χαρακτήρες '*' (αστεράκια).

Σημειώστε ότι οι δύο γραμμές κενών _____ πριν την return είναι ενδεικτικές και μπορείτε να χρησιμοποιήσετε όσες γραμμές θέλετε.

def stars_horizontal(n):
    """String asteriwn topo8etimena orizontiws.

    n -- akeraios >= 1

    Epistrefei string me n xaraktires '*'.

    Paradeigmata:
>>> stars_horizontal(1)
'*'
    >>> stars_horizontal(5)
    '*****'
    >>> print(stars_horizontal(5))
    *****
    """
    _________________ # mporeite na xrhsimopoihsete perissoteres 'h ligoteres grammes
    _________________
   
return sum_sequence(_________ , __________)

Άσκηση 5

Συμπληρώστε τον κώδικα της reverse_args ώστε η κλήση reverse_args(f), όπου f συνάρτηση δύο ορισμάτων, να επιστρέφει συνάρτηση που κάνει τον ίδιο υπολογισμό με την f όπου δέχεται τα ορίσματα σε αντίστροφη σειρά, δηλ., f(x, y) έχει την ίδια τιμή με τη reverse_args(f) (y, x).

def reverse_args(f):
""" Antistrefei ta orismata.

-- f synartisi 2 orismatwn

Epistrefei synartisi g opou i klisi g(x, y) exei idia timi me tin f(y, x).

Paradeigmata:
>>> pow(2, 3)
8
>>> pow(3, 2)
9
>>> wop = reverse_args(pow)
>>> wop(2, 3)
9
>>> wop(3, 2)
8
"""
""" GRAPSTE TON KWDIKA SAS APO KATW """

Άσκηση 6

Σε αυτή την άσκηση θα εξασκηθείτε στο να αποφεύγετε να ξαναγράφετε παρόμοιο κώδικα χρησιμοποιώντας τεχνικές από το μάθημα όπως ορισμό φωλιασμένων συναρτήσεων, συναρτήσεις υψηλότερου επιπέδου, εντολές επανάληψης. Συμπληρώστε το σώμα της συνάρτησης askisi6 ώστε να παράγει ό,τι ακριβώς εμφανίζεται στα σχόλια.

Ιδανικά το πρόγραμμά σας πρέπει να περιέχει μια το πολύ εντολή επανάληψης. (Κάθε κλήση της print θα πρέπει να εμφανίζει μια μόνο γραμμή.)

Μπορεί να βρείτε χρήσιμη την ενσωματωμένη συνάρτηση str η οποία επιστρέφει τιμές ως string, πχ. η str(9) επιστρέφει '9', η τιμή της str(-3.4) είναι '-3.4'.

def askisi6():
    """Ypologismoi gewmetrikwn sximatwn.

    >>> askisi6()
    Perifereies kyklwn me aktina 1 ews 10
    6.283185307179586
    12.566370614359172
    18.84955592153876
    25.132741228718345
    31.41592653589793
    37.69911184307752
    43.982297150257104
    50.26548245743669
    56.548667764616276
    62.83185307179586
    Emvada tetragwnwn me pleura 1 ews 8
    1
    4
    9
    16
    25
    36  
    49
    64
    Emvado kyklou aktinas 1 = 3.141592653589793
    Emvado kyklou aktinas 2 = 12.566370614359172
    Emvado kyklou aktinas 3 = 28.274333882308138
    Emvado kyklou aktinas 4 = 50.26548245743669
    Emvado kyklou aktinas 5 = 78.53981633974483
    """
    """ GRAPSTE TON KWDIKA SAS APO KATW, APOFEYGONTAS
    TIN EPANALIPSI PAROMOIWN ENTOLWN """

Άσκηση 7

Συμπληρώστε τα κενά _______ στη συνάρτηση make_quadratic ώστε η κλήση make_quadratic(a, b, c) να επιστρέφει τετραγωνική συνάρτηση f(x)=ax2+bx+c (ως συνάρτηση του x). 

Συνεπώς, με την εντολή f = make_quadratic(1,2,3) η f(x) έχει τιμή ίση με x2+2x+3.

def make_quadratic(a, b, c):
  """Polywnymo 2ou ba8mou.

    a, b, c -- ari8moi

    Epistrefei thn tetragwnikh synarthsh f(x) = a*x*x+b*x+c. 

    Paradeigmata:
    >>> f = make_quadratic(1.0, 2.0, 1.0)
    >>> f(0)
    1.0
    >>> f(-1)
    0.0
    >>> f(1)
    4.0
    >>> f(1.5)
    6.25
    """
    return ___________________

Άσκηση 8

Συμπληρώστε τo σώμα της συνάρτησης abacize ώστε να επιστρέφει τελεστές που εφαρμόζονται και αποτιμώνται σε χάντρες όπως σε ένα αριθμητήρι (άβακας). Για παράδειγμα η abacize(add) επιστρέφει την εκδοχή άβακα του τελεστή της πρόσθεσης (add), οπότε η κλήση add(1, 2) χρησιμοποιώντας την εκδοχή άβακα της add θα μπορούσε να γίνει ως εξής:

>>> from operator import add
>>> f = abacize(add)
>>> f('o', 'oo')
'ooo'

Το όρισμα της abacize μπορεί να είναι οποιαδήποτε αριθμητική συνάρτηση δύο αριθμών, πχ. add, sub, mul, max. Η συνάρτηση που επιστρέφει η abacize δέχεται ως όρισμα δύο string αποτελούμενα από χαρακτήρες 'o' οι οποίοι αναπαριστούν τις χάντρες σε ένα άβακα. Το πλήθος των χαρακτήρων 'o' είναι ο αριθμός χαντρών που θέλουμε να χρησιμοποιήσουμε, δηλ., 'o' αντιστοιχεί σε 1, 'oo' σε 2, 'ooo' σε 3 κτλ. (Η ενσωματωμένη συνάρτηση len δίνει το πλήθος των χαρακτήρων που περιέχει ένα string, πχ., η len('oooo') επιστρέφει 4.

def abacize(op):
    """Ekdoxh abaka (ari8mhthri) enos telesti.

    op -- synartisi dyo akeraiwn orismatw pou epistrefei akeraia timi

    Epistrefetai nea synartisi pou dexetai ta
    ari8mitika orismata tis op kai epistrefei ta apotelesma tis
    xrhsimopoiwntas anaparastasi me xandres ari8mitiriou.  

    Paradeigmata:
    >>> from operator import *
    >>> baby_add = abacize(add)
    >>> baby_add('o', 'o')
    'oo'
    >>> baby_add('oo', 'ooo')
    'ooooo'
    >>> baby_mul = abacize(mul)
    >>> baby_mul('oo', 'ooo')
    'oooooo'
    >>> abacize(max)('oo', 'ooo')
    'ooo'
    >>> abacize(pow)('oo', 'ooo')
    'oooooooo'
    """
    """ GRAPSTE TON KWDIKA SAS APO KATW """

Άσκηση 9

Στην άσκηση αυτή θα εξασκηθείτε στην υλοποίηση αναδρομικών υπολογισμών.

Συμπληρώστε τα κενά ________ στο σώμα της συνάρτησης sum_squares ώστε να επιστρέφει το άθροισμα των τετραγώνων των αριθμών 1 έως n, δηλ., την τιμή της έκφρασης 12+22+32+...+n2.

Αν και υπάρχει αριθμητική έκφραση που δίνει απευθείας τον ζητούμενο υπολογισμό, θα πρέπει η υλοποίηση να γίνει με αναδρομικό υπολογισμό χωρίς να χρησιμοποιηθούν εντολές επανάληψης όπως while και for.

def sum_squares(n):
    """A8roisma tetragwnwn.

   
n -- 8etikos akeraios >= 1

    Epistrefei tin timi 1 + 2*2 + 3*3 + ... + n*n.

   
Paradeigmata:
    >>> sum_squares(1)
    1
    >>> sum_squares(2)
    5
    >>> sum_squares(100)
    338350
    """
    """PREPEI NA LEITOYRGEI ANADROMIKA, XWRIS ENTOLES
    EPANALHPSHS OPWS while, for.
    """
    if __________:
        return ___________
    else:
        return _______________________

Άσκηση 10

Στην άσκηση αυτή θα εξασκηθείτε στην υλοποίηση αναδρομικών υπολογισμών.

Συμπληρώστε το σώμα της print_digits ώστε η κλήση print_digits(x) να εμφανίζει τα ψηφία του θετικού ακέραιου x ένα ένα σε μια γραμμή το κάθε ένα, αρχίζοντας από το πιο σημαντικό (αριστερότερο) ψηφίο.

Η υλοποίηση πρέπει να γίνει με αναδρομικό υπολογισμό χωρίς να χρησιμοποιηθούν εντολές επανάληψης όπως while και for.  

def print_digits(x):
    """Emfanizei ta pshfia ari8mou.

   
x -- 8etikos akeraios >= 0

    Emfanizei ena ena ta pshfia tou x arxizontas
    apo to pio simantiko pshfio.

    Paradeigmata:
    >>> print_digits(0)
    0
    >>> print_digits(2019)
    2
    0
    1
    9
    >>> print_digits(923884)
    9
    2
    3
    8
    8
    4
    """
    """ GRAPSTE TON KWDIKA SAS APO KATW """
    """PREPEI NA LEITOYRGEI ANADROMIKA, XWRIS ENTOLES
    EPANALHPSHS OPWS while, for.
    """