16. Metodika pre učiteľa - Vetvenie¶
Cieľom tejto hodiny je zoznámiť žiakov s príkazom vetvenia.
Začíname úlohou na zopakovanie:
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:
(*)
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):
Riešenie:
>>> 3 > 4 False
Riešenie:
>>> 1 + 2 > 3 False
>>> -1 > -2 True
>>> (1 + 2) * 3 < 1 + 2 * 3 False
>>> a = 100 >>> a < 101 True
Komentár:
Prvé zoznámenie s príkazom vetvenia: v oboch vetvách je po jednom príkaze.
Konštrukcia vetvenia
if
…else
… 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á hodnotuTrue
)ďalší riadok obsahuje len slovo
else
s povinnou dvojbodkou:
, toto slovo nesmie byť odadené, ale musí byť na presne rovnakej úrovni ako riadokif
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á hodnotuFalse
)
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
if
…else
… vysvetliť kresbou na tabuli na konkrétnom jednoduchom príklade.
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ýminput
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ť slovofloat(
, 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 aniint(
anifloat(
, keďže načítaná hodnota nie je celým ani desatinným číslom, ale je to načítaný nejaký text.
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.
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
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á.
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ýplnefill=
. V takýchto prípadoch môžeme zvoliť trochu iné využitie vetvenia: vo vetváchif
sa do premennejfarba
priradí buď červená ('red'
) alebo zelená ('green'
) v závislosti od podmienkycas < 30
. A až potom, po skončeníif
, sa použije príkazcreate_oval
na nakreslenie červeného alebo zeleného kruhu v závislosti od premennejfarba
. 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)
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 vif
. 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')
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')
(*)
Dve riešenia:1. Riešenie (najprv sa nakreslí prvý kruh s polomerom
r1
a stredom(180, 130)
, druhý kruh s polomeromr2
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
if
…else
…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