Obsah lekce:
Stejně jako cyklus WHILE slouží cyklus FOR k opakování posloupností příkazů. Tento cyklus se, stejně jako while, používá velmi často, a proto se jím nyní budeme zabívat. Cyklus FOR je vhodný především v situacích, kdy již předem přesně víme, kolikrát se bude daná posloupnost příkazů opakovat.
Cyklus FOR použijeme k vytvoření cyklu se zadaným počtem opakování. Syntaxe příkazu FOR je následující:
FOR proměnná := dolní_mez TO horní_mez DO posloupnost-příkazů
Cyklus probíhá v následujících krocích:
ProgramNapisPetCisel;
var cislo:integer;
begin
FOR cislo:=1 TO 5 DO
begin
writeln(cislo);
end;
readln;
end.
Program vypíše pět čísel od jedničky do pětky (na výstupu vidíme číslice 1, 2, 3, 4, 5 každou na zvláštním řádku) a pracuje takto:
Uvažujme jednoduchý program, který umí sečíst pět čísel. Program pracuje tak, že nejprve nastaví proměnnou součet na nulu a následně proběhne 5x cyklus FOR, který si vždy vyžádá od uživatele zadaní proměnné číslo, kterou přičte k proměnné součet. Cyklus FOR proběhne přesně 5x a tím dojde k postupnému zadání pěti čísel a jejich přičtení do proměnné soucet.
Program SoucetPetiCisel;
var cislo, i, soucet:integer;
begin
soucet:=0;
FOR i:=1 TO 5 DO
begin
writeln('Zadej cislo:');
readln(cislo);
soucet:=soucet + cislo;
end;
writeln('Soucet zadanych cisel je ',soucet);
readln;
end.
Pojďme tento program ještě vylepšit tak, že bude uživateli ještě oznamovat, kolikáté číslo uživatel právě zadává. Bude tedy uživatele informovat: "Zadej 1. číslo, .... Zadej 2. číslo" atd. K řešení tohoto požadavku můžeme využít proměnnou i, která řídí celý cyklus. Tuto proměnnou máme pořád k dispozici a v každém průchodu cyklu ji můžeme využít. Celý problém tedy vyřešíme tak, že hodnotu proměnné i vypíšeme v příkazu, který oznamuje uživateli, že má zadat číslo.
writeln('Zadej ',i,'. cislo:');
Program SoucetPetiCisel;
var cislo, i, soucet:integer;
begin
FOR i:=1 TO 5 DO
begin
writeln('Zadej ',i,'. cislo:');
readln(cislo);
end;
writeln('Soucet zadanych cisel je ',soucet);
readln;
end.
Zamysleme se nyní nad tím, jaké zásadní vlastnosti tento program má. Program skutečně sečte pět zadaných čísel, ale to je vše co je na něm dobré. Velkou nevýhodou tohoto programu je, že program pracuje skutečně pouze s pěti čísly a jiným počtem si není schopen poradit. Celkový smysl tohoto programu je tedy velmi problematický a jeho varianta s cyklem WHILE z minulé lekce je tedy podstatně lepší a předevšim obecně použitelná pro libovolný počet čísel. Naplno se zde ukázala vlastnost cyklu FOR, která říkala, že pro jeho použití musíme předem přesně říci, kolikrát se bude daná posloupnost příkazů opakovat. Lze program upravit alespoň tak, aby bylo možno zvolit počet zadávaných čísel?
I tento požadavek lze splnit tím, že nadefinujeme proměnnou, jejíž hodnotu uživatel zadá po startu programu. Touto proměnnou bude určen počet opakování cyklu for.
Program SoucetZadanehoPoctuCisel;
var cislo, i, pocetcisel, soucet:integer;
begin
writeln('Zadej pozadovany pocet cisel:');
readln(pocetcisel);
FOR i:=1 TO pocetcisel DO
begin
writeln('Zadej ',i,'. cislo:');
readln(cislo);
end;
writeln('Soucet zadanych cisel je ',soucet);
readln;
end.
Pomocí cyklu for jsme mohli prozatím napsat program pro zadání předem známého počtu čísel. Chtěli bychom ale napsat program, který umožní zadat libovolný počet čísel, jejichž počet nemusí být předem znám. Jak víme, tak pomocí cyklu while to možné je.
Pomocí cyklu for lze tento požadavek splnit také, ale má to nevýhodu v tom, že bychom jako horní mez museli nastavit nějakou hodně vysokou hodnotu, aby mohl uživatel skutečně zadat nějaký "libovolný" počet čísel. Navíc bychom museli nějakou podmínkou cyklu násilně ukončit (příkaz break uvnitř cyklu), což je sice možné, ale také zbytečné.
Kdy tedy cyklus for použít? Tehdy, pokud opravdu předem známe přesný počet opakování cyklu. Tohoto využijeme později při zpracování polí a při třídění. Cyklus for zde uvádíme především proto, že se často používá, ale nemá takové možnosti jako cyklus while. Dokonce platí, že libovolný algoritmus lze zapsat jen pomocí cyklu while a podmínky if...then.
Každý cyklus for lze zapsat cyklem while.
FOR proměnná := dolní_mez TO horní_mez DO posloupnost-příkazů
WHILE (dolni_mez<=horni_mez) DO
begin
posloupnost-příkazů;
dolni_mez := dolni_mez + 1;
end;
Na závěr dodejme, že v jazyce Pascal existuje i obrácená varianta cyklu for.
FOR proměnná := horní_mez DOWNTO dolní_mez DO posloupnost-příkazů
Úkol: Sestavte program pro výpočet faktoriálu zadaného přirozeného čísla. Použijte cyklus FOR.
Definici faktoriálu nalezněte na Internetu a pokuste se říci, k čemu se použivá. Pak teprve začněte psát program.
ProgramFaktorial;
var cislo, faktorial, nasob:integer;
begin
writeln('Zadejte číslo');
readln(cislo);
faktorial := 1;
for nasob := 1 to cislo do
faktorial:=faktorial * nasob;
writeln('Faktorial je ',faktorial);
end;
Pokuste se zjistit, zda váš program pracuje opravdu dobře a narazíte-li na nějaké problémy, pak se pokuste zjistit, čím jsou způsobeny.
Napište program, který vypíše na obrazovku všechny násobky čísla 7 z intervalu 1..20. Výsledkem programu bude tedy vypsaná posloupnost čísel 7, 14, 21, 29,...,140. Použijte cyklus FOR.
Sestavte program pro nalezení největšího čísla ze zadaných n čísel. Použijte cyklus FOR.
Sestavte program, který na obrazovku vypíše malou násobilku - tedy násobky čísel 1..10 uspořádané v tabulce. Umožněte uživateli zadat pro jak velké n bude chtít násobilku generovat. Použijte cyklus FOR.