Lekce 13: Podmíněné příkazy

python.edumach.cz



1. Podmíněné příkazy

Program níže vykreslí 20 náhodných čtverců na náhodných pozicích:

# 13_1.py

import tkinter
import random

canvas = tkinter.Canvas(width=400, height=400)
canvas.pack()

def nahodny_ctverec():
    x = random.randrange(300)
    y = random.randrange(300)
    a = random.randint(20, 80)
    canvas.create_rectangle(x, y, x+a, y+a)

for i in range(1, 21):
    nahodny_ctverec()
    canvas.update()
    canvas.after(500)

Předpokládejme, že chceme program upravit tak, aby kreslil větší čtverce červeně a menší modře. V takových situacích musíme do programu zapsat podmínku. Určité příkazy se provedou pouze tehdy, když je podmínka splněna, a naopak určité příkazy se provedou, když podmínka splněna není. Například: zadali bychom, že čtverce větší než 50 pixelů budou červené a menší čtverce modré.

Náš podmíněný příkaz by mohl znít: "pokud je velikost větší než 50, vykresli červený čtverec, v opačném případě vykresli modrý čtverec". Zapíšeme to takto:

if a > 50:
    canvas.create_rectangle(x, y, x+a, y+a, fill='red')
else:
    canvas.create_rectangle(x, y, x+a, y+a, fill='blue')
# 13_1.py

import tkinter
import random

canvas = tkinter.Canvas(width=400, height=400)
canvas.pack()

def nahodny_ctverec():
    x = random.randrange(300)
    y = random.randrange(300)
    a = random.randint(20,80)
    if a > 50:
        canvas.create_rectangle(x, y, x+a, y+a, fill='red')
    else:
        canvas.create_rectangle(x, y, x+a, y+a, fill='blue')

for i in range(1,21):
    nahodny_ctverec()
    canvas.update()
    canvas.after(500)

Všimněte si, že za příkazem if a podmínkou následuje dvojtečka (stejně jako v cyklu for nebo po definici funkce). Dvojtečka následuje také za příkazem else, za který zapisujeme příkazy, které se mají provést, pokud podmínka není splněna. Důležité je také odsazení příkazů v zápise větvení. Všechny odsazené příkazy spadají pod větev if, resp. else. Pokud bychom některé řádky neodsadili, program by je provedl, jako by nebyly v příkazech if nebo else, nebo by ohlásil chybu odsazení.

Místo a > 50 mohou být jiné podmínky (podle toho, co chceme, aby bylo splněno). Můžeme použít i takové zápisy:

Příklad Význam
a < 50 podmínka je splněna, pokud a je menší než 50
a <= 50 podmínka je splněna, pokud a je menší nebo rovno 50
a >= 50 podmínka je splněna, pokud a je větší nebo rovno 50
a == 50 podmínka je splněna, pokud a je rovno 50
a != 50 podmínka je splněna, pokud a není rovno 50
50 < a < 60 podmínka je splněna, pokud a je mezi 50 a 60 (s výjimkou 50 a 60)
50 <= a <= 60 podmínka je splněna, pokud a je mezi 50 a 60 (včetně 50 a 60)

Upravme funkci nahodny_ctverec() následujícím způsobem:

def nahodny_ctverec():
    x = random.randrange(300)
    y = random.randrange(300)
    a = random.randint(20,80)
    if 40 < a < 60:
        canvas.create_rectangle(x, y, x+a, y+a, fill='red')
        canvas.create_text(x+10, y+10, text=a, fill="white")
    else:
        canvas.create_rectangle(x, y, x+a, y+a, fill='blue')

1.1 ❓ Otázky

  1. K čemu bude tento program sloužit?
  2. Jak bychom mohli tento program zjednodušit?

1.2. 💾 Cvičení

1.2.1. Čtverec nebo kolečko 1

Vytvořte program, ve kterém je nejprve nakreslena čára ve středu obrazovky. Pokud klikneme myší nad tuto čáru, program nakreslí modrý čtverec; pokud klikneme pod tuto čáru, program nakreslí žluté kolečko.

1.2.2. Čtverec nebo kolečko 2

V předchozí úloze zkuste vynechat zápis s celou částí else: a příkazy ve větvi else. Bude toto neúplné if také fungovat?

2. Více podmínek najednou

V podmíněném příkazu můžeme také zadat více podmínek a spojit je pomocí logických operátorů and a or. Chceme-li, aby všechny podmínky byly splněny současně, použijeme operátor and. Operátor or použijeme tehdy, když stačí splnit alespoň jednu z podmínek.

# 13_3.py

import tkinter
import random

canvas = tkinter.Canvas(width=400, height=400)
canvas.pack()

def krouzek(souradnice):
    x = souradnice.x
    y = souradnice.y
    if 100 < x < 150 and 50 < y < 100:
        canvas.create_oval(x-5, y-5, x+5, y+5, fill='green')
    else:
        canvas.create_oval(x-5, y-5, x+5, y+5, fill='yellow')

canvas.bind('<Button-1>', krouzek)

Program vykreslí zelené kroužky pouze tehdy, pokud je x v rozmezí 100 až 150 a zároveň y v rozmezí 50 až 100. Pokud na plátno mnohokrát klikneme, uvidíme, kde jsou nakresleny zelené a žluté kroužky.

