Obsah lekce:
V reálném životě se často setkáváme s cykly - opakujícími se činnostmi nebo pochody - například:
Obecně řečeno: Dokud platí nějaká podmínka, tak opakuj následující kroky. Kroků v cyklu může být v podstatě libovolný konečný počet. A u podmínky cyklu platí to stejné co platilo u podmínky u příkazu IF THEN - tedy, že může být v podstatě libovolně komplikovaná. Pokud špatně zvolíme podmínku, může se stát, že cyklus while poběží navždy.
V Pascalu (stejně jako v mnoha dalších programovacích jazycích) existuje příkaz WHILE. Syntaxe tohoto příkazu je následující:
WHILE (podmínka) DO posloupnost-příkazů
Program NapisPetCisel;
var cislo:integer;
begin
cislo := 1;
WHILE (cislo<=5) DO
begin
writeln(cislo);
cislo := cislo + 1;
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:
Pomocí cyklu již můžeme opakovat libovolnou činnost, kterou může být například opakovaní celého programu. Uvažujme, že uživatel spustí náš program a my se jej na konci programu zeptáme: "Chceš spustit program ještě jednou?". Uživatel dostane na výběr a tak buď stiskne klávesu 'a' a program se provede znovu nebo stiskne cokoli jiného a program skončí. K tomu, abychom mohli od uživatele načíst libovolný znak z klávesnice, potřebujeme proměnnou typu char. Do takové proměnné lze uložit právě jeden libovolný znak z klávesnice. Ukažme si toto na programu, který sčítá dvě čísla.
Program OpakovanySoucetDvouCisel;
var odpoved:char;
a,b:integer;
begin
odpoved:='a';
while (odpoved='a') do
begin
writeln('Zadej cislo a:');
readln(a);
writeln('Zadej cislo b:');
readln(b);
writeln('Soucet zadanych cisel je ',(a+b));
writeln('Prejete si secist dalsi dve cisla (a/n)?');
readln(odpoved);
end;
readln;
end.
Program opakuje zadávání dvou čísel a výpis jejich součtu do té doby, dokud uživatel na dotaz, zda chce pokračovat, odpovídá stiskem klávesy se znakem 'a' (+enter). Všimněme si ještě prvního řádku programu (pod příkazem begin). Je na něm pouze pokyn, aby se do proměnné odpoved vložila hodnota 'a'. Proč?
Důvodem je, aby se program po spuštění dostal do cyklu WHILE a začal jej vykonávat (což se stane pouze v případě, že je hodnota proměnné odpoved právě znak 'a'). Kdyby tam tento řádek nebyl, tak by proměnná odpoved hodnotu 'a' neměla, podmínka cyklu WHILE by nebyla splněna a tak by se cyklus ani nezačal provádět a program by pokračoval až posledním příkazem readln; (spustil by se a jen by čekal než uživatel stiskne klávesu enter - to je takový snutný program...).
Řekněme, že bychom chtěli vědět kolik součtů náš program uživali celkem spočítal. Budeme tedy potřebovat ještě proměnnou pocet, která bude uchovávat počet realizovaných součtů. Princip bude takový, že jí na začátku programu nastavíme hodnotu 0 a s každým vyřešeným příkladem ji o jedničku zvedneme.
Program OpakovanySoucetDvouCisel;
var odpoved:char;
a,b,pocet:integer;
begin
odpoved:='a';
pocet:=0;
while (odpoved='a') do
begin
writeln('Zadej cislo a:');
readln(a);
writeln('Zadej cislo b:');
readln(b);
writeln('Soucet zadanych cisel je ',(a+b));
writeln('Prejete si secist dalsi dve cisla (a/n)?');
readln(odpoved);
pocet:=pocet+1;
end;
writeln('Pocet realizovanych prikladu byl ',pocet);
readln;
end.
Doposud jsme byli schopni psát pouze programy, které uměly načíst omezený počet čísel. Nyní si napíšeme program pro součet libovolného počtu čísel (například jako na kalkulačce).
Program SoucetLibovolnehoPoctuCisel;
var odpoved:char;
soucet:integer;
begin
odpoved:='a';
soucet:=0;
while (odpoved='a') do
begin
writeln('Zadej cislo:');
readln(cislo);
soucet:=soucet+cislo;
writeln('Prejete si nacist dalsi cislo (a/n)?');
readln(odpoved);
end;
writeln('Soucet vsech 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 dosažení tohoto cíle budeme potřebovat proměnnou pocet.
Program SoucetLibovolnehoPoctuCisel;
var odpoved:char;
cislo,pocet,soucet:integer;
begin
odpoved:='a';
pocet:=0;
soucet:=0;
while (odpoved='a') do
begin
writeln('Zadej ',(pocet+1),' cislo:');
readln(cislo);
soucet:=soucet+cislo;
writeln('Prejete si nacist dalsi cislo (a/n)?');
readln(odpoved);
pocet:=pocet+1;
end;
writeln('Soucet vsech zadanych cisel je ',soucet);
writeln('Pocet zadanych cisel je ',pocet);
readln;
end.
Napište program pro výpočet aritmetického průměru libovolného počtu zadaných čísel.
Napište program pro nalezení minima a maxima ze všech zadaných čísel.