← Přehled všech hodin

Seznamy a inventář hrdiny

Cíl hodiny: Děti odcházejí s programem, který umí batoh — věci do něj přidává, odebírá, počítá je a umí je všechny vypsat, i když dopředu neví kolik jich bude.
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.
Proč je tahle hodina důležitá:

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 Pět proměnných na pět věcí — ukážete, proč to nejde 10 min
Výklad Bloky Seznam je krabice na víc věcíMáš to v batohu? 35 min
Ukázky Demo 1–5, demo 5 spojuje seznam s herní smyčkou z minula 25 min
Cvičení Děti pracují samy, vy obcházíte 55 min
Závěr Kdo chce, ukáže svůj inventář před třídou 5 min
Hlavní pedagogický cíl

Jedna věta: jedna proměnná může držet víc hodnot najednou a program dopředu nemusí vědět kolik.

Všechno ostatní (Add, Count, indexy, foreach) je jen nářadí k téhle myšlence. Když si dítě odnese jen to, že „seznam je krabice s přihrádkami, které se dají přidávat a ubírat", je hodina splněná.

Druhá věc, kterou stojí za to nechat zaznít: foreach je první cyklus, který skončí sám od sebe. Minule museli break napsat ručně — teď se cyklus zastaví, když dojdou věci. To je pro ně příjemné zjištění.

Tři věci, které dnes NEVYSVĚTLUJTE
  1. Pole (string[]). Rozdíl mezi polem a List<T> je téma pro pokročilé. Dnes existuje jen List<T>, protože umí růst.
  2. Generika obecně. Lomené závorky v List<string> čtěte prostě jako „seznam textů". Slovo „generický typ" dnes nepadne.
  3. LINQ (.Max(), .Where(), .Sum()). Láká to, ale je to zkratka, která přeskočí přemýšlení. Maximum si dnes najdeme foreachem a podmínkou — přesně tak, jak to dělá procesor.
Časté omyly, na které buďte připraveni
  • „Seznam začíná jedničkou." Nezačíná. batoh[0] je první věc. Nejlepší obraz: index je „kolik kroků od začátku", ne „kolikátý v pořadí".
  • .Count versus poslední index. Když je v batohu 5 věcí, poslední má index 4. Tohle si musí osahat, ne zapamatovat.
  • Remove("meč") versus RemoveAt(0). Jedno hledá podle obsahu, druhé podle pozice. Pletou si to skoro všichni.
Poznámky pro učiteleRozjezd: ukažte problém, ne řešení1. Vysvětlení a souvislosti

Než řeknete slovo „seznam", nechte děti narazit na zeď.

Promítněte tenhle kód a řekněte: „hrdina sebral tři věci, vypište batoh."

string vec1 = "meč";
string vec2 = "štít";
string vec3 = "lektvar";

Console.WriteLine($"V batohu: {vec1}, {vec2}, {vec3}");

Funguje. A teď přitvrďte: „sebral čtvrtou věc. A pátou. A dvacátou."

Někdo navrhne vec4, vec5… nechte ho chvíli psát. Pak přijde otázka, která hodinu otevře: „A co když dopředu nevíme, kolik věcí hrdina sebere?"

Tady se dvě proměnné nespojí. Potřebujeme jednu krabici s přihrádkami, která umí růst. Tomu se říká seznam.

Blok 1Seznam je jedna krabice na víc věcí1. Vysvětlení a souvislosti

Proměnná string udrží jeden text. Seznam udrží textů, kolik chceš.

Čti to po částech:

  • List<string> = seznam textů. V lomených závorkách je vždycky napsané, co dovnitř patří.
  • batoh je jméno, které si volíš ty.
  • new List<string>() znamená „vyrob nový, zatím prázdný seznam".
  • .Add("meč") přidá věc na konec seznamu.
  • .Count je počet věcí uvnitř.

Tečka za jménem seznamu znamená „udělej se seznamem tohle".

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

