Python - zbierka úloh

Portál: Moodle gymnázia, Bilíkova 24
Kurz: Informatika 3. ročník
Kniha: Python - zbierka úloh
Vytlačil(a): Hosťovský používateľ
Dátum: piatok, 17 mája 2024, 11:21

1. Premenná, vstup a výstup

Meno premennej musí začínať písmenom, byť jednoslovné a rozlišujú sa veľké a malé písmená. Príklady premenných:

x, binarne_cislo, velkost2

Pozrite si základné informácie o dátových typoch v Pythone. Preštudujte si príklady operácie + na reťazcoch a skúste aj nejaký reťazec vynásobiť pomocou *.

Vstup zadáme príkazom input(), pozrite si príklady použitia. Dôležité je uvedomiť si, že input() vždy vytvorí premennú typu reťazec, preto napr. celé číslo načítame tak, že zmeníme jeho typ funkciou int() či float() – pozrite si príklad:

cislo = int(input("Zadaj celé čisielko: "))
Úlohy
  1. Napíšte program, kde do premennej name a surname priraďte reťazce. Potom:
    1. vypíšte 10-krát name pomocou *,
    2. vypíšte reťazec vzniknutý spojením name a surname pomocou +,
    3. vypíšte name a surname pomocou príkazu print() s čiarkami a porovnajte,
    4. vypíšte name a surname do rámčeka z hviezdičiek.

  2. Napíšte program, kde do premennej vek zadáš číslo a do meno a priezvisko reťazce. Potom:
    1. vypíšte vetu: Volám sa… a mám… rokov.
    2. do premennej dni vypočítajte, koľko to je dní, a doplň vetu: … to je… dní.
    3. premenná meno nech sa zadá na vstupe príkazom input().
    4. premenná vek nech sa tiež zadá na vstupe – vznikne problém: aký?
    5. premennú vek zmeňte na číslo funkciou int().

  3. Napíšte program, kde na vstupe zadáte čísla a a b. Potom vypíše všetky aritmetické operácie: \( a + b, \ a - b, \ a \cdot b, \ a / b, \ a ^ b, \) celočíselný podiel, zvyšok. Diskutujte o číselných typoch vstupov i výstupov a možných chybách pri výpočte.

  4. Použitím operácií % b (pre zvyšok pri delení čísla a číslom b) a a // b (pre celočíselne delenie) vypíšte pre zadaný počet dní d, koľko obsahujú týždňov a zvyšných dní.

  5. Zadaný počet minút min preveďte na stupne a minúty – tie sa rátajú zo zvyšku po stupňoch.

  6. Pre zadaný počet sekúnd s vypíšte, koľko obsahujú:
    1. minút a sekúnd,
    2. hodín, minút a sekúnd – použite delenie so zvyškom.

  7. cokoladaPre zadaný počet cols stĺpčekov a rows riadkov čokolády, a počet zjedených štvorčekov n, vypočítajte:
    1. počet ostávajúcich štvorčekov n_left,
    2. počet ostávajúcich stĺpčekov cols_left a voľných štvorčekov x_left,
    3. počet ostávajúcich riadkov rows_left a voľných štvorčekov y_left,
    4. ošetrite, aby nemohlo byť zjedených viac štvorčekov, než má čokoláda.

2. Vetvenie

Program môžeme na základe podmienok vetviť. Urobíme si prehľad možných spôsobov vetvenia. Okrem toho sa naučíme používať logické operácie or, and a not.

