Priebežný test z Programovania (1) 2014/2015

  1. Zistite, čo vypíše tento program:

    def urob(hodnota):
        prem1, prem2 = 0, 0
        while hodnota > 0:
            if hodnota % 2 == 0:
                prem1 += 1
            else:
                prem2 -= 1
            hodnota //= 2
        print(prem1, prem2)
    
    >>> urob(13)
    >>> urob(99)
    

  1. Nasledovné priradenia vytvoria 7 prvkový zoznam zoz, ktorý obsahuje len čísla a n-tice. Zapíšte do tabuľky hodnoty prvkov tohto zoznamu:

    a = tuple(range(10,30))
    zoz = [a[3], a[8:11], a[:1], a[-3:-1], a[4:14:4], a[::5], a[7:3:-1]]
    

    zoz[0]

    zoz[1]

    zoz[2]

    zoz[3]

    zoz[4]

    zoz[5]

    zoz[6]


  1. Funkcia dokonale(n) zisťuje, či zadané celé číslo je dokonalé (rovná sa súčtu svojich deliteľov). Doplňte chýbajúce časti tak, aby výsledkom funkcie bola buď hodnota True alebo False. Nedopisujte žiadne ďalšie príkazy.

    def dokonale(n):
        sucet = 0
        for i in _____________:
            if __________________:
                sucet += i
        return ______________________
    

  1. Funkcia urob(meno, zoznam) vyrobí textový súbor, v ktorom budú všetky prvky zadaného zoznamu celých čísel, ale v zmenenom poradí: najprv idú všetky s nadpriemernou hodnotou a až za nimi všetky zvyšné. Funkcia teda otvorí súbor na zápis, do každého riadku zapíše jedno z čísel z daného zoznamu:

    def urob(meno, zoznam):
        t = open(______________________________)
        priemer = ________________________________
        for i in True, False:
            for p in zoznam:
                if __________________ or ___________________:
                    print(______________)
        t.close()
    
    >>> urob('cisla.txt', [2, 9, 3, 8, 4, 1, 7, 5])
    ... vytvorí súbor s číslami: 9 8 7 5 2 3 4 1
    

    Doplňte chýbajúce časti príkazov. Nevkladajte žiadne ďalšie príkazy.


  1. Funkcia urob(n) vypisuje hviezdičky do viacerých riadkov:

    def urob(n):
        for i in range(n):
            print(' '*i, '*'*(2*(n-i)-1))
    

    Zistite

    1. koľko hviezdičiek sa vypíše, ak zavoláme urob(4)

    2. pre aké najmenšie n sa vypíše aspoň 555 hviezdičiek


  1. Funkcia zoznam_cisel(retazec) dostáva ako parameter znakový reťazec, ktorý obsahuje celé čísla oddelené medzerou. Funkcia z neho vytvorí zoznam čísel (využite metódu find() a funkciu int()). Funkcia nič nevypisuje, ale vráti tento zoznam ako výsledok funkcie. Vo funkcii je niekoľko chýb, pre ktoré nebeží správne. Opravte ich! Nepridávajte žiadne ďalšie príkazy.

    def zoznam_cisel(retazec):
        zoznam = []
        retazec += '\n'
        while retazec == '':
            i = zoznam.find(' ')
            retazec.append(int(retazec[i+1:]))
            retazec = retazec[:i]
        print(zoznam)
    
    >>> a = zoznam_cisel('19 173 7 97 1001')
    >>> print(a)
    [19, 173, 7, 97, 1001]
    

  1. Funkcia urob(utvary) nakreslí podľa zadaného zoznamu niekoľko farebných štvorcov a kruhov:

    def urob(utvary):
        canvas = tkinter.Canvas()
        canvas.pack()
        for i in utvary:
            u = 0
            for j in range(i[0]):
                x, y = random.randrange(50, 200), random.randrange(50, 200)
                sur = (x-5, y-5, x+5, y+5)
                if u != 0:
                    canvas.create_rectangle(sur, fill=i[1])
                else:
                    canvas.create_oval(sur, fill=i[1])
                u = (u + 1) % 3
    
    >>> urob([(10, 'red'), (2, 'blue'), (5, 'red'), (8, 'blue'), (3, 'red')])
    

    Zistite, aký počet červených štvorcov a modrých kruhov sa nakreslí pre konkrétne volanie.

    • počet červených štvorcov =

    • počet modrých kruhov =


  1. Funkcia kopiruj(vstup, vystup) prekopíruje obsah súboru s menom vstup do súboru s menom vystup, pričom nekopíruje riadky, ktoré obsahujú znak '#':

    def kopiruj(vstup, vystup):
        with open(vstup, 'w') = t2:
            with open(vystup) = t1:
                riadok = t1.input()
                while riadok:
                    if '#' in not riadok:
                        t2.print(riadok)
                    riadok = t1.input()
    

    V programe je niekoľko chýb. Opravte ich, ale nepridávajte žiadne ďalšie príkazy.


  1. Funkcia uprac(zoznam) presťahuje všetky prvky s hodnotou číslo 0 na začiatok zoznamu, ostatné prvky posunie vpravo. Funkcia nevracia žiadnu hodnotu, len modifikuje vstupný zoznam. Doplňte chýbajúce príkazy:

    def uprac(zoznam):
        pocet0 = 0
        for i in reversed(range(len(zoznam))):
            if zoznam[i] == 0:
                pocet0 += 1
            else:
                ___________________________
        while pocet0:
            ___________________________
            ___________________________
    
    >>> a = [0, 5, 0, 0, 2, '0', 7, 0]
    >>> uprac(a)
    >>> a
    [0, 0, 0, 0, 5, 2, '0', 7]
    

  1. Funkcia rozdel(zoznam) rozdelí zoznam celých čísel na dva nové zoznamy: všetky prvky s párnymi hodnotami budú v prvom výslednom zozname a všetky zvyšné v druhom. Funkcia vráti výsledok ako dvojprvkovú n-ticu (typ tuple) práve vytvorených zoznamov:

    def rozdel(zoznam):
        prvy, druhy = [], []
        for prvok in zoznam:
            if prvok % 2:
                druhy.append(prvok)
            else:
                prvy.append(prvok)
        return prvy, druhy
    
    >>> a, b = rozdel([1, -2, 3, 4, 0, -5])
    >>> print(a)
    [-2, 4, 0]
    >>> print(b)
    [1, 3, -5]
    

    Opravte túto funkciu tak, aby namiesto dvoch zoznamov vracala dve n-tice (tuple). Môžete prepísať ľubovoľné riadky funkcie okrem záverečného return.