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 se | příklad | výsledek |
|---|---|---|---|
== | je rovno | 5 == 5 | true |
!= | není rovno | 5 != 5 | false |
< | menší než | 3 < 7 | true |
> | větší než | 3 > 7 | false |
<= | menší nebo rovno | 7 <= 7 | true |
>= | větší nebo rovno | 6 >= 7 | false |
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
= 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:
- slovo
if, - podmínka v kulatých závorkách — cokoli, co dá
true/false, - tělo ve složených závorkách
{ }— co se má stát, když podmínka platí.
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ří.
{ } 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.
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ápis | význam | platí když… |
|---|---|---|
&& | a zároveň | platí obě strany |
|| | nebo | platí aspoň jedna strana |
! | ne / opak | otočí 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.
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í.
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 }.
&&
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í.
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.
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á.
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.
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č.
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
- Co je výsledkem porovnání a jakého je typu.
- Rozdíl mezi
=a==. - Co dělá
if,elseaelse ifa proč záleží na jejich pořadí. - Co znamená
&&,||a!. - Proč
"Ano" == "ano"jefalsea co s tím.