Nekonečné cykly
Když podmínka cyklu while nikdy nepřestane platit, cyklus nikdy neskončí. Takovému cyklu se říká nekonečný cyklus a je to jedna z nejčastějších chyb v cyklech. Tady chybí řádek cislo++:
int cislo = 1;
while (cislo <= 5) {
std::cout << cislo << std::endl;
}cislo zůstane 1, podmínka cislo <= 5 platí pořád a program stále dokola vypisuje 1:
1
1
1
1
...Na vašem počítači by takový program běžel, dokud byste ho sami nezastavili. V těchto cvičeních se po 5 sekundách zastaví a zobrazí se hláška Program běžel příliš dlouho, a proto byl zastaven. Není v něm nekonečný cyklus? Když ji uvidíte, projděte všechny cykly a u každého se zeptejte: mění něco v jeho bloku proměnnou z podmínky tak, aby podmínka jednou přestala platit?
Typické příčiny:
- Proměnnou nic nemění, jako v příkladu výše.
- Proměnná se mění opačným směrem. Odpočítávání
while (cislo >= 1)scislo++místocislo--zvětšujecislopořád víc, takže podmínka platí dál. - Změna je mimo blok. Opakuje se jen kód mezi složenými závorkami. Když se
cislo++ocitne pod uzavírací závorkou}, provedlo by se až po skončení cyklu, a to nikdy nenastane. Totéž se stane, když složené závorky vynecháte: do cyklu pak patří jen první příkaz za podmínkou. Proto je pište vždy, i když má blok jen jeden řádek. - Podmínka mine svůj cíl. Podmínka s
!=(nerovná se) platí pro všechna čísla kromě jednoho. Když proměnná právě toto číslo přeskočí, cyklus běží donekonečna. Proto se v počítacích cyklech obvykle používá<,<=,>nebo>=: zastaví se, i když proměnná hranici přeskočí.
Jak psát:
Pokyny
Program v editoru má vypsat lichá čísla od 1 do 9 a pak Hotovo. Spusťte ho: čísla stále rostou a po 5 sekundách se program zastaví. Zjistěte, proč podmínka nikdy nepřestane platit, a opravte ji tak, aby program vypsal 1, 3, 5, 7, 9 a Hotovo, každé na samostatném řádku.
Začněte programovat zdarma
2/13