Lekce 5 - Podmínky (větvení) ve VB.NET
V předešlém cvičení, Řešené úlohy k 4. lekci VB.NET, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Abychom si něco naprogramovali, potřebujeme nějak reagovat na různé situace. Může to být například hodnota zadaná uživatelem, podle které budeme chtít měnit další běh programu. Říkáme, že se program větví a k větvení používáme podmínky, těm se budeme věnovat celý dnešní Visual Basic .NET tutoriál. Vytvoříme program na výpočet odmocniny a vylepšíme naši kalkulačku.
Podmínky
Podmínky zapisujeme pomocí klíčového slova If
, za kterým
následuje logický výraz a za ním klíčové slovo Then
. Pokud
je výraz pravdivý, provede se následující příkaz. Pokud ne,
následující příkaz se přeskočí a pokračuje se až pod ním. Podmínku
ukončuje End If
. Vyzkoušejme si to:
{VBNET_CONSOLE} If 15 > 5 Then Console.WriteLine("Pravda") End If Console.WriteLine("Program zde pokračuje dál") Console.ReadKey() {/VBNET_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Výstup programu:
Konzolová aplikace
Pravda
Program zde pokračuje dál
Pokud podmínka platí (což zde ano), provede se příkaz vypisující do konzole text pravda. V obou případech program pokračuje dál. Součástí výrazu samozřejmě může být i proměnná:
{VBNET_CONSOLE} Console.WriteLine("Zadej nějaké číslo") Dim a As Integer = Console.ReadLine() If a > 5 Then Console.WriteLine("Zadal jsi číslo větší než 5!") End If Console.WriteLine("Děkuji za zadání") Console.ReadKey() {/VBNET_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Ukažme si nyní relační operátory, které můžeme ve výrazech používat:
Operátor | VB.NET zápis |
---|---|
Rovnost | = |
Je ostře větší | > |
Je ostře menší | < |
Je větší nebo rovno | >= |
Je menší nebo rovno | <= |
Nerovnost | <> |
Rovnost zapisujeme jedním =
, stejně jako když chceme
přiřadit hodnotu do proměnné. Pokud chceme nějaký výraz znegovat,
napíšeme před něj Not
.
{VBNET_CONSOLE} Console.WriteLine("Zadej nějaké číslo, ze kterého spočítám odmocninu:") Dim a As Integer = Console.ReadLine() If a > 0 Then Console.WriteLine("Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!") Dim o As Double = Math.Sqrt(a) Console.WriteLine("Odmocnina z čísla " & a & " je " & o) End If Console.WriteLine("Děkuji za zadání") Console.ReadKey() {/VBNET_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Konzolová aplikace
Zadej nějaké číslo, ze kterého spočítám odmocninu:
144
Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!
Odmocnina z čísla 144 je 12
Děkuji za zadání
Program načte od uživatele číslo a pokud je větší než 0
,
vypočítá z něj druhou odmocninu. Mimo jiné jsme použili třídu
Math
, která na sobě obsahuje řadu užitečných matematických
metod, na konci této kapitoly si ji blíže představíme. Sqrt()
vrací hodnotu jako Double
. Bylo by hezké, kdyby nám program
vyhuboval v případě, že zadáme záporné číslo. S dosavadními znalostmi
bychom napsali něco jako:
{VBNET_CONSOLE} Console.WriteLine("Zadej nějaké číslo, ze kterého spočítám odmocninu:") Dim a As Integer = Console.ReadLine() If a > 0 Then Console.WriteLine("Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!") Dim o As Double = Math.Sqrt(a) Console.WriteLine("Odmocnina z čísla " & a & " je " & o) End If If a <= 0 Then Console.WriteLine("Odmocnina ze záporného čísla neexistuje!") End If Console.WriteLine("Děkuji za zadání") Console.ReadKey() {/VBNET_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Všimněte si, že musíme pokrýt i případ, kdy se a = 0
,
nejen když je menší. Kód však můžeme výrazně zjednodušit pomocí
klíčového slova Else
, které vykoná následující příkaz
nebo blok příkazů v případě, že se podmínka
neprovede:
{VBNET_CONSOLE} Console.WriteLine("Zadej nějaké číslo, ze kterého spočítám odmocninu:") Dim a As Integer = Console.ReadLine() If a > 0 Then Console.WriteLine("Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!") Dim o As Double = Math.Sqrt(a) Console.WriteLine("Odmocnina z čísla " & a & " je " & o) Else Console.WriteLine("Odmocnina ze záporného čísla neexistuje!") End If Console.WriteLine("Děkuji za zadání") Console.ReadKey() {/VBNET_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Kód je mnohem přehlednější a nemusíme vymýšlet opačnou podmínku, což by v případě složené podmínky mohlo být někdy i velmi obtížné.
Else
se také využívá v případě, kdy potřebujeme v
příkazu manipulovat s proměnnou z podmínky a nemůžeme se na ni tedy ptát
potom znovu. Program si sám pamatuje, že se podmínka nesplnila a přejde do
sekce Else
. Ukažme si to na příkladu: Mějme číslo
a
, kde bude hodnota 0
nebo 1
a po nás se
bude chtít, abychom hodnotu prohodili (pokud tam je 0
, dáme tam
1
, pokud 1
, dáme tam 0
). Naivně bychom
mohli kód napsat 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}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Nefunguje to, že? Pojďme si projet, co bude program dělat. Na začátku
máme v a
nulu, první podmínka se jistě splní a dosadí do
a
jedničku. No ale rázem se splní i ta druhá. Co s tím? Když
podmínky otočíme, budeme mít ten samý problém s jedničkou. Jak z toho
ven? Ano, 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}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Podmínky je možné skládat a to pomocí dvou základních operátorů:
Operátor | VB.NET zápis |
---|---|
A zároveň | And |
Nebo | Or |
Uveďme si příklad:
{VBNET_CONSOLE} Console.WriteLine("Zadejte číslo v rozmezí 10-20:") Dim a As Integer = Console.ReadLine() If a >= 10 And a <= 20 Then Console.WriteLine("Zadal jsi správně") Else Console.WriteLine("Zadal jsi špatně") End If Console.ReadKey() {/VBNET_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
S tím si zatím vystačíme, operátory se pomocí závorek samozřejmě dají kombinovat.
{VBNET_CONSOLE} Console.WriteLine("Zadejte číslo v rozmezí 10-20 nebo 30-40:") Dim a As Integer = Console.ReadLine() If ((a >= 10) And (a <= 20)) Or ((a >= 30) And (a <= 40)) Then Console.WriteLine("Zadal jsi správně") Else Console.WriteLine("Zadal jsi špatně") End If Console.ReadKey() {/VBNET_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Select Case
Select Case
nám umožňuje zjednodušit (relativně) zápis
více podmínek pod sebou. Vzpomeňme si na naši kalkulačku v prvních
lekcích, která načetla 2 čísla a vypočítala všechny 4 operace. Nyní si
ale budeme chtít zvolit, kterou operaci chceme. Bez Select Case
bychom napsali kód podobný tomuto:
{VBNET_CONSOLE} Console.WriteLine("Vítejte v kalkulačce") Console.WriteLine("Zadejte první číslo:") Dim a As Single = Console.ReadLine() Console.WriteLine("Zadejte druhé číslo:") Dim b As Single = Console.ReadLine() Console.WriteLine("Zvolte si operaci:") Console.WriteLine("1 - sčítání") Console.WriteLine("2 - odčítání") Console.WriteLine("3 - násobení") Console.WriteLine("4 - dělení") 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ýsledek: {0}", vysledek) Else Console.WriteLine("Neplatná volba") End If Console.WriteLine("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.") Console.ReadKey() {/VBNET_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Konzolová aplikace
Vítejte v kalkulačce
Zadejte první číslo:
3,14
Zadejte druhé číslo:
2,72
Zvolte si operaci:
1 - sčítání
2 - odčítání
3 - násobení
4 - dělení
2
Výsledek: 0,42
Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.
Všimněte si, že jsme proměnnou vysledek
deklarovali na
začátku, jen tak do ni můžeme potom přiřazovat. Kdybychom ji deklarovali u
každého přiřazení, Visual Basic by kód nezkompiloval a vyhodil chybu
redeklarace proměnné. Proměnná může být deklarována (založena v
paměti) vždy jen jednou. Bohužel Visual Basic není schopen poznat, zda je do
proměnné vysledek
opravdu přiřazena nějaká hodnota. Ozve se
při výpisu na konzoli, kde se mu nelíbí, že může vypisovat proměnnou,
která nemá přiřazenu hodnotu. Z tohoto důvodu na začátku dosadíme do
vysledek
nulu. Další vychytávka je kontrola správnosti volby.
Program by v tomto případě fungoval stejně i bez těch Else
,
ale nač se dále ptát, když již máme výsledek.
Nyní si zkusíme napsat ten samý kód pomocí Select Case
:
{VBNET_CONSOLE} Console.WriteLine("Vítejte v kalkulačce") Console.WriteLine("Zadejte první číslo:") Dim a As Single = Console.ReadLine() Console.WriteLine("Zadejte druhé číslo:") Dim b As Single = Console.ReadLine() Console.WriteLine("Zvolte si operaci:") Console.WriteLine("1 - sčítání") Console.WriteLine("2 - odčítání") Console.WriteLine("3 - násobení") Console.WriteLine("4 - dělení") 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ýsledek: {0}", vysledek) Else Console.WriteLine("Neplatná volba") End If Console.WriteLine("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.") Console.ReadKey() {/VBNET_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Select Case
může místo Case x
: obsahovat ještě
možnost Case Else
, která se vykoná v případě, že nebude
platit žádný Case
. Je jen na vás, jestli budete
Select Case
používat, obecně se vyplatí jen při větším
množství příkazů a vždy jde nahradit sekvencí If
a
Else
. Select Case
jde samozřejmě udělat i pro
hodnoty proměnné typu String
.
To bychom měli.
V následujícím cvičení, Řešené úlohy k 5. lekci VB.NET, si procvičíme nabyté zkušenosti z předchozích lekcí.