IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

bool muz = true; // nejaká premenná udávajúci pohlavia
string nazevPohlavi;
if (muz)
    nazevPohlavi = "muž";
else
    nazevPohlavi = "žena";
Console.WriteLine(nazevPohlavi);

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:

bool muz = true; // nejaká premenná udávajúci pohlavia
string nazevPohlavi = (muz) ? "muž" : "žena";
Console.WriteLine(nazevPohlavi);

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:

string pohlavi = "nevim"; // nejaká premenná udávajúci pohlavia
string nazevPohlavi = (pohlavi == "muz") ? "muž" : (pohlavi == "zena") ? "žena" : "nezname";
Console.WriteLine(nazevPohlavi);

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:

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í.");

Ako ale použiť switch pre takýto príklad? Možno by vás napadol nasledujúce zápis:

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;
}

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:

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;
}

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.


 

Predchádzajúci článok
Textové reťazce v C # druhýkrát - Práca s jednotlivými znakmi
Všetky články v sekcii
Základné konštrukcie jazyka C # .NET
Preskočiť článok
(neodporúčame)
Textové reťazce v C # do tretice - Split a Join
Článok pre vás napísal Radek Vymětalík
Avatar
Užívateľské hodnotenie:
2 hlasov
...
Aktivity