← Přehled všech hodin

Cykly

Cíl hodiny: Děti přestanou kopírovat stejné řádky pod sebe a naučí se říct počítači „udělej to padesátkrát". Odcházejí s programem, který má vlastní herní smyčku a tabulku odměn.
Jak stránku používat: vpravo nahoře je tlačítko Prezentace — schová všechno kromě jednoho bloku a přepíná se šipkami. U ukázek a cvičení je kód vlevo editovatelný: uprav ho a klikni na Spustit (nebo Ctrl+Enter). Program se přeloží a spustí přímo v prohlížeči a vpravo se objeví to, co vypsal do konzole. Nic se neinstaluje.
Kde jsme a co dnes přibude: Cyklus je nejsilnější nástroj, který se letos naučíš. Bez něj je program jen dlouhý seznam.

1. Vysvětlení a souvislosti

Poznámky pro učiteleJak celou hodinu vést1. Vysvětlení a souvislosti

Tenhle blok je jen pro vás — dětem ho nepromítejte.

Fáze Co se děje Čas
Rozjezd Ukázka deseti zkopírovaných řádků a otázka „co s tím?" 10 min
Výklad + ukázky Bloky 2–8, for, pak while, pak zbytek 40 min
Ukázky pro projekci Pět hotových programů, píšete je živě 20 min
Cvičení Děti pracují samy, vy obcházíte 60 min
Závěr Kdo chce, pustí svoji herní smyčku 10 min
Hlavní pedagogický cíl

Cyklus je první místo, kde program nejde přečíst shora dolů. Řádek se provede, a pak se tok vrátí zpátky nahoru. Tohle je pro část třídy skutečný zlom a chce to čas.

Nejlepší nástroj je ruční simulace: na tabuli tabulka se sloupci i | co se vypíše a vy krok po kroku doplňujete. Udělejte to alespoň dvakrát, i když se to bude zdát pomalé. Ušetří vám to hodinu debugování.

Tři věci, které dnes NEVYSVĚTLUJTE
  1. for s víc proměnnými nebo s i += 2 hned na začátku. Nejdřív ať všichni zvládnou i++. Krok po dvou je až Rozšíření.
  2. foreach versus for do hloubky. Stačí pravidlo: „procházím kolekci → foreach, počítám kolikrát → for".
  3. Proč jde i deklarovat uvnitř for a mimo něj neplatí. Rozsah platnosti proměnných zmiňte jen tehdy, když na to někdo narazí.

Nekonečný cyklus je jistota, ne riziko. Někdo ho dnes vyrobí — počítejte s tím a mějte na to připravenou reakci. Ve spouštěči na téhle stránce se běh sám ukončí po chvíli a napíše chybu. Ve VS Code se program zastaví klávesami Ctrl+C. Řekněte to dopředu, ať z toho nikdo nemá stres.

Jak pracovat se smíšenou úrovní. Minimum je jeden for, který něco vypíše. Rozšíření je while a break. Výzva jsou vnořené cykly — ty jsou pro polovinu třídy těžké a je to v pořádku.

Blok 1Problém, který cyklus řeší1. Vysvětlení a souvislosti

Představ si, že jich má být padesát. Nebo tisíc.

Kopírovat řádky má tři vady: - je to dlouhé a nudné, - při změně musíš opravit každý řádek, - a hlavně: nefunguje to, když dopředu nevíš, kolikrát se to má opakovat.

Zkus si sem doplnit šesté kolo. Teď si představ, že to děláš padesátkrát.

To je přesně ten okamžik, kdy programátor sáhne po cyklu.

Klikni vlevo na Spustit a objeví se tu výstup programu.

Tři řádky místo pěti. A při padesáti kolech pořád tři řádky — stačí přepsat pětku.

Cyklus je příkaz, který říká: „tenhle blok kódu proveď víckrát."

Zkus v kódu vlevo změnit 5 na 12 a spustit. Nic jiného měnit nemusíš.

Všimni si, že se v textu objevuje i a pokaždé má jinou hodnotu. To je ta kouzelná část — cyklus ti dává počítadlo, se kterým můžeš pracovat.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 2Cyklus for zblízka1. Vysvětlení a souvislosti

V kulatých závorkách jsou tři věci oddělené středníkem. Čti je takhle:

Část Zápis Kdy se provede
start int i = 1 jednou, úplně na začátku
podmínka i <= 5 před každým kolem
krok i++ po každém kole

Průběh je přesně tenhle:

  1. vyrob i a dej do něj 1,
  2. je i <= 5? Ano → proveď tělo (složené závorky),
  3. i++ (teď je i dvojka),
  4. zpátky na bod 2.