2.1. Vetvenie príkazmi if a else

  1. Pre zadaný vek age zistite:
    1. či je to dospelý,
    2. či ide o tínedžera, tj. je medzi 13 a 19 (vrátane).

  2. Obor Pažďuch má sedemmíľové boty. Vie v nich robiť iba sedemmíľové kroky. Chce ísť na návštevu za jednou z troch obrýň (Xaverka, Ygelitka a Zubatka). Obryne bývajú vo vzdialenosti x, y a z míľ. Obor potrebuje rozhodnúť, či môže aspoň jednu z obrýň navštíviť (tj. vyjde mu to presne na sedemmíľové kroky). Výstupom bude buď Choď na návštevu!, alebo Dnes to nepôjde.

  3. Napíšte program, ktorý do premennej pom vloží hodnotu True, ak jedno zo zadaných čísel x, y je práve o jednu väčšie než druhé, inak bude pom nepravda. Potom vypíšte hodnotu pom. Na poradí x, y by nemalo záležať.

  4. Policajt potrebuje pomoc s udelením pokút. Zašiel do baru a zistil vek (age) občana a to, či pije pivo (beer). Napíšte program, ktorý do premennej fine vloží True v prípade, že občan je maloletý a pije pivo, inak priradí do fine hodnotu False. Následne vypíšte jej hodnotu.

  5. Janko Hraško bol dnes trikrát skúšaný. Janko je šťastný, kedykoľvek dostane aspoň jednou lepšiu známku než trojku. Napíšte program, ktorý pre zadané známky a, b, c rozhodne, či je Janko šťastný.

  6. Kováč má okovať niekoľko koní a potrebuje zistiť, či má správny počet podkov. Napíšte program, ktorý zadaný počet podkov p a počet koní k vypíše, koľko podkov chýba či prevyšuje, alebo či je počet správne.

  7. Pre zadané logické hodnoty antigénového testu c a t (celé čísla 0 či 1) zistite:
    1. či je test platný,
    2. či je pacient pozitívny či negatívny,
    3. či je algoritmus čo najúspornejší pri svojom vetvení.
    výsledky testu

  8. Nájdite maximum:
    1. z dvoch celých čísel a, b zadaných na vstupe,
    2. z dvoch desatinných čísel a, b zadaných na vstupe – použite funkciu float(),
    3. z troch desatinných čísel a, b, c zadaných na vstupe,
    4. uistite sa, že bod (c) funguje správne a algoritmus je čo najjednoduchší.

2.2. Vetvenie príkazom elif

  1. Pre číselne zadaný mesiac m určite ročné obdobie. Použi vetvenie pomocou elif. Skontrolujte, či zadané m dáva zmysel.

  2. Napíšte program, ktorý rozhodne, kto vyhral v hre kameň-nožnice-papier. Ťahy zadáva používateľ prvými písmenami, napr. tah1 = "k", tah2 = "n". Skript má za úlohu vypísať gesto víťazného ťahu, alebo text Remíza.

  3. Na vstupe zistite výšku h [m] a váhu m [kg], ktoré sú typu float.
    1. vypočítajte BMI index podľa vzorca: \( i = \frac{m}{h^2}\) vypíš,
    2. podľa tabuľky vyhodnoťte proporcie:

      < 18,5 od 18,5 do 25 od 25 do 30 > 30
      podvýživa zdravé proporcie nadváha obezita

3. Grafika

Skúsme teraz uplatniť algoritmické myslenie pri práci s grafikou.

  • Vytvor nový program s týmto obsahom:

    import tkinter
    canvas = tkinter.Canvas()
    canvas.pack()
    
  • Program spusti – na obrazovke uvidíš nové okno:

  • Zisti, či sa dá okno posúvať, meniť jeho veľkosť. Nakoniec toto nové okno zatvor.

    Tvoj program vyrobil grafickú plochu canvas. Slovo canvas budeš používať aj v ďalších príkazoch na kreslenie.
    súradnice okna tkinteru

  • Pridaj do svojho programu nový príkaz a program opäť spusti:

    import tkinter
    canvas = tkinter.Canvas()
    canvas.pack()
    canvas.create_rectangle(50, 70, 220, 150)
    

3.1. Obdĺžniky

Vyskúšajme si vytvorenie plátna na grafiku pomocou modulu tkinter, ktoré si priradíme do premennej vykres; príkazy na kreslenie spojujeme s premennou vykres. Najskôr si otvoríme nové okno príkazom vykres.pack(). Potom nakreslíme obdĺžnik príkazom vykres.create_rectangle(), kde ako parametre sú súradnice horného ľavého a dolného pravého rohu. Ak chceme plátno daných rozmerov, doplníme do generujúceho príkazu width a height.

     import tkinter
     vykres = tkinter.Canvas(width=600, height=400)
     vykres.pack()
