V třetím díle seriálu probereme operátory a podmínky řídicí běh programu.
Na začátek bych se chtěl omluvit těm, kteří mi poslali úkoly k první lekci kurzu. Vzhledem k tomu, že jsem žádný úkol přímo nezadával, tak jsem ani nekontroloval, zda někdo něco odevzdal, tím pádem jsem ani nemohl odpovědět na dotaz na jeden technický problém.
A dejme se do práce:
Operátory
Všechny operátory (např. +, -, /, *, % ...) jazyka VB.NET jsou při kompilaci (sestavení vašeho zdrojového kódu do souboru *.exe, případně *.dll) chápány jako jednoduché funkce. Například operátor +
datového typu Integer je vlastně funkce, která vezme dvě celá čísla, sečte je a vrátí výsledek. Ve VB.NET jsou definovány tyto operátory:
Operátor | Popis | Příklad |
+, -, *, / | klasické aritmetické operátory | 6 + 4 |
\ | celočíselné dělení | 5 \ 2 (výsledek je 2) |
Mod | modulo, neboli zbytek po dělení | 5 Mod 2 (výsledek je 1) |
VB.NET má dále operátory porovnání a operátory logické, které nás obzvláště zajímají v souvislosti s dnešní lekcí. Tyto operátory vždy vrací buď True, nebo False:
Operátor | Popis | Příklad |
= | porovnání | 6 = (5 + 1) (výsledek je True) |
<> | nerovná se | 6 <> (5 + 2) (výsledek je True) |
<, >, <=, >= | menší než, větší než, menší nebo rovno, větší nebo rovno | 6 <= 5 (výsledek je False) |
To jsou operátory porovnání. Logické operátory vrací také True nebo False, ale pracují už rovnou s logickými hodnotami:
Operátor | Popis | Příklad |
Not | logická negace | Not True (výsledek je false) |
And | logické násobení, neboli konjunkce | True And True (výsledek je True) |
Or | logické sčítání, neboli disjunkce | True Or False (výsledek je True) |
Xor | exklusivní disjunkce | True Xor True (výsledek je false) |
Zde musím trochu vysvětlit, co jsou tyto logické operátory vlastně zač. Operátor And vrací True, pokud jsou obě strany výrazu pravdivé, jinak vrací False. Operátor Or vrací True, pokud platí jedna z podmínek nebo obě podmínky. False vrací, pouze pokud neplatí ani jedna z podmínek. Operátor Xor vrací True, pokud platí pouze jedna z podmínek. Pokud neplatí žádná nebo platí obě, vrací False. Pro lepší pochopení snad pomůže tato tabulka (pro přehlednost uděláme z True jedničku a z False nulu):
And | Or | Xor |
1 And 1 je 1 | 1 Or 1 je 1 | 1 Xor 1 je 0 |
1 And 0 je 0 | 1 Or 0 je 1 | 1 Xor 0 je 1 |
0 And 1 je 0 | 0 Or 1 je 1 | 0 Xor 1 je 1 |
0 And 0 je 0 | 0 Or 0 je 0 | 0 Xor 0 je 0 |
Vím, že toto je trochu složitější, takže jako vždy, pokud něčemu nerozumíte, napište do komentářů.
Podmínky
Téměř každý programovací jazyk na světě má podmínky. Podmínky slouží k vyhodnocování údajů za běhu programu a zvolení správného postupu. Podmínky souvisí úzce s datovým typem Boolean, na základě jehož hodnoty se vyhodnocují. Syntaxe pro zapsání podmínky ve VB.NET je následující:
If (podmínka) Then (jedna metoda nebo funkce)
nebo
If (podmínka) Then
(více metod a funkcí)
...
End If
Jakmile dojde běh programu k podmínce, tato se vyhodnotí a kód mezi If a End If se provede, pouze pokud je podmínka vyhodnocena jako True. Syntaxe If má ještě nepovinnou část Else, která určuje, co se provede, pokud je podmínka vyhodnocena jako False:
If (podmínka) Then
'Kód, který se provede, pokud je podmínka vyhodnocena
'jako True
Else
'Kód, který se provede, pokud je podmínka vyhodnocena
'jako False
End If
Blok If má ještě jednu speciální, nepovinnou část, a to blok ElseIf. Ten slouží k vyhodnocení více podmínek v rámci jednoho Ifu. Příklad:
Dim a As Integer
...
'Tady se do a přiřadí nějaká hodnota.
...
If (a = 7) Then
'Pokud se a rovná 7...
ElseIf (a = 6) Then
'Pokud se a rovná 6...
Else
'Pokud neplatí ani jedna z podmínek...
End If
Blok Select Case
Blok Select Case funguje jako pokročilá konstrukce pro vyhodnocování podmínek. Vypadá takto:
Select Case a
Case 6
'Pokud se a rovná 6...
Case 7
'Pokud se a rovná 7
Case 8, 9, 10
'Pokud se a rovná 8, 9, nebo 10
Case Else
'Pokud je a něco úplně jiného...
End Select
Deklarace Case má ještě speciální variantu Case Is, kterou lze použít pro testování rozsahu:
Dim a As Integer = 6
Select Case a
Case Is < 6
'a je menší než šest
Case 6
'a je šest
Case Is > 6
'a je větší než šest
End Select
Předtím, než se vrhneme na naši praktickou ukázku, musím ještě předvést využití dvou veleužitečných funkcí: Console.ReadLine()
a Integer.Parse()
.
Funkci Console.ReadLine() jsme dosud používali pouze na pozastavení programu, ale tato kromě toho umí i načítat vstup z klávesnice. Využívá se takto:
Dim name As String = Console.ReadLine()
'Funkce pozastaví program, počká, až uživatel napíše něco do konzole a odentruje.
'Pak vrátí načtenou hodnotu.
Console.WriteLine(name)
Funkce Integer.Parse() se používá pro převod řetězce na odpovídající číselné vyjádření. Příklad:
Dim s As String = "46"
Dim i As Integer = Integer.Parse(s) 'V i je nyní hodnota 46
Pozor! Pokud je v převáděném řetězci hodnota, která se nedá vyjádřit číslem, třeba "Honza", program nebude fungovat a, obecně řečeno, spadne.
Tak, a teď k té praktické ukázce. Napíšeme si program, který na začátku vybídne uživatele, aby zadal číslo od jedné do čtyř a podle zadaného čísla bude nadále počítat obsah, popř. objem kruhu, čtverce, koule nebo krychle. Protože náš příklad bude obsahovat množství funkcí, které pouze vypočítávají tyto hodnoty, tak si vytvoříme nový modul, který nazveme Helpers a funkce napíšeme do něj. V okně Solution Explorer klepněte pravým tlačítkem na název projektu, vyberte položku Add -> Module... Zobrazí se vám nové okno, jako název vepište Helpers.vb a potvrďte. Celý zdrojový kód je zde:
TretiLekce.vb
Module TretiLekce
Sub Main()
Console.WriteLine("Zadejte hodnotu 1-4 (1 pro čtverec, 2 pro kruh, 3 pro krychli, 4 pro kouli)")
Dim choice As Integer = Integer.Parse(Console.ReadLine())
'nejúspornější zápis
Console.WriteLine()
Select Case choice
Case 1
Console.WriteLine("Zadejte stranu čtverce (cm):")
Dim a As Integer = Integer.Parse(Console.ReadLine())
Console.WriteLine()
Console.WriteLine("Obvod čtverce je " & Helpers.GetSquarePerimeter(a) & " cm")
Console.WriteLine("Obsah čtverce je " & Helpers.GetSquareArea(a) & " cm2")
Case 2
Console.WriteLine("Zadejte poloměr kruhu (cm):")
Dim r As Integer = Integer.Parse(Console.ReadLine())
Console.WriteLine()
Console.WriteLine("Obvod kruhu je " & Helpers.GetCirclePerimeter(r) & " cm")
Console.WriteLine("Obsah kruhu je " & Helpers.GetCircleArea(r) & " cm2")
Case 3
Console.WriteLine("Zadejte stranu krychle (cm):")
Dim a As Integer = Integer.Parse(Console.ReadLine())
Console.WriteLine()
Console.WriteLine("Povrch krychle je " & Helpers.GetCubeSurface(a) & " cm2")
Console.WriteLine("Objem krychle je " & Helpers.GetCubeVolume(a) & " cm3")
Case 4
Console.WriteLine("Zadejte poloměr koule (cm):")
Dim r As Integer = Integer.Parse(Console.ReadLine())
Console.WriteLine()
Console.WriteLine("Povrch koule je " & Helpers.GetSphereSurface(r) & " cm2")
Console.WriteLine("Objem koule je " & Helpers.GetSphereVolume(r) & " cm3")
Case Else
End Select
Console.ReadLine()
End Sub
End Module
Helpers.vb
Module Helpers
Function GetSquareArea(ByVal a As Double) As Double
Return a ^ 2
End Function
Function GetSquarePerimeter(ByVal a As Double) As Integer
Return 4 * a
End Function
Function GetCubeSurface(ByVal a As Double) As Double
Return 6 * a ^ 2
End Function
Function GetCubeVolume(ByVal a As Double) As Double
Return a ^ 3
End Function
Function GetCirclePerimeter(ByVal r As Double) As Double
Return 2 * Math.PI * r
End Function
Function GetCircleArea(ByVal r As Double) As Double
Return Math.PI * r ^ 2
End Function
Function GetSphereSurface(ByVal r As Double) As Double
Return 4 * Math.PI * r ^ 2
End Function
Function GetSphereVolume(ByVal r As Double) As Double
Return (4 / 3) * Math.PI * (r ^ 3)
End Function
End Module
To by bylo pro dnešní lekci vše. Za domácí úkol napište za použití dosud naučených technik program, který bude řešit kvadratickou rovnici. O ošetřování vstupu proti hodnotám typu Honza místo 46 se nestarejte, ošetřit to ještě numíme. Pokud by to zde někdo nevěděl, postup řešení kvadratické rovnice je tento (Funkce pro výpočet druhé odmocniny ve VB.NET je Math.Sqrt(), vrací double.):
Kvadratická rovnice je rovnice tvaru . Nejprve si musíme vypočítat tzv. diskriminant, který značíme jako D. Vzorec pro výpočet D je: . Pomocí diskriminantu zjistíme, kolik má rovnice řešení. Pokud je diskriminant menší než nula, rovnice nemá řešení. Pokud je diskriminant roven nule, má rovnice jedno řešení, vyjádřitelné vzorcem . Pokud je diskriminant větší než nula, má rovnice dvě řešení, vyjádřitelná jako a .