12. diel - Cykly vo VB .NET druhýkrát - While, Do-Loop, Exit a Continue
V minulej lekcii, Podmienky vo VB.NET druhýkrát - ternárne výraz a Select Case , sme sa venovali ďalšie syntax podmienok.
Na úvod by bolo dobré podotknúť, že dnešná lekcia obsahuje menej používané praktiky a slúži hlavne na to, aby vás neprekvapili v cudzom kódu. Nie je príliš dôležité, aby ste ich sami vedeli používať.
Do
... Loop
Cyklus While
už dobre poznáme. Jeho podmienka sa vyhodnocuje
na začiatku cyklu, môže teda nastať situácia, že cyklus niekedy neprebehne
ani raz (podmienka nebola na začiatku splnená).
Dnes si ukážeme konštrukciu cyklu, ktorá nám umožní umiestniť
podmienku na koniec cyklu (cyklus teda prebehne vždy minimálne raz).
Spomínanou konštrukcií je cyklus Do
... Loop
.
Môžeme využiť 4 možnosti, ktoré vyzerajú nasledovne.
1 - While
na začiatku
cyklu
Tento cyklus nemusí prebehnúť ani raz:
Do While podmienka 'kód... Loop
2 - While
na konci cyklu
Tento cyklus prebehne minimálne raz:
Do 'kód... Loop While podmienka
3 - Until
na začiatku
cyklu
Cyklus nemusí prebehnú ani raz:
Do Until podmienka 'kód... Loop
4 - Until
na konci cyklu
Cyklus prebehne minimálne raz:
Do 'kód... Loop Until podmienka
Rozdiel medzi While
a Until
je, že v prípade
While
musí byť podmienka splnená, zatiaľ čo u
Until
je to naopak, tj. Cyklus prebieha, kým nie je podmienka
splnená.
Untilpodmienka
je teda vlastne to isté ako
While Notpodmienka
.
Príklad
Použitie Do
- Loop
cyklu si ukážme na našej
kalkulačke z lekcie o
cykloch. Pre skrátenie príkladu nebudeme používať verziu s overením
užívateľských vstupov.
Variant s While
V kalkulačke sme použili cyklus While
, ktorý umožnil celý
program opakovať a tak zadávať ďalšie a ďalšie príklady. Kód vyzeral
takto (jedná sa o verziu s konštrukciou Select Case
):
Console.WriteLine("Vitajte v kalkulačke") Dim pokracovat As String = "Áno" While pokracovat = "Áno" Console.WriteLine("Zadajte prvé číslo:") Dim a As Single = Console.ReadLine() Console.WriteLine("Zadajte druhé číslo:") Dim b As Single = Console.ReadLine() Console.WriteLine("Zvoľte si operáciu:") Console.WriteLine("1 - sčítanie") Console.WriteLine("2 - odčítanie") Console.WriteLine("3 - násobenie") Console.WriteLine("4 - delenie") Dim volba As Integer = Console.ReadLine() Dim vysledek As Single = 0 Select Case volba Case 1 vysledek = a + b Case 2 vysledek = a - b Case 3 vysledek = a * b Case 4 vysledek = a / b End Select If volba > 0 And volba < 5 Then Console.WriteLine("Výsledok: {0}", vysledek) Else Console.WriteLine("Neplatná voľba") End If Console.WriteLine("Prajete si zadať ďalší príklad? [áno/nie]") pokracovat = Console.ReadLine() End While Console.WriteLine("Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.") Console.ReadKey()
Všimnite si, že sme sa pri tejto variante s While
museli
zamyslieť nad východiskovou hodnotou premennej pokracovat
, ktoré
sme nastavili hodnotu "Ano"
, aby podmienka bola splnená pre prvý
priechod cyklom. Vymyslieť predvolenú hodnotu môže byť ale niekedy pomerne
zložité a môže napríklad i vyžadovať pomocnú premennú.
Variant s Do
- Loop
Keď použijeme cyklus Do
- Loop
s podmienkou na
konci, tak predvolenú hodnotu danej premennej nemusíme riešiť:
Console.WriteLine("Vitajte v kalkulačke") Dim pokracovat As String Do Console.WriteLine("Zadajte prvé číslo:") Dim a As Single = Console.ReadLine() Console.WriteLine("Zadajte druhé číslo:") Dim b As Single = Console.ReadLine() Console.WriteLine("Zvoľte si operáciu:") Console.WriteLine("1 - sčítanie") Console.WriteLine("2 - odčítanie") Console.WriteLine("3 - násobenie") Console.WriteLine("4 - delenie") Dim volba As Integer = Console.ReadLine() Dim vysledek As Single = 0 Select Case volba Case 1 vysledek = a + b Case 2 vysledek = a - b Case 3 vysledek = a * b Case 4 vysledek = a / b End Select If volba > 0 And volba < 5 Then Console.WriteLine("Výsledok: {0}", vysledek) Else Console.WriteLine("Neplatná voľba") End If Console.WriteLine("Prajete si zadať ďalší príklad? [áno/nie]") pokracovat = Console.ReadLine() Loop While pokracovat = "Áno" Console.WriteLine("Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.") Console.ReadKey()
Exit
a Continue
Beh cyklu je potreba niekedy prerušiť, k tomu máme nasledujúce 2 kľúčové slová.
Exit
Príkaz Exit
ukončuje aktuálny cyklus. Používa sa
najčastejšie, ak pomocou cyklu nájdeme hľadanú položku v kolekcii a nemá
teda už zmysel v prehliadaní kolekcie pokračovať. Nebudeme tak
ďalej zbytočne prehľadávať zvyšok kolekcie, keď už máme to, čo sme
hľadali.
Za príkazom Exit
musí byť ešte doplnené ďalšie
kľúčové slovo podľa typu cyklu:
Exit For
- ukončenieFor
cykluExit While
- ukončenieWhile
cykluExit Do
- ukončenieDo
-Loop
cyklu
Príklad
Predstavme si, že máme pole položiek a chceme v nich nejakú nájsť. Že
môžeme použiť metódu IndexOf()
alebo Contains()
?
Pokiaľ pôjde o pole, tak áno, ale niektoré kolekcie ju nemajú a / alebo
chceme hľadať pomocou nejakej iné vlastnosti, než ktorú tieto metódy
zohľadňujú. Potom si vyhľadávanie musíme napísať pekne ručne cyklom
alebo použiť výrazne pokročilejšie konštrukcie, ako teraz ovládame.
Predstavme si, že máme veľké a malé štítky na poháre a chceme použiť na všetky poháre buď jedny alebo druhé. Zaujíma nás teda, či sa text všetkých popisok zmestí na malé štítky. Napíšeme program, ktorý zistí, či je v poli slovo dlhšie ako 6 znakov. Ak áno, musíme použiť väčšie štítky.
Začneme cyklom prechádzať jednotlivé slová a akonáhle nájdeme slovo
dlhšie ako 6 znakov, tak si uložíme jeho index. Zatiaľ stále nič nové pod
slnkom. V tú istú chvíľu však pomocou Exit
cyklus
ukončíme.
Ukážka použitia Exit
:
Dim seznamOvoce() as String = {"Jablka", "Hrušky", "Švestky", "Meruňky", "Jahody", "Třešně"} Dim hledanyIndex as Integer = -1 For i As Integer = 0 To seznamOvoce.Length - 1 If seznamOvoce(i).Length > 6 Then hledanyIndex = i Exit For End If Next If hledanyIndex >= 0 Then Console.WriteLine("Prvé slovo dlhšie ako 6 znakov: " + seznamOvoce(hledanyIndex)) End If
výstup:
Konzolová aplikácia
Prvé slovo dlhšie ako 6 znakov: Švestky
Príkaz Exit
sa v praxi často nahrádza príkazom
Return
za predpokladu, že je kód v našej vlastnej metóde.
Vlastné metódy sa ale naučíme deklarovať až v nadväzujúcom kurze Základy objektovo orientovaného programovania vo VB.NET.
Potom Exit
odporúčam skôr nepoužívať, správnejšie varianta
je kód pre prácu s kolekciou vyčleniť do samostatnej funkcie.
Continue
Príkaz Continue
je podobný Exit
. Používa sa
však k ukončeniu iba aktuálnej iterácie (priebehu) cyklu a nie
celého cyklu. Cyklus potom rovno prechádza na ďalšiu iteráciu.
Continue
môžeme využiť napr. Pri validovanie položiek
pri prehliadaní nejakej kolekcie.
Aj u príkazu Continue
platí rovnako ako u Exit
,
že za ním musí byť ešte doplnené ďalšie kľúčové slovo podľa typu
cyklu:
Continue For
- ukončenie prebiehajúcej iterácieFor
cykluContinue While
- ukončenie prebiehajúcej iterácieWhile
cykluContinue Do
- ukončenie prebiehajúcej iterácieDo
-Loop
cyklu
Príklad
Predstavme si, že máme od užívateľa zadané čísla a tieto čísla chceme sčítať. Užívateľ tieto čísla zadá ako jeden reťazec, kde každé číslo je oddelené čiarkou. Bohužiaľ musíme počítať aj s tým, že používateľ zadá namiesto čísla nejaký nezmysel. Riešenie by mohlo vyzerať nasledovne:
Dim cislaRetezec As String = "10,50,abcd,30,9" 'rozloženie reťazca do poľa Dim cislaPole() As String = cislaRetezec.Split(",") Dim soucet As Integer = 0 For Each cislo As String in cislaPole 'prevedenie reťazca na celé číslo Dim celeCislo As Integer If Not Integer.TryParse(cislo, celeCislo) Continue For End If soucet += celeCislo Next Console.WriteLine("Súčet je: " & soucet)
výstup:
Konzolová aplikácia
Súčet je: 99
Program spočíta všetky správne zadané hodnoty, teda tie, u ktorých
metóda TryParse()
vrátila hodnotu True
. U nesprávne
zadaných hodnôt je aktuálna iterácie ukončená. Namiesto
Continue
by sme samozrejme mohli použiť príkaz If
,
kód by sme tým ale zbytočne zaboril.
Nekonečný cyklus While
a Do - Loop
Nasledujúce konštrukcie sú tu pre ukážku čo všetko je možné stretnúť v cudzích kódoch a nie je dobrý dôvod ich používať!
Cyklus While
je možné zapísať tak, aby podmienka vždy
platila, napr. Ako:
While True 'nekonečný cyklus End While
Tento zápis funguje rovnako ako:
Do Until False 'nekonečný cyklus Loop
Oba vyššie deklarované cykly beží do nekonečna a môžete ich
stretnúť v zle napísaných zdrojových kódoch spolu s príkazmi
Exit
, ktoré z nich potom za nejakých podmienok vyskakujú.
Akonáhle korektné podmienka nie je priamo v deklarácii cykle, je pomerne neprehľadné zistiť, kedy cyklus vôbec skončí a ľahké urobiť z takéhoto cyklu nechtiac cyklus nekonečný. To platí obzvlášť, keď z cyklu vyskakuje viac podmienkami a neskrývane všetky možné prípady.
Hoci dnešné lekcie obsahovala štandardnú gramatiku VB .NET
pre cykly, z nových konštrukcií používajte iba Continue
.
Prechodne ešte môžete používať Exit
, než sa dostaneme k
objektom:)
V nasledujúcom cvičení, Riešené úlohy k 11.-12. lekciu VB.NET, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.