EMZETT.
Login

Kurz: for i = 1, 3 do io.write(i, ” ”) end — 1 bis 3 print() for i = 10, 1, -4 do io.write(i, ” ”) end — Schrittweite -4 print() for i = 0, 1, 0.25 do io.write(i, ” ”) end print()

Teil des Kurses Lua

Kapitel 3 von 8 im Kurs Lua. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

if und Schleifen

local punkte = 78
if punkte >= 90 then
    print("sehr gut")
elseif punkte >= 75 then
    print("gut")
else
    print("weiter üben")
end
 
for i = 1, 3 do io.write(i, " ") end           -- 1 bis 3
print()
for i = 10, 1, -4 do io.write(i, " ") end      -- Schrittweite -4
print()
for i = 0, 1, 0.25 do io.write(i, " ") end
print()
 
local n = 3
while n > 0 do io.write(n, " "); n = n - 1 end
print()
local k = 0
repeat k = k + 1 until k >= 3                  -- läuft mindestens einmal
print(k)
 
for i = 1, 10 do
    if i % 2 == 0 then goto weiter end         -- Lua kennt kein continue, goto ersetzt es
    if i > 7 then break end
    io.write(i, " ")
    ::weiter::
end
print()

Ausgabe:

gut
1 2 3
10 6 2
0 0.25 0.5 0.75 1
3 2 1
3
1 3 5 7

Funktionen

local function gruss(name, anrede)
    anrede = anrede or "Hallo"            -- Standardwert
    return anrede .. ", " .. name .. "!"
end
 
local function minmax(...)
    local liste = {...}                    -- ... sammelt beliebig viele Argumente
    table.sort(liste)
    return liste[1], liste[#liste], #liste     -- mehrere Rückgabewerte
end
 
local function summe(...)
    local s = 0
    for _, v in ipairs({...}) do s = s + v end
    return s
end
 
print(gruss("Mia"))
print(gruss("Tom", "Hi"))
local lo, hi, anzahl = minmax(5, 2, 9, 1)
print(lo, hi, anzahl)
print(summe(1, 2, 3, 4))
print(select("#", 1, nil, 3), select(2, "a", "b", "c"))
print((minmax(3, 1, 2)))                   -- Klammern: nur der erste Wert
print(table.unpack({10, 20, 30}))

Ausgabe:

Hallo, Mia!
Hi, Tom!
1	9	4
10
3	b	c
1
10	20	30

Funktionen sind Werte: Closures

local function zaehler(start)
    local n = start or 0
    return function() n = n + 1; return n end     -- merkt sich n
end
local a, b = zaehler(), zaehler(100)
print(a(), a(), a(), b(), b())
 
local function anwenden(liste, f)
    local ergebnis = {}
    for i, v in ipairs(liste) do ergebnis[i] = f(v) end
    return ergebnis
end
print(table.concat(anwenden({1, 2, 3}, function(x) return x * x end), ","))
 
local mathe = {
    plus  = function(a, b) return a + b end,
    mal   = function(a, b) return a * b end,
}
print(mathe.plus(2, 3), mathe["mal"](4, 5))
 
local function fakultaet(n) return n <= 1 and 1 or n * fakultaet(n - 1) end
print(fakultaet(10), fakultaet(20))
 
local function endrekursiv(n, acc)           -- Endrekursion: kein Stapelüberlauf
    if n == 0 then return acc end
    return endrekursiv(n - 1, acc + n)
end
print(endrekursiv(100000, 0))

Ausgabe:

1	2	3	101	102
1,4,9
5	20
3628800	2432902008176640000
5000050000

Hinweis

Lua führt Endaufrufe (return f(...)) ohne zusätzlichen Stapel aus (proper tail calls). Deshalb stürzt endrekursiv(100000, 0) nicht ab.

Merke

  • if/elseif/else/end, while, repeat/until, numerisches for i = von, bis, schritt
  • Kein continue: goto oder verschachtelte if
  • Funktionen: mehrere Rückgabewerte, ... für variable Argumente, select
  • Funktionen sind Werte: Closures merken sich lokale Variablen

Übungsaufgabe

Schreibe eine Funktion, die eine Liste von Zahlen bekommt und Summe und Durchschnitt zurückgibt.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Variablen und Datentypen

Weiter: Tabellen

Alle Kapitel: Lua im Überblick