← Přehled všech hodin

Proměnné a datové typy

Cíl hodiny: Děti chápou, že každá proměnná v C# má svůj tvar, umí vybrat správný typ pro danou hodnotu a vědí, proč 7 / 2 vyjde 3.
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: Typy jsou jediné místo, kde je C# přísnější než Python — a zároveň místo, kde ti nejvíc pomůže.

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 domácího úkolu, promítnutí dvou tří vizitek 10 min
Proč typy Bloky Krabice má tvarchar, střídáte výklad a spouštění 35 min
Počítání Celočíselné dělení, double vs decimal, var a const 30 min
Ukázky Demo 1–5, hlavně demo 5 (stavový panel) 15 min
Cvičení Děti pracují samy, vy obcházíte 45 min
Závěr Kdo chce, ukáže svůj panel hrdiny 5 min
Hlavní pedagogický cíl

Dnešek stojí a padá na jediném zážitku: 7 / 2 vyjde 3 a není to chyba počítače. Až dítě pochopí, že int prostě desetinnou část nemá kam dát, přestane typy vnímat jako otravnou byrokracii a začne je brát jako informaci.

Druhý cíl je praktický: umět si vybrat. Životy → int. Průměr → double. Peníze → decimal. Ano/ne → bool. Kdo tohle rozhodne správně, ušetří si hodinu ladění v pátém týdnu.

Tři věci, které dnes NEVYSVĚTLUJTE
  1. Jak jsou čísla uložená v paměti. Žádné bity, žádná dvojková soustava. Stačí „int je krabice na celá čísla a nic jiného se do ní nevejde".
  2. Hodnotové vs. referenční typy. Ani slovo o zásobníku a haldě. Pro dnešek jsou všechny typy stejně „krabice".
  3. float a další číselné typy. Držte se trojice int, double, decimal. Víc možností = víc zmatku. Kdo se zeptá, dostane odkaz do dokumentace.

Jak pracovat se smíšenou úrovní. Každé cvičení má tři stupně: Minimum, Rozšíření, Výzva. Slabším stačí Minimum. Rychlíky posaďte k těm, kdo se trápí — vysvětlování cizímu člověku je nejrychlejší způsob, jak si typy zapamatovat.

Blok 1Krabice má tvar1. Vysvětlení a souvislosti

Každá proměnná v C# má typ — a ten se nedá cestou vyměnit. Když napíšeš int zivoty, tak v té krabici bude celé číslo. Navždy.

Představ si šuplíky v dílně. Do šuplíku na hřebíky nedáš kladivo. Ne proto, že by se tam nevešlo, ale proto, že se pak nic nenajde.

Pět typů, které dnes poznáš:

Typ Co do něj patří Příklad
int celé číslo 100, -3, 0
double desetinné číslo 12.5, 0.75
decimal peníze, přesné desetinné 149.90m
bool pravda / nepravda true, false
char jeden znak 'K', '★'
string text (i prázdný) "Arkon"

Všimni si: charjednoduché uvozovky, string dvojité.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Proč to Python nepotřebuje a C# ano

V Pythonu napíšeš zivoty = 100 a jazyk si typ domyslí za běhu. C# chce typ znát předem, při překladu. Díky tomu ti umí říct o chybě dřív, než program vůbec spustíš — a taky je pak program rychlejší.

Blok 2Celá čísla: int1. Vysvětlení a souvislosti

int je celé číslo. Žádná desetinná část neexistuje.

Proto 7 / 2 vyjde 3 a ne 3,5. Není to zaokrouhlení — je to useknutí. Desetinná část se prostě zahodí.

Operátor Co dělá Příklad
+ - * sčítání, odčítání, násobení 5 * 315
/ dělení (u int bez zbytku) 7 / 23
% zbytek po dělení 7 % 21
+= -= přičti / odečti k sobě zivoty -= 10
++ -- o jedna nahoru / dolů zivoty++

zivoty -= 10; je jen kratší zápis zivoty = zivoty - 10;.

Pozor na % — vypadá jako procenta, ale znamená zbytek. 13 % 5 je 3, protože 13 = 2×5 + 3. Budeme to potřebovat pořád.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Studenti zkuste změnit
  • Zjisti, kolik je 100 / 3 a kolik 100 % 3.
  • Zkus zivoty-- místo zivoty++.
  • Co vypíše 10 / 4 * 4? A proč to není 10?
Blok 3Desetinná čísla: double a decimal1. Vysvětlení a souvislosti

