Úvod do rubriky Visual Basic

Programátorská dílna

Ján Hanák

Visual Basic ::

Pokračujeme s VB .NET 2003

 

Časová náročnost (h:min):

0:45

 
Začátečník Pokročilý Expert

Použitý operační systém :

Hlavní vývojový nástroj :

Další vývojový software :

Jiný software :

Windows XP Professional SP1a

Visual Basic .NET 2003

Žádný

Žádný

 

Vážení čtenáři,

 

v dnešním díle seriálu Pokračujeme s VB .NET 2003 začneme s představováním rozhodovacích příkazů, které můžete najít v jazyce Visual Basic .NET 2003. Předmětem našeho snažení se stane především příkaz If...Then a jeho modifikace, a poté také příkaz Select Case. Naučíte se, jak provádět rozhodování v programu a vytvářet programové větve. Jelikož uvedené příkazy se používají v takřka každém životaschopném programu, jejich bezproblémové ovládnutí by mělo být samozřejmostí pro každého uživatele, který se hodlá vydat na dráhu profesionálního programátora. Přeji vám příjemné počtení.

 

 

 

Charakteristika programových rozhodnutí

 

Podobně jako ve skutečném životě, i ve světe softwaru je velmi důležité přijímat správná rozhodnutí ve správnou dobu. Tím, že se počítačový program dovede v jistých okamžicích správně rozhodnout, může do jisté míry simulovat chování samotného člověka. Aby se program mohl sám rozhodovat, je samozřejmě nutné jej předem naprogramovat pomocí rozhodovacích příkazů a příslušných programových konstrukcí. Rozhodovací příkazy pomáhají programu vtisknout jistou dávku inteligence, protože vhodně připravený program se poté nedostane do nesnází při dělení libovolného čísla nulou, či ve chvíli, kdy se uživatel snaží zapsat data do neexistujícího souboru. Visual Basic .NET 2003 nabízí dva základní rozhodovací příkazy: If...Then a Select Case. Podívejme se nejprve na příkaz If...Then a jeho modifikace.

 

 

Příkaz If...Then

 

Příkaz If...Then slouží na jednoduché testování podmínky a má následující generickou podobu:

 

If Podmínka Then

  Příkazy

End If

 

Aby mohl příkaz If...Then náležitě pracovat, musí poznat podmínku, kterou má testovat. Touto podmínkou může být libovolný výraz, jehož hodnotu lze konvertovat do platných hodnot typu Boolean. Jelikož typ Boolean dovede pracovat pouze se dvěma hodnotami (True a False), je vždy možné zjistit, zdali je podmínka splněna (hodnota True) či nikoliv (hodnota False). Povězme, že podmínkou bude matematický výraz x<3. Pokud budeme předpokládat, že proměnná x je datového typu Byte, dojdeme k poznání, že podmínkový výraz bude pravdivý, tedy vyhodnocen na hodnotu True jenom tehdy, bude-li hodnota proměnné x z intervalu <0, 2>. Jestliže bude proměnná x ukrývat ve svých útrobách hodnotu 3, podmínka nebude splněna (3 není menší než 3). Podobně tomu bude i v případě, kdy bude hodnotou proměnné x jakékoliv jiné přirozené číslo (zápornou hodnotu do proměnné vzhledem k jejímu datovému typu nelze uložit). Příkaz If...Then tedy začíná svoji činnost testem podmínky nebo, chcete-li, podmínkového výrazu. Pokud je test úspěšný a podmínka je splněna (hodnota True), jsou vykonány všechny programové příkazy, které se nacházejí za klíčovým slovem Then. Za tímto návěstím se může nacházet jeden, dva nebo i více příkazů, případně se zde nemusí nacházet příkaz žádný. (Pokud je za klíčovým slovem Then uvedeno více příkazů, mluvíme o bloku příkazů). Po vykonání všech přítomných příkazů je zpracován příkaz End If, který označuje konec působnosti příkazu If...Then. Jakmile je příkaz End If podroben exekuci, činnost rozhodovacího příkazu If...Then končí a běh programu pokračuje řádkem, jenž se nachází za příkazem End If.

 

Tak se příkaz If...Then chová v případě splnění testované podmínky. Co se ovšem stane ve chvíli, kdy je testovaný výraz vyhodnocen na hodnotu False a podmínka není tudíž splněna? Je-li tomu tak, nejsou vykonány žádné programové příkazy v těle příkazu, nýbrž činnost příkazu je okamžitě ukončena a běh programu se přesouvá na řádek, jenž následuje za řádkem s příkazem End If.  

 

 

Obr. 1: Algoritmus práce rozhodovacího příkazu If...Then

 