vykres.create_rectangle(30, 30, 130, 130)
  1. Napíšte program, ktorý vedľa seba nakreslí dva štvorce so stranami 80 (pozície zvoľ podľa uváženia):

  2. Napíšte program, ktorý nakreslí dva veľké štvorce – jeden so stranou 100 a druhý 150. Štvorce majú spoločný stred:

  3. Napíšte program, ktorý z troch obdĺžnikov 150x50, 100x50 a 50x50 nakreslí takúto pyramídu:

  4. Zatiaľ sme kreslili jednoduché prázdne obdĺžniky. Takto nakreslíte obdĺžnik s farbou:
    import tkinter
    canvas = tkinter.Canvas()
    canvas.pack()
    canvas.create_rectangle(30, 30, 130, 130, fill='red')

    Pridajte do programu ďalšie 3 príkazy na kreslenie obdĺžnikov, aby sme dostali takýto obrázok:

    Ďalšie farby dostanete, ak namiesto slova 'red' napíšeš 'green', 'blue' alebo 'yellow'.

  5. Vytvorte nový program, ktorý nakreslí vlajku Holandska (pomer strán vlajky býva 2 : 3). Aký názov môže mať biela farba?

  6. Vytvorte program, ktorý nakreslí vlajku Írska s farbou 'orange':

  7. Nakreslite takýto obrázok:

    Na vlajku ktorého štátu sa obrázok podobá?

  8. Zo štyroch úzkych obdĺžnikov vytvorte takýto rámik:

  9. Nasledovný obrázok vznikol zo štyroch štvorcov. Prvý z nich má súradnice ľavého horného vrcholu [50, 50]. Napíšte program, ktorý ich nakreslí – zvoľte si ľubovoľné štyri rôzne farby (môžu byť iné ako na tomto obrázku):


  10. Nakreslite nórsku vlajku:

    Dokážete to urobiť tak, aby sa v bielych častiach nekrížili čierne čiary, tak ako je to na obrázku vpravo?

  11. Upravte nasledujúci program tak, aby sa nakreslil rovnaký obrázok, ale aby obsahoval iba 3 príkazy pre kreslenie obdĺžnikov:
    canvas.create_rectangle(90, 90, 150, 150, fill='yellow')
    canvas.create_rectangle(150, 90, 210, 150, fill='red')
    canvas.create_rectangle(90, 150, 150, 210, fill='green')
    canvas.create_rectangle(30, 90, 90, 150, fill='red')
    canvas.create_rectangle(90, 30, 150, 90, fill='green')

Farby v Pythonu


3.2. Kreslenie s premennými

  1. Vytvorte nový program, ktorý nakreslí takéto dva dotýkajúce sa štvorce: oba majú dĺžky strán 100, pritom červený má ľavý horný roh v bode [50, 50] a modrý má ľavý horný roh v bode [150, 150].

  2. V premenných x, y sú uložené súradnice ľavého horného rohu štvorca. Dokonči program tak, aby si pomocou nich nakresli štvorec so stranou 100:

    import tkinter
    obr = tkinter.Canvas(width = 600, height = 400)
    obr.pack()
    x = 100
    y = 70
    obr.create_rectangle(x, y, x + ?, ?, fill='yellow')

  3. Napíšte program, ktorý použije štyri premenné x, y, sirka, vyska a podľa nich nakreslí obdĺžnik s ľavým horným rohom x, y a danou šírkou a výškou. Farbu si zvoľte.

    Napríklad sa nakreslí takýto obdĺžnik, ak v programe zadáme:

    x = 100
    y = 70
    sirka = 200
    vyska = 50
  4. Vytvorte program, ktorý nakreslí takéto štvorce:

    Majú rovnaký ľavý horný vrchol, jeho súradnice budú v bode (0,0). Štvorce sa postupne zmenšujú po 50 px. Použite cyklus. Môžete napokon doplniť farby pomocou premennej typu list, do ktorej si vopred napíšete zoznam farieb.

  5. Vytvorte program, ktorý nakreslí štvorec 100×100 px so stredom v bode (x, y). Upravte ho tak, že postupne nakreslí štvorce s týmto stredom, ktoré sa zmenšujú po 50 px.

  6. Päť farebných štvorcov leží tesne vedľa seba na jednej podložke. Veľkosti strán sú postupne 100, 80, 60, 40, 20. Napíšte program, v ktorom ľavý dolný vrchol prvého štvorca má súradnice x, y:

  7. Nastavte si veľkosť plátna na 600×400 pixelov. Pomocou cyklu vytvorte pásiky široké 500 px a hrubé 50 px. Môžete napokon doplniť farby pomocou premennej typu list, do ktorej si vopred napíšete zoznam farieb.

  8. Predchádzajúcu úlohu zmeňte tak, že farby budú len dve a budú sa striedať. Aby zoznam farieb mohol mať len dve položky, použite párnosť na určenie farby.

  9. Zmenšite si plátno na 400×400 px. S použitím predchádzajúcich nápadov a dvoch cyklov vytvorte šachovnicu. Začnite kresliť hneď od počiatku (0,0).

  10. S použitím modulu random nakreslite 200 štvorcov s náhodne určenými stredmi. Môžete aj meniť ich veľkosť px a farbu.
    K vygenerovaní súradníc (a veľkosti štvorcov) sa hodí príkaz random.randint(a, b), kde a, b určujú interval generovaných hodnôt. Pozor, aby sa štvorce nekreslili za okraj!
    K náhodnému výberu farieb z premennej typu list možno použiť random.choice().

  11. S použitím funkcie na kreslenie okien nakreslite bytovku, ktorá má okná 50 px od seba. Príkaz na kreslenie čiary je create_line(x1, y1, x2, y2).

