NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Lekce 13 - Cykly ve VB.NET podruhé - While, Do-Loop, Exit a Continue

V minulé lekci, Podmínky ve VB.NET podruhé - Ternární výraz a Select Case, jsme se věnovali další syntaxi podmínek.

Na úvod by bylo dobré podotknout, že dnešní lekce obsahuje méně používané praktiky a slouží hlavně k tomu, aby vás nepřekvapily v cizím kódu. Není příliš důležité, abyste je sami uměli používat.

Do...Loop

Cyklus While již dobře známe. Jeho podmínka se vyhodnocuje na začátku cyklu, může tedy nastat situace, že cyklus někdy neproběhne ani jednou (podmínka nebyla na začátku splněna).

Dnes si ukážeme konstrukci cyklu, která nám umožní umístit podmínku na konec cyklu (cyklus tedy proběhne vždy minimálně jednou). Zmiňovanou konstrukcí je cyklus Do...Loop. Můžeme využít 4 možnosti, které vypadají následovně.

1 - While na začátku cyklu

Tento cyklus nemusí proběhnout ani jednou:

Do While podmínka
    'kód...
Loop

2 - While na konci cyklu

Tento cyklus proběhne minimálně jednou:

Do
    'kód...
Loop While podmínka

3 - Until na začátku cyklu

Cyklus nemusí proběhnou ani jednou:

Do Until podmínka
    'kód...
Loop

4 - Until na konci cyklu

Cyklus proběhne minimálně jednou:

Do
    'kód...
Loop Until podmínka

Rozdíl mezi While a Until je, že v případě While musí být podmínka splněna, zatímco u Until je to naopak, tj. cyklus probíhá, dokud není podmínka splněna.

Until podmínka je tedy vlastně totéž jako While Not podmínka.

Příklad

Použití Do-Loop cyklu si ukažme na naší kalkulačce z lekce o cyklech. Pro zkrácení příkladu nebudeme používat verzi s ověřením uživatelských vstupů.

Varianta s While

V kalkulačce jsme použili cyklus While, který umožnil celý program opakovat a tak zadávat další a další příklady. Kód vypadal takto (jedná se o verzi s konstrukcí Select Case):

Console.WriteLine("Vítejte v kalkulačce")
Dim pokracovat As String = "Ano"
While pokracovat = "Ano"
    Console.WriteLine("Zadejte první číslo:")
    Dim a As Single = Console.ReadLine()
    Console.WriteLine("Zadejte druhé číslo:")
    Dim b As Single = Console.ReadLine()
    Console.WriteLine("Zvolte si operaci:")
    Console.WriteLine("1 - sčítání")
    Console.WriteLine("2 - odčítání")
    Console.WriteLine("3 - násobení")
    Console.WriteLine("4 - dělení")
    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ýsledek: {0}", vysledek)
    Else
        Console.WriteLine("Neplatná volba")
    End If
    Console.WriteLine("Přejete si zadat další příklad? [ano/ne]")
    pokracovat = Console.ReadLine()
End While
Console.WriteLine("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.")
Console.ReadKey()

Všimněte si, že jsme se u této varianty s While museli zamyslet nad výchozí hodnotou proměnné pokracovat, které jsme nastavili hodnotu "Ano", aby podmínka byla splněna pro první průchod cyklem. Vymyslet výchozí hodnotu může být ale někdy poměrně složité a může třeba i vyžadovat pomocnou proměnnou.

Varianta s Do-Loop

Když použijeme cyklus Do-Loop s podmínkou na konci, tak výchozí hodnotu dané proměnné nemusíme řešit:

Console.WriteLine("Vítejte v kalkulačce")
Dim pokracovat As String
Do
    Console.WriteLine("Zadejte první číslo:")
    Dim a As Single = Console.ReadLine()
    Console.WriteLine("Zadejte druhé číslo:")
    Dim b As Single = Console.ReadLine()
    Console.WriteLine("Zvolte si operaci:")
    Console.WriteLine("1 - sčítání")
    Console.WriteLine("2 - odčítání")
    Console.WriteLine("3 - násobení")
    Console.WriteLine("4 - dělení")
    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ýsledek: {0}", vysledek)
    Else
        Console.WriteLine("Neplatná volba")
    End If
    Console.WriteLine("Přejete si zadat další příklad? [ano/ne]")
    pokracovat = Console.ReadLine()
Loop While pokracovat = "Ano"
Console.WriteLine("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.")
Console.ReadKey()

Exit a Continue

Běh cyklu je potřeba někdy přerušit, k tomu máme následující 2 klíčová slova.

Exit

Příkaz Exit ukončuje aktuální cyklus. Používá se nejčastěji, pokud pomocí cyklu nalezneme hledanou položku v kolekci a nemá tudíž již smysl v procházení kolekce pokračovat. Nebudeme tak dále zbytečně prohledávat zbytek kolekce, když již máme to, co jsme hledali.

Za příkazem Exit musí být ještě doplněno další klíčové slovo podle typu cyklu:

  • Exit For - ukončení For cyklu
  • Exit While - ukončení While cyklu
  • Exit Do - ukončení Do - Loop cyklu

