Maturitní otázka č. 4
4. Programování – Řídící struktury
1. Co jsou to řídící struktury a jaké známe?
V klasickém (imperativním) programování se příkazy vykonávají postupně shora dolů. Často ale potřebujeme reagovat na různé stavy (např. uživatel zadal špatné heslo) nebo opakovat určitou operaci. Právě k tomu slouží řídící struktury – určují a mění tok řízení (control flow) programu.
Základní typy řídících struktur:
- Sekvence (Posloupnost): Základní forma. Příkazy se vykonávají lineárně jeden za druhým, jak jsou zapsány v kódu (např. načti číslo, přičti jedničku, vypiš výsledek).
- Selekce (Větvení): Program se rozhoduje mezi dvěma a více cestami na základě splnění či nesplnění určité logické podmínky (True/False). Sem patří konstrukce if, if-else, a switch (případně match-case v Pythonu).
- Iterace (Cykly): Program opakuje určitý blok kódu, dokud je splněna předem daná podmínka, nebo pro daný počet opakování. Sem patří cykly for, while a do-while (nebo repeat-until).
- Skoky (Nepodmíněné skoky): Změna toku řízení bez podmínky. V moderním programování se jim snažíme vyhnout (příkaz goto tvoří tzv. "špagetový kód"), ale v rozumné míře sem řadíme příkazy pro řízení cyklů a funkcí jako break, continue nebo return.
2. Cykly v programování a jejich využití
Cykly (smyčky) umožňují opakovaně vykonávat určitou část kódu, což šetří čas programátora, zmenšuje velikost programu a umožňuje zpracovávat dynamické množství dat. Dělíme je primárně na tři základní typy, které se liší tím, kdy a jak testují ukončovací podmínku:
- Cyklus s podmínkou na začátku (while): Program nejprve otestuje logickou podmínku. Pokud je pravdivá (True), provede se tělo cyklu. Poté se podmínka testuje znovu. Tento cyklus se používá tehdy, když předem neznáme přesný počet opakování (např. "čti soubor, dokud nenarazíš na konec" nebo "žádej od uživatele heslo, dokud ho nezadá správně"). Může se stát, že se cyklus neprovede ani jednou (když je podmínka nepravdivá hned na začátku).
- Cyklus s podmínkou na konci (do-while / repeat-until): Nejprve se provede tělo cyklu a až poté se testuje podmínka. Rozdíl je v tom, že tento cyklus se ZARUČENĚ provede alespoň jednou, bez ohledu na počáteční stav podmínky (např. vypsání hlavního menu hry a následné čekání na volbu uživatele).
- Cyklus se známým počtem opakování (for): Skládá se obvykle z inicializace řídící proměnné (indexu), podmínky opakování a kroku (inkrementace). Tento cyklus se používá nejčastěji v případech, kdy předem přesně víme, kolikrát má proběhnout. Je ideální pro procházení a výpis prvků strukturovaných datových typů, jako jsou pole a seznamy (např. "projdi pole od prvního do stého prvku").
3. Prostředky pro větvení programů
Větvení (podmínky) slouží k realizaci rozhodovacích procesů v algoritmu. Většina programovacích jazyků (např. C, Java, Python, C#) k tomu používá tyto dva základní prostředky:
- Příkaz if / else: Slouží pro obousměrné větvení. "Pokud (if) je venku zima, vezmi si bundu, jinak (else) si vezmi tričko". V kódu se vyhodnocuje logický výraz. Je možné přidávat více větví pomocí "else if" (nebo "elif" v Pythonu) a pokrýt tak více situací (např. testování konkrétní známky z testu).
- Přepínač switch (nebo match-case): Používá se pro přehlednější vícenásobné větvení, pokud se program rozhoduje pouze na základě hodnoty JEDNÉ proměnné (nejčastěji číselné nebo textové). Místo dlouhého řetězce "else if" se hodnota proměnné porovnává proti konkrétním případům (příkaz "case"). Jakmile se najde shoda, provede se příslušný blok a cyklus se obvykle opustí příkazem "break". Má často i větev "default", která se aktivuje, pokud hodnota neodpovídala žádnému předchozímu případu.
4. Praktický program: Vykreslování hvězdiček
V této ukázce využijeme programovací jazyk Python. Jazyk Python je na tento úkol ideální, jelikož umožňuje jednoduché množení řetězců (znaku hvězdičky) celým číslem. Použijeme v něm jak načtení uživatelského vstupu, tak sekvenci příkazů větvení (if-else) a pochopitelně iterační cyklus for.
# Načtení celého čísla od uživatele
n = int(input("Zadejte celé číslo: "))
# Logická podmínka pro větvení
if n <= 10:
# Bod A: n <= 10 (postupné snižování od n po 1 hvězdičku)
# range(start, stop, krok) -> začneme na n, končíme před 0 (tedy u 1), jdeme po -1
for i in range(n, 0, -1):
print("*" * i)
else:
# Bod B: n > 10 (stejný výpis, ale vždy právě 10 řádků, tedy od 10 do 1)
for i in range(10, 0, -1):
print("*" * i)
Vysvětlení funkčnosti pro komisi: Program nejprve definovanou řídící strukturou větvení zkontroluje velikost čísla n (např. 5). Větvička `if` zpracuje čísla menší nebo rovna 10. Cyklus for s parametrem zpětného kroku (-1) se postupně postará o výpis požadovaného počtu hvězdiček. V první iteraci "vytiskne n hvězdiček", v další n-1, až po 1. V případě, že uživatel zadá např. 25 (větev `else`), program se z bezpečnostních důvodů (např. přetečení terminálu) omezí a vytiskne právě 10 řádků přesně ve stejném formátu (od deseti hvězdiček po jednu), jak požaduje zadání.