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)
endden 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 donapíšetesemena = semena + 1místosemena = semena - 1, semen pořád přibývá a podmínka platí dál. - Změna je za
end. Opakuje se jen kód mezidoaend. Řádek podendby 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 - 1proměnnousemenanezmění. Lua přitom žádnou chybu neohlásí: potichu vytvoří novou globální proměnnousemnaa v proměnnésemenazů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.
Jak psát:
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
HotovoZa 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
2/10