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.