4. Cykly

Naučíme sa pracovať s cyklami, aby sme si usnadnili prácu, keď treba zopakovať nejaký krok viackrát.

4.1. Cyklus for

  1. Pozrite si, ako vypíšeme čísla od 0 po 9 – vyskúšajte:
  2.     for i in range(10):
    print('číslo', i)
    Ak si to správne zapíšeme, program po spustení vypíše:
    číslo 0
    číslo 1

    číslo 9
  3. Čo treba v predchádzajúcom programe zmeniť, aby sa vypísali čísla:
    1. 0, 1, …, 10 – teda, aj číslo 10,
    2. 1, 2, …, 10,
    3. 2, 4, …, 20,
    4. 10, 20, …, 100 ?

    Vyskúšajte.

  4. Vytvorte program, ktorý vypíše pomocou for cyklu čísla a ich druhé mocniny:

  5. 0 na druhú je 0
    1 na druhú je 1

    2 na druhú je 4

    3 na druhú je 9

    4 na druhú je 16

    5 na druhú je 25

    6 na druhú je 36
  6. Máme takúto rozprávku:

  7. Na strome bolo 0 vrabcov, jeden priletel a už je na ňom 1 vrabcov
    Na strome bolo 1 vrabcov, jeden priletel a už je na ňom 2 vrabcov

    Na strome bolo 9 vrabcov, jeden priletel a už je na ňom 10 vrabcov

    Zapíšte ju pomocou for cyklu.

  8. Vrabce z predchádzajúcej rozprávky odlietajú – vymyslite program, ktorý to pomocou cyklu for porozpráva:

  9. Na strome bolo 10 vrabcov, jeden odletel a zostalo na ňom 9 vrabcov
    Na strome bolo 9 vrabcov, jeden odletel a zostalo na ňom 8 vrabcov


    Na strome bolo 1 vrabcov, jeden odletel a zostalo na ňom 0 vrabcov
  10. Vytvorte zo znaku * následujúce obrazce pomocou 10-krokového for cyklu:
  11. Načítajte slovo na vstupe do premennej slovo. Potom ho pomocou for cyklu:

    1. vypíšte slovo po jednotlivých písmenách pod seba,
    2. for i in slovo:
      print(i)

    3. vypíšte 1. písmeno, pod to prvé 2 písmená, pod to prvé 3 atď.
      (tip: použite novú premennú ozvena, kde si postupne pridávate písmeno za písmenom; na začiatku jej priraďte prázdny reťazec),

    4. vypíše slovo tak, že ho poprekladá medzerami, napríklad: j a b l k o,

    5. prerobte program malými úpravami tak, aby vypísal slovo pospiatočky.

  12. Máme kartičky s číslami od 0 po 9, ktoré chceme náhodne rozložiť po ploche. Vytvorte program, ktorý pomocou cyklu postupne nakreslí 10 takých kartičiek na náhodným pozíciách:



  13. Číslo na kartičke nakreslíte takto:
      canvas.create_text(x, y, text=i, font='arial 30')
  14. Na chodníku je rozhodených päť bankoviek s hodnotami 10, 20, 30, 40 a 50. Napíšte program, ktorý také bankovky nakreslí pomocou cyklu for:



  15. Pomocou sčítania nájdite:
    1. dvojnásobok čísla x zadaného na vstupe,
    2. stonásobok čísla x zadaného na vstupe,
    3. vynásobte dve čísla x, y zadané na vstupe
    4. zamyslite sa nad efektívnosťou algoritmu z bodu (c) a zlepši ho.

  16. Pomocou násobenia:
    1. umocnite na vstupe zadané číslo x na druhú,
    2. umocnite na vstupe zadané číslo x na 10,
    3. umocnite na vstupe zadané číslo x na exponent y daný na vstupe.

