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


  1. Zisti, čo sa vypíše:

    >>> t = 'anicka dusicka kde si bola'
    >>> t.split()[::-1][-1][::-1][2]
    
    >>> z = [12, 23, 34, 45, 56, 67, 78, 89]
    >>> str(z[2::2][1])[::-1]
    

  1. Do funkcie najdi(cislo) sme pridali kontrolný výpis print: Zisti, čo táto funkcia vypíše a akú hodnotu vráti pre volanie najdi(150):

    def najdi(cislo):
        od, do = 1, cislo
        x = (od + do) // 2
        while abs(od - do) > 1:
            print(od, do, x)
            if x**2 > cislo:
                do = x
            else:
                od = x
            x = (od + do) // 2
        return x
    

  1. Nasledovný program by mal pomocou náhodných bodiek nakresliť tento čiernobiely obrázok:

    _images/t19a_01.png

    Kruh na obrázku má polomer 100. Dopíš program (obe vetvy if môžu obsahovať viac príkazov, ale kreslí len posledný riadok create_oval):

    import tkinter
    import random
    
    canvas = tkinter.Canvas()
    canvas.pack()
    
    for i in range(10000):
        x = random.randint(10, 360)
        y = random.randint(10, 250)
        vzd = ((x-180)**2 + (y-125)**2) ** 0.5
        if ___________________________________________:
    
    
            _____________________________________
        else:
    
    
            _____________________________________
        canvas.create_oval(x-3, y-3, x+3, y+3, fill=farba, width=0)
    

  1. Máme danú funkciu vypis(x, y). Zisti, čo vypíše volanie vypis(20, 100):

    def vypis(x, y):
        cislo, sucet = 0, 1
        while cislo <= y:
            if cislo >= x:
                print(cislo, end=' ')
            cislo, sucet = sucet, cislo+sucet
        print()
    

  1. Máme funkciu vyhod_duplikaty(retazec), ktorá z daného reťazca vyhodí všetky za sebou idúce opakujúce sa znaky (nechá len jeden z nich). Napríklad:

    >>> x = vyhod_duplikaty('abbba')
    >>> x
    'aba'
    

    Oprav toto riešenie (v každom riadku programu maximálne jedna oprava):

    def vyhod_duplikaty(retazec):
        i = 0
        while i < len(retazec):
            if retazec[i] == retazec[i-1]:
                retazec = retazec[:i] + retazec[i-1:]
            else:
                i -= 1
        print(retazec)
    

  1. Máme funkciu vyhod_neparne(zoznam), ktorá z daného zoznamu celých čísel vyhodí tie prvky, ktoré sú nepárne. Napríklad:

    >>> x = [2, 3, 4, 5, 7, 8, 10, 11, 13, 15, 17]
    >>> vyhod_neparne(x)
    >>> x
    [2, 4, 8, 10]
    

    Doplň (v oboch vetvách if je po jednom príkaze):

    def vyhod_neparne(zoznam):
        i = 0
        while i < len(zoznam):
            if _________________:
                __________________________
            else:
                __________________________
    

  1. Daná je funkcia urob(co). Zisti, čo je jej výsledkom:

    def urob(co):
        i = 0
        while i < len(co)-1:
            co[i:i+2] = [co[i] + co[i+1]]
            i += 1
    
    x = [4, 5, 6, 7, 8, 9, 10]
    urob(x)
    print(x)
    

  1. V textovom súbore sú slová oddelené medzerou. Tento súbor treba prečítať a v každom riadku prevrátiť poradie slov. Oprav funkciu prevrat_riadky(meno_suboru) (do funkcie nedopisuj ďalšie riadky):

    def prevrat_riadky(meno_suboru):
        with open(meno_suboru) as t:
            text = t.read()
        riadky = text.join('\n')
        for riadok in riadky:
            riadok = ' '.join(riadok.strip()[::-1])
        text = '\n'.split(riadky)
        with open(meno_suboru, 'w') as t:
            t.write(text)
    

  1. Máme funkciu enum(postupnost), ktorá vytvorí rovnakú n-ticu dvojíc, ako by vytvorila tuple(enumerate(postupnost)). Napríklad:

    >>> enum('python')
    ((0, 'p'), (1, 'y'), (2, 't'), (3, 'h'), (4, 'o'), (5, 'n'))
    

    Doplň:

    def enum(postupnost):
        vysl = _____________________
        i = 0
        for prvok in postupnost:
            ________________________________
            i += 1
        return vysl
    

  1. Máme danú funkciu vektor, ktorá nakreslí šípku:

    import tkinter
    from math import sin, cos, radians
    
    def vektor(x, y, dlzka, uhol):
        x1 = x + dlzka*cos(radians(uhol))
        y1 = y + dlzka*sin(radians(uhol))
        canvas.create_line(x, y, x1, y1, arrow='last')
        return x1, y1
    

    Zisti, čo sa nakreslí týmto programom:

    canvas = tkinter.Canvas()
    canvas.pack()
    
    x, y = 150, 50
    for u in range(0, 360, 60):
        x, y = vektor(x, y, 100, u)