× 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 4.

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

V dalším díle seriálu si probereme cykly, pole a ošetřování výjimek.

V tomto díle se podíváme na další důležitou část jazyka VB.NET, a to sice cykly. Také se naučíme pracovat s kolekcemi a zjistíme, jak ošetřit výjimky vzniklé za běhu programu. Také bych se chtěl omluvit za velmi dlouhý interval mezi tímto a předchozím dílem, ale pracoval jsem na jednom projektu a nemohl jsem si najít čas. Doufám, že jste zatím na tento kurz nezanevřeli.

Cykly

Cyklus, jak už jeho název naznačuje, je část programu, která vykonává dokola nějakou činnost. Prvním z cyklů, které si ukážeme, je While. Cyklus While se opakuje tak dlouho, dokud platí zadaná podmínka:

Dim i As Integer = 0
While i < 10
  Console.WriteLine(i) 'Vypiš i.
  i += 1 'Přičti k i jedničku a skoč na začátek cyklu.
End While

Cyklus While je dost možná nejpoužívanější cyklus ve všech programovacích jazycích. Dalším cyklem je Do, který je téměř identický s While, ale jeden podstatný rozdíl existuje: cyklus While nejprve testuje podmínku a až pak provádí tělo cyklu, takže pokud je podmínka už na začátku nepravdivá, neprovede se tělo cyklu ani jednou. Narozdíl od toho, Do napřed provede tělo cyklu a až potom testuje podmínku, čili tělo cyklu se vždy provede alespoň jednou:

Dim i As Integer = 0
Do
    Console.WriteLine(i)
    i += 1
Loop While i > 10
'Podmínka se vyhodnotí jako False.
'Cyklus While by nebyl proveden ani jednou.
'Cyklus Do se provede alespoň jednou a
'do konzole se vypíše: 0.

nebo

Dim i As Integer = 0
Do
    Console.WriteLine(i)
    i += 1
Loop Until i > 10
'Loop Until je téměř totéž
'jako Loop While, ale
'provádí se pouze, pokud
'je podmínka vyhodnocena
'jako False.

nebo

Dim i As Integer = 0
Do Until i > 10
    Console.WriteLine(i)
    i += 1
Loop
'Stejné, ale podmínka 
'se testuje ještě před
'provedením cyklu.

Dalším, trochu jiným cyklem je For. Ten je specifický tím, že už na začátku cyklu je určeno, kolikrát proběhne. Vypadá to takto:

Dim i As Integer
i = Integer.Parse(Console.ReadLine())
Console.WriteLine()
For o As Integer = 0 To i Step 1
    Console.WriteLine(o)
Next

Část Step je nepovinná, pokud chcete cyklus, ve kterém bude proměnná o po každém zopakování narůstat o jedničku. Pokud byste ale chtěli, aby proměnná o klesala o jedničku nebo naopak narůstala o 2, napsali byste Step -1 nebo Step 2.

Pole

Pole (angl. array) je proměnná, která uchovává více hodnot stejného typu. Pokud byste chtěli vytvořit pole pro typ Integer, napsali byste toto (prvky pole jsou číslovány od nuly, tzn. první prvek má číslo 0):

Dim intArray(2) As Integer
'Vytvoří pole Integerů, do kterého se vejdou
'tři proměnné.
intArray(0) = 1
'První proměnné v poli přiřadí hodnotu 1.
intArray(1) = 8
'Druhé proměnné v poli přiřadí hodnotu 8.
intArray(2) = 16
'Třetí proměnné v poli přiřadí hodnotu 16.

'Pole lze také inicializovat takto:

Dim secondIntArray() As Integer = {2, 4, 6}
'Vytvoří pole Integerů a přiřadí do něj hodnoty 2, 4, a 6.
'Velikost pole se odvodí při kompilaci.
Console.WriteLine(secondIntArray(2))
'Vypíš třetí prvek pole, tedy číslo 6.

Když už máme pole vytvořené, potřebujeme nějaký způsob, jak jej projít a získat jeho hodnoty. K tomu můžeme využít jednoduchý cyklus For:

Dim secondIntArray() As Integer = {2, 4, 6}
For i As Integer = 0 To secondIntArray.Length - 1
    'Indexy pole začínají nulou, proto Length - 1.
    'Length je vlastnost pole určující jeho velikost.
    Console.WriteLine(secondIntArray(i))
    'Přístup k prvku pole s indexem i.
Next

Nebo můžeme využít sofistikovaný nástroj pro procházení kolekcí, a tím je cyklus For Each:

Dim secondIntArray() As Integer = {2, 4, 6}
For Each i As Integer In secondIntArray
  Console.WriteLine(i)
Next

Ošetřování výjimek

Výjimka je zvláštní událost, ke které dojde při běhu programu, pokud se někde stala chyba. Ukázka:

Sub Main()
    Dim i As Integer = Integer.Parse("Honza")
    'Zde program skončí, protože dojde k výjimce typu
    'FormatException - "honza" se nedá převést na číslo.
