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