Záverečný test z Programovania (1) 2014/2015

  1. Zadefinujte rekurzívnu funkciu mocnina(n,k), ktorá vypočíta n**k pre celé nezáporné k len pomocou násobenia a umocňovania na 2 (čo je opäť len násobením so samým sebou):

    • mocnina(n, 0) = 1

    • mocnina(n, k) = mocnina(n, k//2) ** 2 … pre párne k

    • mocnina(n, k) = mocnina(n, k-1) * n … pre nepárne k

    def mocnina(n, k):
    
    
    
        ...
    
  2. Zistite, koľko hviezdičiek sa vypíše pre volania rekurzia(10) a rekurzia(13)?

    def rekurzia(n):
        if n < 2:
            print('*')
        else:
            rekurzia(n-1)
            rekurzia(n-2)
    
  3. V triede Kniha si ukladáme informácie o knihách:

    class Kniha:
        def __init__(self, autor, titul, cena):
            self.zoznam = [autor, titul, cena]
    
        def autor(self, zmen=None):
    
    
            ...
    

    Dopíšte metódu autor() tak, aby volanie bez parametrov vrátilo autora knihy a volanie s jedným parametrom zmenilo autora, napr.

    >>> k = Kniha('Doyle', 'Sherlock Holmes', 11.5)
    >>> k.autor()
    'Doyle'
    >>> k.autor('sir Arthur Conan Doyle')
    >>> k.zoznam
    ['sir Arthur Conan Doyle', 'Sherlock Holmes', 11.5]
    
  4. V triede Kniha si ukladáme informácie o knihách:

    class Kniha:
        def __init__(self, autor, titul, cena):
            self.zoznam = [autor, titul, cena]
    
        def __getitem__(self, co):
            ________________
            return ________________
    
        def __setitem__(self, co, zmen):
            ________________
            ____________________ = zmen
    

    Dopíšte metódy __getitem__() a __setitem__() tak, aby pre parameter co, ktorý je jeden z reťazcov 'autor', 'titul' alebo 'cena', fungovalo:

    >>> k = Kniha('Doyle', 'Sherlock Holmes', 11.5)
    >>> k['titul']
    'Sherlock Holmes'
    >>> k['cena'] = 8.1
    >>> k.zoznam
    ['Doyle', 'Sherlock Holmes', 8.1]
    
  5. Dopíšte funkciu vyrob(dlzky), ktorá vytvorí dvojrozmernú tabuľku celých čísel tak, že ak parameter dlzky je zoznam celých čísel, tak tieto označujú dĺžky riadkov vytváranej dvojrozmernej tabuľky (zoznam zoznamov). Počet prvkov zoznamu dlzky označuje počet riadkov vytváranej tabuľky. Prvky vytváranej tabuľky pritom postupne zaplňte hodnotami od 1.

    def vyrob(dlzky):
        tab = []
        _______________
        for d in dlzky:
            _______________
            _______________
        return tab
    
    >>> zoz = vyrob([3, 2, 4])
    >>> vypis(zoz)
    1 2 3
    4 5
    6 7 8 9
    

    Funkciu vypis() neprogramujte. Pri dopisovaní kódu do funkcie nemusíte dodržať naznačený počet riadkov programu.

  6. Textový súbor 'subor.txt' v každom riadku obsahuje niekoľko slov oddelených medzerami. Nasledovná funkcia by mala vytvoriť dvojrozmernú tabuľku znakových reťazcov, ktorá bude v každom riadku obsahovať ako prvky slová z príslušného riadku súboru:

    def urob(meno):
        with open(meno) as subor:
            vysledok = []
            while subor:
                riadok = subor.read()
                if riadok:
                    return vysledok
                riadok = riadok.strip()
                riadok.append(vysledok)
    

    Opravte všetky chyby.

  7. Dané sú dva zoznamy zoz1 a zoz2, ktoré majú rovnaký počet prvkov. Vytvorte funkciu, ktorá z takýchto dvoch zoznamov vytvorí a vráti nový slovník (asociatívne pole). V tomto slovníku sú kľúčmi prvky z prvého zoznamu a hodnotami sú príslušné prvky druhého zoznamu:

    def urob(zoz1, zoz2):
    
    
    
    >>> a = urob(['druh', 'vaha', 'vek'], ['slon', 1000, 10])
    >>> a
    {'druh': 'slon', 'vek': 10, 'vaha': 1000}
    
  8. Vytvorili sme zoznam informácií (slovníkov, teda asociatívnych polí) o zvieratách v zoo, napr.:

    zoo = [{'druh':'slon', 'meno':'Bimbo'}, {'druh':'opica', 'meno':'Milica'}, ...]
    

    Napíšte funkciu vsetky_mena(zoo), ktorá vráti množinu všetkých mien zvierat v zoo:

    def vsetky_mena(zoo):
    
    
        ...
    
  9. Zistite, čo sa vypíše:

    >>> zoz1 = [3, 'sedem', 3.14]
    >>> zoz2 = ['dog', 'cat', 'mouse', 'duck']
    >>> zoz3 = {'sedem': [3]*3, 3.14: zoz2, 'cat': zoz1}
    >>> zoz3[zoz3[zoz2[1]][2]][2]
    
  10. Dopíšte funkciu urob(m1, m2, m3), ktorá dostáva ako parametre 3 množiny. Výsledkom funkcie bude nová množina, ktorá obsahuje všetky také prvky, ktoré nie sú v m1, ale sú buď v m2 alebo v m3 (ale nie naraz v oboch).

    def urob(m1, m2, m3):
        mnozina = _______________
        _________________
        _________________
        return mnozina
    

    Pri dopisovaní kódu do funkcie nemusíte dodržať naznačený počet riadkov programu. Použitie, napr.

    >>> urob({1,3,5,7}, {1,2,3,4,5}, {4,5,6,7})
    {2, 6}
    >>> urob(set(),{1,2,3,4,5},{4,5,6,7})
    {1, 2, 3, 6, 7}