Záverečný test z Programovania (1) 2019/2020


  1. Pre danú rekurzívnu funkciu pocet(pole1, pole2):

    def pocet(pole1, pole2):
        if len(pole2) == 0:
            return 0
        if len(pole2) == 1:
            return pole1.count(pole2)
        stred = len(pole2) // 2
        return pocet(pole1, pole2[:stred]) + pocet(pole1, pole2[stred:])
    

    zisti výsledok volania:

    >>> pocet('a m', 'mama ma emu')
    

  1. Zmenili sme metódu fd() pre korytnačku:

    class MojaTurtle(turtle.Turtle):
        def fd(self, d):
            if d <= 10:
                super().fd(d)
            else:
                self.fd(d // 2 - 5)
                self.pu()
                self.fd(10)
                self.pd()
                self.fd(d - d // 2 - 5)
    

    Zisti, aká je prejdená dĺžka čiar so spusteným perom pre tieto volania:

    1. MojaTurtle().fd(30)

    2. MojaTurtle().fd(40)

    3. MojaTurtle().fd(50)

    Uvedom si, že táto funkcia je rekurzívna.


  1. Máme zadefinovať funkciu ocisluj(tab), ktorá zmení všetky prvky dvojrozmernej tabuľky tak, že ich postupne prechádza po stĺpcoch a čísluje ich celými číslami od 0, pritom riadky tabuľky nemusia mať rovnakú dĺžku, napríklad:

    >>> ab = [[1, 1], [1, 1, 1], [1], [1, 1, 1, 1]]
    >>> ocisluj(ab)
    >>> ab
    [[0, 4], [1, 5, 7], [2], [3, 6, 8, 9]]
    

    Dopíš chýbajúce časti funkcie:

    def ocisluj(tab):
        m = 0
        for r in tab:
            m = ___________________________
        poc = 0
        for j in range(m):
            for i in range(len(tab)):
                if ____________________________:
                    tab[i][j] = poc
                    poc += 1
    

  1. Napíš funkciu pocet_riadkov(meno_suboru), ktorá vráti počet riadkov zadaného súboru. Ak daný súbor neexistuje (nepodaril sa open()), funkcia vráti -1. Po skončení funkcie by mal byť súbor korektne zatvorený:

    def pocet_riadkov(meno_suboru):
    
    
    
    
    
        return ...
    

  1. Funkcia zisti() pracuje so slovníkom (asociatívnym poľom):

    def zisti(zoznam):
        slovnik, neviem = {}, None
        for prvok in zoznam:
            slovnik[prvok] = slovnik.get(prvok, 0) + 1
            if neviem is None or slovnik[prvok] > slovnik[neviem]:
                neviem = prvok
        return neviem
    

    Zisti, čo sa vypíše pre volania:

    print(zisti([1,2,3,4,5,4,3,2,3,2,4,6,4]))
    print(zisti(list('programujem v pythone')))
    

  1. V triede Mnozina je 5 chýb. Oprav ich! Neopravuj kód, ktorý nie je chybný.

    class Mnozina:
        def __init__(self):
            self.zoznam = []
    
        def __repr__(self):
            print(tuple(sorted(self.zoznam)))
    
        def add(self, cislo):
            if cislo in self:
                self.zoznam.append(cislo)
    
        def discard(self, cislo):
            if cislo in self:
                self.zoznam.pop(cislo)
    
        def __contains__(self, cislo):
            return self.zoznam.index(cislo) >= 0
    
        def __len__(self):
            return len(self.zoznam)
    
        def zjednotenie(self, ina):
            for i in ina.zoznam:
                self.append(i)
    

  1. Máme zadefinovať triedu Stvorec, pomocou ktorej sa budú reprezentovať štvorce. Pri štvorcoch nás budú zaujímať len strana, uhlopriečka, obsah a obvod. Trieda bude používať jediný (inštančný) atribút uh a ako konštantu pre druhú odmocninu z 2 použi triedny atribút odmoc2. Dopíš len vyznačené časti:

    class Stvorec:
        odmoc2 = math.sqrt(2)
    
        def __init__(self, strana):
            self.uh = ____________________
    
        def __str__(self):                           # vráti stvorec(strana)
            return f'Stvorec({________________})'
    
        def obsah(self):
            return _____________________
    
        def obvod(self):
            return ________________________
    
        def strana(self):
            return ________________________
    
        def uhlopriecka(self):
            return self.uh
    
        def kopia(self):
            return ________________________
    

  1. Máme takto definovanú triedu Body. Zisti, čo sa vypíše:

    class Body:
        def __init__(self):
            self.body = ''
    
        def pridaj(self):
            self.body += 'a'
            return self
    
        def uber(self):
            self.body += 'b'
            return self
    
        def kolko(self):
            print(self.body.count('a') - self.body.count('b'))
            return self
    
    b = Body().pridaj().pridaj().uber().uber().kolko().uber().pridaj().kolko()
    print(b.body)
    

  1. Funkcia:

    def pocitaj(a=0, b=0, c=0, d=0, e=0, f=0):
        return a - b + c - d + e - f
    

    funguje pre 0 až maximálne 6 parametrov (postupne k výsledku pripočítava a odpočítava číselné parametre). Prerob túto funkciu tak, aby mohla mať ľubovoľný počet parametrov. Napríklad:

    >>> pocitaj(17, 15, 13, 11, 9, 7, 5, 3, 1)
    9
    

    Zapíš:

    def pocitaj(___________________________):
    
    
    
        return ...
    

  1. Dopíš funkciu vyrob(n), ktorá vyrobí dvojrozmernú tabuľku veľkosti n x n, pričom všetky prvky sú očíslované po stĺpcoch od 1 do n*n. Napríklad:

    >>> vyrob(3)
    [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
    

    Zapíš to pomocou generátorovej notácie:

    def vyrob(n):
        return _______________________________