← Přehled všech hodin

Vstupy od uživatele

Cíl hodiny: Program přestane být filmem a stane se rozhovorem. Děti umí načíst text i číslo od uživatele a nenechají program spadnout, když někdo napíše hloupost.
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.
Na co navazujeme:
Jak spouštět programy se vstupem

Tady na stránce najdeš pod kódem políčko stdin. Do něj předepíšeš odpovědi — každou na samostatný řádek — a teprve pak klikneš na Spustit. Program si je přečte, jako by je někdo psal na klávesnici.

Na počítači žádné políčko není: spustíš dotnet run a odpovědi píšeš normálně.

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 Kontrola úkolu, promítnutí dvou panelů z minula 10 min
Otázka a odpověď Console.Write + Console.ReadLine, první rozhovor 25 min
Text versus číslo int.Parse, pád na FormatException, TryParse 35 min
Ukázky Demo 1–5, hlavně demo 4 (odolný vstup) 15 min
Cvičení Děti pracují samy, vy obcházíte 45 min
Závěr Kdo chce, nechá spolužáka vytvořit postavu ve svém programu 5 min
Hlavní pedagogický cíl

Dnešní zážitek je jednoduchý a silný: program se mě zeptal a odpověděl mi. Děti poprvé ukážou program někomu jinému a ten s ním něco udělá.

Odborný cíl je ale jinde: z klávesnice přijde vždycky text. Když tohle dítě pochopí, přestane se divit, proč Console.ReadLine() * 2 nejde a proč se "5" + 5 rovná 55.

Třetí, nenápadný cíl: program nesmí spadnout kvůli uživateli. Odsud vede přímá cesta k TryParse a k tomu, co se v praxi nazývá ošetření vstupu.

Tři věci, které dnes NEVYSVĚTLUJTE
  1. Výjimky a try/catch. Pád ukažte, ale neřešte mechaniku. TryParse je pro dnešek plnohodnotná odpověď.
  2. null a nullable typy. Editor bude podtrhávat string x = Console.ReadLine(); varováním CS8600. Řekněte, že je to varování, ne chyba, a jde se dál.
  3. Cykly „ptej se, dokud nezadá správně". Bez while to nejde a while přijde v 6. hodině. Dnes stačí náhradní hodnota.

Jak pracovat se smíšenou úrovní. Slabší zvládnou Minimum — přečíst text a vypsat ho zpátky. Rychlíkům dejte hned Výzvu s TryParse a nechte je vymýšlet, čím by šel program „rozbít". Bude je to bavit víc než cokoli jiného.

Blok 1Otázka a odpověď1. Vysvětlení a souvislosti
demo/vyklad1_otazka.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.

Rozhovor má vždycky dvě půlky.

  • Console.Write("...") položí otázku a zůstane na řádku, takže kurzor bliká hned za otazníkem. Proto Write, ne WriteLine.
  • Console.ReadLine() počká, dokud uživatel nestiskne Enter, a vrátí to, co napsal — jako string.

Console.ReadLine() je jako otázka, po které si musíš počkat na odpověď. Program se na tom řádku zastaví a nic dalšího se neděje, dokud uživatel nezmáčkne Enter.

Odpověď je vždycky text. I když uživatel napíše 42, přijde to jako "42" — jako text. To je nejdůležitější věta dnešní hodiny.

Studenti zkuste změnit
  • Změň otázku a do políčka stdin napiš jiné jméno.
  • Přidej druhou otázku a druhou proměnnou.
  • Zkus místo Console.Write použít Console.WriteLine. Kde teď bliká kurzor?
  • Nech políčko stdin prázdné a spusť. Co se vypíše?
Blok 2Z textu na číslo1. Vysvětlení a souvislosti

Text se sčítá slepováním, čísla se sčítají počítáním. Proto "42" + 8428, zatímco 42 + 850.

  • int.Parse(text) — udělá z textu celé číslo.
  • double.Parse(text) — udělá z textu desetinné číslo.

Proč je u double.Parse ta dlouhá přípona? Protože v Česku se desetinná místa oddělují čárkou, ale v kódu a na internetu tečkou. InvariantCulture říká: „ber to vždycky s tečkou, ať je počítač nastavený jakkoli." Bez ní by "2.5" na českém Windows neprošlo.

Pro celá čísla (int.Parse) tenhle problém neexistuje — celé číslo žádnou desetinnou značku nemá.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Zkratka pro dnešek

Když budeš od uživatele chtít desetinné číslo, je jednodušší zeptat se na celé číslo a vydělit ho. Místo „zadej 2.5" se ptej „zadej sílu v desetinách" a pak sila / 10.0. Ušetříš si spoustu problémů s čárkou a tečkou.

