Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

5. díl - Podmínky (větvení)

Ostatní jazyky Visual Basic .NET Základní konstrukce Podmínky (větvení)

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Typový systém podruhé: Datové typy, jsme si podrobně probrali datové typy. 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:

If 15 > 5 Then
    Console.WriteLine("Pravda")
End If
Console.WriteLine("Program zde pokračuje dál")
Console.ReadKey()

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á:

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()

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.

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()

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:

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()

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:

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()

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:

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()

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.

Dim a As Integer = 0
If a = 0 Then
        a = 1
Else
        a = 0
End If
Console.WriteLine(a)
Console.ReadKey()

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:

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()

S tím si zatím vystačíme, operátory se pomocí závorek samozřejmě dají kombinovat.

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()

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:

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()

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 výsledek 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:

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()

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 stringové proměnné.

To bychom měli. V příští lekci, Cykly ve Visual Basicu, nás čekají pole a cykly. Tím dovršíme základní znalosti, máte se na co těšit :)


 

 

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
Jak se ti líbí článek?
7 hlasů
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity (6)

 

 

Komentáře

Avatar
Libor Šimo (libcosenior):12.2.2016 15:00

Skoda ze tu nie je vysvetlena podmienka (funkcia) IIf().

Odpovědět 12.2.2016 15:00
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Michal Žůrek (misaz):12.2.2016 15:02

iif je v podstatě ternární operátor.

Odpovědět 12.2.2016 15:02
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na Michal Žůrek (misaz)
Libor Šimo (libcosenior):12.2.2016 15:05

V cecku je napr.
a = c < d ? c : d;
Ako by to bolo s iif?

Odpovědět 12.2.2016 15:05
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovědět 12.2.2016 15:10
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Michal Žůrek (misaz):12.2.2016 15:11

je to funkce s třemi parametry, podmínka co vrátí, když je podmínka pravdivá a co vrátí když podmínka neplatí.

Odpovědět 12.2.2016 15:11
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na Michal Žůrek (misaz)
Libor Šimo (libcosenior):12.2.2016 15:15

Uz je mi to jasne.
a = IIf(c < d, c, d)
Je to spravne?
Daju sa aj spajat ako v cecku?
a = IIf(c < d, c, IIf(c = d, d, a))
Sorry, trva mi to dlhsie, pisem na malom tablete.

Editováno 12.2.2016 15:18
Odpovědět 12.2.2016 15:15
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Michal Žůrek (misaz):12.2.2016 16:45

jo jde to, je to obyčejná funkce.

Odpovědět 12.2.2016 16:45
Nesnáším {}, proto se jim vyhýbám.
Avatar
Jana Morče
Člen
Avatar
Jana Morče:5. června 11:45

Ahoj, dělala jsem tu první kalkulačku bez Select case, ale kalkulačky mi nefungovala bez kontroly správnosti volby (Else). Respektive výsledek skončí vždy (kromě sčítání samozřejmě, to je první If. Což by ale nemělo, neboť aplikace je "vypodmínkovaná" tak, aby reagovala na každou ze 4 možností. Mám to prostě takhle a bez Else funguje jen to sčítání; s Else funguje vše..Děkuji moc za radu..

Module Module1

Sub Main()
Console.Write­Line("Vítejte ve virtuální kalkulačce.")
Console.Write­Line("Zadejte první číslo: ")
Dim a As Single = Console.ReadLine()
Console.Write­Line("Zadejte druhé číslo: ")
Dim b As Single = Console.ReadLine()
Console.Write­Line("Zvolte si operaci:")
Console.Write­Line("1 - sčítání")
Console.Write­Line("2 - odčítání")
Console.Write­Line("3 - násobení")
Console.Write­Line("4 - dělení")
Dim volba As Integer = Console.ReadLine()
Dim vysledek As Single = 0
If volba = 1 Then
vysledek = a + b
If volba = 2 Then
vysledek = a - b
If volba = 3 Then
vysledek = a * b
If volba = 4 Then
vysledek = a / b
End If
End If
End If
End If
If volba > 0 And volba < 5 Then
Console.Write­Line("Výsledek: " & vysledek)
Else
Console.Write­Line("Neplatná volba!")
End If
Console.Write­Line("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou..")
Console.ReadKey()

End Sub

End Module

 
Odpovědět 5. června 11:45
Avatar
Odpovídá na Jana Morče
Michal Žůrek (misaz):5. června 20:41

tvé podmínky, když je správně odsadíš vypadíjí přibližně následovně

If volba = 1 Then
        vysledek = a + b
        If volba = 2 Then
                vysledek = a - b
                If volba = 3 Then
                        vysledek = a * b
                        If volba = 4 Then
                                vysledek = a / b
                        End If
                End If
        End If
End If

a jak že to vlastně funguje? Pokud platí první podmínka (volba = 1), tak se jednak provede matematická operace a kontorluje se druhá podmínka, ale ta se má přece kontrolovat pokud první podmínka neplatí.... Po posunutí End If na správne řádky by to mělo vypadat následovně.

If volba = 1 Then
        vysledek = a + b
End If
If volba = 2 Then
        vysledek = a - b
End If
If volba = 3 Then
        vysledek = a * b
End If
If volba = 4 Then
        vysledek = a / b
End If

teď se všechny podmínky zpracují nezávisle na sobě a operace se provede jen pro vybranou volbu (ostatní podmínky, které se kontrolují sekvenčně za sebou nezareagují).

Odpovědět 5. června 20:41
Nesnáším {}, proto se jim vyhýbám.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.