Zkus si přidat čtvrtou věc — a všimni si, že nemusíš nic jiného měnit. Seznam roste sám.

Blok 2Index: sáhnu si na konkrétní věc1. Vysvětlení a souvislosti

Věci v seznamu jsou v řadě a každá má své číslo — index. A tady pozor: počítá se od nuly.

Proč od nuly?

Index neříká „kolikátá věc", ale „o kolik kroků od začátku". První věc je na začátku — nula kroků.

index:   0       1       2
        meč    štít  lektvar

batoh.Count je 3, ale poslední index je 2. Proto se poslední věc bere jako batoh[batoh.Count - 1].

Když sáhneš na batoh[3], program spadne — taková přihrádka neexistuje.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 3foreach: projdi všechno, co v seznamu je1. Vysvětlení a souvislosti

Vypisovat batoh[0], batoh[1], batoh[2] ručně je hloupost — a při deseti věcech nemožnost. Od toho je foreach.

Přečti to jako větu:

„Pro každou věc vec v batohu udělej to, co je ve složených závorkách."

  • string vec je proměnná, která v každém kole drží jednu věc.
  • in batoh říká, odkud se bere.
  • Cyklus se zastaví sám, až věci dojdou. Žádný break nepotřebuje.

Jméno vec si volíš ty. Klidně foreach (string predmet in batoh).

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

Tohle je zásadní rozdíl oproti minulé hodině: while (true) běží, dokud ho nezastavíš. foreach ví, kdy skončit.

Blok 4Číslované procházení1. Vysvětlení a souvislosti

Někdy chceš u každé věci i její pořadí. Pak si vedle foreach vezmeš počítadlo.

Počítadlo je nad cyklem — přesně jako minule stav nad herní smyčkou. Kdyby bylo uvnitř, bylo by pořád jedna.

Ve výpisu začínáme jedničkou, protože pro člověka je přirozenější „první věc" než „věc s indexem nula". Program uvnitř dál počítá od nuly, ale hráč to nemusí vědět.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 5Odebírání: Remove a RemoveAt1. Vysvětlení a souvislosti

Když hrdina lektvar vypije, musí z batohu zmizet. Na to jsou dva způsoby a je důležité je nepomíchat.

Metoda Co dělá
.Remove("štít") najde věc podle obsahu a smaže první nalezenou
.RemoveAt(0) smaže věc na dané pozici
.Clear() vysype celý batoh

Když Remove hledanou věc nenajde, nic se nestane a program nespadne. Zato RemoveAt(10) v tříprvkovém seznamu program shodí.

Po každém odebrání se indexy posunou. To děti překvapí — a je to logické: když z řady odejde druhý, třetí se stane druhým.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 6Máš to v batohu?1. Vysvětlení a souvislosti

Než hrdina něco použije, musí se program zeptat, jestli to vůbec má.

.Contains("lektvar") vrátí true, nebo false — přesně to, co potřebuje if.

Pozor na velká písmena: "Lektvar" a "lektvar" jsou pro počítač dvě různé věci. Jak se s tím vypořádat, si ukážeme příště u řetězců.

Hodí se ještě .IndexOf("meč") — vrátí pozici věci, nebo -1, když tam není.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 7Seznam čísel funguje úplně stejně1. Vysvětlení a souvislosti

Do seznamu nemusí patřit jen text. List<int> je seznam celých čísel — třeba škody, které hrdina rozdal v jednotlivých kolech.

Všechno je stejné, jen v lomených závorkách je int místo string.

  • Součet se hromadí v proměnné nad cyklem — stejný trik jako minule.
  • Uvnitř foreach je skoda jedno konkrétní číslo.
  • soucet / skody.Count dělí celá čísla, takže zbytek zahodí. Průměr 15 z čísel 15, 22 a 8 je tedy „patnáct", ne „15,0".

Seznam čísel se hodí na skóre, životy družiny nebo hody kostkou.

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

Pár věcí, které dětem neříkáte, ale vy je vědět chcete.

