Ernte und Markt
Ein Beet ist reif, wenn es so viele Tage gewachsen ist, wie seine Pflanze braucht. Dann erntet Emma es: Jeder Samen ergibt eine Pflanze, und die Pflanzen kommen in die Scheune. Und das Beet beginnt wieder bei 0: Auf Emmas Hof lässt jedes Beet nach der Ernte seine Pflanze neu wachsen.
Die Scheune ist ein Dictionary. Seine Schlüssel sind die Namen der Pflanzen, und seine Werte sagen, wie viele davon in der Scheune liegen. Etwas hinzuzufügen ist das Zählmuster aus der Lektion über Dictionaries: scheune[name] = (scheune[name] or 0) + beet.samen. Beim ersten Mal ist scheune[name] nil, und or 0 macht daraus 0. Ohne es bricht das Programm schon bei der allerersten Ernte ab:
main.lua:95: attempt to perform arithmetic on a nil value (field '?')Das Fragezeichen steht da, weil der Schlüssel kein im Code geschriebener Name ist, sondern der Wert der Variablen name. Und Vorsicht bei scheune.name: Das ist der Schlüssel "name", nicht der Name der Pflanze, alle Pflanzen landeten also unter einem Schlüssel.
Ernte ein Beet direkt, nachdem seine Beschreibung in die Liste des Tages gekommen ist. Seine Zeile zeigt dann am Erntetag Karotte 3/3 und am nächsten Tag Karotte 1/3. Würdest du es vor der Beschreibung ernten, stünde dort Karotte 0/3.
Am Ende der Saison bringt Emma alles aus der Scheune auf den Markt. Die Funktion verkaufe(scheune) gibt eine Zeile aus, mit jeder Pflanze, ihrer Anzahl und dem Preis einer Pflanze, und die Summe. Dann gibt sie die Summe zurück, und das Hauptprogramm addiert sie zu den Münzen. Die Pflanzen sollen in alphabetischer Reihenfolge stehen. pairs geht ein Dictionary aber in keiner bestimmten Reihenfolge durch, und die kann sich sogar von einem Durchlauf zum nächsten ändern. Sammle also zuerst die Schlüssel in einer Liste und sortiere sie, wie in der Lektion über Dictionaries. Zum Beispiel Eier, gezählt nach dem Huhn, das sie gelegt hat:
local gelegtVon = {"Pepper", "Goldie", "Pepper"}
local anzahlen = {}
for _, huhn in ipairs(gelegtVon) do
anzahlen[huhn] = (anzahlen[huhn] or 0) + 1
end
local namen = {}
for name in pairs(anzahlen) do
table.insert(namen, name)
end
table.sort(namen)
for _, name in ipairs(namen) do
print(name, anzahlen[name])
endDas gibt Folgendes aus:
Goldie 1
Pepper 2In deinem Programm gibt eine eigene Funktion, sortierteNamen(t), die sortierte Liste der Schlüssel eines Dictionaries zurück. verkaufe geht dann mit ipairs durch sortierteNamen(scheune), und für jeden Namen holt es sich mit findePflanze den Preis der Pflanze. Setze die beiden Funktionen unter beschreibeBeet: verkaufe ruft findePflanze auf und muss deshalb darunter stehen.
So schreibst du es:
Anweisungen
- 1
Erstelle im Hauptprogramm über der Schleife über die Tage ein leeres Dictionary
scheune. Ernte in der inneren Schleife unter der Zeile, die die Beschreibung des Beets zur Liste hinzufügt, das Beet, wenn es reif ist: Addiere seine Samen unter dem Namen der Pflanze zur Scheune und setze seingewachsenzurück auf0. Die Tage sehen jetzt so aus:Tag 1 (sonnig): Karotte 1/3, Weizen 1/2, Kürbis 1/6 Tag 2 (sonnig): Karotte 2/3, Weizen 2/2, Kürbis 2/6 Tag 3 (regnerisch): Karotte 3/3, Weizen 2/2, Kürbis 4/6 Tag 4 (wolkig): Karotte 1/3, Weizen 1/2, Kürbis 5/6 Tag 5 (sonnig): Karotte 2/3, Weizen 2/2, Kürbis 6/6 Tag 6 (wolkig): Karotte 3/3, Weizen 1/2, Kürbis 1/6Zeigt ein Beet
0/3statt3/3, erntest du es vor seiner Beschreibung. - 2
Schreibe unter
beschreibeBeeteine FunktionsortierteNamen(t), die die Schlüssel des Dictionariestmitpairsin einer Liste sammelt, die Liste mittable.sortsortiert und zurückgibt. - 3
Schreibe darunter eine Funktion
verkaufe(scheune). Für jeden Namen aussortierteNamen(scheune)macht sie einen Text wieKarotte 8 x 5(den Namen, die Anzahl in der Scheune und den Preis des Marktes) und addiert die Anzahl mal den Preis zur Summe. Dann gibt sie eine Zeile mitMarkt:, den Texten verbunden mit", ", einem Gleichheitszeichen und der Summe aus, zum BeispielMarkt: Karotte 8 x 5, Weizen 18 x 3 = 94, und gibt die Summe zurück. - 4
Addiere am Ende des Hauptprogramms das, was
verkaufe(scheune)zurückgibt, zumuenzen, und gib die Münzen am Ende der Saison aus. Das Programm endet so:Tag 6 (wolkig): Karotte 3/3, Weizen 1/2, Kürbis 1/6 Markt: Karotte 8 x 5, Kürbis 2 x 20, Weizen 18 x 3 = 134 Saisonende: 140 MünzenEmma hat Karotten aus zwei Ernten verkauft (4 + 4) und Weizen aus dreien (6 + 6 + 6).