Programmieren lernen mit Lua: Lektion 02: Eingaben und Bedingungen
Übersicht | Vorherige Lektion | Nächste Lektion
ARVE Error: src mismatch
provider: youtube
url: https://www.youtube.com/watch?v=IIVCCqYMgwI&t=0s
src in org: https://www.youtube-nocookie.com/embed/IIVCCqYMgwI?feature=oembed&width=840&height=1000&discover=1
src in mod: https://www.youtube-nocookie.com/embed/IIVCCqYMgwI?width=840&height=1000&discover=1
src gen org: https://www.youtube-nocookie.com/embed/IIVCCqYMgwI?start=0
Dateien mit Lua Code ausführen
In der ersten Lektion haben wir ausschließlich im interaktiven Modus (also direkt über die Konsole) mit dem Lua-Interpreter kommuniziert. In dieser Lektion beginnen wir, Programme in eine Datei zu schreiben und die Datei als ganzes auszuführen. Um zu sehen, wie das unter repl.it läuft, öffnet bitte diesen Link.. Mit einem Klick auf die Schaltfläche „Code“ gelangt ihr in die Code-Ansicht und seht den Inhalt der Datei main.lua
, die in diesem Fall drei Zeilen Code enthält:
Im Bereich „Output“ (linke Schaltfläche) könnt ihr den Code mit einem Klick auf den Run-Button ausführen:
Wenn ihr auf repl.it angemeldet seid, könnt ihr mit einen Klick auf die Schaltfläche „Fork“ das Projekt in euren eigenen Bereich kopieren. Fork bedeutet zu deutsch „Abspaltung“: eine Kopie des Projektes, die unabhängig vom Original verändert werden kann. Das passiert in der Editor-Ansicht, die sich nach dem Forken automatisch öffnet. Auch wenn ihr eigene Projekte anlegt, öffnen sich diese in der Editor Ansicht:
Text eingeben
Selbstverständlich ist es auch bei dieser Art der Ausführung möglich, Eingaben von Nutzerinnen zu verarbeiten. Das erledigt die Funktion io.read()
. Sie liefert einen Rückgabewert, den ihr zur weiteren Verarbeitung unter einem Bezeichner speichern könnt. Das passiert auch in dem folgenden Programmbeispiel. Es bittet zunächst darum, einen Namen einzugeben. Die Eingabe wird hier unter dem Bezeichner name
gespeichert. Die letzte Zeile verwendet name
, um eine „persönliche“ Begrüßung auszugeben.
print("Wie heißt Du?") name = io.read() print("Hallo " .. name .. "!")
Wenn ihr das Programm mit dem Run-Button startet, dann sieht die Interaktion mit dem Programm auf der Konsole aus wie folgt. Das Zeichen $
verwenden wir in diesem und allen anderen Beispielen, um die Eingaben in der Interaktion mit einem Programm zu kennzeichnen. Bei der Interaktion mit dem Interpreter verwenden wir weiterhin das Zeichen >
.
Wie heißt Du? $ Theodor Hallo Theodor!
Das Programm in der Editor-Ansicht – das schicke Dark-Theme könnt ihr über das Zahnrad links einstellen
Strings in Zahlen umwandeln
Was ist, wenn Nutzer einen Zahlenwert eingeben sollen? Dann gibt es ein kleines Problem: Eingaben sind zunächst immer vom Typ string
. Woher soll das Programm wissen, ob in diesem Fall ein Text oder eine Zahl gemeint ist? Das Problem löst die Funktion tonumber()
. Die wandelt, wenn es möglich ist, einen String in einen Zahlenwert um. Das demonstriert das nächste Beispielprogramm. Es bittet um die Eingabe zweier Zahlen und bildet anschließend die Summe. Ohne die Umwandlung der Eingaben per tonumber()
würde die Addition summe = zahl1 + zahl2
nicht funktionieren.
print("Bitte gib die erste Zahl ein.") eingabe = io.read() zahl1 = tonumber(eingabe) print("Bitte gib die zweite Zahl ein.") eingabe = io.read() zahl2 = tonumber(eingabe) summe = zahl1 + zahl2 print(zahl1 .. " + " .. zahl2 .. " = " .. summe)
Das Programm in einem Anwendungsbeispiel:
Bitte gib die erste Zahl ein. $ 7 Bitte gib die zweite Zahl ein. $ 9 7 + 9 = 16
Wenn ihr in dem Programm etwas eingebt, das sich nicht in eine Zahl umwandeln lässt, zum Beispiel „sieben“ oder „Käse“, dann bekommt ihr eine Fehlermeldung:
attempt to perform arithmetic on global 'zahl1' (a nil value)
Das bedeutet schlicht gesagt: „Der Versuch, eine Rechnung mit zahl1
durchzuführen, hat nicht geklappt, weil zahl1
gleich nil
ist“. Das liegt daran, dass die Funktion tonumber()
, wenn sie keinen Zahlenwert ermitteln konnte, nil
zurückliefert.
Das Beispielprogramm auf repl.it
Wechsel in den interaktiven Modus nach Ausführung
Wenn ihr ein Programm auf repl.it ausführt und die Ausführung abgeschlossen ist, landet ihr im interaktiven Modus. Das erkennt ihr am roten Promt-Zeichen. Die vorher getroffenen Zuweisungen sind weiterhin gültig. Im gegebenen Beispiel verweisen die Bezeichner zahl1
und zahl1
nach wie vor auf einen Wert:
Diese Tatsache werden wir in späteren Programmbeispielen nutzen, in denen wir eigene Funktionen in Dateien definieren, die wir dann nach der Ausführung der Datei im interaktiven Modus testen und anwenden.
Aufgabe 1: Schreib ein Programm, dass zunächst danach fragt, wie viele Bonbons gekauft werden sollen; als zweites soll es fragen, wie viel ein Bonbon kostet. Danach soll das Programm den Gesamtpreis ausgeben:
Wie viele Bonbons sollen es sein? $ 9 Was kostet ein Bonbon? $ 0.12 9 Bonbons kosten 1.08 Euro
print("Wie viele Bonbons sollen es sein?") eingabe = io.read() anzahl_bonbons = tonumber(eingabe) print("Was kostet ein Bonbon?") eingabe = io.read() stueckpreis = tonumber(eingabe) gesamtpreis = anzahl_bonbons * stueckpreis print(anzahl_bonbons .. " Bonbons kosten " .. gesamtpreis .. " Euro.")
Bedingungen
Unverzichtbarer Bestandteil eines jeden Computerprogramms sind die sogenannten Bedingungen. Wir sprechen auch von bedingter Ausführung. Das heißt, dass eine bestimmte Portion Code nur ausgeführt werden soll, wenn eine bestimmte Bedingung erfüllt ist. Beispiele für bedingte Ausführungen sind:
WENN der böse Geist die Spielerin berührt
DANN ziehe der Spielerin 100 Gesundheitspunkte ab
WENN das Spiel vorbei ist
DANN zeige den Schriftzug GAME OVER an
Vergleichsoperatoren
In Lua beschreiben wir Bedingungen in sogenannten booleschen Ausdrücken. Diese Ausdrücke liefern einen Wert vom Typ boolean
. Da Bedingungen entweder wahr oder falsch sein können, kann dieser Wert nur zwei verschiedene Zustände annehmen: true
(wahr) oder false
(falsch). Boolesche Ausdrücke enthalten oft Vergleichsoperatoren:
a == b a ist gleich b a ~= b a ist nicht gleich b a < b a ist kleiner b a <= b a ist kleiner oder gleich b a > a a ist größer b a >= b a ist größer oder gleich b
Zuweiung oder Vergleich
An dieser Stelle wollen wir auf einen wichtigen Unterschied aufmerksam machen. In Lua und anderen Programmiersprachen steht das einfache Gleichheitszeichen für eine Zuweisung:
a = 10
bedeutet
"Weise a den Wert 10 zu"
In der Mathematik steht das einfache Gleichheitszeichen für einen Vergleich:
a = 10
bedeutet hier
"a hat den Wert 10"
Das ist eine Aussage, die wahr oder falsch sein kann.
Wenn wir in Lua einen Vergleich machen wollen, verwenden wir das doppelte Gleichheitszeichen;
a == 10
Ein paar Fingerübungen mit Vergleichsoperatoren
Probieren wir ein paar Ausdrücke mit Vergleichsoperatoren zunächst im interaktiven Modus aus:
> 7 == 8 false > 7 == 7 true > 10 > 20 false > 10 > 9 true
Selbstverständlich lassen sich auch Bezeichner vergleichen:
> a = 1 > b = 2 > a > b false > a < b true
Auch die Ergebnisse von booleschen Ausdrücken lassen sich unter Bezeichnern speichern. Diese sind, wie erwähnt, vom Typ boolean
:
> bedingung = 10 == 10 > type(bedingung) boolean
Bedingte Ausführung mit if und else
Das folgende Programm zeigt ein einfaches Beispiel für die bedingte Ausführung. Es simuliert die Eingangskontrolle eines Kinos und fragt zunächst nach dem Alter der Nutzerin. Der Film ist ab 16 Jahren zugelassen. Das bedeutet: Wenn (if
) das Alter größer oder gleich 16 ist (alter >= 16
), dann (then
) darf die Nutzerin den Film sehen.
altersbeschraenkung = 16 print("Wie alt bist Du?") eingabe = io.read() alter = tonumber(eingabe) if alter >= altersbeschraenkung then print("Du bist alt genug für den Film: Viel Spaß!") end
Die Einrückung in der vorletzten Zeile ist übrigens nicht notwendig, erleichtert aber die Lesbarkeit des Codes. Grundsätzlich gilt: Zusammengehöriger Code steht auf derselben Einrückungsebene.
Der eingerückte Code zwischen then
und end
wird übrigens auch als Block bezeichnet: Ein Block ist generell eine Portion Code, die unter bestimmten Bedingungen ausgeführt werden soll.
Wir können das Programm erweitern, indem wir festlegen, was passieren soll, wenn die Bedingung alter >= altersbeschraenkung
nicht erfüllt ist. Das passiert mit einem sogenannten else
-Zweig. „else“ heißt auf deutsch „sonst“:
if alter >= altersbeschraenkung then print("Du bist alt genug für den Film: Viel Spaß!") else print("Du bist nicht alt genug, um den Film zu schauen.") end
Das Beispielprogramm auf repl.it
Übrigens sind if
, else
und end
sogenannte Schlüsselwörter. Sie haben in der Programmiersprache Lua eine festgelegte Bedeutung und dürfen daher nicht als Bezeichner verwendet werden.
Aufgabe 2: Schreib ein Programm, das eine Rechenaufgabe stellt. Wenn der Nutzer die richtige Lösung eingibt, soll das Programm „Richtig!“ ausgeben, sonst „Leider falsch“. Ein Tipp: Du kannst als Vorlage das vorherige Programmbeispiel mit der Einlasskontrolle nutzen und musst lediglich einige Änderungen vornehmen.
print("Wieviel ist Sieben mal Acht?") eingabe = io.read() loesung = tonumber(eingabe) if loesung == 56 then print("Richtig!") else print("Leider falsch.") end
Verschachtelte if-Anweisungen
Ihr könnt auch mehrere if
-Anweisungen ineinander verschachteln. Stellt euch vor, dass zum Betreten des Kinos eine zweite Bedingung erfüllt sein muss, nämlich, dass der Spieler genügend Geld für eine Karte dabei hat. Das zeigt das folgende Beispiel. Die Bedingung „Genügend Geld für eine Eintrittskarte“ prüft das Programm nur, wenn der Spieler alt genug ist. Die entsprechenden Zeilen sind hier markiert.
Hier vertraut die Einlasskontrolle nicht mehr auf die Ehrlichkeit der Spieler, sondern setzen Alter und Guthaben unter den entsprechenden Bezeichnern direkt fest. Um die korrekte Funktion des Programms in den unterschiedlichen Situationen (alt genug, aber kein Geld dabei etc…) zu prüfen, müsst ihr verschiedene Werte für alter
und guthaben
eingeben.
altersbeschraenkung = 16 eintrittspreis = 8 alter = 17 guthaben = 3 if alter >= altersbeschraenkung then if guthaben >= eintrittspreis then print("Du bist alt genug und kannst Dir die Karte leisten: Viel Spaß!") else print("Du hast leider nicht genügend Geld für eine Eintrittskarte.") end else print("Du bist nicht alt genug, um den Film zu schauen.") end
Aufgabe 3: Erweitere das letzte Codebeispiel: Der Eintrittspreis soll vom Guthaben abgezogen werden. Gib am Ende des Programms das Guthaben in foldender Form aus: „Dein Gutaben beträgt 4 Euro.“
altersbeschraenkung = 16 eintrittspreis = 8 alter = 17 guthaben = 12 if alter >= altersbeschraenkung then if guthaben >= eintrittspreis then print("Du bist alt genug für den Film und kannst Dir die Karte leisten: Viel Spaß!") guthaben = guthaben - eintrittspreis else print("Du hast leider nicht genügend Geld für eine Eintrittskarte.") end else print("Du bist nicht alt genug, um den Film zu schauen.") end print("Dein Gutaben beträgt " .. guthaben .. " Euro.")
Zeile 9 berechnet den neuen Wert von guthaben
und speichert ihn unter guthaben
.
Zeile 17 gibt das aktuelle Guthaben aus.
Logische Operatoren
Mittels der logischen Operatoren kannst Du mehrere Bedingungen zu einer einzigen Bedingung verknüpfen oder Bedingungen umkehren:
a and b ist wahr, wenn a und b wahr sind a or b ist wahr, wenn mindestens eine Bedingung a oder b wahr ist not a ist wahr, wenn a nicht wahr ist
Mit and
kannst Du etwa die Bedingung für den Kinobesuch aus dem vorherigen Beispiel so zusammenfassen:
if alter >= altersbeschraenkung and guthaben >= eintrittspreis then print("Du bist alt genug für den Film und kannst Dir die Karte leisten: Viel Spaß!") end
Bei umfangreicheren Ausdrücken empfiehlt es sich, die mit and
verknüpften Bedingungen in Klammern zu setzten. Der Ausdruck ist einfach besser lesbar:
if (alter >= altersbeschraenkung) and (guthaben >= eintrittspreis) then ...
Eine typische Anwendung für or
ist, feststellen, ob ein Wert innerhalb eines bestimmten Bereiches liegt:
if (wert > 0) or (wert < 10) then print("Der Wert liegt zwischen 0 und 10") else print("Der Wert liegt nicht zwischen 0 und 10") end
not
kehrt schlichtweg jede Bedingung um. Aus true
wird false
, aus false
wird true
:
if not obst_vorraetig then print("Du hast kein Obst mehr") else print("Du hast noch genügend Obst") end
ist also vom Ergebnis her identisch mit:
if obst_vorraetig then print("Du hast noch genügend Obst") else print("Du hast kein Obst mehr") end
Aufgabe 4: Schreibe einen Ausdruck, der true
ergibt, wenn wert
genau zwischen 10 und 20 ist, sonst false
.
wert > 10 and wert < 20
Aufgabe 5: Modifiziere die Lösung von Aufgabe 4, sodass er auch true
ergibt, wenn wert
exakt 10 oder 20 ist.
wert >= 10 and wert <= 20
Aufgabe 6: Schreibe einen Ausdruck, der dann wahr ist, wenn wert
exakt 5 oder 7 ist.
wert == 5 or wert == 7
Was wir hier ausgelassen haben
Aufeinander folgende if-Anweisungen lassen sich auch mit elseif
bauen:
if BEDINGUNG then ... elseif BEDINGUNG2 then ... elseif BEDINGUNG3 then ... end
Navigation
Wir bedanken uns bei der Peakboard GmbH für die freundliche Unterstützung bei der Entwicklung dieses Kurses.
Peakboard ist eine All-in-One-Lösung aus Soft- und Hardware, mit der Du Daten aus unterschiedlichen Datenquellen erhebst, auswertest und in Echtzeit auf Bildschirmen visualisierst. Mit der kostenlosen Software, dem Peakboard Designer, gestaltest Du Dein individuelles Dashboard und bindest deine Datenschnittstellen an. Die Hardware, die Peakboard Box, verarbeitet und kommuniziert die Datenströme dezentral und damit ressourcenschonend direkt am Industriearbeitsplatz. Damit sorgst Du für mehr Transparenz und optimierst so ganz einfach deine Prozesse.