Anglická verze
logolink

< Zpět na seznam lekcí

Cyklus while

AlgortimyObsah lekce:

  • Co je to cyklus
  • Syntaxe cyklu WHILE v jazyce Pascal
  • Jednoduchý cyklus
  • Opakování programu dle přání uživatele
  • Zpracování libovolného počtu čísel

Co je to cyklus

V reálném životě se často setkáváme s cykly - opakujícími se činnostmi nebo pochody - například:

  • Například chůze po schodech je cyklus. Ten by se dal vyjádřit jako cyklus, kde se opakuje zdolání každého jednotlivého schodu dokud nezdoláme celé schodiště. Jinými slovy: "Dokud nejsi nahoře tak postup o schod výše." Jedná se tedy o cyklus neboli opakované akce (přesun o jeden schod výše), které po určitou dobu opakovaně (cyklicky) provádíme.
  • Chci koupit 5 rohlíků. Takže cyklem je skládání jednoho rohlíku po druhém do košíku. Akcí je vložení jednoho rohlíku do košíku. Tuto akci opakujeme přesně pětkrát. Pak máme v košíku pět rohlíků a tím cyklus končí.

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.

Syntaxe cyklu WHILE v jazyce Pascal

V Pascalu (stejně jako v mnoha dalších programovacích jazycích) existuje příkaz WHILE. Syntaxe tohoto příkazu je následující:

Základní syntaxe příkazu WHILE v programovacím jazyce Pascal
WHILE (podmínka) DO posloupnost-příkazů

Jednoduchý příklad cyklu WHILE

WHILE v programovacím jazyce Pascal
 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:

  1. Do proměnné cislo přiřaď hodnotu 1.
  2. DOKUD je cislo menší nebo rovno 5 DĚLEJ následující dvě instrukce
  3.   Vypiš hodnotu proměnné cislo.
  4.   Zvyš hodnotu proměnné cislo o jedničku.
  • V prvním průchodu cyklu se vypíše číslo jedna (hodnota proměnné cislo) a hodnota proměnné cislo se zvětší o jedničku.
  • Po těchto dvou příkazech, které jsou uvnitř cyklu, se ověří, zda je cislo<=5. To bude pravda, protože proměnná číslo má hodnotu 2 a cyklus se spustí znovu.
  • V druhém průchodu cyklu se opět vypíše proměnná cislo (nyní již číslo dva) a hodnota proměnné cislo se zvětší o jedničku.
  • Předchozí se opakuje dokud platí podmínka, že hodnota proměnné cislo je menší nebo rovna číslu 5. Pak provádění cyklu skončí, program přejde na příkaz readln a čeká na stisk klávesy enter, aby mohl skončit.

Opakovaní program podle přání uživatele

Opakovaný součet dvou čísel

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.

Opakovaný Součet Dvou Čísel
 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.

Opakovaný Součet Dvou Čísel
 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.

Součet libovolného množství čísel

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).

Součet libovolného počtu čísel
 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.

Součet libovolného počtu čísel
 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.

Domácí úkol

Napište program pro výpočet aritmetického průměru libovolného počtu zadaných čísel.

Domácí úkol

Napište program pro nalezení minima a maxima ze všech zadaných čísel.

Otázky a úkoly

  1. Jaká je správná syntaxe cyklu while?
  2. Uveďte 3 příklady, kdy byste využili cyklus while.
  3. Zkuste najít způsob jak cyklus while přerušit úplně nebo jak přeskočit aktuální průběh.
webdesign, xhtml, css, php - Mgr. Michal Mikláš