11. diel - Podmienky v C # druhýkrát - ternárne výraz a propadávací switch
V kurze sme si v minulej lekcii, Textové reťazce v C # druhýkrát - Práca s jednotlivými znakmi , ukázali, že
string
je vlastne pole znakov.
V dnešnej lekcii si predstavíme 2 ďalšie konštrukcie, ktoré súvisia s podmienkami. Jedná sa o oddychový tutoriál, ktorým túto tému dokončíme.
Ternárne operátor
Často sa nám stáva, že niekde potrebujeme nastaviť 2 rôzne hodnoty podľa toho, či platia nejaké podmienka.
Príklad - Výpis pohlavia
Predstavme si, že máme napr. Pohlavia užívateľa uložené ako
bool
(muž by bol true
) a my by sme ho chceli
previesť do textu. S doterajšími znalosťami by sme napísali asi takýto
kód:
{CSHARP_CONSOLE}
bool muz = true; // nejaká premenná udávajúci pohlavia
string nazevPohlavi;
if (muz)
nazevPohlavi = "muž";
else
nazevPohlavi = "žena";
Console.WriteLine(nazevPohlavi);
{/CSHARP_CONSOLE}
Výstup programu je samozrejme nasledovné:
Konzolová aplikácia
muž
Kód je pomerne ukecaný na to, že len prepína medzi dvoma hodnotami. Preto programovacie jazyky často podporujú tzv. Ternárne výraz.
Syntaxe ternárního výrazu
Pomocou tohto operátora môžeme získať hodnotu podľa platnosti logického výrazu. Zapíšeme ho takto:
(vyraz) ? hodnota1 : hodnota2
Podmienku vložíme väčšinou do zátvorky ()
, potom nasleduje
otáznik ?
a 2 hodnoty, ktoré sa majú vrátiť. Hodnoty sú
oddelené dvojbodkou :
, prvá sa vráti keď podmienka platí a
druhá keď neplatí. Ako ľahké!:) Názov operátora je odvodený od toho, že
má 3 časti (podmienka, prvá hodnota a druhá hodnota), preto ternárne.
Príklad - Použitie ternárního výrazu
Poďme si ternárne operátor vyskúšať na príklade s pohlavím:
{CSHARP_CONSOLE}
bool muz = true; // nejaká premenná udávajúci pohlavia
string nazevPohlavi = (muz) ? "muž" : "žena";
Console.WriteLine(nazevPohlavi);
{/CSHARP_CONSOLE}
Namiesto typu bool
by sme mohli do zátvorky
samozrejme napísať akúkoľvek inú podmienku, napr.
(vek >= 18) ? "plnoletý " : "maloletý "
. V
prípade jednoduchých výrazov môžeme zátvorku aj vynechať.
Vnorovanie ternárne operátorov
Ternárne operátormi možno teoreticky ponoriť do seba a tým reagovať aj na 3 a viac hodnôt. Avšak vo väčšine prípadov ponáranie skôr kód znepřehlední, vznikajú totiž dlhé alebo podivne zalomené riadky a nie je na prvý pohľad vidieť, aká časť sa kedy spustí. Ukážme si, ako by sa pomocou vnorovanie ternárne výrazov vyriešil výpis 3 pohlavie:
{CSHARP_CONSOLE}
string pohlavi = "nevim"; // nejaká premenná udávajúci pohlavia
string nazevPohlavi = (pohlavi == "muz") ? "muž" : (pohlavi == "zena") ? "žena" : "nezname";
Console.WriteLine(nazevPohlavi);
{/CSHARP_CONSOLE}
Pre príklad vyššie by bolo lepšie vytvoriť vlastnú metódu, čo si ale ukážeme až v nadväzujúcom kurze objektovo orientovaného programovania.
switch
s propadáváním
S konštrukciou switch
sme sa už stretli v lekcii Podmienky
(vetvenia). Dnes si ukážeme jej ďalšie použitie, na rozdiel od
ternárního operátora ide ale skôr o historickú funkčnosť, pre ktorú dnes
nie je veľmi rozumných využitie. Stále je ale súčasťou štandardnej
gramatiky C# .NET a môžete na ňu naraziť v cudzích zdrojových kódoch.
Príklad - Štvrťrok
Predpokladajme, že chceme podľa mesiaca v roku zistiť, aké je štvrťrok.
Pomocou if
a else
by príklad vyzeral nasledovne:
{CSHARP_CONSOLE}
int mesic = 2;
if (mesic >= 1 && mesic <= 3)
Console.WriteLine("Je první čtvrtletí.");
else if (mesic >= 4 && mesic <= 6)
Console.WriteLine("Je druhé čtvrtletí.");
else if (mesic >= 7 && mesic <= 9)
Console.WriteLine("Je třetí čtvrtletí.");
else if (mesic >= 10 && mesic <= 12)
Console.WriteLine("Je čtvrté čtvrtletí.");
{/CSHARP_CONSOLE}
Ako ale použiť switch
pre takýto príklad? Možno by vás
napadol nasledujúce zápis:
{CSHARP_CONSOLE}
int mesic = 11;
switch (mesic)
{
case 1:
Console.WriteLine("Je první čtvrtletí.");
break;
case 2:
Console.WriteLine("Je první čtvrtletí.");
break;
case 3:
Console.WriteLine("Je první čtvrtletí.");
break;
case 4:
Console.WriteLine("Je druhé čtvrtletí.");
break;
case 5:
Console.WriteLine("Je druhé čtvrtletí.");
break;
case 6:
Console.WriteLine("Je druhé čtvrtletí.");
break;
case 7:
Console.WriteLine("Je třetí čtvrtletí.");
break;
case 8:
Console.WriteLine("Je třetí čtvrtletí.");
break;
case 9:
Console.WriteLine("Je třetí čtvrtletí.");
break;
case 10:
Console.WriteLine("Je čtvrté čtvrtletí.");
break;
case 11:
Console.WriteLine("Je čtvrté čtvrtletí.");
break;
case 12:
Console.WriteLine("Je čtvrté čtvrtletí.");
break;
}
{/CSHARP_CONSOLE}
Príklad funguje spoľahlivo, problém však je, že sme si týmto zápisom moc nepomohli. Podobnému repetitivnímu kódu by sme sa vždy mali vyhýbať.
Prepadávaniu
Skúsme to ešte raz a využime tzv. Prepadávaniu. Ak
potrebujeme vo viacerých blokoch case
vykonávať rovnaký kód,
stačí tieto bloky vložiť pod seba a neukončiť každý blok pomocou
break
, ale celú skupinu bloku jedným break
.
Neukončené bloky tak prepadnú a vykoná sa kód spoločný pre viac
blokov:
{CSHARP_CONSOLE}
int mesic = 11;
switch (mesic)
{
case 1:
case 2:
case 3:
Console.WriteLine("Je první čtvrtletí.");
break;
case 4:
case 5:
case 6:
Console.WriteLine("Je druhé čtvrtletí.");
break;
case 7:
case 8:
case 9:
Console.WriteLine("Je třetí čtvrtletí.");
break;
case 10:
case 11:
case 12:
Console.WriteLine("Je čtvrté čtvrtletí.");
break;
}
{/CSHARP_CONSOLE}
Ukážka výstupu aplikácie:
Konzolová aplikácia
Je čtvrté čtvrtletí.
Tento zápis je už oveľa prehľadnejšie. Konštrukcia switch
má však pridanú hodnotu v prípade, kedy nemôžeme použiť väčší /
menší a ide o výpočet hodnôt, tu je to skôr redundantný kód plný
prázdnych case
.
C# podporuje prepadávaniu iba v prázdnych
case
. Môžete si skúsiť, že akonáhle obsahujú nejaký kód,
kód sa bez break
nepreloží. Aj z neprázdnych case
možno teoreticky prepadávať do ďalších pomocou príkazu
goto casehodnota ;
, Jedná sa ale o zlú a mätúce
praktiku, preto ju nepoužívajte!
Prepadávaniu používajte vo switch
len pokiaľ k nemu máte
dobrý dôvod, avšak je dôležité, aby ste ho vedeli čítať, keď na neho
niekde narazíte.
V budúcej lekcii, Textové reťazce v C # do tretice - Split a Join , si ukážeme, že string
vie predsa
len ešte niečo navyše. Prezradím, že budeme dekódovať Morzeovu
abecedu.