Hlavní strana -> Programování v C -> 06. Cykly for, while, do-while

06. Cykly for, while, do-while

Stal se zázrak a něco neuvěřitelně silného mě přinutilo napsat pokračování. Dostáváme se konečně k cyklům, bez kterých neexistuje žádný program, kromě těch primitivních, které vypíšou ahoj a skončí. Nahlídneme taky na proměnné z hlediska jejich umístění.

Cykly slouží k tomu, aby program prováděl jednu činnost několikrát a tím také natahuje dobu jeho trvání. Nechci tím říct, že by nějak schválně prodlužovaly čas jeho běhu, ale v praxi se setkáváme s programy, které trvají (běží) dlouho. Je to tím, že mají nějakou programovou smyčku, ve které se stále dokola opakuje nějaká činnost. Třeba čekání na stisk klávesy :-)

for

Cyklus for se skládá ze tří částí oddělených středníky. První část je inicializační, druhá podmínková a třetí inkrementační. Vypadá to takhle:

for(inicializace; podmínka; inkrementace) příkaz; event. blok příkazů

#include <stdio.h>

void main(void)
{
    int i;

    for(i=1; i<10; i++) printf("%d ",i);
    printf("Konec");
}

Takový program napíše na obrazovku čísla 1 až 9, protože nejdříve je i nastaveno na 1, to vyhovuje podmínce i<10, vypíše se číslo na obrazovku. Po provedení příkazu se provede inkrementace, zkontroluje podmínka a pokud platí, provede se znovu příkaz. To vše se opakuje do doby, kdy nebude splněna podmínka. Inicializace se tedy provede jen jednou na začátku cyklu, poté se vždy kontroluje podmínka a až po provedení příkazu se dělá inkrementace. Cyklus for je nejpoužívanější z cyklů.

while

Cyklus while se též nazývá cyklus s podmínkou na začátku. Narozdíl od for neobsahuje inicializační část a inkrementační část. Tyto musí být někde jinde. Inicializační před a inkrementační uvnitř cyklu. Vypadá takhle:

while(podmínka) příkaz; event. blok příkazů

Předchozí příklad by vypadal za použití while:

#include <stdio.h>

void main(void)
{
    int i;

    i=1;
    while(i<10){
        printf("%d ",i);
        i++;
    }
}

do-while

Cyklus s podmínkou na konci a je velmi podobný cyklu while. Jediný rozdíl je v tom, že se provede vždy alespoň jednou, protože podmínka je testována až na konci. Vzor:

do{ příkaz; event. blok příkazů }while(podmínka);

#include <stdio.h>

void main(void)
{
    int i;

    i=1;
    do{
        printf("%d ",i);
        i++;
    }while(i<10);
}

Zbývá už jen napsat, že nesmíte zapomenout na řídící proměnnou nebo podmínku, za které bude cyklus probíhat. Moho by se totiž stát, že vytvoříte nekonečný cyklus a program by se mohl chovat nepředvídaně nebo by mohl zhavarovat. Je důležité ukončit jej vždy ve správnou dobu. Takže už víte jak vypadají cykly v C. Nyní už nic nebrání v tom je používat, snad jen fantazie. Nebojte se, že tady nejsou žádné příklady, ty budou vznikat teprve v průběhu vývoje těchle stránek.

Na začátku jsem ještě psal o proměnných z hlediska jejich umístění v programu. Existují dva druhy proměnných - lokální a globální. Lokální vznikají ve funkci a jsou známy jen v této funkci. Zabírají místo v paměti jen po dobu trvání funkce. Globální proměnné se vytvářejí na začátku programu a jsou známy a mohou být používány všemi funkcemi v programu. Ve dvou různých funkcích se mohou objevit proměnné se stejnými jmény a nebudou se nijak ovlivňovat. Naopak nesmí existovat dvě globální proměnné stejného jména, nebo stejná jména globální a lokální proměnné. Program by nevěděl, kterou má použít. Globální proměnná si uchovává svou hodnotu po celý běh programu, zatímco lokální se vytvoří při vstupu do funkce a při výstupu z funkce se ruší a přestává existovat. Příklad:

#include <stdio.h>

int glob; /* globalni promenna */

/* prototypy funkci */
int secti(int x, int y);
void pocitej_do(int x);

void main(void)
{
    int a, b, soucet;

    printf("Zadejte dve cela cisla.\n");
    scanf("%d%d", &a, &b);

    soucet = secti(a,b);  /* provede soucet zadanych hodnot */
    pocitej_do(soucet);
    printf("\nKonec");
}

int secti(int x, int y)
{
    glob = x + y;  /* prirazeni hodnoty globalni promenne */
  
    return glob;
}

void pocitej_do(int x)
{
    int a;  /* pouziti a neni v rozporu s a v main() protoze se v obou pripadech
              jedna o lokalni promennou */

    if(x<0) return;  /* pokud je x mensi nez 0 ukonci se funkce,
                       protoze for by nefungoval spravne */
    for(a=0; a<x; a++)
        printf("Hodnota A je: %d\n", a);

}

To by mohlo zase na chvíli stačit. Snad se dostanu k dalšímu dílu příští týden. Hlavně mi někdo konečně napište, protože jinak s tím skončím. Beru všechno od kritiky až po chválu. Nikoho nesežeru, protože to přes Inet neumím :-) zatím. K.

Zpět

Programování v C | CZ 175/477 | Mapa stránek
Bc. Petr Klimánek, student Ostravské univerzity v Ostravě