Když podmínka neplatí, cyklus skončí a program pokračuje řádkem pod ním.

i++ je zkratka za i = i + 1. Kdyby tam nebylo, i by zůstalo na jedničce a cyklus by běžel navždy.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Proč zrovna „i"

i je zkratka od index. Je to nejstarší zvyk v programování a uvidíš ho všude. U vnořených cyklů se pokračuje j a k.

Když se ale počítadlo dá pojmenovat smysluplně — kolo, radek, utok — je to lepší. Čitelnost vyhrává nad zvykem.

Tři nejčastější varianty, které budeš potřebovat:

  • i = 0; i < 5 — pět kol, ale čísla 0 až 4. Takhle se počítá u seznamů, protože ty začínají nulou.
  • i = 10; i >= 1; i-- — počítání dolů. i-- je zkratka za i = i - 1.
  • i = i + 5 — krok po pěti. Do závorky můžeš napsat jakýkoliv výpočet.

Pozor na klasickou past: i <= 5 proběhne pětkrát (1,2,3,4,5), ale i < 5 taky pětkrát (0,1,2,3,4) — když začneš od nuly. Vždycky si to spočítej, nebo to prostě spusť a podívej se.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 3Cyklus while: nevím kolikrát, ale vím dokdy1. Vysvětlení a souvislosti

for použiješ, když víš kolikrát. while, když víš jen podmínku.

Kolik kol potrvá souboj? To dopředu nevíš — záleží na životech a na síle útoku. Zato víš, kdy skončit: až životy klesnou na nulu.

Čti to jako větu: „dokud jsou životy větší než nula, opakuj…"

while (podmínka) { ... } — před každým kolem se zeptá. Když podmínka neplatí hned napoprvé, tělo se neprovede ani jednou.

Tři věci, na které si dej pozor:

  1. Proměnnou zivoty musíš vyrobit před cyklem.
  2. Uvnitř se musí něco změnit tak, aby podmínka jednou přestala platit.
  3. kolo++ si musíš přičítat sám — while ti počítadlo nedá.
Klikni vlevo na Spustit a objeví se tu výstup programu.
int zivoty = 30;

while (zivoty > 0)
{
    Console.WriteLine("Útok!");
}

Tenhle program nikdy neskončí. Nikde se zivoty nemění, takže podmínka platí pořád. Tomu se říká nekonečný cyklus.

Poznáš ho podle toho, že konzole chrlí jeden řádek donekonečna. Ve VS Code ho zastavíš Ctrl+C, tady na stránce se běh sám utne a napíše chybu.

Není to katastrofa — vyrobí ho každý programátor a některé jsou i schválně (třeba herní smyčka, ze které se vyskočí přes break).

Kontrolní otázka, než spustíš while: „co uvnitř způsobí, že podmínka jednou přestane platit?" Když na to neumíš odpovědět, cyklus je nekonečný.

Blok 4Cyklus do-while: aspoň jednou1. Vysvětlení a souvislosti

do-while je while naruby: nejdřív udělá, pak se ptá.

Rozdíl je jediný, ale důležitý:

Kdy se ptá Nejméně kol
while před tělem 0
do-while po těle 1

Hodí se všude, kde se má něco stát aspoň jednou: nabídnout menu, hodit kostkou, zeptat se na jméno.

Pozor na středník. Za while (podmínka) na konci do-while středník být musí. Je to jediné místo v C#, kde je za závorkou while středník správně.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 5Break a continue: vyskoč a přeskoč1. Vysvětlení a souvislosti

break znamená „okamžitě ven z cyklu". Zbytek těla se přeskočí a další kola se už nekonají.

Tady hrdina poráží příšery jednu po druhé, ale jakmile narazí na draka, výprava končí.

Čti to jako „přeruš".

Nejčastější použití: - našel jsem, co jsem hledal — dál hledat nemá smysl, - stalo se něco zlého — přestaň, - uživatel napsal „konec".

break funguje ve všech cyklech: for, while, do-while i foreach.

Klikni vlevo na Spustit a objeví se tu výstup programu.

continue znamená „tohle kolo mě nezajímá, skoč na další". Cyklus pokračuje, jen se přeskočí zbytek těla.

Tady: když má i po dělení dvěma zbytek 1 (je liché), přeskoč a na výpis se vůbec nedostaneš.

Příkaz Co udělá
break ukončí celý cyklus
continue ukončí jen tohle kolo

Použij continue na filtrování: „přeskoč prázdné řádky", „přeskoč mrtvé příšery", „přeskoč zboží, na které nemám".

