← Přehled všech hodin

Funkce (metody)

Cíl hodiny: Děti se naučí rozdělit program na pojmenované kousky. Odcházejí s programem, který má vlastní „nářadí" — metody na rámeček, pruh životů, výpočet útoku a kartu hrdiny.
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.
Kde jsme a co dnes přibude: Metody jsou způsob, jak se přestat opakovat. A jak si přestat pamatovat všechno naráz.

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 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
Hlavní pedagogický cíl

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

Tři věci, které dnes NEVYSVĚTLUJTE
  1. Co přesně znamená 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ě.
  2. Předávání hodnotou versus odkazem. Dnes si vystačíte s čísly a texty, kde se to chová „normálně". Pole a slovníky předávejte, ale nekomentujte.
  3. Rekurze. Je lákavá a děti se na ni někdy ptají. Slibte ji na později a dnes se jí vyhněte — zamotá to i ty, kdo metody právě pochopili.

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

Blok 1Problém, který metoda řeší1. Vysvětlení a souvislosti

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.

Klikni vlevo na Spustit a objeví se tu výstup programu.

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:

  • Definicestatic void Ramecek() { ... }. Popisuje, co metoda umí. Sama o sobě nic neudělá.
  • Volání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.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 2Z čeho se metoda skládá1. Vysvětlení a souvislosti

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.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 3Parametry: metoda, které něco pošleš1. Vysvětlení a souvislosti

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.

Klikni vlevo na Spustit a objeví se tu výstup programu.

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

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 4Návratová hodnota: metoda, která něco spočítá1. Vysvětlení a souvislosti

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:

  • Místo void je v hlavičce typ, který metoda vrací — tady int.
  • V těle musí být 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;
Klikni vlevo na Spustit a objeví se tu výstup programu.

Vracet jde jakýkoliv typint, 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í.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 5Výchozí hodnoty a pojmenované argumenty1. Vysvětlení a souvislosti

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ček
  • Oddelovac(znak: '~') → 40 vlnovek

Ten 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:

  1. Parametry s výchozí hodnotou musí být na konci seznamu.
  2. Výchozí hodnota musí být konstanta — číslo, text, znak. Ne výpočet.

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

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 6Zkrácený zápis =>1. Vysvětlení a souvislosti

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;

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 7Přetěžování: jedno jméno, víc variant1. Vysvětlení a souvislosti

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() — nic
  • Console.WriteLine("text") — text
  • Console.WriteLine(42) — číslo

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

Klikni vlevo na Spustit a objeví se tu výstup programu.
Poznámky pro učiteleTechnické pozadí — jen pro vás1. Vysvětlení a souvislosti

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

2. Ukázky pro projekci

Blok 8Ukázka 1 — První metody2. Ukázky pro projekci
Studenti zkuste změnit
  • Změň text uvnitř Ramecek a sleduj, kde všude se to projeví.
  • Přidej třetí metodu Cara() a zavolej ji mezi nimi.
  • Zavolej Ramecek() pětkrát za sebou v cyklu.
  • Zkus zavolat metodu bez závorek. Co řekne kompilátor?
demo/demo1_prvni_metody.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: 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ě.

Blok 9Ukázka 2 — Metody s parametry2. Ukázky pro projekci
Studenti zkuste změnit
  • Přidej čtvrtou postavu s vlastními čísly.
  • Změň šířku pruhu z 20 na 30.
  • Přidej metodě PruhZivotu čtvrtý parametr se znakem pruhu.
  • Zkus prohodit pořadí argumentů. Co se stane?
demo/demo2_parametry.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: hlavní program je čitelný jako seznam příkazů. Všechna složitost (počítání dílků, zarovnávání) je schovaná uvnitř metod.

Blok 10Ukázka 3 — Metody, které něco vrací2. Ukázky pro projekci
Studenti zkuste změnit
  • Změň vzorec v SpoctiUtok a sleduj celou tabulku.
  • Přidej metodu SpoctiObranu(int stit, int uroven).
  • Uprav hranice v Popis — kdy je hrdina „svěží"?
  • Zavolej SpoctiUtok přímo uvnitř Console.WriteLine.
demo/demo3_navratova_hodnota.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: 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.

Blok 11Ukázka 4 — Výchozí hodnoty a zkrácený zápis2. Ukázky pro projekci
Studenti zkuste změnit
  • Zavolej Oddelovac úplně bez argumentů.
  • Změň výchozí šířku ze 40 na 60.
  • Přidej metodě Zprava třetí parametr s výchozí hodnotou.
  • Přepiš Dvojnasobek zpátky na klasický zápis se složenými závorkami.
demo/demo4_vychozi_hodnoty.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: 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.

Blok 12Ukázka 5 — Celá hra složená z metod2. Ukázky pro projekci
Studenti zkuste změnit
  • Přidej metodu Odpocinek, která vrátí životy zpátky na maximum.
  • Změň sílu hrdiny a sleduj, kolik kol souboj potrvá.
  • Přidej do Souboj výpis pruhu životů každé kolo.
  • Zkus celý hlavní program přečíst nahlas — dává smysl jako věta?
demo/demo5_hra_z_metod.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: 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.