List<T> je generický typ. Zápis List<string> znamená „instance třídy List parametrizovaná typem string". Kompilátor díky tomu hlídá, že do seznamu nepřidáte číslo, a zároveň odpadá boxing, který trápil starý ArrayList z .NET 1.1.

Uvnitř je pole. List<T> drží obyčejné pole a kapacitu. Když se zaplní, alokuje nové pole dvojnásobné velikosti a data zkopíruje. Proto je Add amortizovaně O(1), zatímco Insert(0, x) je O(n) — musí všechno posunout. Remove(x) je taky O(n), protože nejdřív hledá.

foreach není magie. Kompilátor ho přeloží na volání GetEnumerator() a opakované MoveNext() / Current. Praktický důsledek, na který děti narazí: když uvnitř foreach seznam změníte, program vyhodí InvalidOperationException („Collection was modified"). Řešení, které dnes stačí ukázat: nejdřív si poznamenat, co se má smazat, a smazat to až po cyklu.

using System.Collections.Generic; by byl potřeba ve starším C#. Od .NET 6 jsou zapnuté implicit usings, takže List<T> funguje rovnou — a naše prostředí je má zapnuté taky.

Proč ne LINQ. skody.Max() je jednořádkové a svůdné, ale schová přesně to přemýšlení, které dnes trénujeme. Nechte foreach. LINQ přijde, až budou mít cykly v malíku.

2. Ukázky pro projekci

Blok 8Ukázka 1 — Batoh, který roste2. Ukázky pro projekci

Nejjednodušší možný inventář: pár věcí, počet a hezký výpis.

demo/demo1_batoh.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 u toho říct: změňte počet věcí přímo před třídou. Výpis se přizpůsobí sám — nic dalšího přepisovat nemusíte. Přesně proto seznamy existují.

Blok 9Ukázka 2 — Sbírám a vyhazuji2. Ukázky pro projekci

Batoh není jen sklad. Věci do něj přibývají a zase mizí.

demo/demo2_sber.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 u toho říct: Contains před Remove je dobrý zvyk. Zeptejte se, co by se stalo, kdyby hrdina lektvar neměl — Remove by tiše neudělal nic a hláška by přesto lhala.

Blok 10Ukázka 3 — Statistiky soubojů2. Ukázky pro projekci

Seznam čísel a foreach dokážou spočítat věci, na které by ručně nikdo neměl trpělivost.

demo/demo3_statistiky.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 u toho říct: hledání maxima je klasický algoritmus. nejvic začíná na nule a při každém větším čísle se přepíše. Nechte děti popsat, co se v proměnné děje kolo po kole — to je celé „myšlení jako počítač".

Blok 11Ukázka 4 — Obchod se dvěma seznamy2. Ukázky pro projekci

Jeden seznam je zboží v obchodě, druhý je batoh. Nákup znamená přesun.

demo/demo4_obchod.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 u toho říct: nákup jsou tři kroky — odečíst peníze, přidat do batohu, odebrat z nabídky. Když jeden krok vynecháte, obchod začne podvádět. Nechte děti najít, který krok chybí, když ho schválně smažete.

Blok 12Ukázka 5 — Inventář v herní smyčce2. Ukázky pro projekci

Tady se minulá hodina potkává s dnešní: smyčka běží, seznam si pamatuje.

demo/demo5_inventar.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.

Co u toho říct: List<string> batoh je deklarovaný nad smyčkou — úplně stejné pravidlo jako minule u životů a zlata. Kdyby byl uvnitř, batoh by se každé kolo vysypal.

Zkuste do vstupního okénka přidat další řádky a spustit znovu.

Blok 13Když se něco pokazí2. Ukázky pro projekci

Čtyři chyby, na které u seznamů narazí úplně každý.

List<string> batoh = new List<string>();
batoh.Add("meč");
batoh.Add("štít");

Console.WriteLine(batoh[2]);

Tenhle kód spadne. V batohu jsou dvě věci, takže existují indexy 0 a 1. Index 2 už ne.

Hláška zní ArgumentOutOfRangeException a znamená prostě: „sáhl jsi vedle."

Správně je batoh[batoh.Count - 1].

Hláška / projev Co se stalo Jak to spravit
ArgumentOutOfRangeException Sáhl jsi na index, který neexistuje Poslední věc je batoh[batoh.Count - 1]
InvalidOperationException: Collection was modified Uvnitř foreach jsi ze seznamu mazal Poznamenej si, co smazat, a smaž to až po cyklu
CS1061: List&lt;string&gt; does not contain a definition for 'Length' Seznam nemá Length U seznamu je to .Count
CS0165: Use of unassigned local variable Chybí = new List<string>() Seznam se musí nejdřív vyrobit
Program nic nevypíše Seznam je prázdný, foreach nemá co projít Zkontroluj, jestli se Add opravdu provedl
Remove nic neudělal Text se neshoduje úplně přesně "Meč" není "meč" — porovnej znak po znaku
Pro učitele

Chybu „Collection was modified" schválně vyrobte na projektoru:

List<string> batoh = new List<string>();
batoh.Add("meč");
batoh.Add("štít");

foreach (string vec in batoh)
{
    batoh.Remove(vec);
}

Vypadá to nevinně a spadne to. Vysvětlení pro děti stačí obrazné: „nemůžeš trhat stránky z knihy, kterou zrovna čteš."

3. Cvičení

Jak na to: Do každého cvičení máš připravený start s komentáři // TODO. Když nevíš, klikni na 💡 Poradit u příslušného bodu zadání — v dílně se ti kód posune o jeden krok dál. Nejdřív to ale zkus sám.
Blok 14Cvičení 1 — Seznam kouzel (15 min)3. Cvičení

Tvoje zadání:

Každý čaroděj má svůj seznam kouzel. Ten tvůj se bude učit nová.

  1. Vytvoř seznam kouzla a přidej do něj tři kouzla
    💡 Poradit
    List<string> kouzla = new List<string>(); a pak třikrát kouzla.Add("...");.
    Kouzla si vymysli — třeba „ohnivá koule".
  2. Vypiš, kolik kouzel čaroděj umí
    💡 Poradit
    Počet je kouzla.Count. Použij interpolaci: Console.WriteLine($"Umíš {kouzla.Count} kouzel.");.
  3. Vypiš všechna kouzla pod sebe pomocí foreach
    💡 Poradit
    foreach (string kouzlo in kouzla) { Console.WriteLine($"✨ {kouzlo}"); }.
    Uvnitř závorek je vždycky jedno konkrétní kouzlo.
  4. Přidej číslování — každé kouzlo dostane své pořadí
    💡 Poradit
    Počítadlo int cislo = 1; musí být nad cyklem.
    Uvnitř pak cislo++; na konci.
  5. Vypiš první a poslední kouzlo ze seznamu
    💡 Poradit
    První je kouzla[0]. Poslední je kouzla[kouzla.Count - 1] — protože indexy začínají nulou.
Úroveň Co má zvládnout
Minimum Body 1–3: seznam existuje a foreach ho vypíše
Rozšíření Body 4–5 s číslováním a prací s indexy
Výzva Přidat čtvrté kouzlo pomocí Insert(0, "...") na začátek seznamu
cviceni/cviceni1_kouzla.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: očíslovaná kniha kouzel, která se sama přizpůsobí počtu kouzel v seznamu.

Kde se zaseknou:

  • Zapomenuté new List<string>(). Napíšou jen List<string> kouzla; a kompilátor se ohradí (CS0165). Obraz: deklarace je jméno na krabici, new je ta krabice.
  • kouzla[3] jako poslední. Klasika. Nechte je spočítat na prstech a pak ukažte kouzla.Count - 1.
  • Počítadlo uvnitř cyklu. Vypíše se pětkrát „1." — stejná chyba jako minulou hodinu se stavem nad smyčkou. Připomeňte souvislost.
  • Count() se závorkami. Count je vlastnost, ne metoda. Závorky navíc vyhodí chybu — dobrá příležitost říct, že tečka může vést k obojímu.

Kdo je hotový dřív: kouzla.Insert(0, "blesk"); přidá kouzlo na začátek a posune ostatní. Nechte je uhodnout, co se stane s kouzla[0].

Otázka na závěr cvičení: „Kolik věcí je v seznamu, když je poslední index 4?" Pět.

Řešení 1 — jedna z možných variant
reseni/reseni1_kouzla.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í 2 — Batoh s limitem (20 min)3. Cvičení

Tvoje zadání:

Hrdina neunese všechno. Batoh pojme nejvýš čtyři věci — a program to musí hlídat.

  1. Vytvoř prázdný seznam batoh a proměnnou limit = 4
    💡 Poradit
    List<string> batoh = new List<string>(); a pod to int limit = 4;.
    Seznam zatím zůstane prázdný — věci přidáš až v dalších krocích.
  2. Přidej do batohu tři věci a vypiš obsah
    💡 Poradit
    Třikrát batoh.Add("..."); a pak foreach (string vec in batoh) { Console.WriteLine($" • {vec}"); }.
  3. Zkus přidat čtvrtou věc, ale jen když se do batohu vejde
    💡 Poradit
    Podmínka porovná počet s limitem: if (batoh.Count < limit) { batoh.Add("lano"); } else { Console.WriteLine("Batoh je plný!"); }.
  4. Zkus přidat pátou věc — ta se už vejít nesmí
    💡 Poradit
    Stejná podmínka, jiná věc. Když ti pátá věc projde, zkontroluj, jestli používáš < a ne <=.
  5. Vyhoď jednu věc a vypiš, kolik místa v batohu zbývá
    💡 Poradit
    batoh.Remove("štít"); a pak Console.WriteLine($"Volné místo: {limit - batoh.Count}");.
Úroveň Co má zvládnout
Minimum Body 1–2: batoh se naplní a vypíše
Rozšíření Body 3–4: limit opravdu funguje a pátá věc se nevejde
Výzva Před vyhozením ověřit Contains a navíc vypsat ukazatel místa z new string('▪', ...)
cviceni/cviceni2_limit.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: batoh, do kterého se čtvrtá věc ještě vejde a pátá už ne — a program to slušně oznámí.

Kde se zaseknou:

  • <= místo <. Do batohu se vejde pět věcí místo čtyř. Nejlepší chyba hodiny: nechte je spočítat, kolik věcí tam skutečně skončilo.
  • Kontrola až po Add. Věc se přidá a teprve pak se program ptá, jestli se vejde. Stejné pořadí jako minule u zlata.
  • Limit jako natvrdo napsaná čtyřka. Funguje, ale ukažte, že s proměnnou limit stačí změnit jedno místo. Programátorská lenost je ctnost.
  • Remove na neexistující věc. Nespadne, jen tiše neudělá nic. Proto se hodí Contains předtím.

Kdo je hotový dřív: ukazatel zaplnění: new string('▪', batoh.Count) + new string('·', limit - batoh.Count).

Otázka na závěr cvičení: „Proč je v podmínce < a ne <=?" Protože se ptáme před přidáním — musí zbýt aspoň jedno volné místo.

Řešení 2 — jedna z možných variant
reseni/reseni2_limit.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í 3 — Statistiky soubojů (20 min)3. Cvičení

Tvoje zadání:

Hrdina bojoval pět kol. Spočítej, jak si vedl — ale všechno musí spočítat program, ne ty.

  1. Vytvoř List<int> skody a přidej do něj pět čísel
    💡 Poradit
    List<int> skody = new List<int>(); a pětkrát skody.Add(12); s různými čísly.
    Uvnitř lomených závorek je teď int, protože jde o čísla.
  2. Vypiš všechna čísla i s číslem kola
    💡 Poradit
    Počítadlo int kolo = 1; nad cyklem, uvnitř Console.WriteLine($"{kolo}. kolo: {skoda}"); a kolo++;.
  3. Spočítej celkové poškození
    💡 Poradit
    Proměnná int soucet = 0; musí být nad cyklem, uvnitř pak soucet = soucet + skoda;.
  4. Najdi nejsilnější zásah
    💡 Poradit
    int nejvic = 0; nad cyklem a uvnitř podmínka if (skoda > nejvic) { nejvic = skoda; }.
  5. Vypiš souhrn: počet kol, součet, maximum a průměr
    💡 Poradit
    Průměr je soucet / skody.Count. Souhrn patří pod cyklus — až když je spočítáno všechno.
Úroveň Co má zvládnout
Minimum Body 1–3: čísla se vypíšou a součet sedí
Rozšíření Body 4–5 s maximem a souhrnem
Výzva Najít i nejslabší zásah a ke každému kolu dokreslit sloupec new string('█', skoda / 3)
cviceni/cviceni3_statistiky.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: pět řádků záznamu a pod nimi souhrn, který sedí na to, co je vidět nahoře.

Kde se zaseknou:

  • soucet uvnitř cyklu. Součet se každé kolo vynuluje a na konci zůstane poslední škoda. Stejné pravidlo jako u stavu nad herní smyčkou — připomeňte, že je to potřetí, co na to narazili.
  • nejvic začíná na velkém čísle. Někdo dá int nejvic = 100; a maximum se nikdy nepřepíše. Nula funguje, protože škody jsou kladné.
  • Souhrn uvnitř cyklu. Vypíše se pětkrát. Otázka: „je ten řádek nad }, nebo pod ním?"
  • Dělení celých čísel. soucet / skody.Count zahodí desetinnou část. Není to chyba, ale řekněte to nahlas, ať se nediví.

