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).
- 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. - 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. - 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. - 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.
- 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. - 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
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¶
- 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 conrange(1, len(righe), 3): nome, prezzo, cicli. - 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. - Separare le responsabilità.
logica_lavanderialavora solo su valori (ad esempiocicli_ammissibili(testo, disponibili)restituisceTrueoFalse); èinterfaccia_lavanderiaa chiedere di nuovo il dato e a stampare il messaggio. Così ogni funzione si può verificare da sola con unassert. - Errori di arrotondamento. Sommando monete come
0.7 + 0.1Python ottiene0.7999999999999999: il credito non raggiungerebbe mai0.80. Per questoaggiorna_creditousaround(..., 2). - Testo non numerico senza crash. Per i cicli si usa
isdigit(); per le monetefloat()dentrotry/except ValueError. - 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.