Anglická verze
logolink

< Zpět na seznam lekcí

Cyklus for

AlgortimyObsah lekce:

  • Cyklus FOR v jazyce Pascal
  • Syntaxe cyklu FOR v jazyce Pascal
  • Příklady cyklu FOR
  • Vztah mezi cyklem WHILE a FOR
  • Obrácený cyklus FOR
  • Faktoriál
  • Násobilka - domácí úkol

Cyklus FOR v jazyce Pascal

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.

Syntaxe cyklu FOR v jazyce Pascal

Cyklus FOR použijeme k vytvoření cyklu se zadaným počtem opakování. Syntaxe příkazu FOR je následující:

Základní syntaxe příkazu FOR v programovacím jazyce Pascal
FOR proměnná := dolní_mez TO horní_mez DO posloupnost-příkazů

Průběh cyklu

Cyklus probíhá v následujících krocích:

  1. do proměnné proměnná se přiřadí hodnota dolní_mez
  2. pokud platí, že je hodnota v proměnné proměnná je menší nebo rovna hodnotě horni_mez, pak se vykoná tělo cyklu
  3. po vykonání těla cyklu se automaticky zvedne hodnota proměnné proměnná o jedničku a cyklus pokračuje bodem jedna

Příklady cyklu FOR

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

  1. Do proměnné cislo přiřadí cyklus FOR hodnotu 1 a DOKUD je cislo menší nebo rovno 5 DĚLÁ instrukci v bodu dva.
  2. Vypiš hodnotu proměnné cislo.
  • Nejprve cyklus FOR nastaví hodnotu proměnné cislo na jedničku a ověří, zda je hodnota proměnné cislo <= 5. To v prvním kroku platí a tak cyklus pokračuje dál.
  • V prvním průchodu cyklu se vypíše číslo jedna (hodnota proměnné cislo).
  • Cyklus se vrací na začátek, zvedne hodnotu cislo o jedničku a ověří, zda je cislo<=5. To bude pravda, protože proměnná číslo má hodnotu 2 a cyklus se spustí znovu.
  • 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.

Příklady cyklu FOR

Součet pěti čísel

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.

Součet Pěti Čísel
 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.

Změna na řádku s žádostí o zadání čísla
writeln('Zadej ',i,'. cislo:');
Součet Pěti Čísel
 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.

Součet Zadaného Počtu Čísel
 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.

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

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.

Vztah mezi cyklem WHILE a FOR

Každý cyklus for lze zapsat cyklem while.

Základní syntaxe příkazu FOR v programovacím jazyce Pascal
FOR proměnná := dolní_mez TO horní_mez DO posloupnost-příkazů
Cyklus FOR zapsaný jako WHILE
  WHILE (dolni_mez<=horni_mez) DO
  begin
    posloupnost-příkazů;
    dolni_mez := dolni_mez + 1;
  end;

Obrácený cyklus FOR

Na závěr dodejme, že v jazyce Pascal existuje i obrácená varianta cyklu for.

Syntaxe obráceného cyklu FOR v programovacím jazyce Pascal
FOR proměnná := horní_mez DOWNTO dolní_mez DO posloupnost-příkazů

Faktoriál

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

Faktoriál
 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.

Domácí úkol

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.

Domácí úkol

Sestavte program pro nalezení největšího čísla ze zadaných n čísel. Použijte cyklus FOR.

Domácí úkol

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.

Otázky

  1. Jaká je syntaxe cyklu FOR?
  2. Jaké základní vlastnosti má cyklus FOR?
  3. Popište rozdíl mezi cyklem FOR a WHILE.
webdesign, xhtml, css, php - Mgr. Michal Mikláš