Kdo je hotový dřív: hledání minima (int nejmene = 999; a obrácená podmínka) a sloupcový graf new string('█', skoda / 3).

Otázka na závěr cvičení: „Proč nejvic začíná na nule a ne na sto?" Protože první škoda ho musí přebít.

Řešení 3 — jedna z možných variant
reseni/reseni3_statistiky.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í 4 — Řazení družiny (25 min)3. Cvičení

Tvoje zadání:

Do družiny se přidávají a odcházejí hrdinové. Seznam umí i věci, které bys sám dělal dlouho.

  1. Vytvoř seznam druzina se čtyřmi jmény a vypiš ho
    💡 Poradit
    List<string> druzina = new List<string>(); a čtyřikrát .Add().
    Na výpis použij foreach — bude se hodit ještě několikrát.
  2. Seřaď družinu podle abecedy a vypiš znovu
    💡 Poradit
    Stačí jediný řádek: druzina.Sort();.
    Pozor — Sort nic nevrací, mění přímo ten seznam, který má před tečkou.
  3. Otoč pořadí pozpátku a vypiš
    💡 Poradit
    druzina.Reverse(); obrátí pořadí věcí.
    Když ho dáš hned za Sort(), dostaneš abecedu odzadu.
  4. Zjisti, na které pozici stojí konkrétní hrdina
    💡 Poradit
    int pozice = druzina.IndexOf("Elora");.
    Když tam jméno není, vrátí -1 — na to se dá zeptat podmínkou.
  5. Přidej velitele na začátek a posledního člena vyhoď
    💡 Poradit
    druzina.Insert(0, "Velitel Torm"); vloží na pozici 0 a ostatní posune.
    Posledního odebereš přes druzina.RemoveAt(druzina.Count - 1);.
