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 den = den + 1:

local den = 1
while den <= 3 do
    print("Den " .. den)
end

den zůstane 1, podmínka den <= 3 platí pořád a program stále dokola vypisuje Den 1:

Den 1
Den 1
Den 1
Den 1
...

Na vašem počítači by takový program běžel, dokud byste ho sami nezastavili. Tady na webu 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? Co program do té doby vypsal, ve výstupu zůstane, takže uvidíte, kde se zasekl. (Hodně dlouhý výstup se po zhruba 100 000 znacích utne a skončí znakem ….) Když cyklus nic nevypisuje, uvidíte jen hlášku.

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. Když v odpočítávání while semena > 0 do napíšete semena = semena + 1 místo semena = semena - 1, semen pořád přibývá a podmínka platí dál.
  • Změna je za end. Opakuje se jen kód mezi do a end. Řádek pod end by se provedl až po skončení cyklu, a to nikdy nenastane. Odsazení bloku vám ukáže, co do něj patří.
  • Překlep vlevo od =. semna = semena - 1 proměnnou semena nezmění. Lua přitom žádnou chybu neohlásí: potichu vytvoří novou globální proměnnou semna a v proměnné semena zůstane pořád stejná hodnota.
  • 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čí.

Program v editoru má cyklus s ~=. Teď funguje, protože zahon roste o 1 a desítku přesně trefí. Podívejme se, co se stane, když poroste o 2.

Pokyny

Včera pršelo na záhony se sudými čísly, takže dnes Ema zalévá jen liché: 1, 3, 5, 7 a 9. Změňte řádek zahon = zahon + 1 tak, aby zahon rostl o 2, a program spusťte. Sám od sebe neskončí, a tak ho web po 5 sekundách zastaví. Podívejte se do výstupu: kterými čísly zahon prochází a proč podmínka nikdy nepřestane platit? Pak podmínku opravte tak, aby program vypsal:

Zalévám záhon 1
Zalévám záhon 3
Zalévám záhon 5
Zalévám záhon 7
Zalévám záhon 9
Hotovo

Za 3 dny je trh. Pod program přidejte lokální proměnnou dnyDoTrhu s hodnotou 3 a cyklus while, který poběží, dokud bude dnyDoTrhu větší než 0. V cyklu vypište Dní do trhu: a hodnotu proměnné dnyDoTrhu a potom ji zmenšete o 1. (Kdybyste 1 přičítali, cyklus by nikdy neskončil.) Za cyklem vypište Dnes je trh!. Výpis skončí takto:

Dní do trhu: 3
Dní do trhu: 2
Dní do trhu: 1
Dnes je trh!

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/10