Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij podzimní akce 30% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se JavaScript
JavaScript týden

11. diel - Podmienky v C # druhýkrát - ternárne výraz a propadávací switch

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
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

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.


 

Predchádzajúci článok
Textové reťazce v C # do tretice - Split a Join
Všetky články v sekcii
Základné konštrukcie jazyka C #
Článok pre vás napísal Radek Vymětalík
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
...
Aktivity (1)

 

 

Komentáre

Avatar
Honza
Člen
Avatar
Honza:9. marca 16:28

Děkuju za článek.
Vrtá mi ale hlavou jedna věc: proč C# neumožňuje nějak přehledně řešit podmínku pro intervaly hodnot. Něco na tento způsob:

switch (procenta) {
  case 1..50: break;
  case 51..80: break;
  case 81..90: break;
  case 91..95: break;
  case 96..98: break;
  case 99: break;
  case 100: break;
  default: break;
}

Vím že je to spíš filosofická otázka, protože to c# prostě neumožňuje. Ale stejně by mě to zajímalo - např. často zatracovaný Visual Basic tuto konstrukci evidentně umožňuje a přitom oba jazyky jsou postaveny na tom samém základu - .NET

 
Odpovedať
9. marca 16:28
Avatar
David Holohlavský:19. marca 19:00

Díky za článek. ;-)

 
Odpovedať
19. marca 19:00
Avatar
Fíla N.
Člen
Avatar
Fíla N.:29. marca 17:40

Hej, kde se to tu vzalo, to tu nebylo :D , ale díky

 
Odpovedať
29. marca 17:40
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Marek Vajčner:30. marca 9:39

Díky za oddechovku. ;-)

 
Odpovedať
30. marca 9:39
Avatar
Vilfein
Člen
Avatar
Vilfein:19. mája 14:09

Díky za článek :)

 
Odpovedať
19. mája 14:09
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 5 správy z 5.