Úroveň Co má zvládnout
Minimum Body 1–2: družina se vypíše a seřadí
Rozšíření Body 3–4: obrácení pořadí a hledání pozice
Výzva Ošetřit IndexOf, když hrdina v družině není (-1), a vypsat všechny tři verze seznamu pod sebe
cviceni/cviceni4_druzina.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: tři různá pořadí téhož seznamu a nakonec družina s velitelem v čele.

Kde se zaseknou:

  • druzina = druzina.Sort(); Klasický omyl z jiných jazyků. Sort() nic nevrací, mění seznam přímo. Kompilátor to hezky odmítne — využijte to.
  • Zapomenutý výpis mezi kroky. Po Sort() a Reverse() nic nevypíšou a diví se, že „to nic nedělá". Změna je vidět jen tehdy, když ji vypíšeš.
  • Čeština v abecedě. Sort() řadí podle nastavení prostředí, takže Č nemusí skončit tam, kde bychom čekali. Neřešte to, jen to zmiňte.
  • RemoveAt(druzina.Count). O jedna vedle — a program spadne. Poslední index je vždycky Count - 1.

Kdo je hotový dřív: hledat jméno, které v družině není, a ošetřit -1. Případně přidat druhého velitele a nechat je vysvětlit, co udělá Insert(0, ...) podruhé.

