Procházení seznamu
Zatím jste indexy psali jako čísla: plodiny[1], plodiny[2]. Index ale může být i proměnná. Když má i hodnotu 2, je plodiny[i] totéž co plodiny[2]. A cyklus for umí s proměnnou i projít všechny indexy od 1 do délky seznamu:
local plodiny = {"mrkev", "brambory", "dýně"}
for i = 1, #plodiny do
print(i .. ". " .. plodiny[i])
endVypíše:
1. mrkev
2. brambory
3. dýněV prvním průchodu má i hodnotu 1 a cyklus vypíše plodiny[1]. Ve druhém průchodu vypíše plodiny[2] a tak dále až po #plodiny, poslední index. Cyklus funguje pro seznam jakékoli délky: pro sto plodin proběhne stokrát a pro prázdný seznam vůbec, protože for i = 1, 0 proběhne nulakrát.
Protože Lua počítá od 1, jde cyklus od 1 do #plodiny. Časté jsou dvě chyby. Začátek od 0 přidá na začátek průchod navíc, ve kterém je prvek nil:
local plodiny = {"mrkev", "brambory", "dýně"}
for i = 0, #plodiny do
print(i, plodiny[i])
endVypíše:
0 nil
1 mrkev
2 brambory
3 dýněCyklus až do #plodiny + 1 přidá průchod navíc na konec. S .. program vypíše všechny plodiny a pak se zastaví:
local plodiny = {"mrkev", "brambory", "dýně"}
for i = 1, #plodiny + 1 do
print("Plodina: " .. plodiny[i])
endPlodina: mrkev
Plodina: brambory
Plodina: dýně
main.lua:3: attempt to concatenate a nil value (field '?')S indexem v proměnné umí cyklus víc než jen vypsat prvky popořadě. Umí jít pozpátku, s krokem -1 od posledního indexu k prvnímu:
local plodiny = {"mrkev", "brambory", "dýně"}
for i = #plodiny, 1, -1 do
print(plodiny[i])
endVypíše:
dýně
brambory
mrkevUmí pracovat se dvěma seznamy naráz. Když mají hodnoty, které k sobě patří, v obou seznamech stejný index, jedno i přečte obě. Tady je dny[i] počet dní, za který vyroste plodiny[i]:
local plodiny = {"mrkev", "brambory", "dýně"}
local dny = {3, 4, 7}
for i = 1, #plodiny do
print(plodiny[i] .. ", dny růstu: " .. dny[i])
endVypíše:
mrkev, dny růstu: 3
brambory, dny růstu: 4
dýně, dny růstu: 7A umí prvky měnit, protože vejce[i] = … funguje i s indexem v proměnné. Tento cyklus zdvojnásobí každé číslo v seznamu:
local vejce = {4, 6, 5}
for i = 1, #vejce do
vejce[i] = vejce[i] * 2
end
print(vejce[1], vejce[2], vejce[3])Vypíše:
8 12 10Jak psát:
Pokyny
Napište cyklus for, jehož proměnná prochází indexy seznamu semena od 1 do #semena.
V cyklu vypište každé semínko s jeho cenou ze seznamu ceny:
mrkev: cena 2
brambory: cena 3
dýně: cena 5
jahody: cena 4Hugo zdražil každé semínko o 1 minci. Pod cyklus napište druhý cyklus, který ke každému prvku seznamu ceny přičte 1.
Pod něj vypište semínka s cenami znovu, stejně jako v prvním cyklu. Výpis teď ukazuje ceny před změnou i po ní a končí takto:
mrkev: cena 3
brambory: cena 4
dýně: cena 6
jahody: cena 5Začněte programovat zdarma
5/11