Pravidlo do začátku: když jde totéž napsat obyčejným if, napiš if. continue se vyplatí, až když je tělo dlouhé.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 6Vnořené cykly1. Vysvětlení a souvislosti

Cyklus uvnitř cyklu. Vnější se otočí třikrát a při každém svém kole pustí vnitřní cyklus celý — tedy čtyřikrát.

Dohromady 3 × 4 = 12 výpisů.

Analogie, která funguje: vnější cyklus jsou hodiny na displeji, vnitřní jsou minuty. Než se hodina posune o jedničku, minuty projedou celý svůj rozsah.

Dvě věci k zapamatování: - Vnitřní počítadlo se jmenuje jinak (sloupec, ne radek). - Console.Write nepřidává odřádkování, takže se vypisuje do řádku. Console.WriteLine() na konci vnějšího kola řádek ukončí.

Zkus prohodit 3 a 4 a podívej se, co se stane s tvarem.

Klikni vlevo na Spustit a objeví se tu výstup programu.

Vnitřní cyklus se může řídit vnějším. Tady jede i od nuly až k radek — takže první řádek má jednu hvězdičku, pátý pět.

Vznikne trojúhelník:

*
**
***
****
*****

Tohle je klasické cvičení, na kterém se pozná, kdo cykly opravdu pochopil. Zkus si ho upravit na obrácený trojúhelník (i < 6 - radek).

Mimochodem — totéž jde napsat bez vnitřního cyklu: Console.WriteLine(new string('*', radek));. Někdy je kratší cesta lepší.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Poznámky pro učiteleTechnické pozadí — jen pro vás1. Vysvětlení a souvislosti

Věci, které dětem dnes neříkejte, ale vy je vědět potřebujete.

for je jen přepsaný while. Kompilátor z for (int i = 0; i < n; i++) { T } udělá v podstatě int i = 0; while (i < n) { T; i++; }. Když se někdo ptá, který je „lepší", odpověď je: stejný, jen for drží tři části pohromadě, a proto se hůř zapomíná na krok.

Rozsah platnosti i. Proměnná deklarovaná v hlavičce for platí jen uvnitř cyklu. Po cyklu na ni nesáhnete — to je záměr. Když ji potřebujete i potom, deklarujte ji před cyklem: int i; for (i = 0; ...).

i++ vs. ++i. V hlavičce for je to naprosto jedno, protože se výsledek výrazu nepoužívá. Rozdíl (postfix vrací starou hodnotu, prefix novou) dětem neříkejte — je to zdroj zmatku a v praxi na to nenarazí.

continue v do-while. Skočí na podmínku, ne na začátek těla. V for skočí na krokovou část (i++), takže nekonečný cyklus nevyrobí. V while ale ano — continue před i++ je klasická past. Ukažte ji jen rychlíkům.

Nekonečné cykly ve spouštěči. Kód na téhle stránce běží v prohlížeči a má vlastní časový limit. Nekonečný cyklus tedy nezamrzne navždy, ale vypíše chybu o překročení limitu. Je to bezpečné prostředí na experimenty — využijte to a nechte děti nekonečný cyklus schválně vyrobit.

Výkon vnořených cyklů. Dvě vnořené smyčky po n krocích dají operací. U n = 100 je to deset tisíc, u n = 10 000 je to sto milionů a program viditelně zpomalí. Tohle je téma pro 12. hodinu o algoritmech; dnes jen zmiňte, že „vnořený cyklus je drahý".