Otázka na závěr cvičení: „Co vrátí IndexOf u jména, které v seznamu není?" Mínus jedna — a proto se na to ptáme podmínkou.

Řešení 4 — jedna z možných variant
reseni/reseni4_druzina.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 18Cvičení 5 — CsQuest: inventář ve hře (30 min)3. Cvičení

Tvoje zadání:

Finále hodiny: spoj herní smyčku z minula se seznamem z dneška.

  1. Nad smyčkou vytvoř seznam batoh s jednou věcí a vypiš nabídku příkazů
    💡 Poradit
    Seznam musí vzniknout nad while, jinak by se každé kolo vysypal.
    Do nabídky napiš: seber, zahoď, batoh, konec.
  2. Přidej smyčku while (true) s pojistkou a break na konec
    💡 Poradit
    Stejná kostra jako minulou hodinu: Console.Write("> ");, string prikaz = Console.ReadLine(); a if (prikaz == null || prikaz == "konec") { break; }.
  3. Příkaz batoh vypíše obsah pomocí foreach
    💡 Poradit
    Uvnitř větve je celý cyklus — cyklus ve smyčce. Odsazuj po čtyřech mezerách, ať se v závorkách neztratíš.
    Vypiš i počet: {batoh.Count}.
  4. Příkaz seber přidá pochodeň, ale jen když ji hrdina ještě nemá
    💡 Poradit
    Nejdřív se zeptej: if (batoh.Contains("pochodeň")) { ... } else { batoh.Add("pochodeň"); }.
  5. Příkaz zahoď vyhodí poslední věc a pod smyčkou vypiš souhrn
    💡 Poradit
    Poslední věc: batoh.RemoveAt(batoh.Count - 1); — ale jen když batoh.Count > 0.
    Souhrn patří až pod uzavírací } smyčky.
