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


  1. Zisti, čo vypočíta táto funkcia:

    def funkcia(n):
        sucet = 0
        for i in range(n):
            for j in range(n - i):
                sucet += j
        return sucet
    
    print(funkcia(5))
    

  1. Máme mince a bankovky s hodnotami 1, 2, 5, 10, 20, 50, 100. Napísali sme program, ktorý zisťuje, ako sa dá poskladať ľubovoľná suma peňazí minimálnym počtom kusov týchto peňazí. Použili sme len jeden for-cyklus, v ktorom bol jeden if, nejaké priradenia a tiež print. Dopíš:

    def mincovka(suma):
        for hodnota in __________________________:
    
    
    
                print(f'{n} krát hodnota {hodnota}')
    
    >>> mincovka(346)
    3 krát hodnota 100
    2 krát hodnota 20
    1 krát hodnota 5
    1 krát hodnota 1
    

  1. Čo vypíše?

    def test(post):
        vysl = tuple(post[:1])
        for prvok in post[1:]:
            vysl = (prvok,) + vysl + (prvok,)
        return vysl[:len(post)]
    
    print(test('python'))
    

  1. Napísali sme funkciu tretia_odmocnina, ktorá podobným algoritmom, ako sa počítala druhá odmocnina delením intervalu na polovicu v prednáške, vypočíta tretiu odmocninu zadaného čísla. Oprav chyby:

    def tretia_odmocnina(cislo, eps=0.001):
        od, do = 1, cislo
        x = (do - od) / 2
        while abs(x ** 3 - cislo) < eps:
            if x ** 3 < cislo:
                do = x
            else:
                od = x
            x = (do - od) / 2
        return x
    

  1. Čo nakreslí táto funkcia do grafickej plochy canvas (stačí vypísať premennú zoz)? Pomôže ti štvorcová sieť, v ktorej štvorček je 10x10.

    def kresli(prvy, druhy):
        zoz = [prvy[0], druhy[0]]
        for i in range(1, len(prvy)):
            a, b = prvy[i], druhy[i]
            for j in a, zoz[-1], a, b:
                zoz.append(j)
        canvas.create_line(zoz)
    
    kresli((30, 50, 30, 10, 20, 30), (50, 30, 10, 30, 40, 50))
    

  1. Napísali sme funkciu vloz_medzi, ktorá dostáva súbor celých čísel (v každom riadku je práve jedno číslo) a vytvorí taký, v ktorom budú tie isté čísla ale medzi každé dva riadky ešte vloží jeden so súčtom čísel v týchto dvoch riadkoch (opäť v každom riadku bude práve jedno číslo). Oprav chyby v programe:

    def vloz_medzi(meno_suboru1, meno_suboru2):
        with open('r', meno_suboru1) as file1:
            with open('w', meno_suboru2) as file2:
                cislo1 = file1.readline()
                for riadok in enumerate(file1):
                    print(cislo1, file=file2)
                    cislo2 = riadok
                    print(cislo1 + cislo2, file=file2)
                    cislo1 = ''
                print(cislo1, file=file2)
    
    • ak vstupný súbor postupne v riadkoch obsahuje hodnoty: 1, 3, 2, 1, potom výstupný bude v riadkoch obsahovať tieto čísla: 1, 4, 3, 5, 2, 3, 1 (v každom riadku práve jedno číslo)


  1. Napísali sme funkciu je_palindrom, ktorá zisťuje (vráti True alebo False), či je zadaný reťazec palindrom. Dopíš:

    def je_palindrom(retazec):
        i, j = _________________
        while ___________________________:
            i += 1
            j -= 1
        return i >= j
    
    print(je_palindrom('JeleNoviPivoNeleJ')))
    

  1. Napísali sme funkciu, v ktorej sa náhodne hádže hracou kockou (čísla od 1 do 6) dovtedy, kým nepadnú za sebou tri šestky. Funkcia vráti počet, koľkokrát sa muselo hádzať. Oprav v nej chyby:

    def tri_sestky():
        pocet = pocet6 = 0
        while pocet6 <= 0:
            hod = random.randint(1, 6)
            if hod == 6:
                pocet6 += 1
            else:
                pocet6 -= 1
            pocet += pocet6
        return pocet
    

  1. Napísali sme funkciu len_cele, ktorá z danej n-tice vyhodí všetky hodnoty, ktoré nie sú typu int. Funkcia vráti (return) túto novú n-ticu.

    def len_cele(ntica):
        vysl = ____________________
        b = True
        while b:
            b = False
            for prvok in vysl:
                if type(prvok) != int:
                    vysl.remove(_______________)
                    b = True
                    break
        return ____________________
    
    >>> len_cele((0, 1, 2., '0', 1, (2, 2)))
    (0, 1, 1)
    

  1. Napísali sme funkciu prerob, ktorá z daného celého čísla vyrobí reťazec, ale tak, že cifry zoskupí do trojíc (sprava) a oddelí podčiarkovníkom. Využili sme funkciu join, preto sme z čísla najprv vyrobili zoznam trojznakových reťazcov. Doplň kód.

    def prerob(cislo):
        cislo = str(cislo)
        vysl = []
        j = len(cislo)
        while ____________:
            i = max(____________________)
            vysl.insert(_______________________)
            j -= 3
        return '_'.join(vysl)
    
    >>> prerob(12345678)
    '12_345_678'