Lekce 3 — Podmínky

Základy programování v C# · třetí dvouhodinovka

Zatím vaše programy běžely jako po kolejích: řádek za řádkem, odshora dolů, pokaždé úplně stejně. Uměly vypsat text, načíst vstup a uložit si ho do proměnné. Ale neuměly se rozhodnout. Dnes je naučíme říkat „pokud… tak…“.

1. Otázky, na které se odpovídá ano/ne

Minule jste potkali typ bool — krabičku, do které se vejde jen true nebo false. Dnes zjistíte, k čemu je. Počítač se rozhoduje výhradně podle odpovědí ano/ne, a takové odpovědi vznikají porovnáváním:

zápisčte sepříkladvýsledek
==je rovno5 == 5true
!=není rovno5 != 5false
<menší než3 < 7true
>větší než3 > 7false
<=menší nebo rovno7 <= 7true
>=větší nebo rovno6 >= 7false

Výsledek porovnání je obyčejná hodnota typu bool. Můžete si ji klidně uložit do proměnné a vypsat:

int vek = 17;
bool jeDospely = vek >= 18;
Console.WriteLine(jeDospely);      // vypíše: False
Past č. 1: = vs. == Jedno rovnítko znamená „ulož do“ (to znáte z minula). Dvě rovnítka znamenají „je rovno?“. Zápis if (vek = 18) se v C# naštěstí nepřeloží, ale chybovou hlášku dostanete o tom, že „nelze převést int na bool“ — a to vám napoprvé nic neřekne. Když ji uvidíte, hledejte chybějící rovnítko.

2. if — udělej to jen někdy

Console.Write("Kolik ti je let? ");
int vek = int.Parse(Console.ReadLine());

if (vek >= 18)
{
    Console.WriteLine("Můžeš volit.");
}

Console.WriteLine("Konec programu.");

Čte se: „Pokud je vek aspoň 18, proveď to, co je ve složených závorkách. Jinak to přeskoč.“ Poslední řádek se vypíše vždycky — už není uvnitř závorek, podmínka se ho netýká.

Tři části, které musí být vždy:

  1. slovo if,
  2. podmínka v kulatých závorkách — cokoli, co dá true/false,
  3. tělo ve složených závorkách { } — co se má stát, když podmínka platí.
Past č. 2: středník za if
if (vek >= 18);          // ← tenhle středník je chyba
{
    Console.WriteLine("Můžeš volit.");
}
Přeloží se to. A vypíše to „Můžeš volit.“ vždycky, i pětiletému dítěti. Středník totiž ukončil if s prázdným tělem a závorky pod ním už jsou samostatný blok, který se provede bez ptaní. Za if (...) středník nikdy nepatří.
Odsazení Všechno uvnitř { } odsazujte o jednu úroveň (Tab). Překladači je to jedno, vám ne — za dva týdny budete mít podmínku v podmínce v podmínce a bez odsazení se v tom nevyznáte ani vy, ani já při kontrole.

3. else — a co jinak?

if (vek >= 18)
{
    Console.WriteLine("Můžeš volit.");
}
else
{
    Console.WriteLine("Ještě si počkáš.");
}

Provede se přesně jedna z těch dvou větví. Nikdy obě, nikdy žádná. Když potřebujete rozlišit víc než dvě možnosti, řetězíte else if:

Console.Write("Známka: ");
int znamka = int.Parse(Console.ReadLine());

if (znamka == 1)
{
    Console.WriteLine("Výborně");
}
else if (znamka == 2)
{
    Console.WriteLine("Chvalitebně");
}
else if (znamka <= 4)
{
    Console.WriteLine("Prošel/a jsi.");
}
else
{
    Console.WriteLine("Nedostatečně.");
}

Podmínky se zkoušejí odshora dolů a u první, která platí, se skončí. Proto je třetí větev znamka <= 4 správně, i když 1 a 2 jsou taky menší než 4 — ty už byly odchycené výš. Pořadí větví je součást logiky, ne kosmetika.

Zkuste si to v hlavě Co vypíše ten program pro vstup 3? A pro 0? A pro 7? Projděte to prstem řádek po řádku, než to spustíte. Přesně tohle po vás budu chtít při kontrole.

4. Skládání podmínek

Často potřebujete zkontrolovat víc věcí najednou. K tomu jsou tři spojky:

zápisvýznamplatí když…
&&a zároveňplatí obě strany
||neboplatí aspoň jedna strana
!ne / opakotočí true na false a naopak
int vek = 20;
bool maRidicak = true;

if (vek >= 18 && maRidicak)
{
    Console.WriteLine("Můžeš řídit.");
}

if (vek < 15 || vek > 65)
{
    Console.WriteLine("Máš slevu na vstupné.");
}

if (!maRidicak)
{
    Console.WriteLine("Nejdřív autoškola.");
}

Svislítko | najdete na klávesnici obvykle pod AltGr+W (nebo AltGr+\) — zjistěte si to teď, ať to nehledáte uprostřed úlohy.

