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ů:
- s pevným počtem opakování
- s podmínkou na začátku
- 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:
- Provedou se příkazy mezi klíčovými slovy Repeat a Until
- Vyhodnotí se booleovský výraz na konci
- 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.