End Sub

Klidně si tento příklad spusťte - nic se nestane, až na to, že program nefunguje. Nyní si ukážeme, jak tomuto předejít. Program počká na vstup uživatele a sdělí, zda jde o číslo, nebo ne:

Sub Main()
    Dim s As String = Console.ReadLine()
    Try
        Dim i As Integer = Integer.Parse(s)
        Console.WriteLine("Zadaná hodnota je číslo.")
    Catch ex As Exception
        Console.WriteLine("Zadaná hodnota není číslo.")
    End Try
End Sub

V tomto úryvku kódu jsme se setkali s novou konstrukcí jazyka VB.NET - blok Try ... Catch. Ten slouží právě k odchycení a ošetření vzniklé výjimky. Kód, který může vyvolat výjimku, uzavřeme do bloku Try, kód který bude výjimku ošetřovat, do bloku Catch. To "ex As Exception" určuje, jaký typ výjimky budeme ošetřovat. Protože Exception je základní typ výjimky, bude blokem Catch ex As Exception ošetřena každá výjimka, ke které dojde v bloku Try. Mohli bychom ale také napsat:

    Try
        'Nějaký kód...
    Catch ex As FormatException
        'Ošetří výjimku typu FormatException.
    Catch ex As OverflowException
        'Ošetří výjimku typu OverflowException.
    Catch ex As Exception
        'Ošetří všechny ostatní výjimky.
    End Try

Blok Try ... Catch má ještě jednu speciální část, a tou je blok Finally. Ke kódu v bloku Finally dojde vždy, ať už testovaný kód vyvolá výjimku či ne:

Sub Main()
    Dim s As String = Console.ReadLine()
    Try
        Dim i As Integer = Integer.Parse(s)
        Console.WriteLine("Zadaná hodnota je číslo.")
    Catch ex As Exception
        Console.WriteLine("Zadaná hodnota není číslo.")
    Finally
        Console.WriteLine("Test ukončen")
    End Try
End Sub

Opět upozorňuji, pokud máte jakýkoli problém, napište do komentářů.

Praktický příklad

A nastal čas na praktickou ukázku toho, co jsme se naučili. Napíšeme si program, který bude fungovat jako kalkulačka - nechá uživatele provádět základní aritmetické operace zadáním něčeho jako "+42" do konzole:

    Sub Main()
        Console.WriteLine("Vítejte v programu Konzolová kalkulačka 1.0")
        Console.WriteLine()
        Dim quit As Boolean = False
        'Indikuje, zda má být program
        'ukončen, nebo ne.
        Try
            'Načti počáteční hodnotu.
            Dim start As Double = Double.Parse(Console.ReadLine())
            Console.WriteLine()
            'Opakuj, dokud v proměnné quit nebude True.
            While Not quit
                Dim input As String = Console.ReadLine()
                'Načti vstup (např. +8).
                Dim numberPart As Double
                If input.Length > 0 Then
                    numberPart = Double.Parse(input.Substring(1))
                    'Získej z něho numerickou část. Funkce Substring vrací
                    'část daného řetězce. input.Substring(1) například vrátí znaky 2 
                    '- poslední znak řetězce.
                Else
                    numberPart = 0.0
                    Continue While
                    'Pokud tam uživatel nic nezadal, necháme ho to zkusit
                    'znova. Příkaz Continue jednoduše přeskočí
                    'jedno procházení cyklu a skočí zase na začátek.
                End If
                Dim writeToOutput As Boolean = True
                'Chceme vypsat výsledek na výstup?
                Select Case input.Substring(0, 1)
                    'Tady vrací Substring pouze první znak řetězce
                    '(začíná od prvního a vezme jeden znak).
                    Case "+"
                        start += numberPart
                    Case "-"
                        start -= numberPart
                    Case "*"
                        start *= numberPart
                    Case "/"
                        'U datového typu Double je výsledek dělení nulou
                        'nekonečno. To je bohužel dále nepoužitelné.
                        If numberPart <> 0 Then
                            start /= numberPart
                        Else
                            'Sami vyvoláme vyjímku DivideByZeroException.
                            Throw New DivideByZeroException("Pokus o dělení nulou!")
                        End If
                    Case "\"
                        start \= numberPart
                    Case "="
                        'Nedělej nic.
                    Case Else
                        Throw New FormatException("Invalid input!")
                End Select
                'Vypíšeme na výstup dosavadní výsledek.
                If writeToOutput Then Console.WriteLine(start)
                Console.WriteLine()
            End While
        Catch ex As FormatException

        Catch ex As DivideByZeroException
            Console.WriteLine("Je mi líto, ale nulou dělit nelze.")
        End Try
    End Sub

Domácí úkol

Pro tuto lekci žádný domácí úkol nebude. Zkuste si napsat nějaký zajímavý program, využívající to, co jsme se dnes naučili, a jestli chcete, pošlete mi ho. Teším se na viděnou u dalšího dílu.


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