Past č. 3: „když je věk 15 nebo 16“
if (vek == 15 || 16)        // nepřeloží se
if (vek == 15 || vek == 16) // správně
Česky to zní přirozeně, ale počítač po || čeká další celou otázku ano/ne, ne jen číslo. Každou stranu spojky musíte napsat jako samostatné porovnání.
Past č. 4: rozsahy
if (10 <= vek <= 20)          // nepřeloží se
if (vek >= 10 && vek <= 20)   // správně
Matematický zápis „mezi 10 a 20“ C# nezná. Musíte to rozepsat na dvě porovnání spojená &&.

5. Porovnávání textu

Řetězce se porovnávají taky přes ==, ale pozor — pro počítač je "Ano" a "ano" něco úplně jiného:

Console.Write("Pokračovat? (ano/ne) ");
string odpoved = Console.ReadLine();

if (odpoved == "ano")
{
    Console.WriteLine("Jedeme dál.");
}

Uživatel napíše Ano a program mlčí. Řešení: před porovnáním text sjednotit na malá písmena a oříznout mezery, které tam uživatel „omylem“ nechal:

string odpoved = Console.ReadLine().Trim().ToLower();

if (odpoved == "ano" || odpoved == "a")
{
    Console.WriteLine("Jedeme dál.");
}

.Trim() odstraní mezery na krajích, .ToLower() převede na malá písmena. Tečkou za sebe řadíte jednu úpravu za druhou. Zapamatujte si to — v textové hře, kterou budeme psát v druhém pololetí, bude tenhle řádek úplně všude.

6. Podmínka v podmínce

Tělo if může obsahovat cokoli — tedy i další if:

if (vek >= 18)
{
    if (maRidicak)
    {
        Console.WriteLine("Můžeš řídit.");
    }
    else
    {
        Console.WriteLine("Jsi dospělý, ale bez papírů.");
    }
}
else
{
    Console.WriteLine("Na řízení jsi moc mladý.");
}

Tady vidíte, proč záleží na odsazení. Každé else patří k nejbližšímu if nad sebou na stejné úrovni odsazení. Když se v tom ztratíte, počítejte závorky: každá { musí mít svou }.

Kdy vnořovat a kdy použít && Pokud potřebujete jen říct „udělej to, když platí A i B“, použijte && — je to kratší a čitelnější. Vnoření se hodí, když chcete různě reagovat podle toho, která část neplatí (jako v příkladu nahoře).

7. Úkoly

Pořadí je od nejlehčího. Každý úkol je samostatný program. U každého si nejdřív rozmyslete, jaké vstupy vyzkoušíte — hraniční hodnoty (přesně 18, přesně 0) jsou ty, kde programy padají.

Úkol 1 · zahřívací

Sudé, nebo liché?

Načtěte celé číslo a vypište, jestli je sudé, nebo liché.

Nápověda: operátor % vrací zbytek po dělení. 7 % 2 je 1, 8 % 2 je 0.

Úkol 2

Větší ze dvou

Načtěte dvě čísla a vypište to větší. Pokud jsou stejná, vypište „Jsou stejná.“

Test: zkuste zadat obě čísla stejná. Zkuste záporná.

Úkol 3

Vstupné do bazénu

Načtěte věk. Ceník: do 6 let zdarma, 6–17 let 80 Kč, 18–64 let 150 Kč, 65 a více 90 Kč. Vypište cenu.

Test: 5, 6, 17, 18, 64, 65. Všech šest musí sedět.

Úkol 4

Přihlášení

V programu si pevně nastavte jméno a heslo (např. "admin" / "tajne123"). Načtěte od uživatele jméno a heslo a vypište „Přihlášen“ jen tehdy, když sedí obojí. Jméno nesmí záviset na velikosti písmen, heslo musí.

Bonus: pokud sedí jméno, ale ne heslo, vypište „Špatné heslo“. Pokud nesedí jméno, vypište jen „Neznámý uživatel“ — a hlavně neprozrazujte, že heslo bylo správně. Přemýšlejte proč.

Úkol 5 · pro rychlé

Kalkulačka

Načtěte dvě čísla (double) a znak operace jako text: +, -, * nebo /. Vypište výsledek. Při neznámé operaci vypište chybu. Při dělení nulou vypište „Nulou nedělím.“ místo výsledku.

Pozor: double.Parse na českých Windows čeká desetinnou čárku, ne tečku. Vyzkoušejte si, co váš počítač bere.

Shrnutí — co byste měli umět říct vlastními slovy

Pravidlo pro AI platí pořád: můžete se ptát, můžete si nechat vysvětlit chybovou hlášku, můžete si nechat navrhnout řešení. Ale u kontroly dostanete otázku typu „změň to tak, aby sleva platila jen do 14 let včetně“ nebo „co se stane, když sem napíšu -5?“ — a na tu musíte odpovědět vy, ne chatbot. Kód, který neumíte změnit, není váš.