double je číslo s desetinnou tečkou. Píše se tečka, ne čárka: 0.25, ne 0,25. Čárka v C# odděluje argumenty, ne desetiny.

Jakmile je ve výpočtu aspoň jedno desetinné číslo, výsledek je desetinný. Proto 7.0 / 2 vyjde 3.5, zatímco 7 / 2 vyjde 3.

:F1 a :F2 říkají, na kolik desetinných míst se to má vypsat. Je to jen o vzhledu výpisu — v proměnné zůstává celé číslo dál.

decimal je na peníze. Za číslem musí být písmeno m: 149.90m. Bez něj překladač zahlásí chybu, protože by šlo o double.

Proč dva typy? double počítá rychle, ale nepatrně nepřesně (0.1 + 0.2 nevyjde úplně 0.3). U hry to nevadí, u peněz ano. Proto: statistiky → double, obchod → decimal.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Častý zásek

double x = 1,5; je chyba — C# chce tečku. decimal cena = 149.90; je taky chyba (CS0664) — chybí m na konci.

Blok 4Pravda nebo lež: bool1. Vysvětlení a souvislosti

bool má jenom dvě možné hodnoty: true a false. Píšou se malými písmeny a bez uvozovek"true" je text, ne pravdivostní hodnota.

Nejzajímavější je, že bool nemusíš vypisovat ručně. Můžeš ho spočítat porovnáním:

Zápis Čte se
a > b a je větší než b
a < b a je menší než b
a >= b a je větší nebo rovno
a == b a se rovná b
a != b a se nerovná b

Pozor: = přiřazuje, == porovnává. Jedna z nejčastějších chyb vůbec.

Zatím výsledek jen vypisujeme. Za dvě hodiny se podle něj bude program rozhodovat — a to je celý smysl bool.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 5Jeden znak: char1. Vysvětlení a souvislosti

char je právě jeden znak v jednoduchých uvozovkách.

  • 'K' je char — jeden znak.
  • "K" je string — text, který má náhodou délku 1.

Rozdíl vypadá zbytečně, ale je důležitý: char se dá opakovat pomocí new string(znak, počet), což jsme používali už minule na rámečky.

Co se do char nevejde: složitější emoji jako ⚔️ nebo 🛡️. Ty se uvnitř skládají z víc částí, takže patří do string. Znaky jako ★ ♥ ═ █ ░ jsou v pořádku.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Studenti zkuste změnit
  • Vyrob si vlastní oddělovač: new string('~', 40).
  • Zkus char x = 'ab'; a přečti si, co překladač řekne.
  • Najdi si znak a a vypiš pruh z obou.
Blok 6var: typ si domyslí překladač1. Vysvětlení a souvislosti

var neznamená „bez typu". Znamená „typ si domysli sám z toho, co je za rovnítkem".

  • var uroven = 5; je úplně stejné jako int uroven = 5;
  • var jmeno = "Elara"; je stejné jako string jmeno = "Elara";

Typ je pořád pevně daný — jen jsi ho nemusel psát. Proto uroven = "pět"; skončí chybou i u var.

Kdy var použít: když je typ z pravé strany na první pohled jasný. Kdy ne: když by čtenář musel hádat. Pro dnešek piš typy radši ručně, var používej hlavně u dlouhých názvů typů (ty přijdou později).

var x; bez hodnoty nejde — překladač by neměl z čeho typ poznat.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 7const: hodnota, která se nesmí měnit1. Vysvětlení a souvislosti

const je krabice zamčená na klíč. Hodnotu dostane při vzniku a už nikdy se nezmění. Když se ji pokusíš přepsat, program se ani nepřeloží.

Proč to chtít?

  1. Pojmenuje záhadné číslo. zivoty / 100.0 nikomu nic neřekne, zivoty / (double)MAX_ZIVOTY ano.
  2. Změna na jednom místě. Když se maximum zvýší na 120, opravíš jediný řádek.
  3. Ochrana. Nikdo ti omylem nepřepíše pravidlo hry uprostřed programu.

Zvyk: konstanty se píšou VELKÝMI_PÍSMENY_S_PODTRŽÍTKY, aby byly v kódu hned vidět. Není to povinné, ale drž se toho — poznáš je pak na první pohled.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Studenti zkuste změnit
  • Přidej pod poslední řádek MAX_ZIVOTY = 120; a spusť. Přečti si hlášku CS0131.
  • Změň MAX_ZIVOTY na 200 nahoře a všimni si, kolik řádků se změnilo samo.
