17. Příkazy cyklu

Příkazy cyklu

Cykly slouží k vícenásobnému opakování stejné části programu a mají v programování široké využití. Rozlišují se 3 základní typy cyklů:

  1. s pevným počtem opakování
  2. s podmínkou na začátku
  3. s podmínkou na konci

Cyklus FOR

Cyklus for má pevný počet opakování a provede se vždy tolikrát, jak určuje rozsah řídící proměnné. Jeho syntax je následující: For i:=1 to 10 Do {příkaz}, kde „i“ se nazývá řídící proměnná. Ta se po vykonání příkazu zvýší o jedničku dokud nedosáhne konečné hodnoty – v tomto případě 10. Takže tento cyklus se provede desetkrát a proměnná i nabývá postupně hodnot 1 až 10. Místo klíčového slova tolze použít i odpočítávání downto – pak ale musí mít řídíci proměnná vyšší hodnotu než ta koncová… Pro lepší pochopení cyklu FOR tu jsou dva příklady.

program cyklus1;
var i:integer {řídící proměnná je číslo}

begin
 for i:=1 to 10 do writeln(i,'. ahoj');

readln;
end.

Program provede příkaz writeln – vypíše „ahoj“ , vrátí se na začítek cyklu, zvýší hodnotu „i“ a opět provede příkaz. Abyste se přesvědčili, že se hodnota zvyšuje, tak jsem do writeln ještě nechal vypsat aktuální hodnotu „i“. Takže u každého ahoj bude ještě číslo. Následující program bude sčítat 10 čísel, které zadáme.

program scitani;
var pocet,cislo,soucet:integer;
begin

soucet:=0 {Vynuluje se proměnná součet}
for pocet:=1 to 10 do
begin
 read(cislo);
 soucet:=soucet+cislo;
end;
readln;

writeln(soucet);

readln;
end.

Cyklus WHILE

Cyklus While má podmínku na začátku, takže v případě, že není splněna, cyklus se vůbec neprovede.
Syntax je následující: While {výraz (např. a<100)} Do {příkaz}. Jako příklad je zde program, který vypíše všechny mocniny čísel 1 až 100.

program Mocniny;
var x:integer;

begin

x:=0;
while x<100 do
begin
 x:=x+1;
writeln(x,' ',sqr(x),' ',sqr(x)*x);
end;

readln;
end.

Proměnná má zde velký význam, protože v určitém okamžiku její hodnota zajistí ukončení cyklu. Na počátku je 0 a uvnitř cyklu se zvedá o 1.

Cyklus REPEAT UNTIL

Počet opakování cyklu repeat je určen podmínkou vyhodnocenou po příkazu, který se má provést. Syntax: Repeat {příkazy} Until {podmínka pro pokračování}.
Postup při zpracování tohoto cyklu:

  1. Provedou se příkazy mezi klíčovými slovy Repeat a Until
  2. Vyhodnotí se booleovský výraz na konci
  3. je-li hodnota NEpravdivá, opakuje se provedení příkazu

Všiměte si, že u cyklu WHILE je to přesně naopak. Jinými slovy jeden cyklus je negací toho druhého. Můžete si pomoct českými ekvivalenty:
Cyklus While: Když (něco je menší atd.) prováděj tohle a tamto.
Cyklus Repeat: Prováděj tohle a tamto, dokud (něco není menší atd…) Rozdíl je v tom, že jeden z těchto cyklů proběhne vždy alespoň jednou a to ten, který má podmínku na konci. Cyklus Repeat nyní použijeme v programu, který hledá největší společné dělitele dvou čísel postupným odčítáním. Na tento způsob přišel kdysi pan Eukleides a podle něho se nazývá „Eukleidův algorytmus“. V podstatě se jedná o to, že máme dvě čísla – jedno větší a druhé menší. Budeme neustále odčítat menší od většího, dokud se tato čísla nebudou rovnat. Už když je použito slovo „dokud“, úplně se nabízí cyklus Repeat until.

program Deleni;
var j,i:integer;
begin

writeln('zadej 2 cisla');
readln(i,j);

repeat
 begin
  if i>j then i:=i-j else j:=j-i;
 end;
until i=j;

writeln(i);

readln;
end.

 

Cyklus s podmínkou na začátku
Když podmínka není na počátku splněna, cyklus nemusí proběhnout ani jednou.
Zatímco platí podmínka p, prováděj příkaz p1.
while p do p1;
Cyklus s podmínkou na konci
Tento cyklus musí proběhnout aspoň jednou.
Opakuj příkaz p1, dokud neplatí podmínka p.
repeat
  p1;
until p;
Cyklus se známým počtem průchodů (s řídící proměnnou)
Cyklus proběhne n krát
v obecném případě (pro i od m do n) proběhne (n-m+1) krát
pokud m>n tak neproběhne ani jednou.
i je řídící proměnná – musí být celočíselná!
pro i od 1 do n prováděj příkaz p1.
během provádění cyklu řídící proměnná cyklu i postupně nabývá hodnot 1, 2, 3,…,n.
for i:=1 to n
do p1;

pozn.: Vývojové diagramy cyklů mají jako jediné zpětnou větev. Standartní chybou u opakování s podmínkou bývá cyklus „s podmínkou uprostřed“. Zpětná větev musí buď začínat hned za podmínkou, nebo se musí vracet těsně před podmínku.