Čeho se v této hodině vyvarovat v kódu: nepoužívejte Thread.Sleep ani Task.Delay na zpomalení výpisu. Vypadá to lákavě („ať to běží jako hra"), ale živé spouštění na stránce se tím vypne.

2. Ukázky pro projekci

Blok 7Ukázka 1 — Odpočet před výpravou2. Ukázky pro projekci
Studenti zkuste změnit
  • Změň 10 na jiné číslo.
  • Otoč odpočet na počítání nahoru (i = 1; i <= 10; i++).
  • Přidej do těla druhý řádek s i * 2.
  • Zkus krok po dvou: i = i - 2.
demo/demo1_odpocet.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: tři části hlavičky — start, podmínka, krok. Počítadlo i se dá rovnou použít i ve výpočtu (new string('█', i)).

Blok 8Ukázka 2 — Tabulka odměn2. Ukázky pro projekci
Studenti zkuste změnit
  • Přidej čtvrtý sloupec — třeba zkušenosti (uroven * 12).
  • Změň počet úrovní z 10 na 20.
  • Uprav vzorec pro zlato a sleduj, jak se tabulka změní.
  • Vypiš jen sudé úrovně pomocí if (uroven % 2 == 0).
demo/demo2_tabulka_odmen.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: cyklus není jen na opakování textu. V každém kole se dá počítat — a z jednoho for vypadne celá tabulka.

Blok 9Ukázka 3 — Souboj na kola2. Ukázky pro projekci
Studenti zkuste změnit
  • Změň sila hrdiny a sleduj, o kolik kol se souboj zkrátí.
  • Dej příšeře 200 životů.
  • Přidej hrdinovi vlastní životy a ubírej mu je taky.
  • Zkus, co se stane při sila = 0. (Ano, nekonečný cyklus.)
demo/demo3_boj_while.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: while se hodí, když počet kol dopředu neznáš. Podmínka zivotyPrisery > 0 rozhoduje, kdy se má přestat.

Blok 10Ukázka 4 — Prohledávání bestiáře2. Ukázky pro projekci
Studenti zkuste změnit
  • Přesuň draka na první místo v poli. Co se vypíše?
  • Zvyš limit z 50 na 100 — kolik příšer projde?
  • Vyhoď break a podívej se, co se změní.
  • Nahraď continue obyčejným if. Funguje to stejně?
demo/demo4_break_continue.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: break výpravu ukončí, continue jen přeskočí jednu příšeru. Dva různé příkazy, dva různé významy.

Blok 11Ukázka 5 — Mapa dungeonu z vnořených cyklů2. Ukázky pro projekci
Studenti zkuste změnit
  • Změň rozměry mapy na 8 × 15.
  • Vyměň znak zdi za jiný.
  • Přidej do mapy druhý poklad na jiné souřadnici.
  • Uprav podmínku tak, aby vznikl sloup uprostřed mapy.
demo/demo5_mapa_dungeonu.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: vnější cyklus dělá řádky, vnitřní sloupce. Uvnitř se jen rozhodne, jaký znak se na dané souřadnici vypíše.

Blok 12Když se něco pokazí2. Ukázky pro projekci
for (int i = 1; i <= 5; i++);
{
    Console.WriteLine(i);
}

Vidíš ten středník za závorkou? Ten je tam navíc — a mění všechno.

Kompilátor si to přečte jako „cyklus, jehož tělo je prázdné". Cyklus proběhne pětkrát a neudělá nic. Složené závorky pod ním jsou pak obyčejný blok kódu, který se provede jednou.

A protože i mimo cyklus neexistuje, dostaneš navíc CS0103: The name 'i' does not exist in the current context.

Pravidlo: za for (...) a while (...) středník nikdy nepatří. Jediná výjimka je while na konci do-while — tam naopak být musí.

Hláška Co to znamená Jak to opravit
program běží donekonečna nekonečný cyklus uvnitř musí něco změnit podmínku, zkontroluj i++
CS0103: The name 'i' does not exist in the current context používáš i mimo cyklus přesuň kód dovnitř, nebo i deklaruj před cyklem
CS0136 / CS0128 dvakrát stejné jméno počítadla vnitřní cyklus přejmenuj (j, sloupec)
IndexOutOfRangeException i <= pole.Length místo i < u polí se počítá for (int i = 0; i < pole.Length; i++)
CS1525 / CS1002 chybí nebo přebývá středník v hlavičce for musí být přesně dva: start; podmínka; krok
tělo se provede jednou místo pětkrát středník za for (...) středník smaž
CS0139: No enclosing loop out of which to break or continue break mimo cyklus přesuň ho dovnitř složených závorek cyklu
do { } while (x > 0) hlásí chybu chybí středník na konci za while (podmínka) v do-while patří ;

3. Cvičení

Jak cvičení používat: zadání promítněte. Části Pro učitele a Řešení jsou schované — rozbalí se až kliknutím, takže je můžete mít otevřené a děti je neuvidí, dokud nechcete. Kód ve cvičení i v řešení jde spustit a upravovat přímo tady v prohlížeči.
Blok 13Cvičení 1 — Rozcvička v aréně (15 min)3. Cvičení

Tvoje zadání:

Než se hrdina pustí do dungeonu, projde tréninkovou arénou. Všechno opakování za tebe udělá for.

  1. Napiš for, který vypíše osm řádků Kolo 1 — tréninkKolo 8 — trénink.
    💡 Poradit
    Hlavička je for (int kolo = 1; kolo <= 8; kolo++).
    Uvnitř použij $"Kolo {kolo} — trénink".
  2. Přidej odpočet od 5 do 1 — každý řádek s pruhem ze znaků .
    💡 Poradit
    Dolů se počítá i-- a podmínka je i >= 1.
    Pruh vyrobíš přes new string('█', i).
  3. Spočítej v cyklu, kolik zásahů hrdina za osm kol nasbíral (kolo × 3).
    💡 Poradit
    Před cyklem int celkem = 0;, uvnitř celkem = celkem + kolo * 3;.
  4. Vypiš jen kola, která jsou násobkem tří — ostatní přeskoč přes continue.
    💡 Poradit
    Násobek tří poznáš podle kolo % 3 != 0.
    V takovém případě zavolej continue;.
  5. Nakonec vykresli trojúhelník z hvězdiček — první řádek 1, pátý 5.
    💡 Poradit
    Potřebuješ cyklus v cyklu, nebo jednodušeji new string('*', radek).
Úroveň Co má zvládnout
Minimum jeden for, který osmkrát něco vypíše (kroky 1–2)
Rozšíření akumulátor a continue (kroky 3–4)
Výzva trojúhelník z vnořeného cyklu (krok 5)
cviceni/cviceni1_arena.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Pro učitele — na co si dát pozor

Očekávaný výsledek: osm řádků tréninku, odpočet 5–1 s pruhy, celkem 108 zásahů, kola 3 a 6, a nakonec trojúhelník o pěti řádcích.

Kde se zaseknou: - Zapomenou kolo++ → nekonečný cyklus. Nechte to proběhnout, ať vidí, jak to vypadá, a teprve pak opravujte. - Napíšou středník za for (...). Tělo se pak provede jednou a i neexistuje. - U kroku 3 dají int celkem = 0; dovnitř cyklu. Součet pak vyjde 24 místo 108, protože se nuluje každé kolo. Tohle je nejlepší chyba hodiny — ukažte ji celé třídě. - U kroku 5 pojmenují vnitřní počítadlo taky radekCS0136.

Kdo je hotový dřív: ať udělá obrácený trojúhelník, kosočtverec, nebo ať vypíše malou násobilku od 1 do 5 pomocí dvou vnořených cyklů.

Otázka na závěr: „Co by se stalo, kdybych celkem = 0 napsal dovnitř cyklu?" Nechte je odpovědět dřív, než to spustíte.

Řešení 1 — jedna z možných variant
reseni/reseni1_arena.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 14Cvičení 2 — Tabulka úrovní (20 min)3. Cvičení

Tvoje zadání:

Každá RPG hra má tabulku, kolik má hrdina na které úrovni životů, zlata a zkušeností. Ty ji vygeneruješ jedním cyklem.

  1. Vypiš hlavičku tabulky a pod ni cyklem for úrovně 1 až 10.
    💡 Poradit
    for (int uroven = 1; uroven <= 10; uroven++).
    Hlavička se vypisuje před cyklem.
  2. Ke každé úrovni spočítej životy podle vzorce 50 + uroven * 10.
    💡 Poradit
    Proměnnou zivoty si spočítej uvnitř cyklu, ne před ním.
  3. Přidej sloupec se zlatem uroven * uroven * 5 a zarovnej čísla.
    💡 Poradit
    Zarovnání: zlato.ToString().PadLeft(6).
  4. Ke každé páté úrovni připiš ◄ MILNÍK.
    💡 Poradit
    Pátá úroveň je ta, kde uroven % 5 == 0.
    Značku si dej do proměnné a přilep na konec řádku.
  5. Sečti zlato za celou tabulku a vypiš součet pod ní.
    💡 Poradit
    Akumulátor int zlatoCelkem = 0; před cyklem, uvnitř přičítej.
Úroveň Co má zvládnout
Minimum cyklus, který vypíše deset úrovní (kroky 1–2)
Rozšíření druhý sloupec se zarovnáním a milníky (kroky 3–4)
Výzva součet přes celou tabulku (krok 5)
cviceni/cviceni2_tabulka_urovni.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Pro učitele — na co si dát pozor

Očekávaný výsledek: deset řádků, na desáté úrovni 150 životů a 500 zlata, milníky u 5 a 10, součet 1925.

Kde se zaseknou: - Vypíšou hlavičku uvnitř cyklu — dostanou ji desetkrát. Dobrá příležitost zeptat se: „co má být uvnitř a co venku?" - Zapomenou .ToString() před PadLeft. int tuhle metodu nemá. - U kroku 4 napíšou if (uroven % 5 == 0) { Console.WriteLine("MILNÍK"); } a značka jim skočí na vlastní řádek. Ukažte, že text je lepší si připravit do proměnné a přilepit. - U kroku 5 dají zlatoCelkem dovnitř cyklu — klasika z minulého cvičení.

Kdo je hotový dřív: ať přidá sloupec se zkušenostmi, ať tabulku rozšíří na 20 úrovní, nebo ať dopočítá průměrné zlato na úroveň.

Otázka na závěr: „Kolik řádků bys musel napsat bez cyklu?" Deset. A při dvaceti úrovních dvacet. S cyklem se mění jedno číslo.

Řešení 2 — jedna z možných variant
reseni/reseni2_tabulka_urovni.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 15Cvičení 3 — Souboj na kola (20 min)3. Cvičení

Tvoje zadání:

Kolik kol potrvá souboj s trolem? To dopředu nevíš — a přesně proto se tu hodí while.

  1. Připrav proměnné zivotyPrisery = 60, silaHrdiny = 9 a kolo = 1.
    💡 Poradit
    Všechny tři musí vzniknout před cyklem, jinak by se pořád nulovaly.
  2. Napiš while, který ubírá příšeře životy, dokud jsou větší než nula.
    💡 Poradit
    while (zivotyPrisery > 0) a uvnitř zivotyPrisery = zivotyPrisery - silaHrdiny;.
    Nezapomeň na kolo++.
  3. Zabraň záporným životům a přidej k výpisu pruh ze znaků .
    💡 Poradit
    Po odečtení: if (zivotyPrisery < 0) { zivotyPrisery = 0; }.
    Pruh: new string('♥', zivotyPrisery / 5).
  4. Dej hrdinovi vlastní životy a nech příšeru vracet útok za 6.
    💡 Poradit
    Podmínka cyklu se rozšíří: while (zivotyPrisery > 0 && zivotyHrdiny > 0).
  5. Po cyklu vyhodnoť, kdo vyhrál, a vypiš odměnu.
    💡 Poradit
    Stačí if (zivotyPrisery <= 0) — pak vyhrál hrdina, jinak trol.
Úroveň Co má zvládnout
Minimum while, který doběhne a nezacyklí se (kroky 1–2)
Rozšíření ošetření záporných životů a pruh (krok 3)
Výzva oboustranný souboj a vyhodnocení vítěze (kroky 4–5)
cviceni/cviceni3_souboj.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Pro učitele — na co si dát pozor

Očekávaný výsledek: souboj na sedm kol, hrdina vyhraje se zbytkem 4 HP. Až budou měnit čísla, ukažte jim, že při silaHrdiny = 4 hrdina prohraje.

Kde se zaseknou: - Zapomenou kolo++ nebo odečítání životů → nekonečný cyklus. Ptejte se: „co uvnitř způsobí, že podmínka přestane platit?" - Napíšou while (zivotyPrisery > 0); se středníkem. Cyklus je prázdný a program se zasekne bez jediného výpisu — to je matoucí, proto to zmiňte dopředu. - U kroku 4 zapomenou vnitřní if (zivotyPrisery > 0) a mrtvý trol pořád útočí. Je to hezká ukázka toho, že pořadí příkazů v kole rozhoduje. - kolo - 1 na konci je proto, že se kolo přičte i po posledním kole. Nechte je na to přijít samy porovnáním s výpisem.

Kdo je hotový dřív: ať přidá lektvar, který se vypije při životech pod 15, ať zavede kritický zásah každé třetí kolo, nebo ať spočítá, kolik poškození hrdina celkem rozdal.

Otázka na závěr: „Proč tady nejde použít for?" Šlo by, ale museli bychom dopředu spočítat počet kol. while se ptá na stav, ne na počet.

Řešení 3 — jedna z možných variant
reseni/reseni3_souboj.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 16Cvičení 4 — Výprava do jeskyně (20 min)3. Cvičení

Tvoje zadání:

V jeskyni čeká řada příšer. Slabé porazíš, silné obejdeš a před drakem utečeš. A když je zlata málo, jdeš znovu.

  1. Projdi pole jmena cyklem for přes index a vypiš každou příšeru.
    💡 Poradit
    U polí se počítá for (int i = 0; i < jmena.Length; i++).
    Sílu najdeš na stejném indexu: sila[i].
  2. Příšery silnější než limit přeskoč pomocí continue.
    💡 Poradit
    Nejdřív vypiš, že ji obcházíš, a pak zavolej continue;.
  3. Když narazíš na "DRAK", ukonči výpravu přes break.
    💡 Poradit
    Test na jméno: if (jmena[i] == "DRAK").
    Tahle kontrola musí být první v těle cyklu.
  4. Počítej poražené příšery a zlato (síla × 2).
    💡 Poradit
    Dvě proměnné před cyklem: porazeno a zlato.
  5. Zabal celou výpravu do do-while, který se opakuje, dokud nemáš 100 zlata.
    💡 Poradit
    do { ... } while (zlato < 100); — a nezapomeň na středník na konci.
    Počítadlo výprav si dej mimo.
Úroveň Co má zvládnout
Minimum for přes pole podle indexu (krok 1)
Rozšíření continue a break se správným pořadím (kroky 2–3)
Výzva cyklus uvnitř do-while a opakované výpravy (kroky 4–5)
cviceni/cviceni4_jeskyne.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Pro učitele — na co si dát pozor

Očekávaný výsledek: v jedné výpravě padnou Vlk, Skřet a Netopýr, Kostlivec se obejde, drak výpravu utne. Zlato za výpravu je 120, takže do-while proběhne jednou. Ať si zkusí limit = 20 — pak je potřeba víc výprav.

Kde se zaseknou: - Dají test na draka až za test na sílu. Drak má sílu 120, takže ho continue přeskočí a break se nikdy neprovede. Tohle je nejlepší moment hodiny — pořadí podmínek rozhoduje o chování. - Myslí si, že break uvnitř for ukončí i do-while. Neukončí. break vyskočí vždycky jen z nejbližšího cyklu. - Napíšou for (int i = 0; i <= jmena.Length; i++)IndexOutOfRangeException. - Zapomenou středník za while (zlato < 100).

Kdo je hotový dřív: ať přidá pojistku na maximálně pět výprav (while (zlato < 100 && vyprava < 5)), ať mezi výpravami zvedne limit o deset, nebo ať spočítá průměrné zlato na jednu výpravu.

Otázka na závěr: „Kdy se v do-while poprvé vyhodnotí podmínka?" Až po prvním průchodu. Proto se tělo provede vždycky aspoň jednou.

Řešení 4 — jedna z možných variant
reseni/reseni4_jeskyne.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 17Cvičení 5 — CsQuest: herní smyčka (25 min)3. Cvičení

Tvoje zadání:

Velké finále. Hra dostane smyčku, která zpracuje jeden příkaz za druhým — přesně tak, jak to dělají skutečné textové hry.

  1. Projdi pole prikazy cyklem while s vlastním indexem.
    💡 Poradit
    int index = 0; před cyklem, while (index < prikazy.Length), uvnitř index++.
  2. Podle příkazu proveď akci: jdi posune, boj ubere životy, batoh vypíše zlato.
    💡 Poradit
    Použij if / else if.
    Aktuální příkaz si dej do proměnné: string prikaz = prikazy[index];.
  3. Na příkaz konec ukonči smyčku přes break.
    💡 Poradit
    Pozor: index++ musí být před break, jinak na něm ztratíš přehled o pozici.
  4. Neznámý příkaz spočítej do chyby a přeskoč přes continue.
    💡 Poradit
    Ve while musí být index++ před continue — jinak vyrobíš nekonečný cyklus.
  5. Po smyčce vypiš statistiku a pruh životů vykreslený vnořeným cyklem.
    💡 Poradit
    Vnější cyklus přes tři řádky statistiky, vnitřní přes počet znaků pruhu.
Úroveň Co má zvládnout
Minimum while přes pole příkazů s vlastním indexem (kroky 1–2)
Rozšíření break na „konec" a počítání chyb (kroky 3–4)
Výzva závěrečná statistika s vnořeným cyklem (krok 5)
cviceni/cviceni5_herni_smycka.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Pro učitele — na co si dát pozor

Očekávaný výsledek: smyčka zpracuje sedm příkazů, na konec skončí a poslední boj se neprovede. Na konci: 26 HP, 60 zlata, 2 kroky, 1 chyba.

Kde se zaseknou: - Napíšou index++ až na konec těla, za continue. Cyklus se zasekne na příkazu tanec a běží donekonečna. Tohle je hlavní pointa cvičení: ve while se posun indexu musí provést vždycky, proto ho dáváme hned na začátek. - Zkoušejí switch. Je to v pořádku a funguje to, jen jsme ho ještě neprobírali — kdo ho zná, ať ho použije. - U kroku 5 zapomenou Console.Write versus Console.WriteLine a pruh se rozpadne na samostatné řádky. - hodnoty[r] / 5 je celočíselné dělení — u malých hodnot vyjde nula a pruh se nevykreslí. Nechte je na to přijít.

Kdo je hotový dřív: - přidat příkaz lektvar, který doplní 10 HP (nejvýš do 40), - ukončit smyčku i tehdy, když životy klesnou na nulu, - nahradit pole příkazů čtením od uživatele — to je přesně domácí úkol.

Otázka na závěr: „Proč se poslední boj v poli neprovedl?" Protože break ukončil celý cyklus. Zbytek pole zůstal nezpracovaný — a to je přesně to, co chceme.

Řešení 5 — jedna z možných variant
reseni/reseni5_herni_smycka.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

4. Domácí úkol

Blok 18Domácí úkol na příští hodinu4. Domácí úkol

Uprav svůj Program.cs tak, aby se z něj stala hra se smyčkou:

  • herní smyčka while, která se pořád dokola ptá na příkaz,
  • alespoň čtyři příkazy (jdi, boj, batoh, konec),
  • ukončení přes break, když uživatel napíše konec nebo když padnou životy,
  • continue u příkazu, kterému hra nerozumí, a počítadlo takových chyb,
  • a na konci statistika vygenerovaná cyklem for (aspoň tři řádky s pruhem).

Ulož snímek obrazovky (nebo soubor Program.cs) a přines na příští hodinu.

Pro učitele

Tenhle úkol je poprvé „skutečná hra". Děti u něj vydrží déle než u čehokoliv předtím, protože jim odpovídá. Počítejte s tím, že přinesou víc, než jste chtěli.

Nekonečné cykly budou. Řekněte dopředu, že se program zastaví Ctrl+C a že se tím nic nerozbije. Bez téhle věty se někdo lekne a úkol vzdá.

Na začátku příští hodiny nechte dva tři žáky pustit svou hru na plátně a ostatní ať jim zadávají příkazy. Trvá to pět minut a je to nejlepší motivace, jakou v kurzu máte.

Kdo nemá doma .NET, udělá úkol přímo tady v prohlížeči — pole vstupu je pod kódem, každý příkaz na vlastní řádek.

Zobrazit ukázkové řešení domácího úkolu

Toto je jedna z možných variant, jak mohl úkol dopadnout. Tvoje řešení se může lišit a to je v pořádku.

domaci/domaci_ukol09.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 19Oficiální dokumentace4. Domácí úkol

Oficiální dokumentace je místo, kam se programátoři chodí podívat, když si chtějí něco ověřit nebo zjistit víc detailů. Je většinou v angličtině, ale to nevadí — zkus se orientovat podle názvu příkazu a podle ukázek kódu.

Co jsme použili Oficiální dokumentace Co tam najdeš
for Příkaz for tři části hlavičky a jejich pořadí
while Příkaz while cyklus, který se ptá před tělem
do-while Příkaz do cyklus, který se ptá až po těle
foreach Příkaz foreach procházení kolekcí, které už znáš
break Příkaz break okamžité ukončení cyklu
continue Příkaz continue přeskočení jednoho kola
i++, i-- Inkrement a dekrement rozdíl mezi i++ a ++i
% Aritmetické operátory zbytek po dělení a jeho použití
&&, \|\| Logické operátory skládání podmínek v hlavičce cyklu
pole.Length Pole délka pole a indexování od nuly
Console.Write Console.Write výpis bez odřádkování — nutný u vnořených cyklů
IndexOutOfRangeException IndexOutOfRangeException co znamená sáhnutí mimo pole
Jak s dokumentací pracovat na hodině

Stránka o iteračních příkazech má všechny čtyři cykly na jednom místě — je to jedna z mála stránek MS Learn, kterou se dětem vyplatí ukázat celou. Sjeďte ji na plátně a nechte je najít do-while. Trvá to minutu a ukáže jim to, že dokumentace je normální text, ne kouzlo.

Ve VS Code funguje i zkratka: napsat for a dvakrát Tab. Editor vygeneruje celou hlavičku. Naučte je to — ušetří to spoustu chyb se středníky.

5. Umíme informatiku

Blok 20Navazující cvičení na Umíme informatiku5. Umíme informatiku

Pro rychlejší studenty, kteří dokončí cvičení dřív, nebo na posledních 10–15 minut.

Cvičení Odkaz Proč se hodí
Želví grafika umimeinformatiku.cz Opakování příkazů je tam vidět jako obrázek — ideální na cykly
Programování — základy umimeinformatiku.cz Čtení kódu s cyklem a předpověď výstupu
Robot na mřížce umimeinformatiku.cz Opakuj krok N-krát — cyklus bez psaní kódu

Želví grafika je tu obzvlášť vhodná, protože výsledek cyklu je vidět okamžitě jako tvar. Kdo nechápe, proč se kód „vrací nahoru", pochopí to, jakmile uvidí, jak želva kreslí čtverec čtyřmi otočkami.

Jak to zařadit

Nedávejte to celé třídě naráz. Použijte to jako záložní aktivitu pro tři až pět nejrychlejších dětí, aby nerušily ostatní.

Dobrá alternativa přímo v kódu: zadejte „vykresli kosočtverec z hvězdiček". Je to na dvě vnořené smyčky, trvá to deset minut a kdo to dá, má cykly opravdu zvládnuté.