Blok 8Převody mezi typy1. Vysvětlení a souvislosti

Tři způsoby, jak dostat hodnotu z jedné krabice do druhé:

1. Samo od sebe (nahoru). int se do double vejde vždycky, tak to C# udělá bez ptaní.

2. Přetypováním ( ) (dolů). Z double do int se něco ztratí, proto to musíš napsat ručně: (int)presne. Useká desetinnou část — z 9.8 bude 9, ne 10! Když chceš zaokrouhlit, použij Math.Round.

3. Z textu a do textu. "42" není číslo, je to text. int.Parse("42") z něj číslo udělá. Obráceně .ToString().

Nejdůležitější trik dneška:

(double)a / b     ← správně, vyjde 3,5
(double)(a / b)   ← pozdě, vyjde 3

Přetypování musí být před dělením, ne po něm.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Co ještě není potřeba vysvětlovat

int.Parse spadne, když v textu není číslo. Zatím to neřešte — příští hodinu na to přijde int.TryParse, který místo pádu vrátí false.

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

Proč int a ne něco univerzálního. int je 32bitové celé číslo v rozsahu zhruba −2,1 až +2,1 miliardy. Pro hru bohatě stačí. Kdo narazí na přetečení (int.MaxValue + 1 dá zápornou hodnotu), dostal zajímavou otázku k diskusi, ale do osnov to nepatří.

Proč double není přesný. double ukládá číslo dvojkově, takže desetinná čísla jako 0,1 se do něj vejdou jen přibližně — podobně jako se do desítkové soustavy nevejde přesně jedna třetina. Klasická ukázka:

Console.WriteLine(0.1 + 0.2 == 0.3);   // False
Console.WriteLine(0.1 + 0.2);          // 0,30000000000000004

Promítněte to jen tehdy, když se někdo zeptá — jinak zaseje pochybnost o všech výpočtech. decimal má 128 bitů a desítkový základ, proto je na peníze správně (a proto je zhruba desetkrát pomalejší).

