5. diel - Podmienky (vetvenia)
V predchádzajúcom cvičení, Riešené úlohy k 4. lekcii VB.NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 4. lekcii VB.NET , sme si podrobne prebrali dátové typy. Aby sme si niečo naprogramovali, potrebujeme nejako reagovať na rôzne situácie. Môže to byť napríklad hodnota zadaná užívateľom, podľa ktorej budeme chcieť meniť ďalšie beh programu. Hovoríme, že sa program vetví a k vetvenia používame podmienky, tým sa budeme venovať celý dnešný Visual Basic .NET tutoriál. Vytvoríme program na výpočet odmocniny a vylepšíme našu kalkulačku.
Podmienky
Podmienky zapisujeme pomocou kľúčového slova If
, za ktorým
nasleduje logický výraz a za ním kľúčové slovo Then
. Ak je
výraz pravdivý, vykoná sa nasledujúci príkaz. Ak nie, nasledujúci príkaz
sa preskočí a pokračuje sa až pod ním. Podmienku ukončuje
End If
. Vyskúšajme si to:
{VBNET_CONSOLE}
If 15 > 5 Then
Console.WriteLine("Pravda")
End If
Console.WriteLine("Program tu pokračuje ďalej")
Console.ReadKey()
{/VBNET_CONSOLE}
Výstup programu:
Konzolová aplikácia
Pravda
Program tu pokračuje ďalej
Ak podmienka platí (čo tu áno), vykoná sa príkaz Vyhlasujúca do konzoly text pravda. V oboch prípadoch program pokračuje ďalej. Súčasťou výrazu samozrejme môže byť aj premenná:
{VBNET_CONSOLE}
Console.WriteLine("Zadaj nejaké číslo")
Dim a As Integer = Console.ReadLine()
If a > 5 Then
Console.WriteLine("Zadal si číslo väčšie ako 5!")
End If
Console.WriteLine("Ďakujem za zadania")
Console.ReadKey()
{/VBNET_CONSOLE}
Ukážme si teraz relačné operátory, ktoré môžeme vo výrazoch používať:
operátor | VB.NET zápis |
---|---|
rovnosť | = |
Je ostro väčšia | > |
Je ostro menšia | < |
Je väčšie alebo rovné | > = |
Je menšie alebo rovné | <= |
nerovnosť | <> |
=
, rovnako ako keď chceme priradiť
hodnotu do premennej. Ak chceme nejaký výraz znegovat, napíšeme pred neho
Not
.
{VBNET_CONSOLE}
Console.WriteLine("Zadaj nejaké číslo, z ktorého spočítám odmocninu:")
Dim a As Integer = Console.ReadLine()
If a > 0 Then
Console.WriteLine("Zadal si číslo väčšie ako 0, to znamená, že ho môžem odmocniť!")
Dim o As Double = Math.Sqrt(a)
Console.WriteLine("Odmocnina z čísla " & a & " je " & o)
End If
Console.WriteLine("Ďakujem za zadania")
Console.ReadKey()
{/VBNET_CONSOLE}
Konzolová aplikácia
Zadaj nejaké číslo, z ktorého spočítám odmocninu:
144
Zadal si číslo väčšie ako 0, to znamená, že ho môžem odmocniť!
Odmocnina z čísla 144 je 12
Ďakujem za zadania
Program načíta od užívateľa číslo a ak je väčšia ako
0
, vypočíta z neho druhú odmocninu. Okrem iného sme použili
triedu Math
, ktorá na sebe obsahuje množstvo užitočných
matematických metód, na konci tejto kapitoly si ju bližšie predstavíme.
Sqrt()
vracia hodnotu ako Double
. Bolo by pekné, keby
nám program vyhubovala v prípade, že zadáme záporné číslo. S
doterajšími znalosťami by sme napísali niečo ako:
{VBNET_CONSOLE}
Console.WriteLine("Zadaj nejaké číslo, z ktorého spočítám odmocninu:")
Dim a As Integer = Console.ReadLine()
If a > 0 Then
Console.WriteLine("Zadal si číslo väčšie ako 0, to znamená, že ho môžem odmocniť!")
Dim o As Double = Math.Sqrt(a)
Console.WriteLine("Odmocnina z čísla " & a & " je " & o)
End If
If a <= 0 Then
Console.WriteLine("Odmocnina zo záporného čísla neexistuje!")
End If
Console.WriteLine("Ďakujem za zadania")
Console.ReadKey()
{/VBNET_CONSOLE}
Všimnite si, že musíme pokryť aj prípad, kedy sa a = 0
,
nielen keď je menšia. Kód však môžeme výrazne zjednodušiť pomocou
kľúčového slova Else
, ktoré vykoná nasledujúci príkaz alebo
blok príkazov v prípade, že sa podmienka nevykoná:
{VBNET_CONSOLE}
Console.WriteLine("Zadaj nejaké číslo, z ktorého spočítám odmocninu:")
Dim a As Integer = Console.ReadLine()
If a > 0 Then
Console.WriteLine("Zadal si číslo väčšie ako 0, to znamená, že ho môžem odmocniť!")
Dim o As Double = Math.Sqrt(a)
Console.WriteLine("Odmocnina z čísla " & a & " je " & o)
Else
Console.WriteLine("Odmocnina zo záporného čísla neexistuje!")
End If
Console.WriteLine("Ďakujem za zadania")
Console.ReadKey()
{/VBNET_CONSOLE}
Kód je oveľa prehľadnejšie a nemusíme vymýšľať opačnú podmienku, čo by v prípade zloženej podmienky mohlo byť niekedy aj veľmi ťažké.
Else
sa tiež využíva v prípade, keď potrebujeme v príkaze
manipulovať s premennou z podmienky a nemôžeme sa na ňu teda pýtať potom
znova. Program si sám pamätá, že sa podmienka nesplnila a prejde do sekcie
Else
. Ukážme si to na príklade: Majme číslo a
,
kde bude hodnota 0
alebo 1
a po nás sa bude chcieť,
aby sme hodnotu prehodili (ak tam je 0
, dáme tam 1
,
ak 1
, dáme tam 0
). Naivne by sme mohli kód napísať
takto:
{VBNET_CONSOLE}
Dim a As Integer = 0
If a = 0 Then
a = 1
End If
If a = 1 Then
a = 0
End If
Console.WriteLine(a)
Console.ReadKey()
{/VBNET_CONSOLE}
Nefunguje to, že? Poďme si prejsť, čo bude program robiť. Na začiatku
máme v a
nulu, prvá podmienka sa určite splní a dosadí do
a
jedničku. No ale razom sa splní aj tá druhá. Čo s tým? Keď
podmienky otočíme, budeme mať ten istý problém s jednotkou. Ako z toho von?
Áno, použijeme Else
.
{VBNET_CONSOLE}
Dim a As Integer = 0
If a = 0 Then
a = 1
Else
a = 0
End If
Console.WriteLine(a)
Console.ReadKey()
{/VBNET_CONSOLE}
Podmienky je možné skladať a to pomocou dvoch základných operátorov:
operátor | VB.NET zápis |
---|---|
A zároveň | and |
alebo | Or |
{VBNET_CONSOLE}
Console.WriteLine("Zadajte číslo v rozmedzí 10-20:")
Dim a As Integer = Console.ReadLine()
If a >= 10 And a <= 20 Then
Console.WriteLine("Zadal si správne")
Else
Console.WriteLine("Zadal si zle")
End If
Console.ReadKey()
{/VBNET_CONSOLE}
S tým si zatiaľ vystačíme, operátorov sa pomocou zátvoriek samozrejme dajú kombinovať.
{VBNET_CONSOLE}
Console.WriteLine("Zadajte číslo v rozmedzí 10-20 alebo 30-40:")
Dim a As Integer = Console.ReadLine()
If ((a >= 10) And (a <= 20)) Or ((a >= 30) And (a <= 40)) Then
Console.WriteLine("Zadal si správne")
Else
Console.WriteLine("Zadal si zle")
End If
Console.ReadKey()
{/VBNET_CONSOLE}
Select Case
Select Case
nám umožňuje zjednodušiť (relatívne) zápis
viac podmienok pod sebou. Spomeňme si na našu kalkulačku v prvých lekciách,
ktorá načítala 2 čísla a vypočítala všetky 4 operácie. Teraz si ale
budeme chcieť zvoliť, ktorú operáciu chceme. Bez Select Case
by
sme napísali kód podobný tomuto:
{VBNET_CONSOLE}
Console.WriteLine("Vitajte v kalkulačke")
Console.WriteLine("Zadajte prvé číslo:")
Dim a As Single = Console.ReadLine()
Console.WriteLine("Zadajte druhé číslo:")
Dim b As Single = Console.ReadLine()
Console.WriteLine("Zvoľte si operáciu:")
Console.WriteLine("1 - sčítanie")
Console.WriteLine("2 - odčítanie")
Console.WriteLine("3 - násobenie")
Console.WriteLine("4 - delenie")
Dim volba As Integer = Console.ReadLine()
Dim vysledek As Single = 0
If volba = 1 Then
vysledek = a + b
Else
If volba = 2 Then
vysledek = a - b
Else
If volba = 3 Then
vysledek = a * b
Else
If volba = 4 Then
vysledek = a / b
End If
End If
End If
End If
If volba > 0 And volba < 5 Then
Console.WriteLine("Výsledok: {0}", vysledek)
Else
Console.WriteLine("Neplatná voľba")
End If
Console.WriteLine("Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.")
Console.ReadKey()
{/VBNET_CONSOLE}
Konzolová aplikácia
Vitajte v kalkulačke
Zadajte prvé číslo:
3,14
Zadajte druhé číslo:
2,72
Zvoľte si operáciu:
1 - sčítanie
2 - odčítanie
3 - násobenie
4 - delenie
2
Výsledok: 0,42
Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.
Všimnite si, že sme premennú vysledek
deklarovali na
začiatku, len tak do nej môžeme potom priraďovať. Keby sme ju deklarovali u
každého priradenie, Visual Basic by kód nezkompiloval a vyhodil chybu
redeklarace premenné. Premenná môže byť deklarovaná (založená v pamäti)
vždy iba raz. Bohužiaľ Visual Basic nie je schopný poznať, či je do
premennej vysledek
naozaj priradená nejaká hodnota. Ozve sa pri
výpise na konzole, kde sa mu nepáči, že môže vypisovať premennú, ktorá
nemá priradenú hodnotu. Z tohto dôvodu na začiatku dosadíme do
vysledek
nulu. Ďalšia vychytávka je kontrola správnosti voľby.
Program by v tomto prípade fungoval rovnako aj bez tých Else
, ale
načo sa ďalej pýtať, keď už máme výsledok.
Teraz si skúsime napísať ten istý kód pomocou
Select Case
:
{VBNET_CONSOLE}
Console.WriteLine("Vitajte v kalkulačke")
Console.WriteLine("Zadajte prvé číslo:")
Dim a As Single = Console.ReadLine()
Console.WriteLine("Zadajte druhé číslo:")
Dim b As Single = Console.ReadLine()
Console.WriteLine("Zvoľte si operáciu:")
Console.WriteLine("1 - sčítanie")
Console.WriteLine("2 - odčítanie")
Console.WriteLine("3 - násobenie")
Console.WriteLine("4 - delenie")
Dim volba As Integer = Console.ReadLine()
Dim vysledek As Single = 0
Select Case volba
Case 1
vysledek = a + b
Case 2
vysledek = a - b
Case 3
vysledek = a * b
Case 4
vysledek = a / b
End Select
If volba > 0 And volba < 5 Then
Console.WriteLine("Výsledok: {0}", vysledek)
Else
Console.WriteLine("Neplatná voľba")
End If
Console.WriteLine("Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.")
Console.ReadKey()
{/VBNET_CONSOLE}
Select Case
môže namiesto Case x
: obsahovať
ešte možnosť Case Else
, ktorá sa vykoná v prípade, že nebude
platiť žiadny Case
. Je len na vás, či budete
Select Case
používať, všeobecne sa oplatí len pri väčšom
množstve príkazov a vždy ide nahradiť sekvencií If
a
Else
. Select Case
ide samozrejme urobiť aj pre
hodnoty premennej typu String
.
To by sme mali. V budúcej lekcii, Riešené úlohy k 5. lekcii VB.NET , nás čakajú polia a cykly. Tým dovŕšite základné znalosti, máte sa na čo tešiť
V nasledujúcom cvičení, Riešené úlohy k 5. lekcii VB.NET, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.