Úroveň Co má zvládnout
Minimum Body 1–3: smyčka běží a příkaz batoh vypíše obsah
Rozšíření Body 4–5: sbírání s kontrolou a vyhazování poslední věci
Výzva Přidat seber lano, limit batohu na 4 věci a počítadlo, kolik věcí hrdina za hru sebral
cviceni/cviceni5_inventar.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.
Pro učitele — na co si dát pozor

Očekávaný výsledek: hratelný inventář. Děti si ho budou chtít pustit několikrát s jiným vstupem — nechte je.

Kde se zaseknou:

  • Seznam uvnitř smyčky. Batoh se každé kolo vysype a nikdy nic neobsahuje. Přesně stejná chyba jako minulou hodinu — ale teď je vidět ještě líp.
  • Ztracená závorka. foreach uvnitř while uvnitř if je pro ně nejhlubší vnoření, jaké zatím psali. Ať odsazují, ať to vidí.
  • RemoveAt(batoh.Count). O jedna vedle a program spadne. Kontrola batoh.Count > 0 navíc řeší prázdný batoh.
  • Vyhozená věc bez uložení. Když nejdřív smažou a pak chtějí vypsat, co vyhodili, už to nemají. Proto string vyhozeno = ...; před RemoveAt.

Kdo je hotový dřív: limit batohu (proměnná limit a kontrola v seber), příkaz seber lano a počítadlo sebraných věcí za celou hru.