Blok 3Co se stane, když uživatel napíše hloupost1. Vysvětlení a souvislosti
Unhandled exception. System.FormatException:
The input string 'draci ohen' was not in a correct format.
   at System.Int32.Parse(String s)
   at Program.<Main>$(String[] args) in Program.cs:line 3

Tohle není chyba překladače, ale pád za běhu. Program se v pohodě přeložil, spustil — a v půlce spadl, protože int.Parse("draci ohen") nemá z čeho udělat číslo.

Čti hlášku odspodu:

  • Program.cs:line 3 — kde to prasklo,
  • System.FormatException — jaký druh problému,
  • was not in a correct format — proč.

Kdo je vinen? Ne uživatel. Program, který s takovou možností nepočítal. Opravdové programy se s uživateli nehádají — počítají s tím, že napíšou cokoli.

int.TryParse je int.Parse, který se nebojí. Nikdy nespadne. Místo toho vrátí bool: povedlo se, nebo ne?

int.TryParse(text, out int cislo)
             ↑           ↑
         co převádím   kam to ulož
  • Když se to povede, vrátí true a do cislo uloží výsledek.
  • Když ne, vrátí false a do cislonulu.

Slovíčko out znamená „tahle proměnná je výstup" — metoda do ní něco zapíše. out int cislo proměnnou rovnou vyrobí, nemusíš ji deklarovat předem.

Úplně stejně funguje double.TryParse.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 4Bezpečné čtení čísla1. Vysvětlení a souvislosti
demo/vyklad2_bezpecne_cteni.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.

Recept, který budeš používat pořád:

  1. Načti odpověď do string.
  2. Připrav si náhradní hodnotu pro případ, že vstup nedává smysl.
  3. if (int.TryParse(vstup, out int zadano))„povedlo-li se to, …"
  4. Uvnitř složených závorek přepiš náhradní hodnotu tou zadanou.
To `if` zatím ber jako kouzelnou formulku

if znamená „jestliže" a příští hodinu se mu budeme věnovat celou hodinu. Dneska stačí vědět, že kód ve složených závorkách se provede jen tehdy, když se převod povedl. Zkus do políčka stdin napsat jednou 20 a podruhé draci ohen — a porovnej výstup.

Pro učitele — proč zrovna takhle

Zápis if (int.TryParse(vstup, out int zadano)) je pro děti nový hned dvakrát (podmínka + out), ale platí se to jednou a vydrží do konce kurzu. Alternativa „nejdřív bool ok = ..., pak if (ok)" je delší, zato čitelnější — klidně ji použijte, když vidíte, že třída plave.

Nenechte se stáhnout k while. Otázka „a co když chci, aby se to ptalo znovu?" přijde určitě. Odpověď: „přesně to budeme umět v šesté hodině, poznamenej si to." Cykly dnes nezvládnete odučit a rozbijete tím hodinu.

Blok 5Co se dá dělat s přijatým textem1. Vysvětlení a souvislosti

Lidi píšou nedbale. Přidají mezeru, zapomenou velké písmeno. Proto se text od uživatele skoro vždycky nejdřív uklidí.

Zápis Co udělá
.Trim() ořízne mezery na začátku a na konci
.ToUpper() udělá VELKÁ PÍSMENA
.ToLower() udělá malá písmena
.Length řekne, kolik má text znaků
.Substring(0, 1) vezme 1 znak od pozice 0

Všimni si tečky: ocisteny.Trim() se čte „u textu ocisteny proveď Trim". Metody se dají řetězit: vstup.Trim().ToUpper().

Pozor: .Length nemá závorky, .Trim() je má. Je to tak prostě zvykem — Length je vlastnost (údaj), Trim() je metoda (činnost).

Klikni vlevo na Spustit a objeví se tu výstup programu.
Na co si dát pozor u Substring

Substring(0, 1) spadne, když je text prázdný — nemá z čeho brát. Proto vždycky nejdřív Trim() a v ostrém programu i kontrola délky. Dnes to necháme být, jen o tom víš.

Blok 6Celý rozhovor pohromadě1. Vysvětlení a souvislosti
demo/vyklad3_rozhovor.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 si z toho odnést: program se ptá, uklidí si odpovědi, jednu z nich bezpečně převede na číslo a z toho všeho něco spočítá. To je celý dnešek — a zároveň kostra, na které bude stát celá hra.

Poznámky pro učiteleTechnické pozadí — jen pro vás1. Vysvětlení a souvislosti

