7 / 2 vyjde 3.
int, double, decimal, bool, char, string, var, const, převody a přetypovánístring a int.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á tvar až char, 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 |
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.
int je krabice na celá čísla a nic jiného se do ní nevejde".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.
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: char má jednoduché uvozovky, string dvojité.
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ší.
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 * 3 → 15 |
/ |
dělení (u int bez zbytku) |
7 / 2 → 3 |
% |
zbytek po dělení | 7 % 2 → 1 |
+= -= |
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.
100 / 3 a kolik 100 % 3.zivoty-- místo zivoty++.10 / 4 * 4? A proč to není 10?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?
doublepočítá rychle, ale nepatrně nepřesně (0.1 + 0.2nevyjde úplně0.3). U hry to nevadí, u peněz ano. Proto: statistiky →double, obchod →decimal.
double x = 1,5; je chyba — C# chce tečku.
decimal cena = 149.90; je taky chyba (CS0664) — chybí m na konci.
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.
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.
new string('~', 40).char x = 'ab'; a přečti si, co překladač řekne.░ a █ a vypiš pruh z obou.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.
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?
zivoty / 100.0 nikomu nic neřekne,
zivoty / (double)MAX_ZIVOTY ano.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.
MAX_ZIVOTY = 120; a spusť. Přečti si hlášku CS0131.MAX_ZIVOTY na 200 nahoře a všimni si, kolik řádků se změnilo samo.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.
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.
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.
char znacka na jiné písmeno nebo symbol.int uroven napsat 3.5 a přečti si chybu.bool maLektvar a vypiš ho.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.
7 na 9 a 2 na 4. Co vyjde celočíselně a co desetinně?100 % 7.:F3.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.
poskozeni na jiné desetinné číslo a sleduj rozdíl mezi useknutím a zaokrouhlením.(int) u useknute. Jakou chybu dostaneš?{(int)Math.Round(poskozeni * 2)}.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".
MAX_ZIVOTY na 150 a sleduj, kolik řádků se opravilo samo.CENA_LEKTVARU a podívej se na nový počet lektvarů.MAX_ZIVOTY = 50; a přečti si chybu.Co si z toho odnést: konstanta je pravidlo hry zapsané na jednom místě. Když se pravidlo změní, měníš jediný řádek.
zivoty na 15 a podívej se, jak se pruh zkrátí.DILKU z 20 na 30. Co se stane s pruhem?█ a ░ za # a ..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.
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 |
Tvoje zadání:
Vytvoř kartu hrdiny, ve které bude od každého typu aspoň jedna proměnná.
- Proměnné
jmeno(text) aznacka(jeden znak) a výpis ve tvaru[K] Arkon💡 Poradit
Text patří dostring, jeden znak dochar— a ten má jednoduché uvozovky.
Napříkladchar znacka = 'K';a pakConsole.WriteLine($"[{znacka}] {jmeno}");.- Celá čísla
urovenazivotya jejich výpis💡 Poradit
Celé číslo jeinta nepíše se do uvozovek.
Napříkladint zivoty = 100;. Vypiš je stejně jako text:Console.WriteLine($"Životy: {zivoty}");.- Desetinné číslo
sanceKrit(třeba0.25) vypsané i v procentech💡 Poradit
Desetinné číslo jedoublea píše se s tečkou. Procenta dostaneš vynásobením stem.
Například{sanceKrit * 100:F0} %vypíše25 %.- Peníze
zlatojakodecimalvypsané na dvě desetinná místa💡 Poradit
Udecimalmusí být za číslem písmenom, jinak to překladač nepřeloží.
Napříkladdecimal zlato = 249.50m;a výpis{zlato:F2}.- Pravdivostní hodnota
jeZivyspočítaná z životů a čára kolem karty💡 Poradit
boolnemusíš psát ručně — dá se spočítat porovnáním.
Napříkladbool 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 |
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.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.{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".
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.
naHrdinumá vyjít3,5, ne3💡 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.Zlato celkemmá vyjít150, ne10050💡 Poradit
bonusTextje text, a+u textu znamená „slep za sebe". Nejdřív z něj udělej číslo.
Napříkladint bonus = int.Parse(bonusText);a pak teprve sčítej.zapsanepoškození má z9.8vyjít10, ne9💡 Poradit
Přetypování(int)desetinnou část useká, nezaokrouhlí. Zaokrouhlení umíMath.Round.
Například(int)Math.Round(poskozeni).- 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ž doconst int CENA_LEKTVARU = 12;.- Vypiš shrnutí pod čarou, desetinná čísla na jedno místo
💡 Poradit
Čáru uděláš přesnew string('─', 30)a jedno desetinné místo přes:F1.
NapříkladConsole.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) |
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í.
Tvoje zadání:
Spočítej, jak dopadne jeden úder na nepřítele.
- Konstanta
ZAKLADNI_UTOK(celé číslo) a proměnnánasobic(desetinné číslo)💡 Poradit
Konstanta se píšeconstpřed typ a její hodnota se pak nesmí měnit.
Napříkladconst int ZAKLADNI_UTOK = 12;adouble nasobic = 1.5;.- Vypočítej
poskozenijako ú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ělejdouble.
Výpis na jedno místo:{poskozeni:F1}.- 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říkladint ubrano = (int)Math.Round(poskozeni);.- 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.- Přidej
bool prezila 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íš znew 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 |
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í.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.
Tvoje zadání:
Hrdina vysypal měšec. Spočítej, co v něm je a co si za to koupí.
- Konstanta
MINCI_VE_ZLATAKU = 100a proměnnácelkemMinci = 1337💡 Poradit
Obojí je celé číslo, jen první je zamčené přesconst.
Napříkladconst int MINCI_VE_ZLATAKU = 100;aint celkemMinci = 1337;.- 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říkladint zlataky = celkemMinci / MINCI_VE_ZLATAKU;aint drobne = celkemMinci % MINCI_VE_ZLATAKU;.- Přidej
const decimal CENA_LEKTVARU = 4.50m;a spočítej cenu tří lektvarů💡 Poradit
Udecimalnesmíš zapomenout namza číslem. Násobit se dá rovnou celým číslem.
Napříkladdecimal cenaCelkem = 3 * CENA_LEKTVARU;a výpis{cenaCelkem:F2}.- Spočítej celkovou váhu nákupu z
vahaKusuapocetKusu(použijvar)💡 Poradit
varsi typ domyslí z hodnoty vpravo:var pocetKusu = 7;jeint,var vahaKusu = 0.4;jedouble.
Výslednou váhu vypiš přes{vahaCelkem:F1}.- Vypiš celý účet v rámečku se zarovnanými popisky
💡 Poradit
Zarovnání uděláPadRightna textu popisku.
NapříkladConsole.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 |
Očekávaný výsledek: 13 zlaťáků a 37 drobných, cena 13,50, váha 2,8 kg.
Kde se zaseknou:
/ 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ě.
Tvoje zadání:
Vizitka z první hodiny se dnes mění na opravdový stavový panel s pruhy.
- Konstanty
MAX_ZIVOTY,XP_NA_UROVEN,DILKUa údaje o hrdinovi💡 Poradit
Pravidla hry patří doconst, aktuální stav do obyčejných proměnných.
Napříkladconst int DILKU = 20;a pod toint zivoty = 72;,int xp = 160;.- 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říkladint dilkyZivota = zivoty * DILKU / MAX_ZIVOTY;.- 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říkladstring pruhZivota = new string('█', dilkyZivota) + new string('░', DILKU - dilkyZivota);.- Přidej druhý pruh pro zkušenosti a procenta života
💡 Poradit
Pruh XP se počítá úplně stejně, jen sxpaXP_NA_UROVEN. Procenta potřebujídouble.
Napříkladdouble procentaZivota = (double)zivoty / MAX_ZIVOTY * 100;.- Dej všechno do rámečku a přidej
bool jeVOhrozeni💡 Poradit
Rámeček uděláš znew string('═', SIRKA)nahoře i dole anew 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 |
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.█ 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 uvozovkami → CS1503 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.
Uprav svůj
Program.cstak, 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.
Ú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.
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.
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 |
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ě.
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.
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í.