16. Metodika pre učiteľa - Vetvenie


Cieľom tejto hodiny je zoznámiť žiakov s príkazom vetvenia.


Začíname úlohou na zopakovanie:

  1. Riešenie (priemery kruhov sú 50):

    import tkinter
    
    canvas = tkinter.Canvas()
    canvas.pack()
    
    canvas.create_oval(150, 50, 200, 100, fill='red')
    canvas.create_oval(150, 100, 200, 150, fill='gold')
    canvas.create_oval(150, 150, 200, 200, fill='green')
    

Aj druhá úloha slúži na zopakovanie:

  1. (*) Riešenie:

    import random
    
    for i in range(10):
        print(random.choice(['Dobré ráno', 'Dobrý deň', 'Dobrý večer', 'Dobrú noc']))
    

Žiaci by mali objaviť, že výsledky porovnávania majú hodnoty buď True (pravda) alebo False (nepravda):

  1. Riešenie:

    >>> 3 > 4
    False
    

  1. Riešenie:

    1. >>> 1 + 2 > 3
      False
      
    2. >>> -1 > -2
      True
      
    3. >>> (1 + 2) * 3 < 1 + 2 * 3
      False
      
    4. >>> a = 100
      >>> a < 101
      True
      

  1. Komentár:

    Prvé zoznámenie s príkazom vetvenia: v oboch vetvách je po jednom príkaze.

    Konštrukcia vetvenia ifelse … funguje presne rovnako, ako vo všetkých programovacích jazykoch. Líši sa len v detailoch zápisu:

    • prvý riadok obsahuje slovo if, za ktorým nasleduje nejaká podmienka (najčastejšie porovnávanie číselných hodnôt) a riadok je ukončený povinnou dvojbodkou :

    • ďalej nasleduje aspoň jeden odsadený riadok s príkazmi, ktoré sa vykonajú len v prípade, že podmienka je splnená (podmienka za if má hodnotu True)

    • ďalší riadok obsahuje len slovo else s povinnou dvojbodkou :, toto slovo nesmie byť odadené, ale musí byť na presne rovnakej úrovni ako riadok if

    • na záver nasleduje aspoň jeden odsadený riadok s príkazmi, ktoré sa vykonajú len v prípade, že podmienka je nesplnená (podmienka za if má hodnotu False)

    Zrejme práve jedna z vetiev (prvá odsadená skupina príkazov alebo druhá za else) sa naozaj vykoná a tá druhá nie. Ktorá z nich to bude, závisí len na podmienke.

    Na tomto mieste môže učiteľ fungovanie príkazu vetvenia ifelse … vysvetliť kresbou na tabuli na konkrétnom jednoduchom príklade.


  1. Riešenie:

    teplota = 10
    print('Je', teplota, 'stupňov.')
    if teplota > 20:
        print('Dnes je teplo.')
    else:
        print('Dnes je zima.')
    print('Správne sa obleč.')
    

    Po spustení:

    Je 10 stupňov.
    Dnes je zima.
    Správne sa obleč.
    

    Ak to uznáme za vhodné, môžeme zaviesť konštrukciu input na vyžiadanie si nejakej hodnoty, s ktorou sa bude ďalej v programe pracovať. Najvhodnejší je takýto variant zápisu:

    teplota = int(input('Zadaj teplotu: '))
    print('Je', teplota, 'stupňov.')
    ...
    

    Zápis int( pred samotným input označuje, že načítaná hodnota bude celé číslo. Ak by sme predpokladali, že sa môžu zadávať aj desatinné čísla (s desatinnou bodkou), treba použiť slovo float(, napríklad:

    teplota = float(input('Zadaj teplotu: '))
    print('Je', teplota, 'stupňov.')
    ...
    

    Parametrom príkazu input je ľubovoľný text, ktorý sa vypíše do príkazového riadku a za ktorý sa bude zapisovať vstupná hodnota.

    Teraz po spustení to môže vyzerať takto:

    Zadaj teplotu: 15
    Je 15 stupňov.
    Dnes je zima.
    Správne sa obleč.
    

    Príkaz input na vstup hodnôt sa môže využiť aj na zadávanie textov, nielen čísel. Napríklad takto:

    meno = input('Ako sa voláš? ')
    print('Ahoj,', meno)
    

    A po spustení, napríklad:

    Ako sa voláš? Vašek
    Ahoj, Vašek
    

    Zrejme v tomto prípade sme pred input nepoužili ani int( ani float(, keďže načítaná hodnota nie je celým ani desatinným číslom, ale je to načítaný nejaký text.


  1. Riešenie:

    teplota = 0    # alebo: teplota = int(input('Zadaj teplotu: '))
    print('Je', teplota, 'stupňov.')
    if teplota < 0:
        print('Zober si rukavice.')
    else:
        print('Rukavice ti netreba.')
    

    Po spustení pre rôzne teploty:

    Je 10 stupňov.
    Rukavice ti netreba.
    ======== RESTART ========
    Je -5 stupňov.
    Zober si rukavice.
    ======== RESTART ========
    Je 0 stupňov.
    Rukavice ti netreba.
    

  1. Riešenie:

    hmotnost = 30
    print('Hmotnosť listu je', hmotnost, 'g')
    if hmotnost < 50:
        print('Zaplatíš 1.25 eura')
    else:
        print('Zaplatíš 1.4 eura')
    

    Po spustení pre rôzne hmotnosti:

    Hmotnosť listu je 30 g
    Zaplatíš 1.25 eura
    ======== RESTART ========
    Hmotnosť listu je 50 g
    Zaplatíš 1.4 eura
    ======== RESTART ========
    Hmotnosť listu je 100 g
    Zaplatíš 1.4 eura
    

  1. Riešenie:

    pocet = 4
    print('Za', pocet, 'kopčekov zmrzliny zaplatíš:')
    if pocet < 5:
        print(pocet * 1.1, 'eurá.')
    else:
        print(pocet * 0.9, 'eurá.')
    

    Po spustení pre rôzne počty kopčekov:

    Za 4 kopčekov zmrzliny zaplatíš:
    4.4 eurá.
    ======== RESTART ========
    Za 5 kopčekov zmrzliny zaplatíš:
    4.5 eurá.
    ======== RESTART ========
    Za 6 kopčekov zmrzliny zaplatíš:
    5.4 eurá.
    

  1. Riešenie:

    import tkinter
    
    canvas = tkinter.Canvas(bg='white')
    canvas.pack()
    
    cas = 50
    if cas < 30:
        canvas.create_oval(150, 50, 200, 100, fill='red')
    else:
        canvas.create_oval(150, 50, 200, 100, fill='green')
    

    Tu si všimnite (a môžete to rozoberať aj so žiakmi), že v oboch vetvách príkazu if sú skoro úplne rovnaké príkazy, ktoré sa líšia len vo farbe výplne fill=. V takýchto prípadoch môžeme zvoliť trochu iné využitie vetvenia: vo vetvách if sa do premennej farba priradí buď červená ('red') alebo zelená ('green') v závislosti od podmienky cas < 30. A až potom, po skončení if, sa použije príkaz create_oval na nakreslenie červeného alebo zeleného kruhu v závislosti od premennej farba. Môžeme to zapísať takto:

    import tkinter
    
    canvas = tkinter.Canvas(bg='white')
    canvas.pack()
    
    cas = 50
    if cas < 30:
        farba = 'red'
    else:
        farba = 'green'
    canvas.create_oval(150, 50, 200, 100, fill=farba)
    

  1. Riešenie:

    import tkinter
    
    canvas = tkinter.Canvas(bg='white')
    canvas.pack()
    
    cas = 5
    if cas < 30:
        canvas.create_oval(150, 50, 200, 100, fill='red')
    else:
        canvas.create_oval(150, 150, 200, 200, fill='green')
    canvas.create_oval(150, 50, 200, 100)
    canvas.create_oval(150, 100, 200, 150)
    canvas.create_oval(150, 150, 200, 200)
    

    V tomto riešení si všimnite, že vo vetvách if sa nakreslí buď červený horný kruh alebo zelený dolný a po skončení if nasledujú tri príkazy na kreslenie všetkých troch kruhov, teda aj toho, ktorý sa nakreslil v if. Keďže tieto tri kruhy nemajú výplň, tak nevadí, že prekreslia už aj nakreslený kruh. Ak by sme požadovali, aby zhasnuté svetlá boli nakreslené šedou farbou, museli by sme to urobiť inak. Napríklad takto:

    import tkinter
    
    canvas = tkinter.Canvas(bg='white')
    canvas.pack()
    
    cas = 5
    canvas.create_oval(150, 50, 200, 100, fill='gray')
    canvas.create_oval(150, 100, 200, 150, fill='gray')
    canvas.create_oval(150, 150, 200, 200, fill='gray')
    if cas < 30:
        canvas.create_oval(150, 50, 200, 100, fill='red')
    else:
        canvas.create_oval(150, 150, 200, 200, fill='green')
    

  1. Riešenie:

    import tkinter
    
    canvas = tkinter.Canvas()
    canvas.pack()
    
    a = 50
    b = 100
    if a > b:
        canvas.create_rectangle(100, 250, 100 + a, 250 - b, fill='red')
    else:
        canvas.create_rectangle(100, 250, 100 + b, 250 - a, fill='red')
    

  1. (*) Dve riešenia:

    1. Riešenie (najprv sa nakreslí prvý kruh s polomerom r1 a stredom (180, 130), druhý kruh s polomerom r2 sa nakreslí nad alebo pod prvý):

    import tkinter
    
    canvas = tkinter.Canvas()
    canvas.pack()
    
    r1 = 30
    r2 = 50
    canvas.create_oval(180 - r1, 130 - r1, 180 + r1, 130 + r1, fill='blue')
    if r1 < r2:
        canvas.create_oval(180 - r2, 130 + r1, 180 + r2, 130 + r1 + 2*r2, fill='blue')
    else:
        canvas.create_oval(180 - r2, 130 - r1 - 2*r2, 180 + r2, 130 - r1, fill='blue')
    

    2. Riešenie:

    import tkinter
    
    canvas = tkinter.Canvas()
    canvas.pack()
    
    r1 = 30
    r2 = 50
    if r1 < r2:
        canvas.create_oval(180 - r1, 10, 180 + r1, 10 + 2*r1, fill='blue')
        canvas.create_oval(180 - r2, 10 + 2*r1, 180 + r2, 10 + 2*r1 + 2*r2, fill='blue')
    else:
        canvas.create_oval(180 - r2, 10, 180 + r2, 10 + 2*r2, fill='blue')
        canvas.create_oval(180 - r1, 10 + 2*r2, 180 + r1, 10 + 2*r2 + 2*r1, fill='blue')
    

    Toto druhé riešenie využíva to, že v každej vetve if môže byť aj viac príkazov, ktorá sa vykonajú, v prípade, že je podmienka splnená, resp. nesplnená.


Zhrnutie

ciele lekcie

  • zoznámiť sa s príkazom vetvenia a mechanizmom vykonania/nevykonania príkazov

  • zoznámiť sa s pravdivostnými hodnotami a porovnávaním číselných hodnôt

  • prepis situácie z prirodzeného jazyka do formálnej podoby a jazyka pre počítač

zručnosti

  • správne odsadzovanie v konštrukcii vetvenia

syntaktické pravidlá

  • zápis príkazu ifelse

  • zápis podmienok ako výrazov s porovnaním hodnôt

poznámky

  • iba jednoduché testy s jedným príkazom v každej vetve

  • iba úlohy, v ktorých stačí jedno vetvenie