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. 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ů:


Unit CykFor;
interface
implementation
var
   x : Integer;
begin
   ConsoleClear;
   For x := 1 to 10 do {cyklus nahoru}
       Writeln(x);

   For x := 5 downto 1 do {cyklus směrem dolů}
   begin
      Writeln(x*x);
      Writeln(x+x);
   end;
end;
end.
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ů je určeno klíčové slovo 'downto'. Hodnota řídící proměnné se nesmí v cyklu měnit. Hodnoty cyklu jsou vyhodnocovány pouze jednou a to při spuštění příkazu FOR.

První cyklus uvedený v příkladě obsahuje pouze jeden cyklicky opakovaný příkaz (Writeln) a není proto nutné uvádět vymezení bloku. Pokud ale požadujete, aby se v cyklu typu For opakovalo více příkazů, musíte je uvést v bloku mezi begin a end. Viz druhý cyklus uvedený v příkladě. Pozor na to, že se na to často zapomíná a taková chyba se těžko hledá. 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 Repeat. Vnitřní část tohoto cyklu se provede vždy minimálně jednou, protože podmínka ukončení cyklu je uvedena až na jeho konci:


Unit CykRepea;
interface
implementation
var
   x : Integer;
begin
   ConsoleClear;
   x := 1;
   Repeat          {začátek cyklu}
      Writeln(RealToStr(x/(x+1),6,3));
      x := x+1;    {zvýšení hodnoty čítače}
   Until x = 10;   {dokud není výraz pravdivý}
end;
end.
Jistě jste si všimli, že u cyklu typu Repeat nemusíte dávat více příkazů do bloku mezi klíčová slova begin a end. Je to proto, že cyklus typu Repeat je ohraničen blokem mezi repeat a until.

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.


Unit CykWhile;
interface
implementation
var
   x : real;
begin
   ConsoleClear;
   x := 1;
   While x < 5 do     {dokud je výraz pravdivý}
   begin
      Writeln(x*3);
      x := x+1;       {zvýšení hodnoty čítače}
   end;               {konec cyklu}
end;
end.
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