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: 1

Klíč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 p text "slunečno". Takový klíč ještě v tabulce není, takže dny[p] je nil, nil or 0 je 0 a dny["slunečno"] bude 1.
  • Druhý den je v p text "déšť", který tam také není: dny["déšť"] bude 1.
  • Třetí den je tam zase "slunečno". Teď je dny[p] rovno 1, 1 or 0 je 1 a dny["slunečno"] bude 2.

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] + 1 skončí hned první den chybou attempt 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 1 a 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.

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: 3

Pod 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

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

Nebo se registrujte pomocí:

5/10