00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Ciclo while e repeat in Lua

Lua offre due strutture di ciclo condizionale: il ciclo while e il ciclo repeat..until. Entrambi permettono di ripetere un blocco di codice finche’ una condizione e’ soddisfatta, ma differiscono nel momento in cui la condizione viene valutata. In questa guida esploreremo entrambi i costrutti, le loro differenze e diversi esempi pratici.

Ciclo while

Il ciclo while valuta la condizione prima di ogni iterazione. Se la condizione e’ vera, il blocco di codice viene eseguito; altrimenti, il ciclo termina. La sintassi e’ la seguente:

while condizione do
    -- blocco di codice
end

Ecco un esempio che stampa i numeri da 1 a 5:

local i = 1

while i <= 5 do
    print(i)
    i = i + 1
end
-- Output: 1, 2, 3, 4, 5

Se la condizione e’ falsa fin dall’inizio, il blocco non viene mai eseguito:

local x = 10

while x < 5 do
    print("Questo non verra' mai stampato")
    x = x + 1
end

Esempio: Somma dei Numeri

Calcoliamo la somma dei numeri da 1 a 100 con un ciclo while:

local somma = 0
local n = 1

while n <= 100 do
    somma = somma + n
    n = n + 1
end

print("La somma da 1 a 100 e': " .. somma)
-- Output: La somma da 1 a 100 e': 5050

Ciclo repeat..until

Il ciclo repeat..until e’ simile al costrutto do..while presente in altri linguaggi. La differenza fondamentale rispetto al while e’ che la condizione viene valutata dopo l’esecuzione del blocco di codice, garantendo che il corpo del ciclo venga eseguito almeno una volta. La sintassi e’ la seguente:

repeat
    -- blocco di codice
until condizione

Il ciclo continua a ripetersi finche’ la condizione diventa vera (il contrario del while, che continua finche’ la condizione e’ vera).

Ecco un esempio base:

local i = 1

repeat
    print(i)
    i = i + 1
until i > 5
-- Output: 1, 2, 3, 4, 5

Il Blocco Viene Eseguito Almeno Una Volta

Questa e’ la caratteristica chiave del repeat..until:

local x = 10

repeat
    print("Eseguito con x = " .. x)
    x = x + 1
until x > 5
-- Output: Eseguito con x = 10
-- (il blocco viene eseguito una volta anche se x e' gia' maggiore di 5)

Visibilita’ delle Variabili nel repeat

Una particolarita’ del repeat..until in Lua e’ che le variabili dichiarate all’interno del blocco repeat sono visibili nella condizione until:

repeat
    local risposta = io.read()
    -- la variabile 'risposta' e' accessibile nella condizione until
until risposta == "esci"

Questo non sarebbe possibile con un ciclo while, dove la condizione si trova prima del blocco.

Istruzione break

L’istruzione break permette di uscire immediatamente da un ciclo while o repeat..until:

local i = 1

while true do
    if i > 10 then
        break
    end
    print(i)
    i = i + 1
end

Con repeat..until:

local contatore = 0

repeat
    contatore = contatore + 1
    if contatore == 5 then
        print("Interrotto a " .. contatore)
        break
    end
    print(contatore)
until contatore >= 100
-- Output: 1, 2, 3, 4, Interrotto a 5

Cicli Infiniti e Come Uscirne

Un ciclo infinito e’ un ciclo che non termina mai da solo. In Lua si crea facilmente con while true do:

while true do
    -- questo ciclo non termina mai senza un break
end

I cicli infiniti sono utili quando non si conosce in anticipo il numero di iterazioni, ma e’ fondamentale prevedere una condizione di uscita con break:

-- Menu interattivo
while true do
    print("\n--- Menu ---")
    print("1. Saluta")
    print("2. Mostra data")
    print("3. Esci")
    io.write("Scelta: ")
    local scelta = io.read()

    if scelta == "1" then
        print("Ciao!")
    elseif scelta == "2" then
        print(os.date())
    elseif scelta == "3" then
        print("Arrivederci!")
        break
    else
        print("Scelta non valida")
    end
end

Anche repeat..until puo’ essere usato per situazioni simili:

repeat
    io.write("Inserisci un numero positivo: ")
    local input = io.read("*n")
until input and input > 0

Differenze tra while e repeat..until

Riassumiamo le differenze principali:

Caratteristica while repeat..until
Valutazione condizione Prima del blocco Dopo il blocco
Esecuzione minima Zero volte Almeno una volta
Condizione di proseguimento Continua se vera Continua se falsa
Visibilita’ variabili locali Non visibili nella condizione Visibili nella condizione until

Esempio Pratico: Indovinare un Numero

Ecco un esempio completo che utilizza repeat..until per un gioco di indovinamento:

math.randomseed(os.time())
local segreto = math.random(1, 50)
local tentativi = 0

print("Indovina il numero tra 1 e 50!")

repeat
    io.write("Il tuo tentativo: ")
    local tentativo = tonumber(io.read())
    tentativi = tentativi + 1

    if tentativo == nil then
        print("Inserisci un numero valido!")
    elseif tentativo < segreto then
        print("Troppo basso!")
    elseif tentativo > segreto then
        print("Troppo alto!")
    else
        print("Corretto! Hai indovinato in " .. tentativi .. " tentativi.")
    end
until tentativo == segreto

Esempio Pratico: Elaborazione con while

Un uso comune del while e’ l’elaborazione di dati fino a una condizione di arresto:

-- Dimezzamento successivo fino a un valore soglia
local valore = 1000

while valore > 1 do
    print(string.format("%.2f", valore))
    valore = valore / 2
end

Conclusioni

I cicli while e repeat..until sono strumenti fondamentali in Lua per gestire iterazioni condizionali. Il while e’ adatto quando la condizione deve essere verificata prima dell’esecuzione, mentre il repeat..until garantisce almeno un’esecuzione del blocco. L’istruzione break permette di uscire in qualsiasi momento da entrambi i cicli. La scelta tra i due dipende dalla logica del problema: se il blocco deve essere eseguito almeno una volta, repeat..until e’ la scelta naturale.