Pomocí příkazu If...Then můžeme kupříkladu testovat, zdali je v proměnné uložena nulová hodnota:

 

        Dim intProměnná As Integer

        If intProměnná = 0 Then

            MessageBox.Show("Hodnota proměnné je nulová.", _

            "Informace o hodnotě proměnné.", MessageBoxButtons.OK, _

            MessageBoxIcon.Information)

        End If

 

Metoda Show třídy MessageBox zobrazí okno se zprávou, která bude říkat, že hodnota proměnné intProměnná je rovna nule. To není nic překvapujícího, protože proměnná je po své deklaraci automaticky inicializována nulovou hodnotou a jelikož jsme její hodnotu poté neměnili, bude v ní uložena právě nula. Je tedy zřejmé, že výraz intProměnná = 0 je pravdivý, přesněji řečeno je vyhodnocen na hodnotu True typu Boolean. Jak jsme si již řekli, když je podmínka splněna, jsou vykonány příkazy za návěstím Then. V naší ukázce tak dochází k zobrazení okna se zprávou. Povězme však, že proměnnou po její deklaraci inicializujeme nenulovou hodnotou:

 

        Dim intProměnná As Integer = 10

        If intProměnná = 0 Then

            MessageBox.Show("Hodnota proměnné je nulová.", _

            "Informace o hodnotě proměnné.", MessageBoxButtons.OK, _

            MessageBoxIcon.Information)

        End If

 

Co se stane nyní? Po pravdě řečeno, nestane se nic, a to doslova. Vzhledem k tomu, že proměnná intProměnná nyní obsahuje hodnotu 10, nebude testovaná podmínka splněna. Výsledkem práce operátoru pro přiřazení (=) bude hodnota False, což znamená, že testovaný výraz není pravdivý. Z tohoto důvodu nebude zobrazena žádná zpráva, neboť běh programu bude pokračovat příkazy, které jsou umístěny za řádkem s End If (v ukázce nejsou tyto příkazy uvedeny).

 

Tip

Příkaz If...Then lze použít i bez ukončovacího příkazu End If. V tomto případě ovšem musí být programový příkaz, který se má vykonat v případě splnění testované podmínky, umístěn ihned za klíčovým slovem Then na jednom řádku. Kupříkladu níže uvedený fragment kódu...

 

        Dim f As Double = Math.Exp(2.0)

        If f < 5 Then

            f = 0

        End If

 

...lze pomocí nastíněné techniky přepsat takto:

 

        Dim f As Double = Math.Exp(2.0)

        If f < 5 Then f = 0

 

 

Příkaz If...Then...Else

 

Ačkoliv je možné použít příkaz If...Then v jeho základní podobě pro test podmínky a vykonání příkazů v případě úspěšné realizace tohoto testu, jaksi nám chybí možnost reagovat na skutečnost, kdy nebude testovaná podmínka splněna. Proto uvádíme modifikaci příkazu If...Then, ve které vystupuje klíčové slovo Else. Pak hovoříme o příkazu If...Then...Else, jenž má tuto všeobecnou podobu:

 

If Podmínka Then

  Příkazy

Else

  Příkazy

End If  

 

Filozofie je docela jednoduchá: Není-li podmínka splněna, budou vykonány programové příkazy, které následují za návěstím Else.

 

Obr. 2: Algoritmus práce rozhodovacího příkazu If...Then...Else

 

Upozornění

V příkazu If...Then...Else se může návěstí Else nacházet jednom jednou, přičemž platí, že toto návěstí nesmí v žádném případě předcházet klíčové slovo If. Ačkoliv je tato podmínka logická, mnoho začátečníků se snaží použít v jednom příkazu If...Then...Else i více návěstí Else, což ovšem není možné.  

 

Pomocí modifikované podoby příkazu If...Then tak můžeme uživatele obeznámit se skutečností, zdali se kýžený soubor nachází na jeho pevném disku či nikoliv.

 

        Dim Soubor As String

        Soubor = "d:\ikona1.ico"

        If System.IO.File.Exists(Soubor) Then

            MessageBox.Show("Soubor se nachází na disku.")

        Else

            MessageBox.Show("Soubor se na disku nenachází.")

        End If

 

Když sdílené metodě Exists třídy File z jmenného prostoru System.IO předáme cestu k požadovanému souboru, metoda zjistí, zdali je tento soubor přítomen ve specifikované lokaci či nikoliv. Příjemné je, že metoda informuje program o výsledku své činnosti pomocí pravdivostních hodnot. Je-li soubor nalezen a identifikován, je vrácena hodnota True, v opačném případě pak hodnota False. Nejlepší ze všeho ovšem je, že návratovou hodnotu metody Exists můžeme bez jakýchkoliv potíží použít v rozhodovacím příkaze If...Then...Else. Pro uživatele bude zobrazen dialog se zprávou, z které se dozví informace o existenci požadovaného souboru.

 

 