Otázka na závěr cvičení: „Kde přesně je v tvém programu stav hry?" Odpověď: seznam batoh nad smyčkou. Tohle je hlavní myšlenka obou hodin.

Řešení 5 — jedna z možných variant
reseni/reseni5_inventar.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.

4. Domácí úkol

Blok 19Domácí úkol — Nákupní seznam do lékárny4. Domácí úkol

Zadání: Alchymista potřebuje přísady na velký lektvar. Napiš program, který jeho seznam zvládne.

  1. Vytvoř seznam prisady a přidej do něj pět přísad.
  2. Vypiš celý seznam očíslovaný pomocí foreach a počítadla.
  3. Zjisti, jestli seznam obsahuje "dračí šupina" — a napiš, co zjistíš.
  4. Jednu přísadu ze seznamu odeber a jednu novou přidej.
  5. Nakonec seznam seřaď podle abecedy a vypiš znovu i s počtem přísad.

Co musí program umět:

Požadavek Popis
Seznam List<string> vytvořený přes new List<string>()
Procházení Alespoň dva výpisy pomocí foreach
Rozhodování Contains v podmínce if
Změna seznamu Aspoň jedno Remove (nebo RemoveAt) a jedno Add
Souhrn Počet přísad přes .Count

Bonus (nepovinně): přidej List<int> ceny, spočítej foreachem celkovou cenu nákupu a napiš, jestli alchymistovi stačí 100 zlatých.

Pro učitele

Úkol je schválně poskládaný ze čtyř věcí, které dnes trénovali: vytvoření seznamu, foreach, Contains a změna obsahu. Nic nového.

Při opravě sledujte hlavně dvě věci: jestli je počítadlo nad cyklem a jestli po Remove/Add seznam vypisují znovu — jinak změnu není vidět.

Nejčastější odevzdaná chyba: Sort() zavolaný, ale nikdy nevypsaný výsledek. Dobrý námět na příští hodinu: „změna, kterou nikdo nevidí, je pro uživatele stejná jako změna, která se nestala."

Zobrazit ukázkové řešení domácího úkolu
domaci/domaci_ukol06.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 20Oficiální dokumentace4. Domácí úkol

Až budeš chtít vědět víc, tady jsou původní zdroje. Jsou anglicky, ale kód v nich je stejný jako ten tvůj.

Téma Odkaz
Třída List<T> learn.microsoft.com — List<T>
List<T>.Add learn.microsoft.com — Add
List<T>.Remove a RemoveAt learn.microsoft.com — Remove
List<T>.Contains learn.microsoft.com — Contains
List<T>.Sort learn.microsoft.com — Sort
Příkaz foreach learn.microsoft.com — foreach
Kolekce v C# learn.microsoft.com — collections

5. Umíme informatiku

Blok 21Co jsme se dnes naučili5. Umíme informatiku

Dneska se tvůj program naučil pracovat s množstvím. Do teď uměl jednu hodnotu v jedné proměnné. Teď zvládne pět věcí — nebo padesát, a nemusíš kvůli tomu přepsat ani řádek.

Dovednost Kde se ti bude hodit
List<T> a .Add() Inventář, seznam úkolů, playlist, kontakty v telefonu
Indexy od nuly Úplně všude v programování — od tabulek po pixely obrázku
foreach Vždycky, když chceš „udělat něco s každým"
.Contains() Vyhledávání, filtry, kontrola oprávnění

Kde to potkáš v životě: každý seznam, který na telefonu odscrolluješ — zprávy, písničky, fotky — je uvnitř přesně takováhle kolekce. Aplikace neví dopředu, kolik jich bude, a foreach je vykreslí jeden po druhém.

Příště: hrdina má batoh, ale mluví jako robot. Příště se naučíme pracovat s textem — rozdělovat ho, spojovat, hledat v něm a skládat z něj hlášky. CsQuest konečně začne mluvit lidsky.