Záznamy

Dosud Eminy slovníky držely spoustu věcí stejného druhu: plodiny a jejich počty, plodiny a jejich ceny. Tabulka ale může popisovat i jednu věc pomocí několika hodnot. Takové tabulce se často říká záznam:

local mrkev = {nazev = "Mrkev", dny = 3, cenaSemen = 2, prodejniCena = 5}

print(mrkev.nazev .. " roste " .. mrkev.dny .. " dny.")
print("Zisk: " .. (mrkev.prodejniCena - mrkev.cenaSemen) .. " mince")

Vypíše:

Mrkev roste 3 dny.
Zisk: 3 mince

Je to stejná tabulka jako stodola, jen jinak použitá. Ve stodole jsou daty samotné klíče: Ema může kdykoli přidat jakoukoli plodinu. V záznamu jsou klíče pevné a známé předem. Každá plodina má nazev, dny, cenaSemen a prodejniCena a program je čte pomocí tečky. Hodnoty můžou mít různé typy:

local bella = {jmeno = "Bella", druh = "kráva", vek = 4, podojena = false}

bella.podojena = true
print(bella.jmeno, bella.druh, bella.vek, bella.podojena)
Bella	kráva	4	true

Záznamy se skvěle hodí k funkcím. Místo abyste funkci předávali název, dny a ceny jednotlivě, předáte jí jeden záznam a funkce si z něj přečte, co potřebuje:

local function zisk(plodina)
    return plodina.prodejniCena - plodina.cenaSemen
end

local mrkev = {nazev = "Mrkev", dny = 3, cenaSemen = 2, prodejniCena = 5}
local brambory = {nazev = "Brambory", dny = 4, cenaSemen = 3, prodejniCena = 8}
print(zisk(mrkev), zisk(brambory))
3	5

Funkce může záznam také vytvořit a vrátit. Když potřebujete hodně záznamů stejného tvaru, napíšete jejich klíče jen jednou, ve funkci:

local function novyZahon(plodina)
    return {plodina = plodina, den = 0, zalito = false}
end

local zahon = novyZahon("dýně")
print(zahon.plodina, zahon.den, zahon.zalito)
dýně	0	false

plodina = plodina může vypadat divně. Vlevo od = je klíč plodina. Vpravo je jeho hodnota: parametr plodina, ve kterém je při tomto volání "dýně". Každé volání vrátí novou tabulku, takže každý záhon má své vlastní hodnoty.

Typická chyba je překlep v názvu klíče. Lua názvy klíčů nekontroluje, takže mrkev.prodejnicena (s malým c) je prostě nil a počítání s ním skončí chybou attempt to perform arithmetic on a nil value (field 'prodejnicena'). Když v chybě uvidíte field '…', porovnejte název z hlášky s názvem v tabulce.

Pokyny

Napište funkci popis(plodina), která vrátí (ne vypíše) text o plodině, kterou dostane, i s jejím ziskem: prodejní cena minus cena semen. Vypište popis(dyne):

Dýně: 7 dní, zisk 15 mincí

Pod to vytvořte záznam jahody se stejnými čtyřmi klíči, jaké má dýně: název "Jahody", 5 dní, semena za 4 mince a prodejní cena 12 mincí. Vypište jeho popis:

Jahody: 5 dní, zisk 8 mincí

Napište funkci novaPlodina(nazev, dny, cenaSemen, prodejniCena), která vrátí nový záznam s těmito čtyřmi klíči. Vytvořte s ní kukuřici: 6 dní, semena za 3 mince, prodejní cena 10 mincí. Vypište její popis:

Kukuřice: 6 dní, zisk 7 mincí

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/10