Příkaz If...Then...ElseIf

 

Dobrá, pomocí příkazu If...Then...Else můžeme vytvářet dvě programové větvě, přičemž na jednu umístíme kód, jenž bude aktivován v případě splnění testované podmínky, a na druhou pak uložíme ty programové instrukce, které budou realizovány v opačném případě. Pro jednoduché testy je příkaz If...Then...Else vhodný, avšak po určitém čase přijdete na to, že je ve své podstatě poněkud omezující, nakolik vám dovoluje reagovat pouze na dva stavy testovaného výrazu. Úkoly v programování jsou však nezřídka mnohem složitější, a proto není divu, že existuje další modifikace příkazu If...Then, kterou můžeme pojmenovat jako If...Then...ElseIf. A jakáže je generická podoba tohoto příkazu?

 

If Podmínka1 Then

  Příkazy

ElseIf Podmínka2 Then

  Příkazy

End If

 

Jak si můžete všimnout, přídavkem je návěstí ElseIf, za kterým následuje další podmínka (Podmínka2), která je určená k testování. Příkaz If...Then...ElseIf je však poněkud komplikovanější, a proto se na jeho styl práce podíváme pod drobnohledem. Nuže, nejprve je testována hlavní podmínka příkazu, která je v našem ukázkovém modelu označená jako Podmínka1. Je-li tato podmínka splněna (vyhodnocena na hodnotu True), jsou vykonány příkazy, které následují za návěstím Then. Pokud je však výsledkem testování podmínkového výrazu hodnota False, hlavní podmínka není splněna. V tomto okamžiku se běh programu přesouvá na příkaz ElseIf a dochází k testování podmínky, která je spjata s tímto příkazem. Je-li Podmínka2 splněna, jsou provedeny příkazy, které stojí za příslušným klíčovým slovem Then. Jestliže ovšem Podmínka2 není splněna (hodnota False), program opouští rozhodovací příkaz a soustřeďuje se na exekuci dalších instrukcí.  

 

Obr. 3: Algoritmus práce rozhodovacího příkazu If...Then...ElseIf

 

Podívejme se na praktickou aplikaci rozhodovacího příkazu If...Then...ElseIf:

 

        Dim Generátor As New Random

        Dim Číslo As Short

        Číslo = CShort(Generátor.Next(Short.MinValue, Short.MaxValue))

        If Číslo < 0 Then

            MessageBox.Show("Nalezené číslo je menší než nula." _

            & vbCrLf & "Hodnota čísla: " & Číslo)mp; Číslo)

        ElseIf Číslo = 0 Then

            MessageBox.Show("Nalezené číslo je nula." _

            & vbCrLf & "Hodnota čísla: " & Číslo)mp; Číslo)

        ElseIf Číslo > 0 Then

            MessageBox.Show("Nalezené číslo je větší než nula." _

            & vbCrLf & "Hodnota čísla: " & Číslo)mp; Číslo)

        End If

 

Tento fragment zdrojového kódu provádí generování náhodných čísel pomocí metody Next instance třídy Random z jmenného prostoru System. Tato metoda náhodně vybírá číslo z intervalu <-32768, 32767-1>. Hraniční hodnoty intervalu se takřka kryjí s intervalem platných hodnot typu Short, až na to, že maximální hodnota je o jedničku menší. To znamená, že metoda Next může vrátit náhodné číslo o maximální velikosti 32766, ne 32767. Jelikož metoda Next vrací návratovou hodnotu typu Integer, musíme ji před jejím uložením do proměnné Číslo typu Short konvertovat pomocí konverzní funkce CShort. Požadavek na realizaci konverze je nutné uskutečnit především tehdy, pokud pracujete s aktivní volbou Option Strict. Je-li jednou vygenerované číslo uložené v příslušné proměnné, můžeme jej testovat pomocí rozhodovacího příkazu If...Then...ElseIf. Všimněte si, že můžeme použít více programových větví s návěstím ElseIf, ovšem za každým návěstím musí následovat platná testovací podmínka. V závislosti od charakteru nalezeného čísla bude zobrazeno okno se zprávou, ve které se dozvíte, zdali je číslo menší, větší nebo rovné nule. Kromě toho vám bude sdělena i skutečná hodnota čísla, abyste mohli celou činnost lépe zkontrolovat.

 

Rozhodovací příkaz If...Then je mezi programátory velice oblíbený. Tento fakt je ovlivněn mnoha faktory, mezi které můžeme zařadit třeba snadnost použití, flexibilitu a rychlost.  Další podrobnosti kolem rozhodovacích příkazů si však ponecháme do příštího vydání rubriky Visual Basic.