Seznamy záznamů
Jeden záznam popisuje jednu plodinu. Pro všechny Eminy plodiny dejte záznamy do seznamu. Tabulka může obsahovat další tabulky, takže je to prostě seznam, jehož prvky jsou záznamy:
local plodiny = {
{nazev = "Mrkev", dny = 3, cena = 5},
{nazev = "Brambory", dny = 4, cena = 8},
{nazev = "Dýně", dny = 7, cena = 20},
}
print(#plodiny)
print(plodiny[2].nazev)Vypíše:
3
Bramboryplodiny[2].nazev čtěte zleva doprava: ze seznamu plodiny vezměte prvek s indexem 2 (záznam brambor) a z něj klíč nazev. Všechno, co znáte ze seznamů, platí i tady: #plodiny je počet záznamů, table.insert přidá další a ipairs je projde popořadě. Proměnná cyklu v každém průchodu drží jeden celý záznam:
local plodiny = {
{nazev = "Mrkev", dny = 3, cena = 5},
{nazev = "Brambory", dny = 4, cena = 8},
{nazev = "Dýně", dny = 7, cena = 20},
}
for _, plodina in ipairs(plodiny) do
print(plodina.nazev .. ": " .. plodina.cena .. " mincí")
endMrkev: 5 mincí
Brambory: 8 mincí
Dýně: 20 mincíJe dobrý zvyk pojmenovat seznam v množném čísle a proměnnou cyklu v jednotném: plodiny, plodina.
Se seznamy záznamů se pořád opakují tři vzory:
- Součet: sečtete jeden klíč všech záznamů, jako v lekci o seznamech.
- Výběr: vytvoříte nový seznam jen s některými záznamy (nebo s některými jejich hodnotami) pomocí
ifatable.insert. - Hledání: projdete seznam a vrátíte první záznam, který odpovídá; když žádný neodpovídá, vrátíte
nil.
local plodiny = {
{nazev = "Mrkev", dny = 3, cena = 5},
{nazev = "Brambory", dny = 4, cena = 8},
{nazev = "Dýně", dny = 7, cena = 20},
}
local function najdiPlodinu(seznam, nazev)
for _, plodina in ipairs(seznam) do
if plodina.nazev == nazev then
return plodina
end
end
return nil
end
local function rychlePlodiny(seznam)
local vysledek = {}
for _, plodina in ipairs(seznam) do
if plodina.dny <= 4 then
table.insert(vysledek, plodina.nazev)
end
end
return vysledek
end
print(najdiPlodinu(plodiny, "Dýně").cena)
print(najdiPlodinu(plodiny, "Kukuřice"))
print(table.concat(rychlePlodiny(plodiny), ", "))Vypíše:
20
nil
Mrkev, Bramboryreturn uvnitř cyklu ukončí celou funkci, jakmile plodinu najde. K return nil na konci se program dostane, jen když neodpovídá žádný záznam. (Funkce bez return vrací nil také, ale takhle je jasné, co jste mysleli.)
Když plodiny podle názvu hledáte často, můžete si jednou vytvořit slovník: v cyklu podleNazvu[plodina.nazev] = plodina. Pak podleNazvu["Dýně"] najde záznam bez cyklu.
Seznam záznamů seřadíte s porovnávací funkcí, jako v lekci o funkcích: table.sort(plodiny, function(a, b) return a.cena > b.cena end) dá nejdražší plodinu na začátek. Bez funkce skončí table.sort(plodiny) chybou attempt to compare two table values: Lua neví, který ze dvou záznamů má jít první.
Typická chyba je zapomenout na index: plodiny.nazev je nil. Seznam sám žádný název nemá, mají ho jen záznamy v něm. Nejdřív vyberte záznam: plodiny[1].nazev.
Jak psát:
Pokyny
Pomocí ipairs vypište každý prodej: plodinu, počet kusů, cenu jednoho kusu a kolik prodej vynesl:
mrkev: 6 x 5 = 30
dýně: 2 x 20 = 40
brambory: 10 x 8 = 80
jahody: 4 x 12 = 48
pšenice: 9 x 3 = 27Pod to sečtěte, kolik vynesly všechny prodeje, a vypište:
Celkem: 225 mincíNapište funkci velkeProdeje(seznam, minimum), která vrátí nový seznam s názvy plodin, jejichž prodej vynesl aspoň minimum mincí. Její výsledek pro 40 mincí vypište pomocí table.concat:
dýně, brambory, jahodyZačněte programovat zdarma
7/10