Záverečný test z Programovania (1) 2016/2017

  1. Čo presne vypíše tento program?

    def rek(n):
        vysl = 1
        for i in range(1, n):
            vysl += rek(i)
        return vysl
    
    for i in range(6):
        print(i, rek(i))
    
  2. 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)
    

    Zistite, 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)

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

  3. Zistite, čo vráti táto funkcia:

    def test(zoznam):
        vysl, n = 0, len(zoznam)
        for i in range(n):
            for j in range(n):
                vysl += abs(zoznam[i][j] - zoznam[j][i])
        return vysl
    

    pre volanie:

    >>> test([[1, 2, 3], [2, 1, 0], [3, 2, 1]])
    
  4. Zadefinovali sme triedu Zoznam, pomocou ktorej si vieme udržiavať zoznam svojich záväzkov. Trieda obsahuje tieto metódy:

    • pridaj(prvok), ak sa tam takýto záväzok ešte nenachádza, pridá ho na koniec

    • vyhod(prvok), ak sa tam takýto záväzok nachádzal, vyhodí ho

    • __contains__(prvok) vráti True alebo False podľa toho, či sa tam tento záväzok nachádzal

    • vypis() vypíše všetky záväzky v tvare záväzok, záväzok, záväzok

    Opravte všetky chyby (to, čo nie je chyba, neopravujte):

    class Zoznam:
        zoz = []
        def pridaj(self, prvok):
            if prvok in self:
                zoz.insert(prvok)
    
        def vypis(self):
            print(*self.zoz, sep=', ')
    
        def __contains__(self, prvok):
            return prvok in zoz
    
        def vyhod(self, prvok):
            if prvok not in self:
                zoz.delete(prvok)
    
  5. V utriedenom zozname máme tieto hodnoty:

    zoz = [10, 25, 30, 32, 43, 45, 51, 53, 58, 59, 63, 65, 70, 81, 82]
    

    Pomocou algoritmu binárneho vyhľadávania zisťujeme, či sa v ňom nachádza nejaká hodnota. Do základného cyklu algoritmu sme vložili príkaz na vypísanie indexu aj hodnoty stredného prvku v hľadanom úseku:

    def hladaj(hodnota):
        zac, kon = 0, len(zoz)-1
        while zac <= kon:
            stred = (zac + kon) // 2
            print(stred, zoz[stred])            # pridali sme vypis
            if zoz[stred] < hodnota:
                zac = stred + 1
            elif zoz[stred] > hodnota:
                kon = stred - 1
            else:
                return True
        return False
    
    1. Vypíšte všetky tieto dvojice stredný index a hodnota, keď budeme hľadať číslo 63, t.j. volanie hladaj(63).

    2. Vypíšte tieto dvojice pre hľadanú hodnotu 15, t.j. volanie hladaj(15).

  6. Napíšte 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.

    def pocet_riadkov(meno_suboru):
    
    
    
         ...
    
  7. Napíšte funkciu farba(retazec), ktorá z daného reťazca - mena farby v slovenčine vráti správny názov farby pre tkinter. Ak danú farbu nerozpozná, vráti farbu 'pink'. Funkcia by mala akceptovať tieto slovenské mená farieb: 'biela', 'cervena', 'modra', 'zlta', 'zelena' . Vo funkcii nepoužite príkaz ``if.

    def farba(retazec):
    
    
        return ...
    
  8. Mali sme napísať funkciu viac(zoz), ktorá vráti množinu tých prvkov zoznamu zoz, ktoré sa v ňom vyskytujú viac ako raz. Napr.

    >>> viac(['prvy', 2, (3, 4), 'dva', 3, 4, 'prvy', 3])
    {'prvy', 3}
    

    Lenže v našom programe, je niekoľko chýb. Opravte ich. Nepridávajte nové príkazy.

    def viac(zoz):
        mnozina1, mnozina2 = {}, {}
        for prvok1 in zoz:
            for prvok2 in mnozina1:
                if prvok1 == prvok2:
                    mnozina2.add(prvok2)
                else:
                    mnozina1.add(prvok1)
         return mnozina1
    
  9. Funkcia:

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

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

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

    Zapíšte:

    def pocitaj(.....................):
    
        return ...
    
  10. Zapíšte funkciu vyber(), ktorá dostáva dva parametre: nejakú postupnosť hodnôt a postupnosť indexov. Funkcia vráti zoznam hodnôt (z prvého parametra), ktoré sú na príslušných indexoch (druhého parametra). Funkciu zapíšte generátorovou notáciou:

    def vyber(postupnost, indexy):
    
        return ...
    

    Napr.

    >>> vyber('python', (1, 3, 5, 4, 2, 0))
    ['y', 'h', 'n', 'o', 't', 'p']
    >>> vyber([11, 12, 13, 14], (2, 1, 2, 0, 1, 0, 0, 1))
    [13, 12, 13, 11, 12, 11, 11, 12]