Setí
Ema má 30 mincí a plán: která semínka chce koupit a kolik. Plán prochází popořadě. Když má na položku dost mincí, semínka zaplatí a zaseje je na nový záhon. Když ne, položku přeskočí a přejde k další.
Položka plánu obsahuje jen název plodiny a počet semínek. Všechno ostatní o plodině, třeba cena semínka, je v seznamu plodiny. Program proto potřebuje funkci, která najde plodinu podle názvu. To je hledání z lekce o slovnících: cyklus prochází seznam, a když najde správný záznam, return ho vrátí a hned ukončí celou funkci, i s cyklem. Když cyklus nic nenajde, dojde funkce až k return nil za ním. Třeba zvířata na farmě:
local zvirata = {
{jmeno = "Bella", druh = "kráva"},
{jmeno = "Rex", druh = "pes"},
}
local function najdiZvire(jmeno)
for _, zvire in ipairs(zvirata) do
if zvire.jmeno == jmeno then
return zvire
end
end
return nil
end
print(najdiZvire("Rex").druh)
print(najdiZvire("Micka"))Vypíše:
pes
nilKdyž má plán překlep, třeba "mrkve", vrátí najdiPlodinu hodnotu nil a program skončí na prvním řádku, který chce z plodiny něco přečíst:
main.lua:40: attempt to index a nil value (local 'plodina')Záhon je nový záznam se třemi klíči: plodina, celý záznam plodiny (ne jen její název), seminka, počet semínek, a dnyRustu, kolik dní už záhon roste, zatím 0. dnyRustu budete potřebovat v dalším kroku. Díky celému záznamu pod klíčem plodina si záhon později přečte zahon.plodina.dny i zahon.plodina.nazev. Nic se přitom nekopíruje: jak víte z lekce o slovnících, zahon.plodina a záznam v seznamu plodiny jsou jedna a tatáž tabulka.
Záhony přidávejte do seznamu zahony pomocí table.insert. Hned potom je #zahony číslo nového záhonu: 1 u prvního, 2 u druhého. Semínka stojí polozka.seminka * plodina.cenaSemen mincí a Ema je může koupit, když je cena <= jejím mincím. S < by nikdy nemohla utratit poslední minci.
V string.format napište x těsně před %d, bez mezery: "%s x%d" dá mrkev x4.
Jak psát:
Pokyny
Pod seznamem plodiny vytvořte lokální proměnnou plan: seznam záznamů s klíči nazev a seminka. Ema chce 4 semínka mrkve, 6 semínek pšenice, 2 semínka dýně a 2 semínka jahod, v tomto pořadí. První záznam je {nazev = "mrkev", seminka = 4}.
Pod -- Funkce napište funkci najdiPlodinu(nazev), která vrátí plodinu s tímto názvem ze seznamu plodiny, nebo nil.
Na konci hlavního programu vytvořte proměnné mince (30) a zahony (prázdný seznam). Pak projděte plan. U každé položky najděte její plodinu a spočítejte cenu semínek. Když má Ema dost mincí, odečtěte cenu, přidejte do seznamu zahony záhon {plodina = plodina, seminka = polozka.seminka, dnyRustu = 0} a vypište o něm řádek. Jinak vypište, že nemá dost mincí. Pod ceníkem program vypíše:
Záhon 1: mrkev x4 za 8 mincí
Záhon 2: pšenice x6 za 6 mincí
Záhon 3: dýně x2 za 10 mincí
Na jahody x2 nemá Ema dost mincíPokud dostanou záhon i jahody, zkontrolujte, že cenu od proměnné mince odečítáte.
Za cyklem vypište, kolik mincí Emě zbylo. Program končí takto:
Na jahody x2 nemá Ema dost mincí
Mince: 6Pokud se řádek objeví čtyřikrát, vypisujete ho uvnitř cyklu.
Začněte programovat zdarma
2/7