Pflanzen
Emma hat 30 Münzen, und sie hat einen Plan: welches Saatgut sie kaufen will und wie viel davon. Sie geht den Plan der Reihe nach durch. Reichen die Münzen für einen Eintrag, bezahlt sie die Samen und pflanzt sie in ein neues Beet. Wenn nicht, überspringt sie den Eintrag und geht zum nächsten.
Ein Eintrag des Plans enthält nur den Namen der Pflanze und die Anzahl der Samen. Alles andere über die Pflanze, zum Beispiel den Preis eines Samens, steht in pflanzen. Das Programm braucht also eine Funktion, die die Pflanze mit einem bestimmten Namen findet. Das ist die Suche aus der Lektion über Dictionaries: Eine Schleife geht die Liste durch, und wenn sie den richtigen Datensatz findet, gibt return ihn zurück und beendet die ganze Funktion auf einmal, samt Schleife. Findet die Schleife nichts, erreicht die Funktion das return nil danach. Zum Beispiel mit den Tieren auf dem Hof:
local tiere = {
{name = "Bella", art = "Kuh"},
{name = "Rex", art = "Hund"},
}
local function findeTier(name)
for _, tier in ipairs(tiere) do
if tier.name == name then
return tier
end
end
return nil
end
print(findeTier("Rex").art)
print(findeTier("Tom"))Das gibt Folgendes aus:
Hund
nilEnthält der Plan einen Tippfehler, zum Beispiel "Karote", gibt findePflanze nil zurück, und das Programm bricht in der ersten Zeile ab, die ein Feld der Pflanze liest:
main.lua:40: attempt to index a nil value (local 'pflanze')Ein Beet ist ein neuer Datensatz mit drei Feldern: pflanze, der ganze Datensatz der Pflanze (nicht nur ihr Name), samen, die Anzahl der Samen, und gewachsen, die Anzahl der Tage, die das Beet gewachsen ist, vorerst 0. gewachsen brauchst du im nächsten Schritt. Dank des ganzen Datensatzes in pflanze kann das Beet später beet.pflanze.tage und beet.pflanze.name lesen. Nichts wird kopiert: Wie du aus der Lektion über Dictionaries weißt, sind beet.pflanze und der Datensatz in pflanzen dieselbe Tabelle.
Die Beete kommen mit table.insert in die Liste beete. Direkt danach ist #beete die Nummer des neuen Beets: 1 für das erste, 2 für das zweite. Die Samen kosten eintrag.samen * pflanze.samenPreis Münzen, und Emma kann sie kaufen, wenn der Preis <= ihre Münzen ist. Mit < könnte sie nie ihre letzte Münze ausgeben.
Schreibe in string.format das x direkt vor %d, ohne Leerzeichen: "%s x%d" ergibt Karotte x4.
So schreibst du es:
Anweisungen
- 1
Erstelle unter
pflanzeneine lokale Variableplan: eine Liste von Datensätzen mit den Feldernnameundsamen. Emma will 4 Karottensamen, 6 Weizensamen, 2 Kürbissamen und 2 Erdbeersamen, in dieser Reihenfolge. Der erste Datensatz ist{name = "Karotte", samen = 4}. - 2
Schreibe unter
-- Funktioneneine FunktionfindePflanze(name), die die Pflanze auspflanzenmit diesem Namen zurückgibt odernil. - 3
Erstelle am Ende des Hauptprogramms die Variablen
muenzen(30) undbeete(eine leere Liste). Gehe dannplandurch. Suche für jeden Eintrag die Pflanze und berechne den Preis der Samen. Hat Emma genug Münzen, ziehe den Preis ab, füge das Beet{pflanze = pflanze, samen = eintrag.samen, gewachsen = 0}zubeetehinzu und gib eine Zeile darüber aus. Sonst gib aus, dass sie nicht genug Münzen hat. Unter der Preisliste gibt das Programm Folgendes aus:Beet 1: Karotte x4 für 8 Münzen Beet 2: Weizen x6 für 6 Münzen Beet 3: Kürbis x2 für 10 Münzen Nicht genug Münzen für Erdbeere x2Bekommen die Erdbeeren auch ein Beet, prüfe, ob du den Preis von
muenzenabziehst. - 4
Gib nach der Schleife aus, wie viele Münzen Emma übrig hat. Das Programm endet so:
Nicht genug Münzen für Erdbeere x2 Münzen: 6Erscheint die Zeile viermal, gibst du sie innerhalb der Schleife aus.