Proč m u decimal. Literál 149.90 je sám o sobě double a mezi double a decimal neexistuje automatický převod (obojí je „desetinné", ale jinak uložené). Sufix m (od money) říká překladači, že jde rovnou o decimal.

Desetinná čárka a kultura. Výpis Console.WriteLine(1.5) respektuje nastavení systému — v české lokalizaci se objeví 1,5, v anglické 1.5. V zápisu kódu je to ale vždycky tečka. Děti to plete; mějte odpověď připravenou: „tečka se píše, čárka se zobrazuje."

var a čitelnost. V reálných projektech je var naprosto běžný. Tady ho záměrně držíme na vedlejší koleji, aby si děti typ pokaždé vědomě vybraly. Od 10. hodiny (metody a třídy) ho začneme používat víc.

Pojmenování konstant. Konvence Microsoftu je dnes PascalCase (MaxZivoty), ne VELKÁ_PÍSMENA. Používáme velká písmena záměrně — pro děti je vizuální rozdíl mezi konstantou a proměnnou důležitější než dodržení firemního stylu. V 10. hodině na to upozorníme.

2. Ukázky

Jak ukázky používat: každou promítněte, spusťte a pak před dětmi něco změňte. Kód jde upravovat i spouštět přímo tady v prohlížeči.
Blok 9Ukázka 1 — Šest typů na jedné kartě2. Ukázky
Studenti zkuste změnit
  • Přepiš všechny hodnoty na svého hrdinu.
  • Změň char znacka na jiné písmeno nebo symbol.
  • Zkus do int uroven napsat 3.5 a přečti si chybu.
  • Přidej bool maLektvar a vypiš ho.
demo/demo1_typy.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: typ se vybírá podle toho, co ta hodnota znamená. Životy se nedají mít půl, proto int. Zlato se platí, proto decimal.

Blok 10Ukázka 2 — Počítání, které překvapí2. Ukázky
Studenti zkuste změnit
  • Zkus změnit 7 na 9 a 2 na 4. Co vyjde celočíselně a co desetinně?
  • Vypiš, kolik je 100 % 7.
  • Uprav poslední řádek na :F3.
demo/demo2_pocitani.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: / u celých čísel useká zbytek, % ten zbytek vrátí. Když chceš přesně, přetypuj před dělením: (double)a / b.

Blok 11Ukázka 3 — Převody v praxi2. Ukázky
Studenti zkuste změnit
  • Změň poskozeni na jiné desetinné číslo a sleduj rozdíl mezi useknutím a zaokrouhlením.
  • Zkus smazat (int) u useknute. Jakou chybu dostaneš?
  • Přidej výpis {(int)Math.Round(poskozeni * 2)}.
demo/demo3_prevody.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: (int) useká, Math.Round zaokrouhlí. A "25" + 5 není 30, ale 255 — protože + u textu znamená „slep za sebe".

Blok 12Ukázka 4 — Konstanty drží pravidla hry2. Ukázky
Studenti zkuste změnit
  • Změň MAX_ZIVOTY na 150 a sleduj, kolik řádků se opravilo samo.
  • Změň CENA_LEKTVARU a podívej se na nový počet lektvarů.
  • Zkus přidat řádek MAX_ZIVOTY = 50; a přečti si chybu.
demo/demo4_konstanty.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: konstanta je pravidlo hry zapsané na jednom místě. Když se pravidlo změní, měníš jediný řádek.

Blok 13Ukázka 5 — Stavový panel hrdiny2. Ukázky
Studenti zkuste změnit
  • Změň zivoty na 15 a podívej se, jak se pruh zkrátí.
  • Změň DILKU z 20 na 30. Co se stane s pruhem?
  • Vyměň znaky a za # a ..
  • Přidej třetí pruh — třeba mana nebo hlad.
demo/demo5_stavovy_panel.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: celý panel je jenom počítání s int, jeden double na procenta, jeden bool na varování a new string(znak, počet) na pruhy. Nic víc dnešní hodina neuměla — a přesto to vypadá jako opravdová hra.

Blok 14Když se něco pokazí2. Ukázky
Program.cs(4,18): error CS0029: Cannot implicitly convert type 'double' to 'int'

Typové chyby čti odzadu. Hláška vždycky říká „mám tohle, ale chce se po mně tamto".

  • convert type 'double' to 'int' — vpravo je desetinné číslo, vlevo krabice na celé. Buď změň typ krabice na double, nebo napiš (int) a řekni tím: „vím to, useknutí mi nevadí."

Pravidlo pro dnešek: když hláška mluví o dvou typech, podívej se na rovnítko a zeptej se — co je nalevo a co napravo?

Hláška Co to znamená Jak to opravit
CS0029: Cannot implicitly convert 'double' to 'int' desetinné číslo do celočíselné krabice int x = (int)y; nebo double x = y;
CS0029: Cannot implicitly convert 'string' to 'int' text do číselné krabice int x = int.Parse(text);
CS0266: An explicit conversion exists převod existuje, ale musíš si o něj říct dopiš (int) před hodnotu
CS0664: Literal of type double cannot be implicitly converted to 'decimal' u decimal chybí m decimal cena = 149.90m;
CS0019: Operator '*' cannot be applied to 'string' and 'int' násobíš text číslem nejdřív int.Parse(...)
CS0131: The left-hand side of an assignment must be a variable přepisuješ const konstantu měň jen v místě, kde vzniká
CS0165: Use of unassigned local variable proměnná nemá hodnotu přiřaď hodnotu hned při vytvoření
CS0128 / CS0136 dvakrát stejné jméno proměnné druhé přejmenuj, nebo smaž typ na začátku
CS1525: Invalid expression term ',' desetinná čárka místo tečky double x = 1.5;
FormatException za běhu int.Parse dostal text bez čísla příští hodinu: int.TryParse
výsledek je 0 nebo 3 místo 3,5 celočíselné dělení (double)a / b

3. Cvičení

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

Tvoje zadání:

Vytvoř kartu hrdiny, ve které bude od každého typu aspoň jedna proměnná.

  1. Proměnné jmeno (text) a znacka (jeden znak) a výpis ve tvaru [K] Arkon
    💡 Poradit
    Text patří do string, jeden znak do char — a ten má jednoduché uvozovky.
    Například char znacka = 'K'; a pak Console.WriteLine($"[{znacka}] {jmeno}");.
  2. Celá čísla uroven a zivoty a jejich výpis
    💡 Poradit
    Celé číslo je int a nepíše se do uvozovek.
    Například int zivoty = 100;. Vypiš je stejně jako text: Console.WriteLine($"Životy: {zivoty}");.
  3. Desetinné číslo sanceKrit (třeba 0.25) vypsané i v procentech
    💡 Poradit
    Desetinné číslo je double a píše se s tečkou. Procenta dostaneš vynásobením stem.
    Například {sanceKrit * 100:F0} % vypíše 25 %.
  4. Peníze zlato jako decimal vypsané na dvě desetinná místa
    💡 Poradit
    U decimal musí být za číslem písmeno m, jinak to překladač nepřeloží.
    Například decimal zlato = 249.50m; a výpis {zlato:F2}.
  5. Pravdivostní hodnota jeZivy spočítaná z životů a čára kolem karty
    💡 Poradit
    bool nemusíš psát ručně — dá se spočítat porovnáním.
    Například bool jeZivy = zivoty > 0;. Čáru vyrobíš pomocí new string('═', 30).
Úroveň Co má zvládnout
Minimum Body 1–3 fungují a program se přeloží
Rozšíření Přidat bool maLektvar a char pro druhý symbol (třeba '★')
Výzva Zarovnat všechny popisky pomocí PadRight tak, aby hodnoty byly pod sebou
cviceni/cviceni1_karta.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: karta o osmi až deseti řádcích, v níž je od každého dnešního typu aspoň jedna proměnná.

Kde se zaseknou:

  • char znacka = "K"; — dvojité uvozovky u char. Hláška CS0029. Ptejte se: „jeden znak, nebo text?"
  • decimal zlato = 249.50; — chybí m (CS0664). Tohle uvidíte nejčastěji.
  • Desetinná čárka. double sanceKrit = 0,25;CS1525. Napište na tabuli: v kódu tečka, na obrazovce čárka.
  • bool jeZivy = "true";true se píše bez uvozovek.
  • Procenta. Někdo napíše {sanceKrit}% a diví se, že vyjde 0,25 %. Musí se násobit stem.

Kdo je hotový dřív: ať zarovná popisky přes PadRight(10) a přidá druhý char symbol podle povolání ('K' kouzelník, 'B' bojovník, 'L' lučištník).

Otázka na závěr cvičení: „Který z tvých údajů by šel dát do int a proč jsi ho tam nedal?" Cílem je, aby řekli „protože by se ztratily desetiny".

Řešení 1 — jedna z možných variant
reseni/reseni1_karta.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í 2 — Proč to počítá blbě? (15 min)3. Cvičení

Tvoje zadání:

Program v dílně se přeloží a spustí, ale počítá nesmysly. Najdi a oprav tři chyby a pak ho dokonči.

  1. naHrdinu má vyjít 3,5, ne 3
    💡 Poradit
    Dvě celá čísla dělená mezi sebou dají zase celé číslo. Musíš aspoň jedno z nich změnit na desetinné před dělením.
    Například (double)koristCelkem / hrdinu.
  2. Zlato celkem má vyjít 150, ne 10050
    💡 Poradit
    bonusText je text, a + u textu znamená „slep za sebe". Nejdřív z něj udělej číslo.
    Například int bonus = int.Parse(bonusText); a pak teprve sčítej.
  3. zapsane poškození má z 9.8 vyjít 10, ne 9
    💡 Poradit
    Přetypování (int) desetinnou část useká, nezaokrouhlí. Zaokrouhlení umí Math.Round.
    Například (int)Math.Round(poskozeni).
  4. Dopočítej, kolik lektvarů koupíš za zlato a kolik zlata zbude
    💡 Poradit
    Tady se celočíselné dělení naopak hodí — půl lektvaru nekoupíš. Počet dá /, zbytek dá %.
    Cenu si ulož do const int CENA_LEKTVARU = 12;.
  5. Vypiš shrnutí pod čarou, desetinná čísla na jedno místo
    💡 Poradit
    Čáru uděláš přes new string('─', 30) a jedno desetinné místo přes :F1.
    Například Console.WriteLine($"Na hrdinu: {naHrdinu:F1}");.
Úroveň Co má zvládnout
Minimum Opravit body 1–3
Rozšíření Dopočítat lektvary a zbytek zlata
Výzva Přidat výpočet, o kolik procent klesly životy po zásahu (double, :F0)
cviceni/cviceni2_chyby.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: 3,5, 150, 10, 12 lektvarů a 6 zlata zbude.

Tohle cvičení je jádro hodiny. Všechny tři chyby jsou „tiché" — program běží a nic nehlásí. Zdůrazněte: překladač hlídá typy, ale nehlídá smysl.

Kde se zaseknou:

  • (double)(koristCelkem / hrdinu) — přetypují pozdě, výsledek je 3. Nechte je spustit a ptejte se: „co se stalo dřív?"
  • double naHrdinu = 7 / 2; — někoho napadne psát čísla přímo, ale výsledek je pořád 3. Dobrý moment na zdůraznění, že rozhoduje typ operandů, ne typ krabice vlevo.
  • zlato + int.Parse(bonusText) uvnitř "..." bez $ — vypíše se to doslova.
  • Math.Round(poskozeni) bez (int)CS0266. Nechte je hlášku přečíst.

Kdo je hotový dřív: ať dopíše řádek Console.WriteLine($"Životy klesly o {zapsane * 100.0 / 100:F0} %"); a vysvětlí sousedovi, proč tam je 100.0 a ne 100.

Otázka na závěr cvičení: „Která z těch tří chyb by se dala odhalit bez spuštění programu?" Odpověď: žádná. Proto se programy testují.

Řešení 2 — jedna z možných variant
reseni/reseni2_chyby.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í 3 — Kalkulačka poškození (20 min)3. Cvičení

Tvoje zadání:

Spočítej, jak dopadne jeden úder na nepřítele.

  1. Konstanta ZAKLADNI_UTOK (celé číslo) a proměnná nasobic (desetinné číslo)
    💡 Poradit
    Konstanta se píše const před typ a její hodnota se pak nesmí měnit.
    Například const int ZAKLADNI_UTOK = 12; a double nasobic = 1.5;.
  2. Vypočítej poskozeni jako útok krát násobič a vypiš na jedno desetinné místo
    💡 Poradit
    Když se násobí celé a desetinné číslo, výsledek je desetinný — proto krabici udělej double.
    Výpis na jedno místo: {poskozeni:F1}.
  3. Nepřítel má zivotyNepritele; odečti od nich zaokrouhlené poškození
    💡 Poradit
    Životy jsou celé číslo, takže poškození musíš nejdřív zaokrouhlit a přetypovat.
    Například int ubrano = (int)Math.Round(poskozeni);.
  4. Spočítej, kolik procent života nepříteli zbylo
    💡 Poradit
    Dvě celá čísla dělená mezi sebou dají celé číslo — přetypuj čitatele před dělením a pak vynásob stem.
    Například (double)poZasahu / zivotyNepritele * 100.
  5. Přidej bool prezil a celé to vypiš do rámečku
    💡 Poradit
    Pravdivostní hodnota se dá spočítat porovnáním: bool prezil = poZasahu > 0;.
    Rámeček vyrobíš z new string('═', 34) nahoře i dole.
Úroveň Co má zvládnout
Minimum Body 1–3 fungují
Rozšíření Procenta zbývajícího života a bool prezil
Výzva Přidat druhý úder (poZasahu použij znovu) a vypsat stav po obou úderech
cviceni/cviceni3_poskozeni.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: poškození 18,0, ubráno 18, životy 40 → 22, zbývá 55 %, přežil True.

Kde se zaseknou:

  • int poskozeni = ZAKLADNI_UTOK * nasobic;CS0266. Násobek celého a desetinného je desetinný. Dobrá otázka: „kam by se poděla ta půlka?"
  • (double)(poZasahu / zivotyNepritele) → vyjde 0 %. Klasika. Ukažte jim závorky a ptejte se, co se počítá první.
  • Pokus přepsat konstantu (ZAKLADNI_UTOK = 20;) → CS0131. Vysvětlete, že právě proto konstanta existuje.
  • Math.round malým písmenem → CS0117. Připomeňte velká písmena.

Kdo je hotový dřív: ať přidá druhý úder — poZasahu = poZasahu - ubrano; a vypíše, jak to dopadlo. Uvidí, že bool prezil se musí přepočítat znovu.

Otázka na závěr cvičení: „Proč je ubrano typu int, když poskozeni je double?" Odpověď: protože životy se počítají po celých bodech.

Řešení 3 — jedna z možných variant
reseni/reseni3_poskozeni.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í 4 — Pokladnice a převody (20 min)3. Cvičení

Tvoje zadání:

Hrdina vysypal měšec. Spočítej, co v něm je a co si za to koupí.

  1. Konstanta MINCI_VE_ZLATAKU = 100 a proměnná celkemMinci = 1337
    💡 Poradit
    Obojí je celé číslo, jen první je zamčené přes const.
    Například const int MINCI_VE_ZLATAKU = 100; a int celkemMinci = 1337;.
  2. Rozděl mince na zlaťáky a drobné pomocí / a %
    💡 Poradit
    Celočíselné dělení dá počet celých zlaťáků, zbytek po dělení dá drobné.
    Například int zlataky = celkemMinci / MINCI_VE_ZLATAKU; a int drobne = celkemMinci % MINCI_VE_ZLATAKU;.
  3. Přidej const decimal CENA_LEKTVARU = 4.50m; a spočítej cenu tří lektvarů
    💡 Poradit
    U decimal nesmíš zapomenout na m za číslem. Násobit se dá rovnou celým číslem.
    Například decimal cenaCelkem = 3 * CENA_LEKTVARU; a výpis {cenaCelkem:F2}.
  4. Spočítej celkovou váhu nákupu z vahaKusu a pocetKusu (použij var)
    💡 Poradit
    var si typ domyslí z hodnoty vpravo: var pocetKusu = 7; je int, var vahaKusu = 0.4; je double.
    Výslednou váhu vypiš přes {vahaCelkem:F1}.
  5. Vypiš celý účet v rámečku se zarovnanými popisky
    💡 Poradit
    Zarovnání udělá PadRight na textu popisku.
    Například Console.WriteLine($"{"Zlaťáky:".PadRight(16)}{zlataky}");.
Úroveň Co má zvládnout
Minimum Body 1–2 fungují a zlaťáky i drobné sedí
Rozšíření Cena lektvarů v decimal a váha přes var
Výzva Dopočítat, kolik lektvarů si hrdina může dovolit, a kolik mincí mu zbude
cviceni/cviceni4_pokladnice.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: 13 zlaťáků a 37 drobných, cena 13,50, váha 2,8 kg.

Kde se zaseknou:

  • Záměna / a %. Nejlepší je nakreslit to na tabuli: 1337 ÷ 100 = 13 zbytek 37. Přesně to dělá / a %.
  • decimal cenaCelkem = 3 * 4.50;CS0664, chybí m.
  • var vahaCelkem; bez hodnoty → CS0818. Krásná příležitost říct, že var není typ, ale „domysli si to" — a domýšlet se dá jen z něčeho.
  • vahaKusu * pocetKusu u var funguje, ale někdo napíše var vahaKusu = 0; a diví se, že váha vyjde 0. Typ se totiž domyslel jako int.

Kdo je hotový dřív: ať dopočítá int kolikSiKoupi = celkemMinci / (int)(CENA_LEKTVARU * MINCI_VE_ZLATAKU / 100); nebo jednodušeji zavede cenu v mincích jako const int CENA_V_MINCICH = 450;.

Otázka na závěr cvičení: „Proč je cena decimal a váha double?" Odpověď: za cenu se platí, u váhy stačí přibližně.

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

Tvoje zadání:

Vizitka z první hodiny se dnes mění na opravdový stavový panel s pruhy.

  1. Konstanty MAX_ZIVOTY, XP_NA_UROVEN, DILKU a údaje o hrdinovi
    💡 Poradit
    Pravidla hry patří do const, aktuální stav do obyčejných proměnných.
    Například const int DILKU = 20; a pod to int zivoty = 72;, int xp = 160;.
  2. Spočítej, kolik dílků pruhu má být plných
    💡 Poradit
    Nejdřív násob, potom děl — jinak ti celočíselné dělení sežere výsledek.
    Například int dilkyZivota = zivoty * DILKU / MAX_ZIVOTY;.
  3. Sestav pruh života z plných a prázdných znaků
    💡 Poradit
    Plné dílky vyrobíš z '█', prázdné z '░' a slepíš je pomocí +.
    Například string pruhZivota = new string('█', dilkyZivota) + new string('░', DILKU - dilkyZivota);.
  4. Přidej druhý pruh pro zkušenosti a procenta života
    💡 Poradit
    Pruh XP se počítá úplně stejně, jen s xp a XP_NA_UROVEN. Procenta potřebují double.
    Například double procentaZivota = (double)zivoty / MAX_ZIVOTY * 100;.
  5. Dej všechno do rámečku a přidej bool jeVOhrozeni
    💡 Poradit
    Rámeček uděláš z new string('═', SIRKA) nahoře i dole a new string('─', SIRKA) uprostřed.
    Varování spočítej porovnáním: bool jeVOhrozeni = zivoty < MAX_ZIVOTY / 4;.
Úroveň Co má zvládnout
Minimum Pruh života se vykreslí a odpovídá počtu životů
Rozšíření Druhý pruh (XP), procenta a rámeček
Výzva Třetí pruh (mana nebo hlad), zarovnané popisky a char symbol povolání v hlavičce
cviceni/cviceni5_panel.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: dva pruhy z blokových znaků, které se mění, když se změní zivoty nebo xp. Tohle je moment, kdy děti začnou měnit čísla jen proto, aby viděly pruh růst — nechte je.

Kde se zaseknou:

  • zivoty / MAX_ZIVOTY * DILKU → vyjde vždycky 0. Nejčastější chyba cvičení. Pravidlo na tabuli: u celých čísel násob dřív, děl potom.
  • new string('█', -2) spadne za běhu s ArgumentOutOfRangeException, pokud si někdo dá zivoty větší než MAX_ZIVOTY. Dobrý moment říct, že příště (podmínky) se to bude umět ošetřit.
  • Znaky a se nedají napsat z klávesnice. Mějte je připravené na promítnutém řádku, ať je můžou zkopírovat, nebo nechte použít # a ..
  • char s dvojitými uvozovkamiCS1503 u new string.

Kdo je hotový dřív: ať přidá třetí pruh (mana, hlad, únava) a zarovná popisky pomocí PadRight.

Otázka na závěr cvičení: „Kde se v panelu použil int, kde double a kde bool — a proč právě tam?" To je shrnutí celé hodiny.

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

4. Domácí úkol

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

Uprav svůj Program.cs tak, aby úvodní obrazovka CsQuestu obsahovala:

  • pravidla hry v konstantách — maximum životů, cena lektvaru, XP na úroveň,
  • aspoň šest proměnných a od každého typu (int, double, decimal, bool, char, string) aspoň jednu,
  • aspoň dva výpočty, kde se míchá celé a desetinné číslo (útok s násobičem, procenta života),
  • jeden pruh z blokových znaků, který odpovídá skutečné hodnotě,
  • a jeden řádek s bool, který se spočítá porovnáním (třeba „hrdina je v ohrožení").

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

Pro učitele

Úkol záměrně nemá jedno správné řešení. Cílem je, aby si dítě muselo u každé hodnoty vybrat typ — a to je celá dnešní látka.

Na začátku příští hodiny promítněte dva tři panely a ptejte se třídy: „proč je tohle int a tohle double?" Diskuse zabere pět minut a zopakuje víc než výklad.

Časté odevzdané chyby: decimal bez m, pruh spočítaný celočíselným dělením ve špatném pořadí, bool zapsaný jako text. Všechny tři jsou v tabulce Když se něco pokazí — odkažte na ni.

Kdo nemá doma .NET, může úkol udělat přímo tady v prohlížeči.

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_ukol02.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 21Oficiá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 typu a podle ukázek kódu.

Co jsme použili Oficiální dokumentace Co tam najdeš
int Celočíselné typy rozsahy int, long, byte a dalších
double Desetinné typy rozdíl mezi float, double a decimal
decimal Typ decimal proč je na peníze a co znamená sufix m
bool Typ bool true, false a logické operace
char Typ char jeden znak a Unicode
string Typ string textové proměnné a co s nimi jde dělat
var Klíčové slovo var kdy se typ dá vynechat
const Klíčové slovo const konstanty a jejich pravidla
(int)x Přetypování a převody implicitní a explicitní převody
int.Parse int.Parse převod textu na číslo
ToString() Object.ToString převod čehokoli na text
Math.Round Math.Round zaokrouhlování a jeho režimy
{x:F2} Formátovací řetězce F, N, P, C a další formáty
/ a % Aritmetické operátory celočíselné dělení a zbytek
>, <, == Porovnávací operátory porovnání, které vrací bool
Jak s dokumentací pracovat na hodině

Stránku o desetinných typech mějte otevřenou — tabulka rozsahů a přesnosti je jediné místo, kde děti na vlastní oči uvidí, proč decimal existuje.

Ve VS Code stačí najet myší na Math.Round a zobrazí se stejná nápověda přímo v editoru. Naučte je ten pohyb myší — používat ho budou denně.

5. Umíme informatiku

Blok 22Navazují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í
Proměnné a výrazy umimeinformatiku.cz Co je v krabici po několika přiřazeních — přesně dnešní téma
Programování — základy umimeinformatiku.cz Čtení kódu a sledování hodnot bez ohledu na jazyk
Převody jednotek umimematiku.cz Dělení se zbytkem a přepočty, které jsme dnes psali v kódu

Cvičení na proměnné je zde obzvlášť vhodné, protože trénuje přesně tu dovednost, kterou děti dnes potřebovaly — udržet v hlavě, co je v proměnné po každém řádku.

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 a = 7; int b = 2; a nechte je hádat výsledky a / b, a % b, (double)a / b a (double)(a / b). Čtvrtý příklad rozdělí třídu vejpůl a vy máte skvělý moment na vysvětlení.