Vai al contenuto

Traccia d'esame · Lavanderia self-service

File: main.py, dati_lavanderia.py, logica_lavanderia.py, interfaccia_lavanderia.py, lavanderia.txt

Cosa chiede la traccia

Il programma simula una lavanderia self-service a gettoni. L'utente non compra un solo prodotto ma un numero variabile di cicli dello stesso programma di lavaggio, quindi il costo dipende dalla quantità scelta. Il codice va diviso in moduli (programmazione modulare).

  1. Inizializzazione. All'avvio il programma legge lavanderia.txt: l'incasso della macchina e, per ogni programma di lavaggio, nome, prezzo di un ciclo e cicli ancora disponibili. Se il file non esiste o è vuoto, segnala l'errore e termina senza andare in crash.
  2. Menu. Mostra i programmi con costo per ciclo e cicli residui, più l'uscita con 0. I programmi con zero cicli mostrano [MANUTENZIONE] e non si possono scegliere.
  3. Quantità. Chiede quanti cicli acquistare finché il valore non è un intero valido (il testo non va in errore), maggiore di zero e non superiore ai cicli disponibili. Il totale è prezzo_singolo * numero_cicli.
  4. Credito. Chiede monete finché il credito non raggiunge il totale. A ogni inserimento mostra il credito accumulato e quanto manca; rifiuta importi nulli, negativi o non numerici. Gli importi in euro hanno sempre 2 decimali.
  5. Erogazione e resto. Calcola il resto, conferma l'avvio dei cicli, scala i cicli dalla disponibilità, somma la spesa all'incasso e riscrive lavanderia.txt.
  6. Ciclo continuo. Torna al menu per un nuovo cliente fino allo spegnimento; alla fine stampa un report con i cicli residui di ogni programma e l'incasso totale.
File Responsabilità
dati_lavanderia.py lettura e scrittura del file di configurazione (nessun print)
logica_lavanderia.py soli calcoli e controlli (nessun input, nessun print, nessun file)
interfaccia_lavanderia.py menu, letture da tastiera, messaggi a schermo
main.py orchestrazione del flusso, importa gli altri moduli

Ogni modulo contiene un blocco if __name__ == "__main__": con un piccolo test delle proprie funzioni.

Il file lavanderia.txt
Incasso: 0.00
Lavaggio Rapido
3.50
8
Lavaggio Standard
4.50
6
Lavaggio Delicati
5.00
4
Asciugatura
2.50
10
Lavaggio Voluminosi
7.00
0

Laboratorio

Il pulsante Esegui main.py avvia il programma. Quando apri la scheda di un modulo compare anche Esegui nome del modulo: avvia quel file come programma principale, quindi esegue il suo test if __name__ == "__main__":.

Prova così

Scegli il programma 5 (in manutenzione), poi il 1. Chiedi due cicli e poi 2, inserisci ciao, -1, 5, 0.5 e 2: il resto è 0.50 euro. Spegni con 0 e apri lavanderia.txt: incasso 7.00 e 6 cicli residui per il Lavaggio Rapido.

Come ragionare sulla soluzione

  1. Leggere il file a blocchi. Dopo aver tolto gli a capo, la prima riga dà l'incasso (righe[0].split(':')[1]); le altre vanno lette a gruppi di tre con range(1, len(righe), 3): nome, prezzo, cicli.
  2. Dizionario indicizzato da 1. lavaggi[1] = {'nome': ..., 'prezzo': ..., 'cicli': ...}: il numero del menu coincide con la chiave, quindi la scelta dell'utente si usa direttamente.
  3. Separare le responsabilità. logica_lavanderia lavora solo su valori (ad esempio cicli_ammissibili(testo, disponibili) restituisce True o False); è interfaccia_lavanderia a chiedere di nuovo il dato e a stampare il messaggio. Così ogni funzione si può verificare da sola con un assert.
  4. Errori di arrotondamento. Sommando monete come 0.7 + 0.1 Python ottiene 0.7999999999999999: il credito non raggiungerebbe mai 0.80. Per questo aggiorna_credito usa round(..., 2).
  5. Testo non numerico senza crash. Per i cicli si usa isdigit(); per le monete float() dentro try/except ValueError.
  6. Stato aggiornato. Dopo ogni acquisto si scalano i cicli, si aggiorna l'incasso e si riscrive subito il file: se la macchina si spegne all'improvviso, i dati restano corretti.