předchozí lekce (1.12) | obsah kurzu | následující lekce (1.14) |
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) |