static metody, parametry, návratová hodnota, return, void, výchozí hodnoty parametrů, pojmenované argumenty, zkrácený zápis =>, přetěžováníTenhle blok je jen pro vás — dětem ho nepromítejte.
| Fáze | Co se děje | Čas |
|---|---|---|
| Rozjezd | Ukázka třikrát zkopírovaného rámečku a otázka „co s tím?" | 10 min |
| Výklad + ukázky | Bloky 2–9, postupně void → parametry → return |
40 min |
| Ukázky pro projekci | Pět hotových programů, píšete je živě | 20 min |
| Cvičení | Děti pracují samy, vy obcházíte | 60 min |
| Závěr | Kdo chce, ukáže svoji sadu metod | 10 min |
Metoda je pojmenování. Když dítě pochopí, že VypisRamecek() je
srozumitelnější než pět řádků Console.WriteLine, získalo dovednost,
kterou bude používat do konce života.
Druhý cíl je rozdělení pozornosti. Metoda vám dovolí přemýšlet
nad jedním problémem a zbytek programu dočasně ignorovat.
Řekněte to nahlas: „když píšu SpoctiUtok, nezajímá mě, jak vypadá výpis."
static. Zatím berte jako součást zaklínadla —
„u nás v programu to tam prostě patří". Vysvětlí se to u tříd v 16. hodině.Kam metody psát. V programu bez Main (což je náš případ) patří metody
pod hlavní kód, na konec souboru. Program se čte shora: nejdřív co se děje,
pak jak. Dětem to říkejte jako pravidlo: „nahoře děj, dole nářadí."
Volat metodu můžete i dřív, než je v souboru napsaná — to je v pořádku.
Jak pracovat se smíšenou úrovní. Minimum je jedna metoda bez parametrů.
Rozšíření jsou parametry a return. Výzva jsou výchozí hodnoty
a zkrácený zápis =>. Přetěžování berte jako bonus pro tři nejrychlejší.
Stejný rámeček dvakrát. A ve skutečné hře ho budeš chtít pětkrát.
Cyklus tady nepomůže — ty dvě kopie nejsou vedle sebe, je mezi nimi jiný kód.
Problém není jen v délce. Představ si, že chceš změnit znak rámečku. Musíš to opravit na všech místech a na jedno určitě zapomeneš.
Pravidlo, které používají všichni programátoři: jakmile něco píšeš potřetí, udělej z toho metodu.
Kód nahoře se dá přečíst jako věta: rámeček, text, rámeček.
Metoda je pojmenovaný kus kódu, který se dá zavolat. Napíšeš ho jednou, zavoláš kolikrát chceš.
Dvě části, které musíš rozlišovat:
static void Ramecek() { ... }. Popisuje, co metoda umí.
Sama o sobě nic neudělá.Ramecek();. Teprve tady se kód provede.Všimni si, že definice je až dole, pod hlavním kódem, a přesto ji jde zavolat nahoře. To je záměr: nahoře je děj, dole nářadí.
Zkus v definici změnit text rámečku. Změní se na obou místech naráz.
Přečti si hlavičku metody po částech:
| Část | Zápis | Co znamená |
|---|---|---|
| modifikátor | static |
zaklínadlo, které tam zatím prostě patří |
| návratový typ | void |
„nic nevrací" — jen něco udělá |
| jméno | PozdravHrdinu |
jak metodu zavoláš |
| závorky | () |
sem přijdou parametry (zatím žádné) |
| tělo | { ... } |
co se má provést |
Jméno metody píšeme velkým písmenem. To je v C# zvyk (WriteLine, PadRight,
ContainsKey — vidíš to všude). Proměnné naopak malým.
Za voláním jsou vždycky závorky, i když je metoda bez parametrů.
PozdravHrdinu; bez závorek je chyba.
Dobré jméno metody je sloveso: VypisKartu, SpoctiUtok, NactiJmeno.
Když ti jméno nejde vymyslet, metoda nejspíš dělá moc věcí naráz.
Metoda Pozdrav je jedna, ale pokaždé se chová jinak — podle toho,
co jí pošleš do závorek.
Parametr je proměnná, kterou metoda dostane zvenku. Vzniká při volání a platí jen uvnitř metody.
string jmeno v definici je parametr — kolonka, kterou je potřeba vyplnit."Arkon" při volání je argument — konkrétní hodnota, kterou tam dáš.Typ musí sedět. Pozdrav(42) skončí chybou
CS1503: cannot convert from 'int' to 'string'.
Proměnná jmeno uvnitř metody neexistuje venku. Kdybys ji zkusil vypsat
pod voláním, program se nepřeloží. Je to tak správně — metoda má být krabička,
která zvenku nic nerozbije.
Parametrů může být víc — oddělují se čárkou. Každý má svůj typ a jméno.
Při volání záleží na pořadí. PruhZivotu(40, "Hrdina", 50) se nepřeloží,
protože na prvním místě se čeká text.
Všimni si, co se právě stalo: šest řádků výpočtu a kreslení je schovaných uvnitř metody. Hlavní program má tři řádky a je z nich na první pohled jasné, co dělají.
To je celý smysl dnešní hodiny. Metoda skrývá složitost.
Uvnitř metody si klidně vyráběj vlastní proměnné (dilku, pruh) —
venku o nich nikdo neví a nikomu nevadí.
Dosud metody jen něco vypsaly. Teď budou něco vracet.
returnříká: „skonči metodu a pošli tuhle hodnotu zpátky tomu, kdo mě zavolal."
Změnily se dvě věci:
void je v hlavičce typ, který metoda vrací — tady int.return s hodnotou toho typu.Volání metody, která něco vrací, se chová jako hodnota.
Můžeš si ji uložit do proměnné, vypsat ji nebo s ní rovnou počítat:
SpoctiUtok(8, 3) * 2.
return metodu okamžitě ukončí. Kód za ním se už neprovede —
proto z něj jde udělat i chytrou zkratku:
if (zivoty <= 0) return 0;
Vracet jde jakýkoliv typ — int, string, bool, double.
Tady metoda vrací text.
Všimni si tří return za sebou bez jediného else. Funguje to,
protože první return, na který program narazí, metodu ukončí.
Je to čitelnější než zanořené else.
Nejčastější chyba: metoda s návratovým typem, ve které některá větev
return nemá. Kompilátor napíše
CS0161: not all code paths return a value. Znamená to: „existuje cesta
programem, po které nic nevrátíš."
A druhá chyba: zapomenout výsledek použít. SpoctiUtok(8, 3);
samo o sobě nic nevypíše — hodnota se spočítá a zahodí.
Parametru můžeš dát výchozí hodnotu. Když ho při volání vynecháš, použije se ta z definice.
Oddelovac() → 40 znaků ─Oddelovac(20) → 20 znaků ─Oddelovac(10, '*') → 10 hvězdičekOddelovac(znak: '~') → 40 vlnovekTen poslední zápis je pojmenovaný argument. Napíšeš jméno parametru, dvojtečku a hodnotu — a můžeš tím přeskočit ty předchozí.
Dvě pravidla:
Všimni si char — to je typ pro jeden znak a píše se do
apostrofů: '─'. Text v uvozovkách ("─") je string a sem se nehodí.
Když má metoda jediný výraz, jde napsat na jeden řádek.
Místo:
static int Dvojnasobek(int x)
{
return x * 2;
}
napíšeš:
static int Dvojnasobek(int x) => x * 2;
Šipka => znamená „vrací". Složené závorky ani return psát nemusíš.
Na konci je středník.
Použij to jen na opravdu krátké metody. Jakmile je potřeba if nebo
víc řádků, vrať se ke složeným závorkám — čitelnost je důležitější
než úspora místa.
Uvidíš to hlavně u výpočtů: static int Utok(int s) => s * 2;
Přetěžování znamená, že víc metod má stejné jméno, ale jiné parametry. Počítač pozná podle závorek, kterou z nich myslíš.
Ty to používáš celou dobu, aniž bys to věděl:
Console.WriteLine() — nicConsole.WriteLine("text") — textConsole.WriteLine(42) — čísloTo jsou tři různé metody se stejným jménem.
Pozor na jednu technickou věc: přetěžovat jde jen metody uvnitř třídy,
ne ty, které píšeme volně pod program. Proto je tady navíc
static class Boj — je to zatím jen krabice s nářadím, jméno před tečkou.
Třídy se pořádně naučíš v 16. hodině. Dnes stačí vědět,
že přetěžování existuje a proč WriteLine zvládne všechno.
Věci, které dětem dnes neříkejte, ale vy je vědět potřebujete.
Co je vlastně static void Neco() v top-level programu. Je to
lokální funkce (local function), ne metoda třídy. Kompilátor kolem
top-level statements vyrobí skrytou třídu Program s metodou Main
a lokální funkce žijí uvnitř ní. Slovo static tu znamená
„nesmíš sáhnout na proměnné z okolního kódu" — a to je přesně to,
co u dětí chceme, protože je to nutí použít parametry.
Bez static by metoda viděla proměnné hlavního programu a vznikl by chaos.
Lokální funkce NELZE přetěžovat. Dvě static int Utok(...) s různými
parametry skončí chybou CS0128: A local variable named 'Utok' is already
defined. Proto je v bloku o přetěžování static class Boj —
typy se v top-level souboru deklarují až za hlavním kódem
a uvnitř třídy přetěžování funguje normálně. Ve cvičeních se tomu vyhýbáme
a používáme výchozí hodnoty parametrů, které řeší totéž jednodušeji.
Pořadí v souboru. Top-level statements musí být před deklaracemi typů. Lokální funkce mezi ně můžete klidně vložit — jsou to statements. Pořadí volání a definice nehraje roli, lokální funkce se „vidí" v celém bloku.
void versus návratový typ. Dětem říkejte: „metoda buď něco udělá
(void), nebo něco spočítá (int, string, …)." Metody, které dělají obojí,
jsou obvykle špatně navržené — ale dnes to neřešte, na to je čas později.
Předávání hodnotou. int a string se předávají hodnotou (u string
technicky odkazem, ale protože je neměnný, chová se to stejně).
Pole, List a Dictionary se předávají odkazem — metoda je může změnit.
Dnes na to nenarazí, ale kdyby ano, je to vysvětlení.
Varování CS8321. Když děti metodu definují a nezavolají, kompilátor napíše „local function is declared but never used". Je to jen varování, program běží dál. Uklidněte je.
Jak poznat dobrou metodu. Tři otázky: dá se pojmenovat slovesem? Vejde se na obrazovku? Dá se popsat jednou větou bez slova „a"? Tohle je jediné kritérium, které v téhle fázi potřebují.
Ramecek a sleduj, kde všude se to projeví.Cara() a zavolej ji mezi nimi.Ramecek() pětkrát za sebou v cyklu.Co si z toho odnést: definice metody je dole, volání nahoře. Jeden kus kódu, libovolně mnoho použití — a změna se dělá na jednom místě.
PruhZivotu čtvrtý parametr se znakem pruhu.Co si z toho odnést: hlavní program je čitelný jako seznam příkazů. Všechna složitost (počítání dílků, zarovnávání) je schovaná uvnitř metod.
SpoctiUtok a sleduj celou tabulku.SpoctiObranu(int stit, int uroven).Popis — kdy je hrdina „svěží"?SpoctiUtok přímo uvnitř Console.WriteLine.Co si z toho odnést: metoda, která vrací hodnotu, se dá použít všude, kde by mohla být proměnná — v přiřazení, ve výpisu i uprostřed výpočtu.
Oddelovac úplně bez argumentů.Zprava třetí parametr s výchozí hodnotou.Dvojnasobek zpátky na klasický zápis se složenými závorkami.Co si z toho odnést: výchozí hodnota ti ušetří psaní v devíti případech
z deseti a v tom desátém ji prostě přepíšeš. Zkrácený zápis => je jen
jiný oblek pro return.
Odpocinek, která vrátí životy zpátky na maximum.Souboj výpis pruhu životů každé kolo.Co si z toho odnést: hlavní program má deset řádků a čte se jako popis hry.
Metody Souboj a Hodnoceni vracejí hodnoty, Nadpis a KartaHrdiny jen
vypisují. Přesně takhle vypadá skutečný program.
error CS0161: 'Popis(int)': not all code paths return a value
Nejčastější chyba u metod, které něco vracejí. Kompilátor našel cestu
programem, po které se return nikdy neprovede.
Typicky to vypadá takhle:
static string Popis(int zivoty)
{
if (zivoty > 30)
{
return "v pohodě";
}
}
Co když je zivoty rovno deseti? Podmínka neplatí, metoda skončí —
a nic nevrátí. To C# nedovolí.
Oprava: vždycky mít return i na konci metody, mimo všechny if.
Ten poslední return je „když nic z toho výše neplatilo".
| Hláška | Co to znamená | Jak to opravit |
|---|---|---|
CS0161: not all code paths return a value |
některá větev nic nevrací | přidej return na konec metody |
CS0127: Since 'X' returns void, a return keyword must not be followed by an object expression |
void metoda se snaží něco vrátit |
změň void na int / string, nebo hodnotu jen vypiš |
CS1501: No overload for method 'X' takes 2 arguments |
posíláš jiný počet argumentů | zkontroluj závorky v definici i ve volání |
CS1503: cannot convert from 'int' to 'string' |
prohozené argumenty nebo špatný typ | pořadí argumentů musí sedět na pořadí parametrů |
CS0103: The name 'x' does not exist in the current context |
používáš proměnnou z metody venku (nebo naopak) | pošli ji jako parametr, nebo si ji vrať přes return |
CS0128: A local variable named 'X' is already defined |
dvě lokální metody se stejným jménem | přetěžovat volné metody nejde — použij výchozí hodnoty |
CS8321: The local function 'X' is declared but never used |
jen varování, metodu jsi nezavolal | zavolej ji, nebo ji smaž |
| metoda „nic nedělá" | zavolal jsi ji, ale výsledek zahodil | ulož si ho: int u = SpoctiUtok(8, 3); |
Tvoje zadání:
Než začneš stavět hru z metod, vyrobíš si dvě nejjednodušší: rámeček a čáru. A pak zjistíš, že se dají volat kolikrát chceš.
- Napiš metodu
Ramecek(), která vypíše třířádkový rámeček, a zavolej ji.💡 Poradit
Hlavička jestatic void Ramecek()a definice patří pod hlavní kód.
Volá seRamecek();se závorkami.- Přidej metodu
Cara()a zavolej ji mezi dvěma texty.💡 Poradit
Uvnitř stačí jeden řádek:Console.WriteLine(new string('─', 32));.- Zavolej
Cara()třikrát za sebou pomocí cyklufor.💡 Poradit
Volání metody je obyčejný příkaz — klidně ho dej dovnitř cyklu.- Napiš metodu
Pozdrav(string jmeno)a zavolej ji se třemi různými jmény.💡 Poradit
Parametr se píše do závorek:static void Pozdrav(string jmeno).
Uvnitř použij$"Buď zdráv, {jmeno}!".- Projdi pole
druzinacyklemforeacha pozdrav každého.💡 Poradit
foreach (string clen in druzina) { Pozdrav(clen); }.
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | jedna metoda void bez parametrů a její volání (kroky 1–2) |
| Rozšíření | volání metody v cyklu a metoda s parametrem (kroky 3–4) |
| Výzva | volání metody pro každý prvek pole (krok 5) |
Očekávaný výsledek: rámeček, text, čára, text, tři čáry, tři pozdravy, čára, tři pozdravy družiny a rámeček na konec.
Kde se zaseknou:
- Zapomenou závorky u volání: Ramecek; → CS0201.
- Napíšou definici metody doprostřed hlavního kódu a diví se,
proč jim výpis vychází v jiném pořadí. Přesuňte jim ji dolů
a zopakujte pravidlo „nahoře děj, dole nářadí".
- Vnoří definici metody do jiné metody. Přeloží se to, ale zmate je to —
ať to dají vedle sebe.
- U kroku 4 zapomenou typ parametru a napíšou Pozdrav(jmeno) v definici.
Kdo je hotový dřív: ať napíše metodu Ramecek(string text), které se
předá nadpis, nebo Cara(int delka). To je přesně most do dalšího cvičení.
Otázka na závěr: „Kolikrát je ten rámeček v programu napsaný a kolikrát se vypíše?" Napsaný jednou, vypsaný dvakrát. To je celá dnešní hodina v jedné větě.
Tvoje zadání:
Vyrobíš si sadu metod, které umí hezky vypisovat. Až je budeš mít, bude hlavní program krátký a čitelný.
- Napiš metodu
Nadpis(string text), která text orámuje čarami.💡 Poradit
Uvnitř dejnew string('═', 40)nad text i pod něj.- Napiš
Polozka(string nazev, int cena)a vypiš s ní tři kusy zboží.💡 Poradit
Dva parametry se oddělují čárkou.
Zarovnání:nazev.PadRight(24)acena.ToString().PadLeft(4).- Napiš
PruhZivotu(string jmeno, int zivoty, int max)s pruhem z█a░.💡 Poradit
Počet dílků:zivoty * 20 / max.
Pruh složíš ze dvounew string(...)sečtených plusem.- Zavolej
PruhZivotuv cyklu pro celou družinu ze tří polí.💡 Poradit
Použijfor (int i = 0; i < jmena.Length; i++)a předávejjmena[i],hp[i],maxHp[i].- Přidej
Radek(string vlevo, string vpravo), který zarovná text doleva a doprava.💡 Poradit
Použijvlevo.PadRight(28)a za to rovnouvpravo.
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | metoda s jedním parametrem a její použití (kroky 1–2) |
| Rozšíření | metoda se třemi parametry a výpočtem uvnitř (krok 3) |
| Výzva | volání metody v cyklu nad více poli (kroky 4–5) |
Očekávaný výsledek: tři sekce s nadpisy, ceník o třech položkách, tři pruhy životů (Brok má nejkratší) a tři zarovnané řádky shrnutí.
Kde se zaseknou:
- U kroku 3 napíšou zivoty / max * 20. Celočíselné dělení dá nulu
a pruh zmizí. Pořadí operací je tu důležité — nejdřív násobit, pak dělit.
- Zapomenou .ToString() u jmena.Length v kroku 5 → CS1503.
- Posílají argumenty ve špatném pořadí (PruhZivotu(42, "Arkon", 50)).
Chybová hláška je naštěstí srozumitelná.
- Snaží se uvnitř metody použít pole jmena přímo. static metoda na něj
nevidí — a je to dobře. Ať si ho pošlou parametrem.
Kdo je hotový dřív: ať přidá PruhZivotu čtvrtý parametr se znakem pruhu,
ať napíše Tabulka(string[] jmena, int[] hodnoty), nebo ať Nadpis
umí zarovnat text na střed.
Otázka na závěr: „Kolik řádků by měl hlavní program, kdyby metody nebyly?" Zhruba třikrát tolik — a byl by nečitelný.
Tvoje zadání:
Zatím metody jen vypisovaly. Teď budou počítat a vracet výsledek — a ty s ním budeš dál pracovat.
- Napiš
SpoctiUtok(int sila, int uroven), která vrátísila * 2 + uroven * 3.💡 Poradit
Místovoidnapišinta na konec tělareturn ...;.- Ulož si výsledek do proměnné a vypiš ho.
💡 Poradit
int utok = SpoctiUtok(8, 3);— volání se chová jako hodnota.- Napiš
Popis(int zivoty), která vrátí text podle stavu (tři úrovně).💡 Poradit
Návratový typ jestring.
Použij třireturnza sebou — první, na který se dojde, metodu ukončí.- Napiš
Zije(int zivoty), která vrátítruenebofalse.💡 Poradit
Návratový typ jeboola stačíreturn zivoty > 0;.- Vypiš tabulku celé družiny, kde se všechny tři metody použijí v cyklu.
💡 Poradit
Uvnitř cyklu si spočítejutokastavdo proměnných a pak je vypiš.
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | metoda s return a uložení výsledku (kroky 1–2) |
| Rozšíření | metoda vracející string a bool (kroky 3–4) |
| Výzva | tabulka, kde se volají všechny metody v cyklu (krok 5) |
Očekávaný výsledek: útok hrdiny 25, skřeta 13, tři popisy stavu,
False a True, a nakonec tabulka čtyř postav. Drak má 0 HP, takže nežije.
Kde se zaseknou:
- Napíšou void a pak return hodnota; → CS0127.
- Zapomenou poslední return mimo if → CS0161.
Tohle je nejčastější chyba celé hodiny, počítejte s ní.
- Zavolají SpoctiUtok(8, 3); jako samostatný příkaz a diví se,
že se nic nevypsalo. Metoda počítá, ale nevypisuje — to je záměr.
- Zije vypíše True s velkým písmenem. To je normální chování bool
v C#; kdo chce česky, použije podmíněný operátor jako v kroku 5.
Kdo je hotový dřív: ať přidá SpoctiObranu(int stit, int uroven),
ať Popis rozšíří na pět úrovní, nebo ať napíše metodu
NejsilnejsiUtok(int[] sily, int[] urovne), která vrátí maximum z celé tabulky.
Otázka na závěr: „Jaký je rozdíl mezi metodou, která vypisuje, a metodou, která vrací?" První něco udělá, druhá něco spočítá. Dobrá metoda dělá jen jedno z toho.
Tvoje zadání:
Metody se dají psát chytřeji. Naučíš se je volat bez zbytečného psaní a ty nejkratší zapsat na jediný řádek.
- Napiš
Oddelovac(int delka = 40, char znak = '─')a zavolej ji bez argumentů.💡 Poradit
Výchozí hodnota se píše rovnou do závorek:int delka = 40.
Znak je typchara patří do apostrofů.- Zavolej
Oddelovacještě třikrát — s jedním, se dvěma a s pojmenovaným argumentem.💡 Poradit
Pojmenovaný argument vypadá takhle:Oddelovac(znak: '~');.- Napiš
Zprava(string text, string stitek = "INFO")a vyzkoušej obě varianty.💡 Poradit
Parametr s výchozí hodnotou musí být až za těmi povinnými.- Napiš
DvojnasobekaZijezkráceným zápisem se šipkou=>.💡 Poradit
static int Dvojnasobek(int x) => x * 2;— žádné závorky, žádnýreturn, ale středník na konci.- Napiš
Cena(int zaklad, int slevaProcent = 0)a použij ji v cyklu nad ceníkem.💡 Poradit
Výsledek jezaklad - zaklad * slevaProcent / 100.
V cyklu volej jednou bez slevy a jednou se slevou.
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | metoda s výchozí hodnotou a volání bez argumentů (kroky 1–2) |
| Rozšíření | druhý parametr s výchozí hodnotou a zkrácený zápis (kroky 3–4) |
| Výzva | výpočetní metoda s výchozí hodnotou použitá v cyklu (krok 5) |
Očekávaný výsledek: čtyři různě dlouhé oddělovače, dvě zprávy se štítky,
útok 18, False a True, a ceník, kde meč stojí 90 běžně a 72 v akci.
Kde se zaseknou:
- Napíšou char znak = "─" v uvozovkách → CS0029.
char patří do apostrofů, string do uvozovek.
- Dají parametr s výchozí hodnotou před povinný → CS1737.
- Zkusí výchozí hodnotu jako výpočet (int delka = 20 * 2).
Konstantní výraz projde, ale volání metody ne — ať to nezkoušejí.
- U => zapomenou středník na konci.
- V kroku 5 napíšou zaklad * (1 - slevaProcent / 100). Celočíselné dělení
dá nulu a sleva zmizí. Klasická past — ukažte ji celé třídě.
Kdo je hotový dřív: ať přidá Oddelovac třetí parametr s odsazením,
ať napíše Zprava variantu s výchozím textem, nebo ať do ceníku doplní
sloupec s cenou po dvou slevách za sebou.
Otázka na závěr: „K čemu je pojmenovaný argument, když mám pořadí?" Aby šlo přeskočit parametry uprostřed — a aby bylo z volání vidět, co to číslo znamená.
Tvoje zadání:
Velké finále. Postavíš celou výpravu z metod tak, aby se hlavní program dal přečíst jako příběh — a všechna složitost byla schovaná dole.
- Napiš
Nadpis(string text)aKartaHrdiny(string jmeno, int zivoty, int sila, int zlato).💡 Poradit
Obě jsouvoid, obě jen vypisují. Čtyři parametry oddělíš čárkami.- Napiš
Souboj(string prisera, int hp, int silaHrdiny), která vrátí zlato za vítězství.💡 Poradit
Uvnitř použijwhile (hp > 0)a počítej kola.
Návratový typ jeinta vrátíškolo * 8.- Zavolej
Soubojtřikrát a získané zlato sčítej do proměnné.💡 Poradit
zlato = zlato + Souboj("Skřet", 30, sila);- Napiš
Hodnoceni(int zlato)zkráceným zápisem=>a vypiš ji na konci.💡 Poradit
Vracístring.
Použij podmíněný operátor:zlato >= 200 ? "…" : "…".- Projdi pole příšer cyklem a celou výpravu vyhodnoť v tabulce.
💡 Poradit
Dvě pole se stejnými indexy:priseryahpPriser.
V cyklu volejSouboj(prisery[i], hpPriser[i], sila).
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | dvě void metody a hlavní program, který je volá (krok 1) |
| Rozšíření | metoda s cyklem uvnitř, která vrací hodnotu (kroky 2–3) |
| Výzva | zkrácený zápis a celá výprava v cyklu (kroky 4–5) |
Očekávaný výsledek: tři souboje za 32 + 40 + 72 = 144 zlata, pak velká výprava přes čtyři příšery a závěrečné hodnocení „Legenda království!".
Kde se zaseknou:
- Napíšou Souboj("Skřet", 30, sila); bez přiřazení a zlato zůstane nula.
Návratovou hodnotu je potřeba použít.
- Uvnitř Souboj sáhnou na proměnnou sila z hlavního programu.
static metoda na ni nevidí → CS0103. Je to záměr: musí ji poslat parametrem.
- Parametr hp uvnitř metody mění — a diví se, že venku se nic nezměnilo.
To je správné chování a dobrá příležitost říct, že metoda dostane kopii čísla.
- U Hodnoceni zapomenou středník za výrazem se šipkou.
Kdo je hotový dřív:
- přidat metodu Odpocinek(int zivoty, int max), která vrátí doplněné životy,
- nechat Souboj ubírat i hrdinovi a vracet dvě hodnoty přes dvě metody,
- napsat NejtezsiPrisera(string[] jmena, int[] hp), která vrátí jméno té nejsilnější.
Otázka na závěr: „Přečti hlavní program nahlas. Dává smysl jako věta?" Pokud ano, metody jsou pojmenované správně. To je jediný test, který na kvalitu kódu v téhle fázi potřebují.
Přepiš svůj
Program.cstak, aby byl složený z metod:
- alespoň dvě
voidmetody na výpis (rámeček, karta, pruh životů…),- alespoň dvě metody s návratovou hodnotou (výpočet útoku, hodnocení, cena),
- jednu metodu s výchozí hodnotou parametru,
- jednu metodu zapsanou zkráceně přes
=>,- a hlavní program, který se dá přečíst nahlas jako věta — tedy převážně jen volání metod.
Ulož snímek obrazovky (nebo soubor
Program.cs) a přines na příští hodinu.
Tenhle úkol je v podstatě refaktoring — děti nepíšou nic nového, jen přerovnávají to, co už mají. Je to poprvé, co dělají práci skutečného programátora, a stojí za to to říct nahlas.
Na začátku příští hodiny promítněte dva úkoly a přečtěte hlavní program nahlas jako text. Když to dává smysl, pochvalte to. Když ne, ptejte se, jak by se metoda dala pojmenovat líp. Pět minut, obrovský efekt.
Nejčastější chyba v odevzdaných úkolech bude CS0161 (chybějící return)
a snaha metody sáhnout na proměnnou z hlavního programu.
Mějte obě hlášky připravené na plátně.
Kdo nemá doma .NET, udělá úkol 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 příkazu a podle ukázek kódu.
| Co jsme použili | Oficiální dokumentace | Co tam najdeš |
|---|---|---|
| metody | Metody | jak se metoda skládá a jak se volá |
| parametry | Parametry metod | předávání hodnotou, ref, out |
return |
Příkaz return |
jak se vrací hodnota a kdy metoda skončí |
void |
void |
metoda, která nic nevrací |
| výchozí hodnoty | Volitelné argumenty | pravidla pro parametry s výchozí hodnotou |
| pojmenované argumenty | Pojmenované argumenty | zápis znak: '~' |
=> |
Členy s tělem výrazu | zkrácený zápis metod |
| přetěžování | Přetěžování metod | víc metod se stejným jménem |
| lokální funkce | Lokální funkce | metody psané přímo v programu bez třídy |
static |
Modifikátor static |
co to slovo vlastně znamená |
bool |
Typ bool |
pravda a nepravda jako návratová hodnota |
char |
Typ char |
jeden znak v apostrofech |
Stránka o metodách je jedna z mála, kde je hned na začátku přesně to, co se dnes učilo — ukažte dětem první dva odstavce a víc nic.
Mnohem užitečnější je ale nápověda ve VS Code: najet myší na vlastní metodu a vidět její hlavičku. A ještě lepší je funkce Go to Definition (F12), která skočí z volání rovnou na definici. Naučte je to dnes — jakmile mají v programu deset metod, začnou ji potřebovat.
Pro rychlejší studenty, kteří dokončí cvičení dřív, nebo na posledních 10–15 minut.
| Cvičení | Odkaz | Proč se hodí |
|---|---|---|
| Želví grafika | umimeinformatiku.cz | Pojmenovaný postup (procedura) je tam vidět jako tvar |
| Programování — základy | umimeinformatiku.cz | Čtení kódu rozděleného na pojmenované části |
| Robot na mřížce | umimeinformatiku.cz | Skládání složitého postupu z jednodušších kroků |
Želví grafika je tu obzvlášť vhodná, protože „nakresli čtverec" je přesně metoda — pojmenovaný kus postupu, který se dá zavolat kolikrát chceš. Kdo nechápe, proč metody, pochopí to při kreslení domečku ze tří čtverců.
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í, aby nerušily ostatní.
Dobrá alternativa přímo v kódu: zadejte „napiš metodu Tabulka,
která vezme dvě pole a vypíše je vedle sebe". Je to na deset minut
a kdo to dá, má metody i cykly zvládnuté dohromady.