Input e Output in Lua
L’input e l’output (I/O) sono operazioni fondamentali in qualsiasi programma. Lua offre diverse funzioni per la comunicazione con l’utente, dalla semplice stampa a schermo alla lettura di dati dall’input standard.
La Funzione print()
La funzione print() e il modo piu semplice per visualizzare informazioni. Accetta piu argomenti separati da virgola, li stampa separandoli con una tabulazione e aggiunge un a capo alla fine:
print("Ciao, mondo!")
print("Nome:", "Mario", "Eta:", 30) -- Nome: Mario Eta: 30
print(42) -- numero
print(true) -- booleano
print(nil) -- nil
La funzione converte automaticamente tutti gli argomenti in stringhe tramite tostring().
La Funzione io.write()
A differenza di print(), io.write() non aggiunge tabulazioni tra gli argomenti ne un a capo alla fine:
io.write("Ciao")
io.write(", ")
io.write("mondo!\n") -- nuova riga manuale
-- Output: Ciao, mondo!
-- Confronto diretto
print("A", "B", "C") -- A B C
io.write("A", "B", "C\n") -- ABC
io.write() e preferibile quando si vuole un controllo preciso sull’output.
La Funzione io.read()
La funzione io.read() legge dati dall’input standard. Accetta un parametro che specifica il formato:
| Formato | Descrizione |
|---|---|
"l" |
Legge una riga senza il newline (predefinito) |
"L" |
Legge una riga con il newline |
"n" |
Legge un numero |
"a" |
Legge tutto l’input fino a EOF |
| numero | Legge il numero specificato di byte |
io.write("Inserisci il tuo nome: ")
local nome = io.read() -- equivale a io.read("l")
print("Ciao, " .. nome .. "!")
io.write("Inserisci un numero: ")
local numero = io.read("n")
if numero then
print("Il doppio e: " .. numero * 2)
else
print("Input non valido!")
end
-- Lettura multipla in una sola chiamata
io.write("Nome e eta (su due righe): ")
local n, e = io.read("l", "n")
Formattazione dell’Output
Per un output formattato si combina io.write() o print() con string.format():
local prezzo = 19.99
local iva = prezzo * 0.22
io.write(string.format("Prezzo: %.2f EUR\n", prezzo))
io.write(string.format("IVA: %.2f EUR\n", iva))
io.write(string.format("Totale: %.2f EUR\n", prezzo + iva))
-- Tabella allineata
local studenti = {
{ nome = "Mario", voto = 28 },
{ nome = "Lucia", voto = 30 },
{ nome = "Alessandro", voto = 25 },
}
print(string.format("%-15s %5s", "NOME", "VOTO"))
print(string.rep("-", 21))
for _, s in ipairs(studenti) do
print(string.format("%-15s %5d", s.nome, s.voto))
end
Esempio Pratico: Calcolatrice
print("=== Calcolatrice ===")
io.write("Primo numero: ")
local a = io.read("n")
io.read("l") -- consuma il newline rimanente
io.write("Operazione (+, -, *, /): ")
local op = io.read("l")
io.write("Secondo numero: ")
local b = io.read("n")
local risultato
if op == "+" then risultato = a + b
elseif op == "-" then risultato = a - b
elseif op == "*" then risultato = a * b
elseif op == "/" and b ~= 0 then risultato = a / b
else print("Operazione non valida o divisione per zero!"); return
end
print(string.format("%.2f %s %.2f = %.2f", a, op, b, risultato))
Esempio Pratico: Validazione dell’Input
local function leggi_intero(messaggio)
while true do
io.write(messaggio)
local input = io.read("n")
if input then
io.read("l")
return math.floor(input)
end
io.read("l") -- consuma l'input non valido
print("Errore: inserisci un numero valido.")
end
end
local function leggi_stringa(messaggio)
while true do
io.write(messaggio)
local input = io.read("l")
if input and input ~= "" then return input end
print("Errore: il campo non puo essere vuoto.")
end
end
local nome = leggi_stringa("Nome: ")
local eta = leggi_intero("Eta: ")
print(string.format("%s ha %d anni.", nome, eta))
Conclusioni
Lua offre un sistema di I/O semplice ma flessibile. print() e ideale per output rapidi, io.write() fornisce controllo preciso sulla formattazione, e io.read() permette di leggere diversi tipi di dati. Combinando queste funzioni con string.format(), e possibile creare programmi interattivi completi e ben strutturati.