4.2. Vnorené for cykly

Než začneme s vnorenými cyklami, naučíme sa jeden užitočný parameter príkazu print().

Vyskúšajte nasledujúce skripty:

print("Gymnázium")
print("Bilíkova")

Teraz použijeme parameter end:

print("Gymnázium", end = " ")
print("Bilíkova")

Môžete vyskúšať aj iný znak ako medzeru. Ako vidíme, end mení znak na konci vytlačeného reťazca. Ak nie je zadané inak, na konci vytlačeného reťazca je zalomenie riadka.

  1. Využite parameter end a pomocou dvoch do seba vnorených cyklov vypíšte čísla 1, …, 100. Na ukončenie riadka môžete využiť prázdny príkaz print():

    1 2 3 4 5 6 7 8 9 10 
    11 12 13 14 15 16 17 18 19 20
    21 22 23 24 25 26 27 28 29 30
    31 32 33 34 35 36 37 38 39 40
    41 42 43 44 45 46 47 48 49 50
    51 52 53 54 55 56 57 58 59 60
    61 62 63 64 65 66 67 68 69 70
    71 72 73 74 75 76 77 78 79 80
    81 82 83 84 85 86 87 88 89 90
    91 92 93 94 95 96 97 98 99 100
  2. Urobte tabuľku malej násobilky:

    1 2 3 4 5 6 7 8 9 10 
    2 4 6 8 10 12 14 16 18 20
    3 6 9 12 15 18 21 24 27 30
    4 8 12 16 20 24 28 32 36 40
    5 10 15 20 25 30 35 40 45 50
    6 12 18 24 30 36 42 48 54 60
    7 14 21 28 35 42 49 56 63 70
    8 16 24 32 40 48 56 64 72 80
    9 18 27 36 45 54 63 72 81 90
    10 20 30 40 50 60 70 80 90 100
  3. Preštudujte si použitie zoznamov – premenných typu list. Potom napíšte program, ktorý prejde postupne položky zoznamu a každé slovo:

    1. napíše poprekladané medzerami,
    2. pospiatočky.

4.3. Cyklus while

  1. Napíšte program, ktorý načítava postupnosť čísiel, kým nezadáme 0. Potom vypíše súčet zadanej postupnosti.

  2. ruksak Vytvorte program Ruksak, kam zadáme maximálnu nosnosť ruksaku a potom zadávame váhu vecí, ktoré doň balíme. Program:
    1. sa zastaví, keď je maximálna nosnosť prekročená, a vypíše Stop,
    2. vypíše, koľko vecí sme si zabalili, okrem poslednej.

  3. Vytvorte program na uhádnutie náhodného čísla od 1 po 100, ktoré program vygeneruje použitím funkcie random.randint() v modulu random.
    Program nás nechá tipovať hodnotu a napíše, či je hľadané číslo väčšie, alebo menšie.
    Skončí sa, keď je náš tip správny. Na začiatok programu pridáme príkaz import random, aby sme mohli použiť modul random.

  4. Číslo x zadané na vstupe:
    1. pomocou operácie // delte celočíselne 2, výsledok opäť vydelte 2 atď. kým nedôjdeme k nule; výsledky vypisujte,
    2. pomocou operácie % vypisujte zvyšky celočíselného delenia dvomi v bode (a),
    3. premeňte do dvojkovej sústavy.

  5. Pre čísla a, b zadané na vstupe nájdite najmenší spoločný deliteľ pomocou Euklidovho algoritmu:
    1. ak a > b, vymeňte a s b,
    2. vydeľte celočíselne a / b a zistite zvyšok z,
    3. vymeňte a za b, a b za z. Vracajte sa ku kroku (b), kým je zvyšok nenulový.
    Výsledný deliteľ bude posledné b, ktorým sme delili.