Lekce 12 - Podmínky ve VB.NET podruhé - Ternární výraz a Select Case
V předešlém cvičení, Řešené úlohy k 11. lekci VB.NET, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešní lekci si představíme 2 další konstrukce, které souvisejí s podmínkami. Jedná se o oddechový tutoriál, kterým toto téma dokončíme.
Ternární operátor
Často se nám stává, že někde potřebujeme nastavit 2 různé hodnoty podle toho, zda platí nějaká podmínka.
Příklad - Výpis pohlaví
Představme si, že máme např. pohlaví uživatele uložené jako
Boolean
(muž by byl True
) a my bychom ho chtěli
převést do textu. S dosavadními znalostmi bychom napsali asi takovýto
kód:
{VBNET_CONSOLE}
Dim muz As Boolean = True 'nějaká proměnná udávající pohlaví
Dim nazevPohlavi As String
If muz Then
nazevPohlavi = "muž"
Else
nazevPohlavi = "žena"
End If
Console.WriteLine(nazevPohlavi)
{/VBNET_CONSOLE}
Výstup programu je samozřejmě následující:
Konzolová aplikace
muž
Kód je poměrně "upovídaný" na to, že jen přepíná mezi dvěma hodnotami. Proto programovací jazyky často podporují tzv. ternární výraz.
Syntaxe ternárního výrazu
Pomocí tohoto operátoru můžeme získat hodnotu podle platnosti logického výrazu. Zapíšeme ho takto:
Dim promenna as typ = If(podmínka, hodnota1, hodnota2)
Syntaxe je velmi jednoduchá, do závorky za klíčové slovo If
uvedeme podmínku, resp. logický výraz. Pokud je splněno, operátor vrátí
hodnota1
, v opačném případě hodnota2
. Jak
snadné! Název operátoru je
odvozený od toho, že má 3 části (podmínka, první hodnota a druhá
hodnota), proto ternární.
Příklad - Použití ternárního výrazu
Pojďme si ternární operátor vyzkoušet na příkladu s pohlavím:
{VBNET_CONSOLE}
Dim muz As Boolean = True 'nějaká proměnná udávající pohlaví
Dim nazevPohlavi As String = If(muz, "muž", "žena")
Console.WriteLine(nazevPohlavi)
{/VBNET_CONSOLE}
Ve starších verzích se místo If
používal
IIf
. Rozdíly jsou mezi nimi minimální a proto se jimi v tomto
kurzu ani nebudeme zabývat. Stačí, když si zapamatujete, že vhodnější je
v současnosti použít If
.
Vnořování ternárních operátorů
Ternární operátory lze teoreticky zanořovat do sebe a tím reagovat i na 3 a více hodnot. Nicméně ve většině případů zanořování spíše kód znepřehlední, vznikají totiž dlouhé nebo podivně zalomené řádky a není na první pohled vidět, jaká část se kdy spustí. Ukažme si, jak by se pomocí vnořování ternárních výrazů vyřešil výpis 3 pohlaví:
{VBNET_CONSOLE}
Dim pohlavi As Char = "X" 'nějaká proměnná udávající pohlaví
Dim nazevPohlavi As String = If(pohlavi = "M", "muž", If(pohlavi = "F", "žena", "jiné"))
Console.WriteLine(nazevPohlavi)
{/VBNET_CONSOLE}
Pro příklad výše by bylo lepší vytvořit vlastní metodu, což si ale ukážeme až v navazujícím kurzu objektově orientovaného programování.
Select Case
S konstrukcí Select Case
jsme se již setkali v lekci Podmínky
(větvení). Dnes si ukážeme další možnosti při psaní podmínek.
Příklad - Čtvrtletí
Předpokládejme, že chceme podle měsíce v roce zjistit, jaké je
čtvrtletí. K tomu můžeme použít sekvenci If
-
ElseIf
- Else
. Příklad by vypadal následovně:
{VBNET_CONSOLE}
Dim mesic As Integer = 11
If mesic >= 1 And mesic <= 3 Then
Console.WriteLine("Je první čtvrtletí.")
ElseIf mesic >= 4 And mesic <= 6 Then
Console.WriteLine("Je druhé čtvrtletí.")
ElseIf mesic >= 7 And mesic <= 9 Then
Console.WriteLine("Je třetí čtvrtletí.")
ElseIf mesic >= 10 And mesic <= 12 Then
Console.WriteLine("Je čtvrté čtvrtletí.")
Else
Console.WriteLine("Chybně zadané číslo měsíce.")
End If
{/VBNET_CONSOLE}
Jak ale použít Select Case
pro takovýto příklad? Možná by
vás napadl následující zápis:
{VBNET_CONSOLE}
Dim mesic As Integer = 11
Select Case mesic
Case 1
Console.WriteLine("Je první čtvrtletí.")
Case 2
Console.WriteLine("Je první čtvrtletí.")
Case 3
Console.WriteLine("Je první čtvrtletí.")
Case 4
Console.WriteLine("Je druhé čtvrtletí.")
Case 5
Console.WriteLine("Je druhé čtvrtletí.")
Case 6
Console.WriteLine("Je druhé čtvrtletí.")
Case 7
Console.WriteLine("Je třetí čtvrtletí.")
Case 8
Console.WriteLine("Je třetí čtvrtletí.")
Case 9
Console.WriteLine("Je třetí čtvrtletí.")
Case 10
Console.WriteLine("Je čtvrté čtvrtletí.")
Case 11
Console.WriteLine("Je čtvrté čtvrtletí.")
Case 12
Console.WriteLine("Je čtvrté čtvrtletí.")
End Select
{/VBNET_CONSOLE}
Příklad funguje spolehlivě, problém však je, že jsme si tímto zápisem moc nepomohli. Podobnému opakujícímu se kódu bychom se vždy měli vyhýbat.
Sloučení podmínek
Zkusme to ještě jednou a využijme možnosti sloučení podmínek, které
nám Select Case
poskytuje. Možností je hned několik:
{VBNET_CONSOLE}
Dim mesic As Integer = 6
Select Case mesic
Case 1, 2, 3 'výčet hodnot oddělených čárkou
Console.WriteLine("Je první čtvrtletí.")
Case 4 To 6 'interval od - do
Console.WriteLine("Je druhé čtvrtletí.")
Case Is <= 9 'menší nebo rovno hodnotě
Console.WriteLine("Je třetí čtvrtletí.")
Case Else 'zbývající
Console.WriteLine("Je čtvrté čtvrtletí.")
End Select
{/VBNET_CONSOLE}
Ukázka výstupu aplikace:
Konzolová aplikace
Je druhé čtvrtletí.
Tento zápis je již mnohem stručnější a přehlednější! Konstrukce
Select Case
nepodporuje tzv. propadávání. Čili podmínka
Is <= 9
pro hodnoty od 1
do 6
nebude
vyhodnocována, jelikož tyto hodnoty zpracuje již první nebo druhý
case
a poté je Select Case
ukončen (jakmile
je některá podmínka splněna, další podmínky se již
nevyhodnocují).
Styly podmínek v Select Case
lze i kombinovat,
např. pro kladná čísla, která nejsou dvouciferná, by šlo napsat:
Case 1, 2, 3, 4 To 9, Is > 99
.
V příští lekci, Cykly ve VB.NET podruhé - While, Do-Loop, Exit a Continue, na nás čeká další syntaxe okolo cyklů, na kterou můžeme narazit v cizích zdrojových kódech.