Anglická verze
logolink

< Zpět na seznam lekcí

Cyklus for

AlgortimyObsah lekce:

  • Cyklus FOR v jazyce C
  • Syntaxe cyklu FOR v jazyce C
  • 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 C

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 C

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 C
for (proměnná = dolnímez; podmínkaproukončení; změna)
{
	příkazy
}

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í podmínkaproukončení (např. že je hodnota v proměnné proměnná menší nebo rovna hodnotě horní_mez), pak se vykoná tělo cyklu
  3. po vykonání těla cyklu se automaticky zvedne hodnota proměnné proměnná dle pravidla, které je uvedeno v části změna.

Příklady cyklu FOR

FOR v programovacím jazyce C
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int cislo;
    
    for (cislo = 1; cislo <= 5; cislo++)
    {
    	printf("%d\n", cislo);
    }
    
    getchar();
    return 0;
} 

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 (cislo++) 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
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int i, cislo, soucet;
    
    soucet = 0;
    
    for (i = 1; i <= 5; i++)
    {
    	printf("Zadej cislo: ");
        scanf("%d", &cislo);
    	soucet = soucet + cislo;
    }
    
    printf("Soucet zadanych cisel je %d.\n", soucet);
    
    getchar();
    return 0;
} 

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
printf("Zadej %d. cislo: ", i);
Součet Pěti Čísel
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int i, cislo, soucet;
    
    soucet = 0;
    
    for (i = 1; i <= 5; i++)
    {
        printf("Zadej %d. cislo: ", i);
        scanf("%d", &cislo);
    	soucet = soucet + cislo;
    }
    
    printf("Soucet zadanych cisel je %d.\n", soucet);
    
    getchar();
    return 0;
} 

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
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int i, cislo, pocetcisel, soucet;
    
    soucet = 0;
    
    printf("Zadej pozadovany pocet cisel: ");
    scanf("%d", &pocetcisel);
    
    for (i = 1; i <= pocetcisel; i++)
    {
        printf("Zadej %d. cislo: ", i);
        scanf("%d", &cislo);
    	soucet = soucet + cislo;
    }
    
    printf("Soucet zadanych cisel je %d.\n", soucet);
    
    getchar();
    return 0;
} 

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.

Vztah mezi cyklem WHILE a FOR

Každý cyklus for lze zapsat cyklem while.

Základní syntaxe příkazu FOR v programovacím jazyce C
for (proměnná = dolnímez; podmínkaproukončení; změna)
{
	příkazy
}
Cyklus FOR zapsaný jako WHILE
  while (dolni_mez<=horni_mez)
  {
    posloupnost-příkazů;
    dolni_mez := dolni_mez + 1;
  }

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 C
for (proměnná = horní_mez; proměnná >= dolní_mez; proměnná--)
{
	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
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int cislo, faktorial, nasob;
    
    printf("Zadej cislo: ");
    scanf("%d", &cislo);
    
    faktorial = 1;
    
    for (nasob = 1; i <= cislo; i++)
    {
        faktorial = faktorial * nasob;
    }
    
    printf("Faktorial je %d\n", faktorial);
    
    getchar();
    return 0;
} 

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áš