Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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čenie For cyklu
  • Exit While - ukončenie While cyklu
  • Exit Do - ukončenie Do - 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ácie For cyklu
  • Continue While - ukončenie prebiehajúcej iterácie While cyklu
  • Continue Do - ukončenie prebiehajúcej iterácie Do - 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í.


 

Predchádzajúci článok
Podmienky vo VB.NET druhýkrát - ternárne výraz a Select Case
Všetky články v sekcii
Základné konštrukcie jazyka Visual Basic (VB .NET)
Preskočiť článok
(neodporúčame)
Riešené úlohy k 11.-12. lekciu VB.NET
Článok pre vás napísal Alesh
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity