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.