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

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.