Lekce 1.13
Cykly (FOR, REPEAT, UNTIL)


předchozí lekce (1.12) obsah kurzu následující lekce (1.14)

Až doposud prováděly naše programy pouze zadaný sled povelů bez možnosti opakování požadovaných akcí. Pokud by jsme potřebovali například vykonat nějakou část programu stokrát, museli by jsme uvedenou část programu zapsat stokrát. To by však bylo, jak sami jistě uznáte značně nevhodné a nepohodlné. V této lekci si proto probereme, jak je možné na základě vyhodnocení podmínek opakovat zadanou část programu.

Pokud budete potřebovat v programu provést nějakou akci s předem známým počtem opakování, bude nejvhodnější použít cyklus typu For..Next. Jedná se o cyklus, ve kterém je definován tzv. čítač, který udává kolikrát se má cyklus ještě provést. Čítač je automaticky systémem zvyšován o jedničku. Směr načítání může být přitom nahoru, nebo dolů:


Sub Main()
    ConsoleClear      'vymaže obsah textového výstupu
    ConsoleShow       'zobrazí textové výstupní okno

    'cyklus směrem nahoru
    For x = 1 to 10
        Writeln(x) 
    Next

    'cyklus směrem dolů
    For x = 10 to 1 Step -1
        Writeln(x) 
    Next
End Sub
V uvedeném příkladě jsou v programu dva cykly For. První z nich zvyšuje stav čítače x směrem nahoru, druhý směrem dolů. Všimněte si, že čítač musí být sice deklarován jako proměnná, ale přiřazení počáteční hodnoty se provádí až v definici cyklu. Konečná hodnota čítače se pro směr načítání nahoru zadává za klíčovým slovem 'to'. Pro směr načítání dolů musí být uvedena počáteční hodnota větši než konečná hodnota. Navíc se musí uvést pomocí Step krok cyklu se zápornou hodnotou. Step udává krok v jednom cyklu a může být uvedena libovolná číselná nenulová hodnota. Pokud se uvede například hodnota Step ve velikosti 10, bude se řídící proměnná cyklu zvětšovat o 10.

Pokud budete chtít ve svém programu použít cyklus, jehož ukončení bude záviset na splnění zadané podmínky, máte možnost použít cyklus typu Do..Loop. Podmínku pro opakování cyklu můžete přitom uvést buď na začátku cyklu, nebo na jeho konci. Podle toho budou také vykonávány příkazy obsažené v cyklu. Pokud uvedete podmínky cyklu na jeho konci, provede se cyklus vždy minimálně jednou, což může být v některých programech výhodné.


Sub Main()
    x = 0
    Do                   'začátek cyklu
       Writeln(x)        'výpis hodnoty čítače
       x = x+1           'zvýšení hodnoty čítače
    Loop While x < 10    'dokud je výraz pravdivý

    x = 0
    Do                   'začátek cyklu
       Writeln(x)        'výpis hodnoty čítače
       x = x+1           'zvýšení hodnoty čítače
    Loop Until x = 10    'dokud není výraz pravdivý
End Sub
Všimněte si, že v těle cyklu musí být vždy uveden příkaz, který má za následek možnou změnu vyhodnocení cyklu. Jinak by byl cyklus stále opakován a nedošlo by k jeho ukončení.

Příkazy jsou vykonávány opakovaně, dokud není splněna (nesplněna) zadaná podmínka uvedená na konci cyklu. Pokud je v cyklu zadáno While, provádí se příkazy opakovaně tak dlouho, dokud je podmínka cyklu pravdivá. Při zadání Until v podmínce se budou příkazy vykonávat opakovaně tak dlouho, dokud není podmínka cyklu splněna. Obdobným způsobem lze zadat cyklus, kde je platnost podmínky vyhodnocována na začátku cyklu. V takovém případě však nemusí být podle zadané podmínky a počátečních hodnot cyklus proveden ani jednou.


Sub Main()
    x = 0
    Do While x < 10    'dokud je výraz pravdivý
       Writeln(x)      'výpis hodnoty čítače
       x = x+1         'zvýšení hodnoty čítače
    Loop 

    x = 0
    Do Until x = 10    'dokud není výraz pravdivý
       Writeln(x)      'výpis hodnoty čítače
       x = x+1         'zvýšení hodnoty čítače
    Loop 
End Sub
Příkazy uvedené mezi klíčovými slovy Repeat a Until se provádí tak dlouho, dokud není výraz definovaný na konci podmínky pravdivý. Nesmíte přitom zapomenout na zvýšení hodnoty čítače, případně provést jinou akci, která může mít za následek ukončení cyklu.

Jako další cyklus můžete použít cyklus While, který vyhodnocuje podmínku opakování cyklu vždy na jeho počátku. To umožňuje, že pokud není podmínka splněna, neprovedou se příkazy uvedené v bloku následujícím za definicí cyklu ani jednou. To může být v některých případech výhodné a je proto nutné se při vlastním programování rozhodnout, který druh cyklu má být použit.


X = 1
While x < 5        'dokud je výraz pravdivý
   Writeln(x * 1.22);
   x = x + 1       'zvýšení hodnoty čítače
Wend
Pro zápis podmínek při používání cyklů platí vše co bylo uvedeno u popisu větvení programu příkazem If. Stejně tak je velmi výhodné a hlavně přehledné v textu programu odsadit řádky programu uvnitř cyklů o tři prázdné znaky doprava. Viz výše uvedené příklady. Programy tím získají na přehlednosti. Současně doporučujeme uvádět v programu poznámky ve formě komentáře. Jak jste si již mohli všimnout, poznámky se uvádějí ve složených závorkách. Pokud byste na začátku řádku uvedli dvě lomítka, byl by text až do konce řádku v programu ignorován.

Při programování cyklů si musíte dát pozor na to, aby byly v těle cyklu příkazy umožňující jeho ukončení. Pokud byste měli například cyklus s definovanou podmínkou, která nebude nikdy splněna, běžel by program stále v tomto cyklu a museli byste jej ukončit restartem.

V této lekci jsme se zabývali několika příkazy, které však prováděly podobnou činnost. Příkazy cyklu jsou v programech velmi často používané. Je však nutné si podle požadovaných akcí vybrat nevhodnější příkaz pro cyklus.


předchozí lekce (1.12) obsah kurzu následující lekce (1.14)

OZOGAN, 1 Máje 97, 460 01 Liberec
tel.,fax: (048) 52 28 338, e-mail: info@ozogan.cz