Vai al contenuto

Traccia d'esame · Gestione prenotazioni albergo

File: main.py, prenotazioni.txt · struttura dati: dizionario

Cosa chiede la traccia

Il programma gestisce le camere di un albergo caricate dal file di testo prenotazioni.txt. Ogni riga contiene i dati di una camera, separati da virgola:

NumeroCamera,NomeCliente,PrezzoNotte,GiorniSoggiorno
101,Mario Rossi,80.0,3
102,Luigi Verdi,120.0,5
201,Anna Neri,95.0,2

Funzioni richieste:

  1. carica_prenotazioni(nome_file): legge il file e riempie un dizionario che usa il numero della camera come chiave.
  2. mostra_prenotazioni(prenotazioni): stampa tutte le camere, i dati dei clienti e il costo totale del soggiorno (prezzo per notte × giorni).
  3. cerca_camera(prenotazioni): chiede il numero della camera, gestendo maiuscole/minuscole e spazi, e ne mostra le informazioni complete.
  4. aggiungi_prenotazione(prenotazioni): registra un nuovo cliente. Verifica che la camera non sia già occupata, poi chiede nome, prezzo per notte e giorni di soggiorno.
  5. salva_prenotazioni(nome_file, prenotazioni): salva il dizionario aggiornato in prenotazioni.txt, con la stessa struttura a una riga per camera separata da virgole.
  6. main(): ciclo while con il menu: 1 Mostra, 2 Cerca, 3 Aggiungi, 0 Salva ed esci.

Laboratorio

Prova così

Scegli 1 per vedere le camere, poi 2 e scrivi 102 con gli spazi: la camera viene trovata lo stesso. Con 3 prova a prenotare la 101 (occupata) e poi la 305. Esci con 0 e apri la scheda prenotazioni.txt: c'è la nuova riga.

Come ragionare sulla soluzione

  1. Il dizionario. La chiave è il numero della camera, come stringa ('101'); il valore è un altro dizionario con cliente, prezzo e giorni. Così prenotazioni['101']['cliente'] vale 'Mario Rossi' e il controllo "camera già occupata" è semplicemente camera in prenotazioni.
  2. Leggere ogni riga. riga.rstrip('\n').split(',') restituisce la lista dei 4 campi; prezzo e giorni vanno convertiti con float e int.
  3. Spazi e maiuscole. input(...).strip().upper() toglie gli spazi all'inizio e alla fine e rende uguali 101a e 101A.
  4. Input sicuri. Prezzo e giorni vengono richiesti finché non sono numeri positivi: il prezzo con try/except ValueError, i giorni con isdigit().
  5. La virgola nel nome. Se il nome del cliente contenesse una virgola, al prossimo avvio la riga verrebbe divisa in 5 campi: per questo la soluzione la rifiuta.
  6. Salvataggio. Si riapre il file in modalità 'w' e si riscrive una riga per camera: camera + ',' + cliente + ',' + str(prezzo) + ',' + str(giorni) + '\n'.