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) {
    printf("%d\n", cislo);
}

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.
  • Středník za podmínkou. Zápis while (cislo <= 5); končí středníkem a ten středník je všechno, co cyklus opakuje: prázdný příkaz, a to donekonečna. Blok ve složených závorkách pod ním do cyklu vůbec nepatří. Program nic nevypíše a po 5 sekundách se zastaví. Mezi ) a { proto středník nikdy nepište.
  • 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čí.

Někdy místo hlášky o dlouhém běhu uvidíte RuntimeError: unreachable. Tu znáte z lekce o proměnných: nějaké číslo se nevešlo do typu int (bylo větší než 2147483647, tedy zhruba dvě miliardy). V nekonečném cyklu se to stává hlavně tehdy, když cyklus jen počítá a nic nevypisuje. Pak běží velmi rychle a nějaká proměnná roste tak dlouho, až se nevejde. Oprava je stejná: najděte cyklus, který nikdy neskončí.

Pokyny

Program v editoru má vypsat lichá čísla od 1 do 9 a pak Hotovo. Spusťte ho: sám od sebe neskončí, a tak ho web po 5 sekundách 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/11