for, while, do-while, break, continue, vnořené cykly, nekonečný cyklusforeach už umíš — projde všechno v seznamu nebo slovníku.for (vím kolikrát) a while (vím, dokud kdy).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 |
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í.
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í.foreach versus for do hloubky. Stačí pravidlo: „procházím kolekci
→ foreach, počítám kolikrát → for".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.
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.
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.
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:
i a dej do něj 1,i <= 5? Ano → proveď tělo (složené závorky),i++ (teď je i dvojka),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.
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.
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:
zivoty musíš vyrobit před cyklem.kolo++ si musíš přičítat sám — while ti počítadlo nedá.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ý.
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ě.
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.
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é.
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.
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ší.
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í n² 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.
10 na jiné číslo.i = 1; i <= 10; i++).i * 2.i = i - 2.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)).
uroven * 12).if (uroven % 2 == 0).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.
sila hrdiny a sleduj, o kolik kol se souboj zkrátí.sila = 0. (Ano, nekonečný cyklus.)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.
break a podívej se, co se změní.continue obyčejným if. Funguje to stejně?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.
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.
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ří ; |
Tvoje zadání:
Než se hrdina pustí do dungeonu, projde tréninkovou arénou. Všechno opakování za tebe udělá
for.
- Napiš
for, který vypíše osm řádkůKolo 1 — tréninkažKolo 8 — trénink.💡 Poradit
Hlavička jefor (int kolo = 1; kolo <= 8; kolo++).
Uvnitř použij$"Kolo {kolo} — trénink".- Přidej odpočet od 5 do 1 — každý řádek s pruhem ze znaků
█.💡 Poradit
Dolů se počítái--a podmínka jei >= 1.
Pruh vyrobíš přesnew string('█', i).- Spočítej v cyklu, kolik zásahů hrdina za osm kol nasbíral (kolo × 3).
💡 Poradit
Před cyklemint celkem = 0;, uvnitřcelkem = celkem + kolo * 3;.- Vypiš jen kola, která jsou násobkem tří — ostatní přeskoč přes
continue.💡 Poradit
Násobek tří poznáš podlekolo % 3 != 0.
V takovém případě zavolejcontinue;.- Nakonec vykresli trojúhelník z hvězdiček — první řádek 1, pátý 5.
💡 Poradit
Potřebuješ cyklus v cyklu, nebo jednodušejinew 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) |
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 radek → CS0136.
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.
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.
- 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.- Ke každé úrovni spočítej životy podle vzorce
50 + uroven * 10.💡 Poradit
Proměnnouzivotysi spočítej uvnitř cyklu, ne před ním.- Přidej sloupec se zlatem
uroven * uroven * 5a zarovnej čísla.💡 Poradit
Zarovnání:zlato.ToString().PadLeft(6).- Ke každé páté úrovni připiš
◄ MILNÍK.💡 Poradit
Pátá úroveň je ta, kdeuroven % 5 == 0.
Značku si dej do proměnné a přilep na konec řádku.- Sečti zlato za celou tabulku a vypiš součet pod ní.
💡 Poradit
Akumulátorint 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) |
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.
Tvoje zadání:
Kolik kol potrvá souboj s trolem? To dopředu nevíš — a přesně proto se tu hodí
while.
- Připrav proměnné
zivotyPrisery = 60,silaHrdiny = 9akolo = 1.💡 Poradit
Všechny tři musí vzniknout před cyklem, jinak by se pořád nulovaly.- 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ň nakolo++.- 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).- Dej hrdinovi vlastní životy a nech příšeru vracet útok za 6.
💡 Poradit
Podmínka cyklu se rozšíří:while (zivotyPrisery > 0 && zivotyHrdiny > 0).- 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) |
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.
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.
- Projdi pole
jmenacyklemforpř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].- Příšery silnější než
limitpřeskoč pomocícontinue.💡 Poradit
Nejdřív vypiš, že ji obcházíš, a pak zavolejcontinue;.- Když narazíš na
"DRAK", ukonči výpravu přesbreak.💡 Poradit
Test na jméno:if (jmena[i] == "DRAK").
Tahle kontrola musí být první v těle cyklu.- Počítej poražené příšery a zlato (síla × 2).
💡 Poradit
Dvě proměnné před cyklem:porazenoazlato.- 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) |
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.
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.
- Projdi pole
prikazycyklemwhiles vlastním indexem.💡 Poradit
int index = 0;před cyklem,while (index < prikazy.Length), uvnitřindex++.- Podle příkazu proveď akci:
jdiposune,bojubere životy,batohvypíše zlato.💡 Poradit
Použijif/else if.
Aktuální příkaz si dej do proměnné:string prikaz = prikazy[index];.- Na příkaz
konecukonči smyčku přesbreak.💡 Poradit
Pozor:index++musí být předbreak, jinak na něm ztratíš přehled o pozici.- Neznámý příkaz spočítej do
chybya přeskoč přescontinue.💡 Poradit
Vewhilemusí býtindex++předcontinue— jinak vyrobíš nekonečný cyklus.- 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) |
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.
Uprav svůj
Program.cstak, 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íšekonecnebo když padnou životy,continueu 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.
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.
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.
Console.ReadLine() — jeden řádek na jedno čtení.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 |
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.
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.
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é.