13. diel - Cykly v C# .NET druhýkrát - do-while, break a continue
V minulej lekcii, Podmienky v C# - Ternárny výraz a prepadávací switch, sme sa venovali ďalšej syntaxi podmienok.
V dnešnom C# tutoriále sa pozrieme na cyklus do
-
while
, príkazy break
a continue
a tiež
na skrátený zápis už prebraného cyklu for
.
Na úvod by bolo dobré podotknúť, že dnešná lekcia obsahuje menej používané praktiky a slúži hlavne na to, aby nás tieto praktiky neprekvapili v cudzom kóde. Nie je príliš dôležité, aby sme ich sami vedeli používať.
Cyklus do
- while
Cyklus while
už dobre poznáme. Menej používaný
do
- while
sa líši iba tým, že sa vždy vykoná
najmenej raz. Podmienka tohto cyklu je totiž umiestnená až za jeho
telom. Vyzerá teda takto:
do { // code... } while (condition)
Aj na zapísanie tohto cyklu môžeme využiť snippet vo
Visual Studiu: Napíšeme do
a dvakrát stlačíme
Tabuľátor. Zvyšok cyklu sa sám dopíše.
Príklad
Použitie do
- while
cyklu si ukážme na našej
kalkulačke z lekcie o
cykloch. Na skrátenie príkladu nebudeme používať verziu s overením
užívateľských vstupov.
Variant s cyklom 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 switch
):
Console.WriteLine("Welcome to our calculator"); string goOn = "yes"; while (goOn == "yes") { Console.WriteLine("Enter the first number:"); double a = double.Parse(Console.ReadLine()); Console.WriteLine("Enter the second number:"); double b = double.Parse(Console.ReadLine()); Console.WriteLine("Choose one of the following operations:"); Console.WriteLine("1 - addition"); Console.WriteLine("2 - subtraction"); Console.WriteLine("3 - multiplication"); Console.WriteLine("4 - division"); int option = int.Parse(Console.ReadLine()); double result = 0; switch (option) { case 1: result = a + b; break; case 2: result = a - b; break; case 3: result = a * b; break; case 4: result = a / b; break; } if ((option > 0) && (option < 5)) Console.WriteLine("Result: {0}", result); else Console.WriteLine("Invalid option"); Console.WriteLine("Would you like to make another calculation? [yes/no]"); goOn = Console.ReadLine(); } Console.WriteLine("Thank you for using our calculator. Press any key to end the program."); Console.ReadKey();
Všimnime si, že sme sa pri tomto variante s while
museli
zamyslieť nad východiskovou hodnotou premennej goOn
. Tej sme
nastavili hodnotu "yes"
, aby podmienka bola splnená pre prvý
prechod cyklom. Vymyslieť predvolenú hodnotu ale môže byť pomerne zložité
a niekedy je potrebné použiť aj pomocnú premennú.
Variant s cyklom do
-
while
Keď použijeme cyklus do
- while
, predvolenú
hodnotu danej premennej už nemusíme riešiť:
Console.WriteLine("Welcome to the calculator"); string goOn; do { Console.WriteLine("Enter the first number:"); double a = double.Parse(Console.ReadLine()); Console.WriteLine("Enter the second number:"); double b = double.Parse(Console.ReadLine()); Console.WriteLine("Choose one of the following operations:"); Console.WriteLine("1 - addition"); Console.WriteLine("2 - subtraction"); Console.WriteLine("3 - multiplication"); Console.WriteLine("4 - division"); int option = int.Parse(Console.ReadLine()); double result = 0; switch (option) { case 1: result = a + b; break; case 2: result = a - b; break; case 3: result = a * b; break; case 4: result = a / b; break; } if ((option > 0) && (option< 5)) Console.WriteLine("Result: {0}", result); else Console.WriteLine("Invalid option"); Console.WriteLine("Would you like to make another calculation? [yes/no]"); goOn = Console.ReadLine(); } while (goOn == "Yes"); Console.WriteLine("Thank you for using our calculator. Press any key to end the program."); Console.ReadKey();
Príkazy break
a
continue
Niekedy je potrebné beh cyklu prerušiť. Na to nám slúžia nasledujúce dve kľúčové slová.
Príkaz break
Príkaz break
ukončuje aktuálny cyklus. Používa sa
najčastejšie vtedy, keď pomocou cyklu nájdeme nejakú položku v kolekcii a
ďalej už v jej prechádzaní nechceme pokračovať. Nebudeme tak
ďalej zbytočne prehľadávať zvyšok kolekcie, pretože už máme to, čo sme
hľadali.
Príklad s využitím break
Predstavme si, že máme pole položiek a chceme v nich nejakú nájsť.
Ponúka sa použiť metódu IndexOf()
alebo
Contains()
. Pokiaľ pôjde o pole, bude použitie týchto metód
vhodné, ale niektoré kolekcie ich nemajú alebo napríklad chceme hľadať
pomocou inej vlastnosti, než ktorú tieto metódy zohľadňujú. Vyhľadávanie
potom musíme buď napísať pekne ručne cyklom, alebo k nemu použiť výrazne
pokročilejšie konštrukcie, než teraz ovládame.
Predstavme si, že máme veľké a malé štítky na poháre. Na všetky poháre chceme použiť buď jedny, alebo druhé štítky. Zaujíma nás teda, či sa text všetkých popiskov zmestí na malé štítky. Napíšeme program, ktorý zistí, či sa v poli nachádza slovo dlhšie ako 6 znakov. Pokiaľ áno, musíme použiť väčšie štítky.
Cyklom začneme prechádzať jednotlivé slová, a akonáhle nájdeme slovo
dlhšie ako 6 znakov, uložíme si jeho index. Zatiaľ stále nič nové pod
slnkom. V tej istej chvíli však cyklus pomocou príkazu
break
ukončíme.
Ukážka použitia príkazu break
:
string[] fruitsList = {"Apples", "Pears", "Plums", "Apricots", "Strawberries", "Cherries"}; int searchedIndex = -1; for (int i = 0; i < fruitsList.Length; i++) { if (fruitsList[i].Length > 6) { searchedIndex = i; break; } } if (searchedIndex >= 0) Console.WriteLine("First word longer than 6 characters: " + fruitsList[searchedIndex]);
Výstup:
Konzolová aplikácia
First word longer than 6 characters: Apricots
Príkaz break
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 Objektovo orientované programovanie v C# .NET. Príkaz
break
potom odporúčame skôr nepoužívať, správnejší variant
je kód pre prácu s kolekciou vyčleniť do samostatnej funkcie.
Príkaz continue
Príkaz continue
je podobný ako break
. Používa
sa však na ukončenie iba aktuálnej iterácie (priebehu) cyklu, a nie
celého cyklu. Cyklus potom rovno prechádza na ďalšiu iteráciu. Na
použitie príkazu continue
môžeme naraziť napr. pri
validovaní položiek pri prechádzaní nejakej kolekcie.
Príklad s využitím
continue
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, v ktorom je každé číslo oddelené čiarkou. Bohužiaľ musíme počítať aj s tým, že používateľ namiesto čísla zadá nejaký nezmysel. Riešenie by mohlo vyzerať nasledovne:
string stringNumbers = "10,50,abcd,30,9"; // splitting a string into an array string[] arrayNumbers = stringNumbers.Split(','); int sum = 0; foreach (string number in arrayNumbers) { // converting a string to an integer int integer; if(!int.TryParse(number, out integer)) continue; sum += integer; } Console.WriteLine("The sum is: " + sum);
Výstup:
Konzolová aplikácia
The sum is: 99
Program spočíta všetky správne zadané hodnoty, teda tie, pri ktorých
metóda TryParse()
vrátila hodnotu true
. Pri
nesprávne zadaných hodnotách je aktuálna iterácia ukončená. Namiesto
continue
by sme samozrejme mohli použiť aj príkaz
if
, kód by sme tým však zbytočne vnorili.
Skrátený zápis cyklu for
Nasledujúce konštrukcie tu uvádzame iba pre ukážku, s čím všetkým je možné sa stretnúť v cudzích kódoch, a nie je dobrý nápad ich používať!
Cyklus for
je možné zapísať takto skrátene, bez tela
cyklu:
for (int i = 0; i < 10; Console.Write(i++));
Výstup:
Konzolová aplikácia
0123456789
Písať logiku priebehu behu cyklu aj logiku v cykle na jeden riadok ale nie je intuitívne. Navyše sa tak môže ľahko zabudnúť na inkrementáciu premennej, prípadne ju môžeme inkrementovať viackrát.
V hlavičke cyklu for
dokonca nie je nutné uvádzať
akýkoľvek príkaz:
for (;;) { // endless loop }
Tento zápis je rovnaký ako:
while (true) { // endless loop }
Oba vyššie deklarované cykly bežia donekonečna a môžete sa s nimi
stretnúť v zle napísaných zdrojových kódoch spolu s príkazmi
break
, ktoré z nich potom za nejakých podmienok vyskakujú.
Akonáhle podmienka nie je priamo v deklarácii cyklu, je pomerne ťažké zistiť, kedy cyklus vôbec skončí. Z takého cyklu je potom ľahké vytvoriť nechtiac nekonečný. To platí obzvlášť vtedy, keď z cyklu vyskakujeme viacerými podmienkami a nepokryjeme všetky možné prípady.
Hoci dnešná lekcia obsahovala štandardnú gramatiku C#.NET
pre cykly, z nových konštrukcií používajte iba do
-
while
a continue
. Prechodne ešte môžete používať
break
, než sa dostaneme k objektom
V nasledujúcom kvíze, Kvíz - Pokročilé podmienky a cykly v C# .NET, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.