Příklad

Představme si, že máme pole položek a chceme v nich nějakou najít. Že můžeme použít metodu IndexOf() nebo Contains()? Pokud půjde o pole, tak ano, ale některé kolekce ji nemají a/nebo chceme hledat pomocí nějaké jiné vlastnosti, než kterou tyto metody zohledňují. Pak si vyhledávání musíme napsat hezky ručně cyklem nebo použít výrazně pokročilejší konstrukce, než nyní ovládáme.

Představme si, že máme velké a malé štítky na sklenice a chceme použít na všechny sklenice buď jedny nebo druhé. Zajímá nás tedy, zda se text všech popisek vejde na malé štítky. Napíšeme program, který zjistí, zda je v poli slovo delší než 6 znaků. Pokud ano, musíme použít větší štítky.

Začneme cyklem procházet jednotlivá slova a jakmile najdeme slovo delší než 6 znaků, tak si uložíme jeho index. Zatím stále nic nového pod sluncem. V tu samou chvíli ovšem pomocí Exit cyklus ukončíme.

Ukázka použití 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("První slovo delší než 6 znaků: " + seznamOvoce(hledanyIndex))
End If

Výstup:

Konzolová aplikace
První slovo delší než 6 znaků: Švestky

Příkaz Exit se v praxi často nahrazuje příkazem Return za předpokladu, že je kód v naší vlastní metodě. Vlastní metody se ale naučíme deklarovat až v navazujícím kurzu Základy objektově orientovaného programování ve VB.NET. Potom Exit doporučuji spíše nepoužívat, správnější varianta je kód pro práci s kolekcí vyčlenit do samostatné funkce.

Continue

Příkaz Continue je podobný Exit. Používá se však k ukončení pouze aktuální iterace (průběhu) cyklu a ne celého cyklu. Cyklus poté rovnou přechází na další iteraci. Continue můžeme využít např. při validování položek při procházení nějaké kolekce.

I u příkazu Continue platí stejně jako u Exit, že za ním musí být ještě doplněno další klíčové slovo podle typu cyklu:

  • Continue For - ukončení probíhající iterace For cyklu
  • Continue While - ukončení probíhající iterace While cyklu
  • Continue Do - ukončení probíhající iterace Do - Loop cyklu

Příklad

Představme si, že máme od uživatele zadaná čísla a tato čísla chceme sečíst. Uživatel tato čísla zadá jako jeden řetězec, kde každé číslo je oddělené čárkou. Bohužel musíme počítat i s tím, že uživatel zadá místo čísla nějaký nesmysl. Řešení by mohlo vypadat následovně:

Dim cislaRetezec As String = "10,50,abcd,30,9"
'rozložení řetězce do pole
Dim cislaPole() As String = cislaRetezec.Split(",")
Dim soucet As Integer = 0
For Each cislo As String in cislaPole
    'převedení řetězce na celé číslo
    Dim celeCislo As Integer

    If Not Integer.TryParse(cislo, celeCislo)
        Continue For
    End If

    soucet += celeCislo
Next
Console.WriteLine("Součet je: " & soucet)

Výstup:

Konzolová aplikace
Součet je: 99

Program sečte všechny správně zadané hodnoty, tedy ty, u kterých metoda TryParse() vrátila hodnotu True. U nesprávně zadaných hodnot je aktuální iterace ukončena. Místo Continue bychom samozřejmě mohli použít příkaz If, kód bychom tím ale zbytečně zanořili.

Nekonečný cyklus While a Do - Loop

Následující konstrukce jsou zde pro ukázku co vše je možné potkat v cizích kódech a není dobrý důvod je používat!

Cyklus While je možné zapsat tak, aby podmínka vždy platila, např. jako:

While True
    'nekonečný cyklus
End While

Tento zápis funguje stejně jako:

Do Until False
    'nekonečný cyklus
Loop

Oba výše deklarované cykly běží do nekonečna a můžete je potkat ve špatně napsaných zdrojových kódech spolu s příkazy Exit, které z nich potom za nějakých podmínek vyskakují.

Jakmile korektní podmínka není přímo v deklaraci cyklu, je poměrně nepřehledné zjistit, kdy cyklus vůbec skončí a snadné udělat z takového cyklu nechtěně cyklus nekonečný. To platí zvláště, když z cyklu vyskakujeme více podmínkami a nepokryjeme všechny možné případy.

Ač dnešní lekce obsahovala standardní gramatiku VB .NET pro cykly, z nových konstrukcí používejte pouze Continue. Přechodně ještě můžete používat Exit, než se dostaneme k objektům :)

V následujícím kvízu, Kvíz - Pokročilé podmínky a cykly ve VB.NET, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.


 

Předchozí článek
Podmínky ve VB.NET podruhé - Ternární výraz a Select Case
Všechny články v sekci
Základní konstrukce jazyka Visual Basic (VB.NET)
Přeskočit článek
(nedoporučujeme)
Kvíz - Pokročilé podmínky a cykly ve VB.NET
Článek pro vás napsal Alesh
Avatar
Uživatelské hodnocení:
12 hlasů
Aktivity