2.1. ❓ Otázky

  1. Co udělá tento program, když změníme operátor and na operátor `or!?
  2. Co udělá tento program, změníme-li podmínku na x < 150 nebo y > 150?

2.2. 💾 Úkoly

2.2.1. Korálky 1/2

Vytvořte program 13_koralky.py, ve kterém pomocí jediného cyklu s vnořeným větvením nakreslí 15 korálků jako na obrázku. Prvních 8 korálků bude červených a zbylých 7 modrých.

2.2.2. Korálky 2/2

Upravte předchozí program tak, aby se prvních 8 korálků barvilo náhodně pomocí

random.choice(["red", "yellow"])

a zbylých 7 pomocí

random.choice(["blue", "green"])

Výsledek může vypadat například jako na následujícím obrázku:

2.2.3. Korálky 3

Vytvořte program 13_koralky_3.pya v něm nadefinujte funkci koralek. V této funkci vygenerujte náhodné pozice x, y pro střed korálku. Program potom podle x-ové souřadnice nakreslí červený nebo žlutý korálek, pokud je x < 200, modrý nebo zelený korálek pro ostatní čísla.

Využijte kreslení korálků z předchozí úlohy. Když zavoláte funkci koralek v cyklu 100×, můžete dostat například takovýto obrázek:

2.2.4. Výpočet čísla pi metodou Monte Carlo

Vytvořte program 13_pi.py, který bude generovat náhodně rozmístěné tečky v ploše 200×200 (náhodné souřadnice nechť jsou od 1 do 200). Tečky vytvořte jako malé barevné kroužky s poloměrem 2 a vygenerujte jich 10000. Červené tečky budou ty, pro které platí x2+y2 <= 2002, ostatní budou modré. Program vypočítá podíl počtu červených teček vzhledem k počtu všech teček. Tento podíl vynásobí 4 a výsledek na závěr vypíše do okna shellu. Matematici by uměli dokázat, že tento podíl se blíží číslu Pi. Zkontrolujte, zda tomu tak skutečně je.

TIP: Zkuste i jiný čtverec než 200 × 200 nebo jiný počet teček. Jaké bude Pi?

2.2.5. Vlajka Německa

Vytvořte program 13_nemecko.py, který na plátno nakreslí německou vlajku. Tu budete vytvářet tak, že pomocí cyklu vygenerujete 10000× náhodné souřadnice x,y. Souřadnice x bude z intervalu od 10 do 350 a souřadnice y bude z intervalu od 10 do 250. Na tyto souřadnice x,y nakreslíte barevný kroužek s poloměrem 5. Barvu kroužku zvolíte podle y-ové souřadnice následovně: když je y < 90, nakreslí se černý kroužek, když je y < 170, nakreslí se červený kroužek, jinak se nakreslí žlutý kroužek. Výsledek by měl vypadat podobně jako na obrázku:

Vyzkoušejte, jak bude výsledek vypadat, jestliže se bude generovat menší počet barevných kroužků (například 100 nebo 1000).

2.2.6. Vlajka ČR

Vytvořte program 13_cr.py, který podobnou technikou, jako byla použita v předchozí úloze, nakreslí českou vlajku. Obrázek může vypadat například takto:

Modrý klín se kreslí na dvou místech:

2.2.7. Den a noc

  1. Vytvořte program 13_den_noc.py, který podle zadaného času v hodinách nakreslí do grafické plochy slunce nebo měsíc. Do proměnné cas přiřaďte počet hodin. Použijte příkaz větvení na to, aby se pro cas < 8 kreslil měsíc jako bílý kruh, jinak se kreslilo slunce jako žlutý kruh. Poloměr kruhu nechť je v obou případech 50 a střed kruhu má souřadnice 200, 100. Program by měl například nakreslit:

  2. Do předchozího řešení doplňte kreslení pozadí -- měsíc se nakreslí na tmavomodré pozadí, slunce na světlemodré pozadí:

    Stačí, když do každé větve přidáte příkaz na kreslení velkého obdélníku, který překryje celou grafickou plochu:

    if ...... :
        canvas.create_rectangle(......, fill='navy')
        canvas.create_oval(......, fill='white')
    else:
        canvas.create_rectangle(......, fill='cyan')
        canvas.create_oval(......, fill='yellow')
    
  3. Upravte předchozí program tak, aby se nejdříve do proměnných x, y přiřadily souřadnice středu kruhu a ty se potom použily v příkazech create_oval. Kromě toho přidejte na úplný konec programu i kreslení zeleného obdélníku, který bude představovat krajinu. Potom program pro x = 200 a y = 150 bude kreslit scény jako na následujících obrázcích:

    Horní okraj zeleného obdélníku umístěte na y-ovou souřadnici 180.

  4. Vylepšete předchozí program tak, aby fungoval jako náhodný generátor krajinek – přiřaďte na začátku do proměnných x, y, cas náhodná čísla:

    • x z rozsahu 100, 300
    • y z rozsahu 100, 200
    • cas z rozsahu 0, 16

    Program několikrát spusťte a sledujte, zda se krajinky vytváří dle očekávání: