Vai al contenuto

Esercitazione 06 · Sale del centro sportivo

Esercitazione 4 di 4 · in stile prova pratica d'esame

Traccia

Un centro sportivo desidera un programma in Python per monitorare l'utilizzo settimanale delle proprie sale: inserire, visualizzare, ordinare, cercare, analizzare e salvare le ore di utilizzo. Ogni sala ha un codice numerico progressivo e, per ciascuno dei sette giorni della settimana, le ore di utilizzo.

  • inserisci_dati: chiede il numero di sale, che deve essere un intero positivo (altrimenti va richiesto). Per ogni sala e per ogni giorno chiede le ore di utilizzo, un numero reale tra 0 e 24 (altrimenti va richiesto). Ogni nuova chiamata sostituisce i dati inseriti in precedenza.
  • visualizza_dati: mostra per ogni sala il codice, le ore dei sette giorni e il totale settimanale, ad esempio:

    CODICE_SALA  L  M  M  G  V  S  D
    1            2  3  1  4  5  0  7
    
  • ricerca_sala: riceve il codice di una sala e ne mostra le ore, il totale settimanale e la media giornaliera, oppure un messaggio se il codice non esiste.

  • sala_piu_utilizzata: mostra codice e totale settimanale della sala più usata. Se più sale hanno lo stesso massimo, vanno mostrate tutte.
  • salva_su_file: salva l'elenco ordinato delle sale, una per riga:

    codice_sala; ore_giorno1; ore_giorno2; ...; ore_giorno7; totale_settimanale
    
  • ordina_sale: ordina le sale in ordine decrescente di totale settimanale con il Selection Sort.

Il main() implementa un menu iterativo, eseguito almeno una volta e ripetuto finché l'utente non sceglie di uscire, con le voci: inserimento dati, visualizzazione, ricerca sala, sala più utilizzata, ordinamento, salvataggio su file, uscita. Una scelta non valida mostra un messaggio di errore e ripropone il menu.

Laboratorio

Dati di prova

Con 2 sale e queste ore il totale è 57 per la sala 1 e 47 per la sala 2: sala 1 → 1, 2, 4, 6, 7, 18, 19; sala 2 → 2, 10, 9, 8, 5, 6, 7. Per provare la parità, inserisci due sale con le stesse ore.

La soluzione proposta

  • Lista di liste. Ogni sala è una lista [codice, ore_L, ore_M, ..., ore_D]: l'elemento 0 è il codice, gli elementi da 1 a 7 sono le ore. Per questo i cicli usano range(1, 8).
  • Tabella allineata. Le f-string con :<10 (a sinistra in 10 caratteri) e :>6.1f (a destra in 6 caratteri con 1 decimale) incolonnano i valori; end="" evita di andare a capo dopo ogni ora.
  • Ricerca con flag. La ricerca lineare usa la variabile booleana trovata e si ferma appena trova la sala.

Correzioni rispetto alla prima versione, segnate nel codice con # CORREZIONE:

  • Parità nel massimo. sala_piu_utilizzata prima trova il totale massimo, poi scorre tutte le sale e stampa tutte quelle con quel totale. Prova con due sale con le stesse ore.
  • Ricerca che visualizza. È ricerca_sala a mostrare ore, totale e media, come chiede la traccia; la media ha due decimali.
  • Salvataggio ordinato. Prima di scrivere il file le sale vengono ordinate per totale decrescente.
  • Eccezione giusta. Aprendo in scrittura gli errori possibili sono OSError.