Die while-Schleife
Jeden Abend sammelt Emma die Eier ihrer Hühner ein. Ein Programm, das ihren Plan für eine Woche ausgibt, könnte sieben fast gleiche print-Zeilen haben. Für eine ganze Saison bräuchte es hundert. Programme wiederholen solche Arbeit ständig: Sie gehen jeden Tag einer Saison durch, jedes Beet eines Feldes oder zeichnen den Bildschirm eines Spiels 60-mal pro Sekunde neu. Dafür gibt es Schleifen. Eine Schleife ist ein Stück Code, das immer wieder ausgeführt wird.
Die einfachste Schleife in Lua ist while („solange“). Sie wiederholt einen Codeblock, solange ihre Bedingung wahr ist:
local tag = 1
while tag <= 5 do
print("Tag " .. tag)
tag = tag + 1
endDas gibt Folgendes aus:
Tag 1
Tag 2
Tag 3
Tag 4
Tag 5Eine while-Schleife sieht aus wie ein if: das Schlüsselwort, eine Bedingung und ein Codeblock, der mit end endet. Nur steht statt then ein do. Der Unterschied: Ein if führt seinen Block höchstens einmal aus, aber while kehrt immer wieder zur Bedingung zurück. Schritt für Schritt:
- Das Programm erzeugt
tagmit dem Wert1. - Es prüft die Bedingung
tag <= 5. Sie ist wahr, also führt das Programm den Block aus: Es gibtTag 1aus, undtag = tag + 1erhöhttagauf2. - Es geht zurück zur Bedingung.
2 <= 5ist immer noch wahr, also gibt esTag 2aus und erhöhttagauf3. - Und so weiter, bis
tagden Wert6hat. Dann ist die Bedingung falsch, die Schleife endet, und das Programm macht nach demendder Schleife weiter.
Jeder Durchlauf des Blocks heißt Durchlauf (oder Iteration). Diese Schleife hat fünf Durchläufe. Für eine Saison von 100 Tagen würdest du nur die 5 durch 100 ersetzen.
Rücke den Block wie beim if um 4 Leerzeichen ein, damit du auf einen Blick siehst, was sich wiederholt. Der Code nach dem end läuft nur einmal, wenn die Schleife fertig ist:
local beet = 1
while beet <= 3 do
print("Beet " .. beet .. " wird gegossen")
beet = beet + 1
end
print("Alle Beete sind gegossen.")Beet 1 wird gegossen
Beet 2 wird gegossen
Beet 3 wird gegossen
Alle Beete sind gegossen.Beachte die Zeile beet = beet + 1. Lua hat kein += und kein ++, also erhöhst du eine Variable auf die lange Art. Irgendetwas im Block muss die Variable in der Bedingung verändern, damit die Bedingung irgendwann falsch wird. Sonst würde die Schleife nie enden. Was dann passiert, siehst du in der nächsten Übung.
Zwei Fehler machst du am Anfang wahrscheinlich. Wenn du then schreibst wie bei einem if, startet das Programm nicht:
local tag = 1
while tag <= 3 then
print("Tag " .. tag)
tag = tag + 1
endmain.lua:2: 'do' expected near 'then'Und wenn du das end vergisst, sagt Lua dir sogar, zu welcher Schleife es gehört:
local tag = 1
while tag <= 3 do
print("Tag " .. tag)
tag = tag + 1main.lua:4: 'end' expected (to close 'while' at line 2) near <eof><eof> heißt „Dateiende“ (englisch „end of file“): Lua ist am Ende des Programms angekommen und hat immer noch auf das end gewartet.
So schreibst du es:
Anweisungen
- 1
Lösche die drei
print-Zeilen. Erzeuge an ihrer Stelle eine lokale Variabletagmit dem Wert1. Die Schleife zählt damit die Tage. - 2
Schreibe darunter eine
while-Schleife, die läuft, solangetagkleiner oder gleich7ist. Gib in der Schleife den Tag so aus wie die gelöschten Zeilen und erhöhe danntagum 1. Das Programm gibt Folgendes aus:Tag 1: Eier sammeln Tag 2: Eier sammeln Tag 3: Eier sammeln Tag 4: Eier sammeln Tag 5: Eier sammeln Tag 6: Eier sammeln Tag 7: Eier sammeln - 3
Gib nach der Schleife, unter ihrem
end,Nach der Schleife ist der Tagund den Wert vontagaus. Die Ausgabe endet so:Tag 7: Eier sammeln Nach der Schleife ist der Tag 8Die Variable hat am Ende den Wert 8 und nicht 7, weil die Schleife erst endet, wenn die Bedingung falsch ist.