Programmieren lernen mit Lua: Lektion 02: Eingaben und Bedingungen

Übersicht | Vorherige Lektion | Nächste Lektion




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 auf repl.it


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.")

Lösung auf repl.it


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

Lösung auf repl.it


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

Das Programm auf repl.it

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.

Lösung auf repl.it


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

Übersicht

Vorherige Lektion

Nächste Lektion


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.