Co přesně Console.ReadLine() vrací. Přesně string?, tedy text, který může být null — a to ve chvíli, kdy vstup skončí (uživatel stiskne Ctrl+D / Ctrl+Z, nebo se čte z přesměrovaného souboru, kterému došly řádky). Proto editor u string jmeno = Console.ReadLine(); ukáže varování CS8600. Není to chyba a program poběží. Kdo se zeptá, dostane odpověď „tohle vyřešíme, až budeme umět podmínky"; korektní zápis je string jmeno = Console.ReadLine() ?? "";.

Prázdný řádek versus null. Když uživatel jen zmáčkne Enter, přijde prázdný string (""), ne null. To je rozdíl, na který se děti občas ptají.

Parse versus TryParse. Obojí uvnitř dělá totéž. Rozdíl je, co se stane při neúspěchu: Parse vyhodí FormatException, TryParse vrátí false. Výjimky jsou drahé, takže TryParse je i rychlejší — ale hlavní důvod je čitelnost.

out parametr. out znamená, že metoda do proměnné musí něco zapsat dřív, než skončí. Proto TryParse při neúspěchu nastaví nulu — nesmí proměnnou nechat nepřiřazenou. Zápis out int zadano přímo v volání je „inline out variable" a funguje od C# 7.

Kultura a desetinná čárka. double.Parse("2.5") na stroji s českým nastavením selže, protože čeká 2,5. Proto v ukázce používáme CultureInfo.InvariantCulture. Ve skutečných aplikacích se řídí pravidlem: data od uživatele čti v jeho kultuře, data ze souborů a sítě v invariantní. Na hodině to neřešte — jen mějte vysvětlení po ruce, až se někomu program zachová jinak než sousedovi.

Proč dnes nepoužíváme Console.ReadKey. Čte jediný znak bez Enteru a v prohlížeči se chová jinak než na počítači. Pro jistotu se mu vyhýbáme.

2. Ukázky

