Priebežný test z Programovania (1) 2017/2018

  1. Zistite, aký je výsledok volania co_pocita(1111).

    def co_pocita(cislo2):
        cislo1 = 0
        while cislo2 > 0:
            if cislo2 % 2 == 0:
                cislo2 //= 2
            else:
                cislo2 -= 1
            cislo1 += 1
        return cislo1
    

  1. Funkcia rozklad(cislo) zistí rozklad daného čísla na prvočinitele a vráti ho ako znakový reťazec v tvare, napr. '24 = 2 * 2 * 2 * 3'. Doplňte chýbajúce časti programu. Využite metódu join(). Premenná pole je typu tuple.

    def rozklad(cislo):
        pole = ( _____________________ )
        delitel = 2
        while cislo >= delitel:
            if cislo % delitel == 0:
                pole += ( _____________________ )
                cislo //= delitel
            else:
                delitel += 1
        return ________________________________________
    

  1. Zistite, s akým najväčším n sme mohli zavolať funkciu najdi_najvacsie(n), aby nám vrátila hodnotu 144.

    def najdi_najvacsie(n):
        a, b = 0, 1
        while b <= n:
            a, b = b, a + b
        return a
    

  1. Zistite, koľko riadkov vypíše volanie urob('sova'). Tiež vypíšte prvých 6 riadkov.

    def urob(slovo):
        for a in slovo:
            for b in slovo:
                if a != b:
                    for c in slovo:
                        if c not in (a + b):
                            for d in slovo:
                                if d not in (a + b + c):
                                    print(a + b + c + d)
    

  1. Dopíšte telo while-cyklu vo funkcii prerob() tak, aby fungovalo volanie kresli(prerob([...])). Predpokladajte, že vstupom je taký zoznam, v ktorom 3 za sebou idúce prvky označujú x-ovú a y-ovú súradnicu a farbu. V premennej canvas je priradená referencia na grafickú plochu.

    def prerob(pole):
        vysl = []
        while pole:
    
    
    
        return vysl
    
    def kresli(pole):
        for xy, farba in pole:
            canvas.create_text(xy, text='ABC', fill=farba)
    
    kresli(prerob([300,200,'red',100,150,'blue',50,50,'green']))
    

  1. Pôvodne mala funkcia zdvoj(zoznam) každý prvok zdvojiť, teda vybrať a vložiť ho na koniec dvakrát.

    def zdvoj(zoznam):
        for i in range(len(zoznam)):
            h = zoznam.pop(i)
            zoznam.append(h)
            zoznam.append(h)
    

    Hoci to nerobí to, čo bolo treba, dostali sme zaujímavý výsledok. Zistite, čo vypíše:

    a = list(range(1, 5))
    zdvoj(a)
    print(a)
    b = list('kocur')
    zdvoj(b)
    print(''.join(b))
    

  1. Máme danú funkciu zluc():

    def zluc(zoz1, zoz2):
        vysl = []
        i = j = 0
        while i+j < len(zoz1) + len(zoz2):
            if j >= len(zoz2) or i < len(zoz1) and zoz1[i]<zoz2[j]:
                vysl.append(zoz1[i])
                i += 1
            else:
                vysl.append(zoz2[j])
                j += 1
        return vysl
    

    Akú hodnotu mala postupnosť b, ak po zavolaní zluc() sme dostali takýto výsledok?

    >>> a = (3, 8, 8, 11, 16)
    >>> b = (________________________________)
    >>> zluc(a, b)
    [1, 3, 4, 7, 8, 8, 9, 11, 11, 15, 16]
    

  1. Nasledovný program vypíše počet riadkov a dĺžku najdlhšieho riadka daného súboru (aj s koncovým '\n'). Súbor sa pritom číta po jednom znaku. Opravte všetky chyby.

    def zisti(meno_suboru):
        with open(meno_suboru, 'a') as subor:
            pr, naj, r = 0
            znak = subor.read(1)
            while znak > 0:
                r += 1
                if znak == '\n':
                    naj = max(naj, r)
                    pr += 1
    
        print('pocet riadkov suboru: {pr}')
        print('najdlhsi ma {naj} znakov')
    

    Pritom očakávame takýto výstup:

    >>> zisti('text2.txt')
    pocet riadkov suboru: 13
    najdlhsi ma 40 znakov
    

  1. Naprogramovali sme takéto zašifrovanie textu: celý text sa rozdelí na dvojice znakov a v každej sa navzájom oba znaky vymenia, teda prvý s druhým, tretí so štvrtým, piaty so šiestym, atď. Ak je nepárny počet znakov, tak posledný znak sa nevymieňa. Doplňte chýbajúce časti.

    def sifra2(text):
        zoz = list(text)
        for i in ________________:
            zoz[i:i+2] = __________________
        return ________________________
    

    Malo by fungovať:

    >>> sifra2('programujem')
    rpgoarumejm
    >>> sifra2('rpgoarumejm')
    programujem
    

  1. Funkcia indexy(zoznam, hodnota) pre zadaný zoznam vráti postupnosť indexov, na ktorých sa zadaná hodnota v danom zozname vyskytuje. Opravte v programe práve 2 chyby.

    def indexy(zoznam, hodnota):
        vysl = ()
        i = 0
        while hodnota in zoznam[i:]:
            vysl += (zoznam[i:].index(hodnota), )
            i = vysl[-1]
        return vysl
    

    Napr. vráti

    >>> indexy([7, 77, 7, (7, 7), 7], 7)
    (0, 2, 4)