Cykly
Doplňující informace
Cykly jsou jedním ze základních stavebních kamenů programu, umožňují totiž opakování některých instrukcí (příkazů) při výpočtu. Všechy 3 níže uvedené typy cyklů jsou navzájem nahraditelné, rozhodnutí, který typ cyklu v dané situaci použít,je tedy spíše otázkou stylu a větší či menší přehlednosti zdrojového kódu. Cykly je také možné do sebe libovolně vnořovat.
Cyklus while
Konstrukce cyklu s podmínkou testovanou na začátku. Díky tomu nemusí vůbec dojít k provádění příkazů těla cyklu, pokud bude podmínka cyklu před prvním průchodem nesplněna.
Syntaxe:
while (podmínka) příkaz
Příklad (Euklidův algoritmus):
int a = 96; int b = 84; while (b != 0){ int r; r = a % b; a = b; b = r; }
Cyklus do-while
Cyklus s podmínkou testovanou na svém konci. Tento typ cyklu vždy alespoň jednou proběhne (až po prvním průběhu je testovaná podmínka).
Syntaxe:
do příkaz while (podmínka);
Příklad (Euklidův algoritmus):
int a = 96; int b = 84; do { int r; r = a % b; a = b; b = r; } while (b != 0);
Cyklus for
Složitější konstrukce cyklu, která se typicky používá pro cykly s pevným počtem opakování.
Syntaxe:
for (start; podmínka; iterace) příkaz
kde start
je výraz, který se vyhodnotí před prvním průchodem cyklu (typicky inicializace proměnných), podmínka
je logický výraz vyhodnocovaný před každým průchodem cyklu, pokud je splněn pokračuje se další iterací, pokud není pokračuje se příkazy za cyklem, a iterace
je výraz vyhodnocovaný na konci každého průchodu (typicky inkrementace proměnných).
Příklad:
int i; for (i = 10; i < 100; i++){ switch (i % 2){ case 0: printf("%d je sude\n", i); break; case 1: printf("%d je liche\n", i); break; } }
Přerušení cyklu
Příkaz continue;
slouží pro přeskočení zbývajících příkazů těla nejvnitřnějšího cyklu, výpočet pokračuje další iterací cyklu (včetně testu případné podmínky). Příkaz break;
naopak okamžitě opouští nejvnitřnějšího cyklus, pokračuje se příkazy za tímto cyklem.
Příklady cyklů
/* "nekonečný" cyklus, musí obsahovat větev s příkazem break; */ while (1) {...} /* "nekonečný" cyklus, musí obsahovat větev s příkazem break; */ for (;;) {...} /* cyklus for s více výrazy v řídícím řádku */ for (i = 1,s = 0; i < 100; s += i, i++) { ... } /* cyklus se všemi příkazy v řídícím řádku a prázdným tělem; nepřehledný - nepoužívá se */ for (i = 0; i < 10; printf("%i\n", i), i++); /* cyklus pro i od -10 do 10 s krokem +2 */ for (i = -10; i <= 10; i += 2) {...}