Jak ukázky používat: u každé je pod kódem políčko stdin s předepsanými odpověďmi. Změňte je a spusťte znovu — program se zachová jinak. Tohle je nejlepší způsob, jak dětem ukázat, že vstup opravdu něco ovlivňuje.
Blok 7Ukázka 1 — První rozhovor2. Ukázky
Studenti zkuste změnit
  • Napiš do políčka stdin jiné jméno.
  • Nech políčko prázdné a spusť. Co vypíše Length?
  • Přidej druhou otázku („odkud pocházíš?") a druhý řádek odpovědi.
  • Zkus místo Console.Write použít Console.WriteLine. Jak se změní vzhled otázky?
demo/demo1_pozdrav.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 si z toho odnést: Console.Write položí otázku, Console.ReadLine() počká na Enter a vrátí text.

Blok 8Ukázka 2 — Čísla od uživatele2. Ukázky
Studenti zkuste změnit
  • Zadej jiná čísla a sleduj, jak se změní útok i obrana.
  • Přidej třetí otázku na obratnost a zahrň ji do výpočtu.
  • Zkus do políčka stdin napsat místo čísla slovo. Program spadne — přečti si hlášku.
demo/demo2_cisla.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 si z toho odnést: int.Parse(Console.ReadLine()) je zkratka — přečti řádek a hned z něj udělej číslo. Je rychlá na psaní, ale spadne, když uživatel nenapíše číslo. Za chvíli to opravíme.

Blok 9Ukázka 3 — Uklizený text2. Ukázky
Studenti zkuste změnit
  • Napiš do stdin jméno s mezerami na začátku i na konci.
  • Napiš jméno malými písmeny a sleduj, co udělá Substring.
  • Zkus ToLower() místo ToUpper() u povolání.
  • Změň Substring(0, 1) na Substring(0, 3).
demo/demo3_text.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 si z toho odnést: Trim() uklidí mezery, ToUpper() sjednotí velikost písmen a Substring(0, 1) vezme první znak. Text od uživatele se skoro vždycky nejdřív uklízí.

Blok 10Ukázka 4 — Vstup, který se nedá rozbít2. Ukázky
Studenti zkuste změnit
  • Nech ve stdin nesmysl a spusť. Program nespadne — použije náhradní hodnotu.
  • Napiš tam číslo a spusť znovu.
  • Nech políčko úplně prázdné.
  • Změň náhradní hodnotu z 5 na 1 a sleduj rozdíl.
demo/demo4_odolny.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 si z toho odnést: TryParse vrátí true nebo false a program jede dál. Náhradní hodnota je pojistka — program vždycky ví, s čím počítat.

Blok 11Ukázka 5 — CsQuest se ptá na hrdinu2. Ukázky
Studenti zkuste změnit
  • Vytvoř si vlastní postavu — změň všechny čtyři odpovědi ve stdin.
  • Zkus do bodů zadat nesmysl. Karta se pořád vykreslí.
  • Změň vzorec na životy z 60 + sila * 4 na něco vlastního.
  • Přidej pátou otázku (domovské město) a řádek do karty.
demo/demo5_tvorba_postavy.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 si z toho odnést: celá karta vznikla ze čtyř odpovědí. Nic v ní není napsané natvrdo — a přesně tak funguje každá hra, která tě na začátku nechá vytvořit postavu.

Blok 12Když se něco pokazí2. Ukázky
Unhandled exception. System.FormatException:
The input string 'pet' was not in a correct format.
   at Program.<Main>$(String[] args) in Program.cs:line 4

Pád za běhu čti jinak než chybu překladače. Program se přeložil, spustil a až uprostřed narazil.

  • FormatException — dostal text, ze kterého nejde udělat číslo,
  • 'pet' — a rovnou ti ukáže, co to bylo,
  • line 4 — kde se to stalo.

Řešení je vždycky stejné: nahradit int.Parse za int.TryParse a mít připravenou náhradní hodnotu.

Pravidlo pro dnešek: program nesmí spadnout jenom proto, že uživatel napsal něco divného.

Hláška Co to znamená Jak to opravit
System.FormatException int.Parse dostal text bez čísla použij int.TryParse a náhradní hodnotu
System.OverflowException zadané číslo je moc velké pro int TryParse to odchytí a vrátí false
System.NullReferenceException vstup skončil a ReadLine vrátil null doplň řádek do stdin, nebo Console.ReadLine() ?? ""
ArgumentOutOfRangeException u Substring text je kratší, než kolik znaků bereš nejdřív Trim(), pak kontroluj Length
CS0029: Cannot implicitly convert 'string' to 'int' ukládáš text do číselné krabice int x = int.Parse(text);
CS1503: cannot convert from 'string' to 'int' posíláš text tam, kde se čeká číslo převeď vstup ještě před použitím
CS0165: Use of unassigned local variable proměnná dostává hodnotu jen uvnitř if dej jí náhradní hodnotu už při vytvoření
CS8600 (varování, podtržené) ReadLine může vrátit null je to jen varování, program poběží
CS0136 / CS0128 dvakrát stejné jméno u out druhou proměnnou přejmenuj
program „nic nedělá" čeká na Enter dopiš odpověď do políčka stdin
vypíše se 2,5 místo 2.5 výpis se řídí nastavením počítače v kódu se píše tečka, na obrazovce bývá čárka

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. Odpovědi pro program piš do políčka stdin pod kódem, každou na samostatný řádek.
Blok 13Cvičení 1 — Dotazník hrdiny (15 min)3. Cvičení

Tvoje zadání:

Napiš program, který se zeptá na tři věci a vyrobí z nich uvítání.

  1. Zeptej se na jméno hrdiny a odpověď ulož do proměnné jmeno
    💡 Poradit
    Otázku vypiš přes Console.Write, ať kurzor zůstane na řádku, a odpověď načti přes Console.ReadLine().
    Například string jmeno = Console.ReadLine();.
  2. Zeptej se na povolání a ulož ho do povolani
    💡 Poradit
    Je to úplně stejné jako u jména — druhá otázka, druhá proměnná.
    Mezery na krajích uklidíš přes .Trim(): string povolani = Console.ReadLine().Trim();.
  3. Zeptej se na úroveň a převeď odpověď na číslo
    💡 Poradit
    Z klávesnice přijde text, takže ho musíš převést: int.Parse(...).
    Například int uroven = int.Parse(Console.ReadLine());.
  4. Vypiš uvítání, ve kterém použiješ všechny tři hodnoty
    💡 Poradit
    Použij interpolaci — dolar před uvozovkami a proměnné ve složených závorkách.
    Například Console.WriteLine($"Vítej, {jmeno}! Jsi {povolani} na úrovni {uroven}.");.
  5. Dopočítej útok a životy a vypiš je v rámečku
    💡 Poradit
    Vzorce si vymysli sám, třeba int utok = uroven * 3; a int zivoty = 50 + uroven * 10;.
    Rámeček uděláš přes new string('═', 34) nad výpisem i pod ním.
Úroveň Co má zvládnout
Minimum Body 1–2 fungují a program vypíše zadané jméno i povolání
Rozšíření Úroveň jako číslo a dopočítaný útok
Výzva Přidat čtvrtou otázku (domov) a vypsat jméno velkými písmeny přes ToUpper()
cviceni/cviceni1_dotaznik.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: tři otázky, pak rámeček s údaji a uvítáním. Se stdin Elara / Lučištnice / 4 vyjde útok 12 a životy 90.

Kde se zaseknou:

  • Console.WriteLine místo Console.Write u otázky. Program funguje, jen otázka a kurzor nejsou na stejném řádku. Ukažte rozdíl vedle sebe.
  • Zapomenuté Console.ReadLine(). Někdo napíše jen otázku a diví se, že se program neptá. Připomeňte: ptát se a poslouchat jsou dva příkazy.
  • int uroven = Console.ReadLine();CS0029. Chybí int.Parse.
  • Málo řádků ve stdin. Když jsou otázky tři a odpovědi dvě, program buď spadne, nebo dostane prázdný text. Naučte je počítat řádky.
  • Pořadí otázek versus pořadí řádků ve stdin. Kdo prohodí otázky, musí prohodit i odpovědi.

Kdo je hotový dřív: ať přidá otázku na domov a řádek do rámečku, nebo ať vypíše jmeno.Length jako „počet písmen ve jméně hrdiny".

Otázka na závěr cvičení: „Proč u jména nepotřebujeme int.Parse a u úrovně ano?" Odpověď: jméno je text, úroveň se musí počítat.

Řešení 1 — jedna z možných variant
reseni/reseni1_dotaznik.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 14Cvičení 2 — Rozdělení bodů (20 min)3. Cvičení

Tvoje zadání:

Hrdina má na začátku 20 bodů a hráč si je rozdělí mezi sílu a obranu.

  1. Konstanta BODY = 20 a uvítací výpis, který ji zmíní
    💡 Poradit
    Pravidlo hry patří do konstanty: const int BODY = 20;.
    V uvítání ji použij přes interpolaci: Console.WriteLine($"Máš {BODY} bodů.");.
  2. Zeptej se, kolik bodů dá hráč do síly, a převeď odpověď na číslo
    💡 Poradit
    Otázka přes Console.Write, načtení přes Console.ReadLine() a převod přes int.Parse(...).
    Například int sila = int.Parse(Console.ReadLine());.
  3. Zeptej se stejně na obranu
    💡 Poradit
    Druhá otázka vypadá úplně stejně jako první, jen s jiným názvem proměnné.
    Nezapomeň, že ve stdin musí být dva řádky — jeden pro sílu, druhý pro obranu.
  4. Spočítej, kolik bodů zbylo, a kolik procent bodů padlo na sílu
    💡 Poradit
    Zbytek je obyčejné odčítání: int zbyva = BODY - sila - obrana;.
    U procent nezapomeň přetypovat před dělením: (double)sila / BODY * 100.
  5. Vypiš přehled s pruhy z blokových znaků
    💡 Poradit
    Pruh složíš z plných a prázdných dílků: new string('█', sila) + new string('░', BODY - sila).
    Pro obranu udělej druhý pruh úplně stejně.
Úroveň Co má zvládnout
Minimum Body 1–3 fungují a program vypíše zadaná čísla
Rozšíření Zbývající body a procenta na jedno desetinné místo
Výzva Oba pruhy plus dopočítaný útok (sila * 2) a životy (50 + obrana * 5)
cviceni/cviceni2_body.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: se stdin 8 / 7 zbývá 5 bodů, podíl síly 40,0 %, útok 16, životy 85.

Kde se zaseknou:

  • Pruh s příliš velkým číslem. Kdo zadá do síly 30, dostane ArgumentOutOfRangeException, protože BODY - sila je záporné. Skvělý moment říct: „příští hodinu se naučíme, jak takovému vstupu zabránit."
  • (double)(sila / BODY) → vyjde 0 %. Připomeňte pravidlo z minulé hodiny.
  • Zapomenutá druhá odpověď ve stdin. Program spadne na FormatException, protože čte prázdný řádek.
  • const a přepsání. Někdo zkusí BODY = BODY - sila;CS0131.

Kdo je hotový dřív: ať přidá kontrolu „součet sedí" jako bool: bool rozdelenoPresne = sila + obrana == BODY; a vypíše ji. To je hezký můstek na příští hodinu.

Otázka na závěr cvičení: „Co by měl program udělat, když někdo zadá do síly 100?" Nechte je odpovídat — a slibte, že příští hodinu to naprogramují.

Řešení 2 — jedna z možných variant
reseni/reseni2_body.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 15Cvičení 3 — Generátor jména hrdiny (20 min)3. Cvičení

Tvoje zadání:

Hráč zadá jméno jakkoliv — s mezerami, malými písmeny, natvrdo velkými. Tvůj program z toho udělá pořádnou hrdinskou vizitku.

  1. Zeptej se na jméno a hned z něj ukliď mezery na krajích
    💡 Poradit
    Mezery uklidí .Trim() — můžeš ho zavolat rovnou na načtený text.
    Například string jmeno = Console.ReadLine().Trim();.
  2. Vypiš jméno velkými písmeny a kolik má písmen
    💡 Poradit
    Velká písmena udělá .ToUpper(), počet písmen je .Length.
    .Length je vlastnost, takže za ní nejsou závorky.
  3. Zeptej se na domov hrdiny a taky ho ukliď
    💡 Poradit
    Stejný postup jako u jména — druhá otázka, druhá proměnná, zase .Trim().
    Ve stdin musí být dva řádky.
  4. Vyrob přezdívku: první písmeno jména velké, zbytek malý
    💡 Poradit
    První písmeno vytáhneš přes jmeno.Substring(0, 1), zbytek přes jmeno.Substring(1).
    Pak je slep interpolací a na každý kousek použij ToUpper(), resp. ToLower().
  5. Vypiš vizitku v rámečku i s heslem hrdiny
    💡 Poradit
    Rámeček udělej přes new string('═', 40) a řádky zarovnej pomocí PadRight.
    Heslo si vymysli a použij v něm přezdívku i domov.
Úroveň Co má zvládnout
Minimum Body 1–2 fungují a mezery jsou opravdu pryč
Rozšíření Přezdívka s velkým prvním písmenem
Výzva Přidat „kód hrdiny" ze tří velkých písmen jména a délky domova
cviceni/cviceni3_jmeno.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: ze vstupu " elara " vznikne Elara, délka 5, kód ELA-14.

Kde se zaseknou:

  • jmeno.Length()CS1955 („metodu nelze použít jako metodu"). Length je vlastnost, ne metoda. Tohle chybují skoro všichni.
  • Substring(1, 1) místo Substring(1). Ukažte, že první číslo je odkud, druhé kolik. Bez druhého čísla se bere zbytek.
  • Zapomenutý Trim(). Program běží, ale ve výpisu jsou mezery. Proto je v ukázce výpis v hranatých závorkách — mezery jsou vidět.
  • ToUpper() bez uložení. jmeno.ToUpper(); samo o sobě nic nezmění, řetězce se v C# nemění. Zdůrazněte: výsledek si musíš uložit nebo vypsat.
  • Krátké jméno a Substring(0, 3). Kdo napíše Ax, dostane ArgumentOutOfRangeException. Ať to někdo schválně zkusí.

Kdo je hotový dřív: ať vyrobí „přihlašovací jméno" bez mezer přes jmeno.Replace(" ", "_").ToLower() a přidá další řádek vizitky — třeba titul složený z domova a délky jména.

Otázka na závěr cvičení: „Proč Substring(0, 1) vrátí string, i když je to jedno písmeno?" Protože Substring vždycky vrací řetězec — jeden znak jako char bychom dostali přes jmeno[0].

Řešení 3 — jedna z možných variant
reseni/reseni3_jmeno.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 16Cvičení 4 — Obchod se zbraněmi (20 min)3. Cvičení

Tvoje zadání:

V obchodě se prodávají šípy. Program spočítá nákup a vytiskne účtenku — a nespadne, ani když hráč místo čísla napíše nesmysl.

  1. Konstanta CENA = 40 a uvítání obchodníka, které cenu zmíní
    💡 Poradit
    Cena je pravidlo obchodu, tak ať se nedá přepsat: const int CENA = 40;.
    V uvítání ji vypiš přes interpolaci.
  2. Zeptej se, kolik má hráč zlata, a načti to bezpečně
    💡 Poradit
    Použij int.TryParse(Console.ReadLine(), out int zlato); — když text nejde převést, zůstane v proměnné nula a program nespadne.
    int.Parse by tady spadl na FormatException.
  3. Zeptej se stejně bezpečně na počet šípů
    💡 Poradit
    Druhé TryParse vypadá stejně, jen s jinou proměnnou v out.
    Pozor: každá out proměnná musí mít jiný název.
  4. Spočítej cenu nákupu, zbytek zlata a jestli si to hráč může dovolit
    💡 Poradit
    Cena je CENA * pocet, zbytek je zlato - celkem.
    Odpověď „může si dovolit" je bool: bool dovoli = celkem <= zlato;.
  5. Vytiskni účtenku v rámečku se zarovnanými sloupci
    💡 Poradit
    Sloupce zarovnej přes PadRight nebo přes {promenna,8} přímo v interpolaci.
    Rámeček složíš z new string('═', 38).
Úroveň Co má zvládnout
Minimum Body 1–3 fungují a program nespadne ani na textu místo čísla
Rozšíření Spočítaná cena, zbytek a bool odpověď
Výzva Přidat slevu 10 % při nákupu 5 a více kusů (spočítej decimal cenu se slevou)
cviceni/cviceni4_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.
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: se stdin 150 / 3 vyjde celkem 120, zbude 30, Můžeš zaplatit: True.

Nejdůležitější moment hodiny: nechte je zadat do prvního řádku hodně. Program nespadne — vypíše nulu. To je celý smysl TryParse. Porovnejte s cvičením 1, kde stejný vstup skončí červenou chybou.

Kde se zaseknou:

  • int.TryParse(..., out int zlato); a pak znovu out int zlato.CS0128 (proměnná už existuje). Každá out proměnná musí mít jiný název.
  • Zapomenuté out.CS1620. TryParse bez out neexistuje.
  • Snaha vypsat návratovou hodnotu. Někdo napíše Console.WriteLine(int.TryParse(...)); — vypíše se True/False, ale číslo je pryč. Dobrá příležitost vysvětlit, co která část dělá.
  • bool ve výpisu je True/False s velkým písmenem. Není to chyba, jen to tak C# tiskne.

Kdo je hotový dřív: sleva 10 % při 5+ kusech — decimal sleva = celkem * 0.10m;. Podmínku zatím neumíme, tak ať sleva platí vždycky a příští hodinu ji „zamknou" za if.

Otázka na závěr cvičení: „Je lepší, když program spadne, nebo když místo čísla tiše počítá s nulou?" Nechte je hádat se — obě odpovědi jsou za určitých okolností správné a to je dobrá informatika.

Řešení 4 — jedna z možných variant
reseni/reseni4_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.
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 17Cvičení 5 — CsQuest: tvorba postavy (25 min)3. Cvičení

Tvoje zadání:

Tohle je velké finále hodiny a zároveň další kousek tvé hry. Program se hráče zeptá na všechno potřebné a vyrobí kartu postavy.

  1. Zeptej se na jméno a povolání, u obou ukliď mezery
    💡 Poradit
    Dvě otázky přes Console.Write a dvě načtení přes Console.ReadLine().Trim().
    Ve stdin musí být dva řádky, jeden pro jméno, druhý pro povolání.
  2. Vyrob značku povolání — jedno velké písmeno do hranatých závorek
    💡 Poradit
    První písmeno získáš přes povolani.Substring(0, 1) a zvětšíš přes .ToUpper().
    Do závorek ho dostaneš v interpolaci: $"[{znacka}]".
  3. Zeptej se na úroveň a načti ji bezpečně přes TryParse
    💡 Poradit
    Použij int.TryParse(Console.ReadLine(), out int uroven); — když hráč napíše nesmysl, zůstane tam nula.
    Tím pádem program nespadne ani při překlepu.
  4. Dopočítej životy, útok, XP a zlato podle úrovně
    💡 Poradit
    Vzorce si urči sám, třeba int zivoty = 60 + uroven * 8; a int xp = uroven * 120;.
    Pravidla (maximum životů, XP na úroveň) dej do const.
  5. Vypiš kartu postavy s pruhem života a rámečkem
    💡 Poradit
    Pruh spočítej jako zivoty * DILKU / MAX_ZIVOTYnejdřív násob, pak děl.
    Rámeček složíš z '╔', '═', '╗' nebo prostě z new string('═', 46).
Úroveň Co má zvládnout
Minimum Body 1–3 fungují a karta obsahuje jméno, povolání i úroveň
Rozšíření Dopočítané hodnoty a pruh života se správným poměrem
Výzva Přidat hvězdičky podle úrovně (new string('★', uroven)) a heslo hrdiny
cviceni/cviceni5_postava.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: se stdin Elara / Lučištnice / 7 vyjde [L] ELARA ★★★★★★★, životy 116/140 (82 %), útok 26, XP 840, zlato 315.

Tohle cvičení je odměna. Spojuje všechno z hodiny 2 i 3 dohromady a výsledek vypadá jako opravdová hra. Nechte na konci pár dětí promítnout jejich kartu — to je nejlepší motivace do příští hodiny.

Kde se zaseknou:

  • PadRight a rámeček. Česká písmena s háčky zabírají v některých terminálech jinou šířku a rámeček se rozjede. Není to jejich chyba — vysvětlete, že to je vlastnost terminálu, ne programu.
  • zivoty / MAX_ZIVOTY * DILKU → pruh je vždycky prázdný. Klasika z minulé hodiny, opakujte pravidlo nejdřív násob, pak děl.
  • Úroveň 0 a new string('★', 0). Vyjde prázdný řetězec a to je v pořádku — pěkná ukázka, že nula není chyba.
  • Záporná úroveň. new string('★', -1) skončí výjimkou. Kdo na to narazí, má dokonalou motivaci pro příští hodinu o podmínkách.

Když zbývá čas: ať si každý vymyslí vlastní vzorce (mág má víc XP, válečník víc životů) a porovnají karty. Příští hodinu z toho udělají if.

Řešení 5 — jedna z možných variant
reseni/reseni5_postava.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 18Domácí úkol na příští hodinu4. Domácí úkol

Uprav svůj CsQuest tak, aby se hry nedalo spustit bez hráče. Program má:

  • zeptat se aspoň na čtyři věci (jméno, povolání, domov a jedno číslo),
  • aspoň jednou použít TryParse, aby nespadl na nesmyslném vstupu,
  • aspoň jednou upravit textTrim(), ToUpper() nebo Substring(),
  • dopočítat aspoň tři hodnoty z toho, co hráč zadal,
  • a vypsat kartu postavy v rámečku s pruhem života.

Vyzkoušej program třikrát: jednou správně, jednou s prázdnou odpovědí a jednou s textem místo čísla. Napiš do komentáře, co se stalo.

Pro učitele

Nejdůležitější část úkolu je poslední odstavec. Děti mají program schválně rozbít a popsat, co se stalo. Tím se učí testovat.

Na začátku příští hodiny se ptejte: „komu program spadl a proč?" Odpovědi vás dovedou přímo k podmínkám — a to je téma hodiny 4.

Časté odevzdané chyby: int.Parse místo TryParse, zapomenutý Trim() u jména (a pak rozbitý rámeček), Console.WriteLine místo Console.Write u otázky. Všechny jsou v tabulce Když se něco pokazí.

Kdo nemá doma .NET, může úkol udělat přímo tady v prohlížeči — odpovědi napíše do políčka stdin a odevzdá snímek obrazovky.

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_ukol03.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 metody a podle ukázek kódu.

Co jsme použili Oficiální dokumentace Co tam najdeš
Console.ReadLine Console.ReadLine čtení jednoho řádku a co vrací na konci vstupu
Console.Write Console.Write výpis bez odřádkování
int.Parse int.Parse převod textu na celé číslo
int.TryParse int.TryParse bezpečný převod, který nespadne
double.TryParse double.TryParse totéž pro desetinná čísla
out Modifikátor out jak metoda vrátí hodnotu „zadními dveřmi"
FormatException FormatException proč Parse spadne a co to znamená
Trim() String.Trim úklid mezer na krajích textu
ToUpper() String.ToUpper převod na velká písmena
Substring() String.Substring vytažení části textu
Length String.Length počet znaků — vlastnost, ne metoda
$"..." Interpolace řetězců vkládání proměnných do textu
CultureInfo CultureInfo proč je někde desetinná čárka a jinde tečka
Jak s dokumentací pracovat na hodině

Stránku o int.TryParse mějte otevřenou při výkladu. Hlavička metody public static bool TryParse(string? s, out int result) obsahuje úplně všechno, co dnes potřebujeme — bool ven, číslo přes out.

Ve VS Code stačí najet myší na TryParse a stejná hlavička se ukáže přímo v editoru. Naučte je ten pohyb myší, ušetří jim hodiny googlení.

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í
Programování — proměnné umimeinformatiku.cz Sledování hodnot po každém řádku — dnes jich bylo hodně
Programování — základy umimeinformatiku.cz Čtení kódu a předvídání výstupu bez ohledu na jazyk
Práce s textem umimecesky.cz Velká písmena a úprava textu — přesně to, co dělá ToUpper

Cvičení na proměnné je zde obzvlášť vhodné, protože v dnešní hodině nemáme hodnoty napevno v kódu — přicházejí zvenčí a děti si musí zvyknout, že do proměnné se dostane to, co uživatel napíše.

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í.

Dobrá alternativa pro rychlíky bez počítače: napište na tabuli int.Parse("12"), int.Parse(" 12 "), int.Parse("12 kusů") a int.Parse("") a nechte je hádat, které z nich spadne. Odpověď překvapí — mezery kolem čísla Parse zvládne, text za číslem ne.