Kontrollstrukturer i Lua

I denna lektion kommer du lära dig hur du använder if-satser, loopar och andra kontrollstrukturer i Lua för att skapa mer avancerade program.

If-satser

If-satser används för att utföra olika kod beroende på om ett villkor är sant eller falskt. Grundläggande syntax för if-satser i Lua är:

if villkor then
    -- Kod som körs om villkoret är sant
end

Du kan också använda else och elseif för mer komplexa villkor:

local poäng = 85

if poäng >= 90 then
    print("Du fick A!")
elseif poäng >= 80 then
    print("Du fick B!")
elseif poäng >= 70 then
    print("Du fick C!")
elseif poäng >= 60 then
    print("Du fick D!")
else
    print("Du fick F!")
end

Jämförelseoperatorer

Följande jämförelseoperatorer kan användas i villkor:

  • == - Lika med
  • ~= - Inte lika med (används istället för != i andra språk)
  • > - Större än
  • < - Mindre än
  • >= - Större än eller lika med
  • <= - Mindre än eller lika med

Logiska operatorer

Lua använder också logiska operatorer för att kombinera villkor:

  • and - Båda villkoren måste vara sanna
  • or - Minst ett av villkoren måste vara sant
  • not - Inverterar ett villkor (sant blir falskt, falskt blir sant)
Obs! I Lua används ordet then efter villkoret och end för att avsluta if-satsen.

While-loopar

While-loopar upprepar kod så länge ett villkor är sant:

local count = 1
while count <= 5 do
    print("Count är: " .. count)
    count = count + 1
end

Detta kommer skriva ut:

Count är: 1
Count är: 2
Count är: 3
Count är: 4
Count är: 5
Varning! Var försiktig med while-loopar. Om villkoret aldrig blir falskt, hamnar programmet i en oändlig loop.

For-loopar

Lua har två typer av for-loopar: numeriska och generiska.

Numeriska for-loopar

Dessa används när du vill upprepa något ett bestämt antal gånger:

-- Räkna från 1 till 5
for i = 1, 5 do
    print("Nummer " .. i)
end

Du kan också ange ett steg (increment) som tredje parameter:

-- Räkna jämna tal från 2 till 10
for i = 2, 10, 2 do
    print("Jämnt tal: " .. i)
end

Generiska for-loopar med pairs och ipairs

Dessa används för att loopa genom tabeller (Luas arrayer/listor):

local frukter = {"äpple", "banan", "apelsin", "päron"}

-- Loopa genom indexerade element med ipairs
for index, frukt in ipairs(frukter) do
    print(index .. ": " .. frukt)
end

-- För associativa tabeller (som fungerar som dictionaries)
local person = {namn = "Lisa", ålder = 28, stad = "Stockholm"}

-- Loopa genom nycklar och värden med pairs
for nyckel, värde in pairs(person) do
    print(nyckel .. ": " .. värde)
end

Break och Continue

Lua stödjer break för att avsluta en loop i förtid:

for i = 1, 10 do
    if i == 6 then
        print("Hittade 6! Avslutar loopen.")
        break  -- Avsluta loopen när i är 6
    end
    print("Nummer: " .. i)
end

Lua har inte inbyggt stöd för continue, men det kan simuleras med extra logik eller genom att använda en goto-sats (i Lua 5.2+):

for i = 1, 10 do
    if i % 2 == 0 then
        goto fortsätt  -- Simulera continue för jämna tal
    end
    print("Udda tal: " .. i)
    ::fortsätt::
end

Övningar

Övning 1: Gissa talet

Skapa ett enkelt "gissa talet"-spel med följande steg:

  1. Sätt ett hemligt tal i koden (t.ex. 42)
  2. Be användaren att gissa talet i en loop
  3. För varje gissning, berätta om den var för hög eller för låg
  4. Avsluta när användaren gissar rätt

Tips: Använd io.read("*n") för att läsa in ett nummer från användaren.

Lösningsförslag:

-- Gissa talet spel
local hemligt_tal = 42
local antal_gissningar = 0
local gissning

print("Välkommen till Gissa Talet!")
print("Jag tänker på ett tal mellan 1 och 100.")

while true do
    io.write("Din gissning: ")
    gissning = io.read("*n")
    antal_gissningar = antal_gissningar + 1
    
    if gissning < hemligt_tal then
        print("För lågt! Försök igen.")
    elseif gissning > hemligt_tal then
        print("För högt! Försök igen.")
    else
        print("Rätt! " .. hemligt_tal .. " är korrekt!")
        print("Du gissade rätt på " .. antal_gissningar .. " försök.")
        break
    end
end

Övning 2: Multiplikationstabell

Skapa ett program som skriver ut en multiplikationstabell för ett givet nummer:

  1. Sätt ett nummer (t.ex. 7) eller låt användaren välja ett
  2. Använd en for-loop för att skriva ut multiplikationstabellen från 1 till 10
  3. Formatera utskriften så att den är lätt att läsa

Lösningsförslag:

-- Multiplikationstabell
io.write("Ange ett tal för multiplikationstabell: ")
local tal = io.read("*n")

print("\nMultiplikationstabell för " .. tal .. ":")
print("-----------------------------")

for i = 1, 10 do
    local resultat = tal * i
    -- Formatera utskriften så att siffrorna är justerade
    print(tal .. " x " .. string.format("%2d", i) .. " = " .. string.format("%3d", resultat))
end

print("-----------------------------")