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.

„Pes, kterého uzdravíš, tě nikdy nekousne. To je hlavní rozdíl mezi zvířetem a člověkem.“ Mark Twain