× Aktuálně z oboru

SHIELD Experience Upgrade 7 – méně hledání a více zábavy [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]
Celá zprávička [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]

VB.NET - díl 3.

[ http://programujte.com/profil/14993-jakub-ledl/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/14523-martin-simecek/ ]Google [ ?rel=author ]       9. 8. 2009       27 509×

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 .


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2009080100-vb-net-dil-3/ ].