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
cykluExit While
- ukončeníWhile
cykluExit 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í iteraceFor
cykluContinue While
- ukončení probíhající iteraceWhile
cykluContinue Do
- ukončení probíhající iteraceDo
-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í.