Console.ReadLine, Console.Write jako otázka, int.Parse, double.Parse, int.TryParse, náhradní hodnota, Trim, ToUpper, LengthTady 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ě.
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 |
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.
try/catch. Pád ukažte, ale neřešte mechaniku.
TryParse je pro dnešek plnohodnotná odpověď.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.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.
Console.ReadLine() — jeden řádek na jedno čtení.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.
Console.Write použít Console.WriteLine. Kde teď bliká kurzor?Text se sčítá slepováním, čísla se sčítají počítáním.
Proto "42" + 8 dá 428, zatímco 42 + 8 dá 50.
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á.
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.
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ž
true a do cislo uloží výsledek.false a do cislo dá nulu.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.
Console.ReadLine() — jeden řádek na jedno čtení.Recept, který budeš používat pořád:
string.if (int.TryParse(vstup, out int zadano)) — „povedlo-li se to, …"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.
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.
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).
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íš.
Console.ReadLine() — jeden řádek na jedno čtení.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.
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.
Length?Console.Write použít Console.WriteLine. Jak se změní vzhled otázky?Console.ReadLine() — jeden řádek na jedno čtení.Co si z toho odnést: Console.Write položí otázku, Console.ReadLine()
počká na Enter a vrátí text.
Console.ReadLine() — jeden řádek na jedno čtení.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.
Substring.ToLower() místo ToUpper() u povolání.Substring(0, 1) na Substring(0, 3).Console.ReadLine() — jeden řádek na jedno čtení.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í.
5 na 1 a sleduj rozdíl.Console.ReadLine() — jeden řádek na jedno čtení.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.
60 + sila * 4 na něco vlastního.Console.ReadLine() — jeden řádek na jedno čtení.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.
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 |
Tvoje zadání:
Napiš program, který se zeptá na tři věci a vyrobí z nich uvítání.
- Zeptej se na jméno hrdiny a odpověď ulož do proměnné
jmeno💡 Poradit
Otázku vypiš přesConsole.Write, ať kurzor zůstane na řádku, a odpověď načti přesConsole.ReadLine().
Napříkladstring jmeno = Console.ReadLine();.- 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();.- 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říkladint uroven = int.Parse(Console.ReadLine());.- 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říkladConsole.WriteLine($"Vítej, {jmeno}! Jsi {povolani} na úrovni {uroven}.");.- Dopočítej útok a životy a vypiš je v rámečku
💡 Poradit
Vzorce si vymysli sám, třebaint utok = uroven * 3;aint zivoty = 50 + uroven * 10;.
Rámeček uděláš přesnew 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() |
Console.ReadLine() — jeden řádek na jedno čtení.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.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.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.
Console.ReadLine() — jeden řádek na jedno čtení.Tvoje zadání:
Hrdina má na začátku 20 bodů a hráč si je rozdělí mezi sílu a obranu.
- Konstanta
BODY = 20a 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ů.");.- Zeptej se, kolik bodů dá hráč do síly, a převeď odpověď na číslo
💡 Poradit
Otázka přesConsole.Write, načtení přesConsole.ReadLine()a převod přesint.Parse(...).
Napříkladint sila = int.Parse(Console.ReadLine());.- 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.- 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.- 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) |
Console.ReadLine() — jeden řádek na jedno čtení.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:
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.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í.
Console.ReadLine() — jeden řádek na jedno čtení.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.
- 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říkladstring jmeno = Console.ReadLine().Trim();.- 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..Lengthje vlastnost, takže za ní nejsou závorky.- 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.- Vyrob přezdívku: první písmeno jména velké, zbytek malý
💡 Poradit
První písmeno vytáhneš přesjmeno.Substring(0, 1), zbytek přesjmeno.Substring(1).
Pak je slep interpolací a na každý kousek použijToUpper(), resp.ToLower().- Vypiš vizitku v rámečku i s heslem hrdiny
💡 Poradit
Rámeček udělej přesnew 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 |
Console.ReadLine() — jeden řádek na jedno čtení.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.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.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].
Console.ReadLine() — jeden řádek na jedno čtení.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.
- Konstanta
CENA = 40a 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.- Zeptej se, kolik má hráč zlata, a načti to bezpečně
💡 Poradit
Použijint.TryParse(Console.ReadLine(), out int zlato);— když text nejde převést, zůstane v proměnné nula a program nespadne.int.Parseby tady spadl naFormatException.- Zeptej se stejně bezpečně na počet šípů
💡 Poradit
DruhéTryParsevypadá stejně, jen s jinou proměnnou vout.
Pozor: každáoutproměnná musí mít jiný název.- Spočítej cenu nákupu, zbytek zlata a jestli si to hráč může dovolit
💡 Poradit
Cena jeCENA * pocet, zbytek jezlato - celkem.
Odpověď „může si dovolit" jebool:bool dovoli = celkem <= zlato;.- Vytiskni účtenku v rámečku se zarovnanými sloupci
💡 Poradit
Sloupce zarovnej přesPadRightnebo přes{promenna,8}přímo v interpolaci.
Rámeček složíš znew 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) |
Console.ReadLine() — jeden řádek na jedno čtení.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.out. → CS1620. TryParse bez out neexistuje.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.
Console.ReadLine() — jeden řádek na jedno čtení.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.
- Zeptej se na jméno a povolání, u obou ukliď mezery
💡 Poradit
Dvě otázky přesConsole.Writea dvě načtení přesConsole.ReadLine().Trim().
Ve stdin musí být dva řádky, jeden pro jméno, druhý pro povolání.- Vyrob značku povolání — jedno velké písmeno do hranatých závorek
💡 Poradit
První písmeno získáš přespovolani.Substring(0, 1)a zvětšíš přes.ToUpper().
Do závorek ho dostaneš v interpolaci:$"[{znacka}]".- Zeptej se na úroveň a načti ji bezpečně přes
TryParse💡 Poradit
Použijint.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.- Dopočítej životy, útok, XP a zlato podle úrovně
💡 Poradit
Vzorce si urči sám, třebaint zivoty = 60 + uroven * 8;aint xp = uroven * 120;.
Pravidla (maximum životů, XP na úroveň) dej doconst.- Vypiš kartu postavy s pruhem života a rámečkem
💡 Poradit
Pruh spočítej jakozivoty * DILKU / MAX_ZIVOTY— nejdřív násob, pak děl.
Rámeček složíš z'╔','═','╗'nebo prostě znew 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 |
Console.ReadLine() — jeden řádek na jedno čtení.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.0 a new string('★', 0). Vyjde prázdný řetězec a to je
v pořádku — pěkná ukázka, že nula není chyba.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.
Console.ReadLine() — jeden řádek na jedno čtení.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 text —
Trim(),ToUpper()neboSubstring(),- 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.
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.
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 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 |
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í.
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.
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.