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) s cislo++ místo cislo-- zvětšuje cislo pořá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čí.

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

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

2/13