Blok 13Když se něco pokazí2. Ukázky pro projekci
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);

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 14Cvičení 1 — První metody (15 min)3. Cvičení

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

  1. Napiš metodu Ramecek(), která vypíše třířádkový rámeček, a zavolej ji.
    💡 Poradit
    Hlavička je static void Ramecek() a definice patří pod hlavní kód.
    Volá se Ramecek(); se závorkami.
  2. Přidej metodu Cara() a zavolej ji mezi dvěma texty.
    💡 Poradit
    Uvnitř stačí jeden řádek: Console.WriteLine(new string('─', 32));.
  3. Zavolej Cara() třikrát za sebou pomocí cyklu for.
    💡 Poradit
    Volání metody je obyčejný příkaz — klidně ho dej dovnitř cyklu.
  4. 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}!".
  5. Projdi pole druzina cyklem foreach a 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)
cviceni/cviceni1_prvni_metody.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: 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ě.

Řešení 1 — jedna z možných variant
reseni/reseni1_prvni_metody.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 15Cvičení 2 — Nářadí na výpis (20 min)3. Cvičení

Tvoje zadání:

Vyrobíš si sadu metod, které umí hezky vypisovat. Až je budeš mít, bude hlavní program krátký a čitelný.

  1. Napiš metodu Nadpis(string text), která text orámuje čarami.
    💡 Poradit
    Uvnitř dej new string('═', 40) nad text i pod něj.
  2. 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) a cena.ToString().PadLeft(4).
  3. Napiš PruhZivotu(string jmeno, int zivoty, int max) s pruhem z a .
    💡 Poradit
    Počet dílků: zivoty * 20 / max.
    Pruh složíš ze dvou new string(...) sečtených plusem.
  4. Zavolej PruhZivotu v cyklu pro celou družinu ze tří polí.
    💡 Poradit
    Použij for (int i = 0; i < jmena.Length; i++) a předávej jmena[i], hp[i], maxHp[i].
  5. Přidej Radek(string vlevo, string vpravo), který zarovná text doleva a doprava.
    💡 Poradit
    Použij vlevo.PadRight(28) a za to rovnou vpravo.
Ú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)
cviceni/cviceni2_naradi.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: 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ý.

Řešení 2 — jedna z možných variant
reseni/reseni2_naradi.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í 3 — Výpočty, které něco vracejí (20 min)3. Cvičení

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.

  1. Napiš SpoctiUtok(int sila, int uroven), která vrátí sila * 2 + uroven * 3.
    💡 Poradit
    Místo void napiš int a na konec těla return ...;.
  2. Ulož si výsledek do proměnné a vypiš ho.
    💡 Poradit
    int utok = SpoctiUtok(8, 3); — volání se chová jako hodnota.
  3. Napiš Popis(int zivoty), která vrátí text podle stavu (tři úrovně).
    💡 Poradit
    Návratový typ je string.
    Použij tři return za sebou — první, na který se dojde, metodu ukončí.
  4. Napiš Zije(int zivoty), která vrátí true nebo false.
    💡 Poradit
    Návratový typ je bool a stačí return zivoty > 0;.
  5. Vypiš tabulku celé družiny, kde se všechny tři metody použijí v cyklu.
    💡 Poradit
    Uvnitř cyklu si spočítej utok a stav do 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)
cviceni/cviceni3_vypocty.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: ú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 ifCS0161. 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.

Řešení 3 — jedna z možných variant
reseni/reseni3_vypocty.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í 4 — Výchozí hodnoty a zkrácený zápis (20 min)3. Cvičení

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.

  1. 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 typ char a patří do apostrofů.
  2. Zavolej Oddelovac ještě třikrát — s jedním, se dvěma a s pojmenovaným argumentem.
    💡 Poradit
    Pojmenovaný argument vypadá takhle: Oddelovac(znak: '~');.
  3. 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.
  4. Napiš Dvojnasobek a Zije zkrá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.
  5. Napiš Cena(int zaklad, int slevaProcent = 0) a použij ji v cyklu nad ceníkem.
    💡 Poradit
    Výsledek je zaklad - 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)
cviceni/cviceni4_vychozi_hodnoty.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: č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á.

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

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.

  1. Napiš Nadpis(string text) a KartaHrdiny(string jmeno, int zivoty, int sila, int zlato).
    💡 Poradit
    Obě jsou void, obě jen vypisují. Čtyři parametry oddělíš čárkami.
  2. Napiš Souboj(string prisera, int hp, int silaHrdiny), která vrátí zlato za vítězství.
    💡 Poradit
    Uvnitř použij while (hp > 0) a počítej kola.
    Návratový typ je int a vrátíš kolo * 8.
  3. Zavolej Souboj třikrát a získané zlato sčítej do proměnné.
    💡 Poradit
    zlato = zlato + Souboj("Skřet", 30, sila);
  4. 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 ? "…" : "…".
  5. Projdi pole příšer cyklem a celou výpravu vyhodnoť v tabulce.
    💡 Poradit
    Dvě pole se stejnými indexy: prisery a hpPriser.
    V cyklu volej Souboj(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)
cviceni/cviceni5_hra_z_metod.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: 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í.

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

Přepiš svůj Program.cs tak, aby byl složený z metod:

  • alespoň dvě void metody 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.

Pro učitele

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.

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_ukol10.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 20Oficiá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 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
Jak s dokumentací pracovat na hodině

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.

5. Umíme informatiku

Blok 21Navazují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í
Ž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ů.

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