Počítání pomocí tabulky
Slovníky se skvěle hodí k počítání. Ema si zapsala počasí každého dne tohoto týdne a chce vědět, kolik dní bylo slunečno, kolik pršelo a kolik bylo zataženo. Vytvořte slovník, ve kterém jsou klíči druhy počasí a hodnotami počty dní. Začněte s prázdnou tabulkou a projděte seznam; u každého dne přičtěte 1 k počtu jeho počasí:
local pocasi = {"slunečno", "déšť", "slunečno", "zataženo", "slunečno", "déšť", "slunečno"}
local dny = {}
for _, p in ipairs(pocasi) do
dny[p] = (dny[p] or 0) + 1
end
print("Slunečno: " .. dny["slunečno"])
print("Déšť: " .. dny["déšť"])
print("Zataženo: " .. dny["zataženo"])Vypíše:
Slunečno: 4
Déšť: 2
Zataženo: 1Klíče tu mají diakritiku, a proto je na konci čtete v hranatých závorkách. V cyklu je klíč v proměnné p, takže tam na diakritice nezáleží.
Důležitý je řádek dny[p] = (dny[p] or 0) + 1. Projděte si s ním první tři dny:
- První den je v
ptext"slunečno". Takový klíč ještě v tabulce není, takžedny[p]jenil,nil or 0je0adny["slunečno"]bude1. - Druhý den je v
ptext"déšť", který tam také není:dny["déšť"]bude1. - Třetí den je tam zase
"slunečno". Teď jedny[p]rovno1,1 or 0je1adny["slunečno"]bude2.
Nemusíte předem vědět, jaké druhy počasí v seznamu jsou. Nový druh dostane vlastní klíč, jakmile se poprvé objeví.
Dvě typické chyby:
- Bez
or 0:dny[p] = dny[p] + 1skončí hned první den chybouattempt to perform arithmetic on a nil value (field '?'), protože zatím není číslo, ke kterému by se dala přičíst 1. - Bez závorek:
dny[p] = dny[p] or 0 + 1. Chyba žádná, ale+se provede dřív nežor, takže Lua spočítádny[p] or 1a každý druh počasí zůstane na 1.
Stejný vzor umí místo počítání i sčítat množství: soucty[plodina] = (soucty[plodina] or 0) + mnozstvi.
Když chcete najít, co bylo nejčastější, projděte počty pomocí pairs a použijte vzor pro největší hodnotu z lekce o seznamech. Na pořadí pairs tu nezáleží: ať je jakékoli, největší číslo je pořád stejné:
local dny = {["slunečno"] = 4, ["déšť"] = 2, ["zataženo"] = 1}
local nejcastejsi = nil
local nejvic = 0
for p, pocet in pairs(dny) do
if pocet > nejvic then
nejcastejsi = p
nejvic = pocet
end
end
print("Nejčastěji: " .. nejcastejsi .. " (" .. nejvic .. ")")Vypíše:
Nejčastěji: slunečno (4)V lekci o seznamech jste hledání začínali prvním prvkem. Slovník žádný první prvek nemá, ale počet je vždycky aspoň 1, takže tady můžete klidně začít nulou. A jen kdyby dva druhy počasí měly stejný největší počet, rozhodlo by pořadí, který z nich se vypíše.
Jak psát:
Pokyny
Spočítejte, kolik kusů které plodiny Ema prodala: vytvořte prázdnou tabulku pocty a naplňte ji v cyklu přes prodano. Pak z ní vypište počty mrkví a jahod:
Mrkev: 4
Jahody: 3Pod to najděte plodinu, která se prodávala nejlíp: projděte pocty pomocí pairs a pamatujte si největší počet. Vypište:
Nejprodávanější: mrkev (4)Začněte programovat zdarma
5/10