PROVA PRATICA DEL 21 Giugno 2007 - n.61

Indicazioni per la consegna

Nella consegna della prova pratica e' importante che gli studenti rispettino le seguenti indicazioni. Se tali indicazioni non vengono rispettate, c'e' il rischio che un esercizio, pur essendo stato svolto correttamente, venga valutato come errato.

E' importante che il codice consegnato includa solamente lo svolgimento della procedura richiesta. A tale codice infatti vengono automaticamente attaccati la definizione delle strutture dati e una procedura main per testare quanto consegnato.

Ad esempio, prendiamo un esercizio che utilizza le seguenti strutture dati:

typedef enum Uno {a,b,c} Uno;

typedef struct Due{
int a[3];
int b[3];
} Due;

Se a partire da queste strutture dati l'esercizio chiede di consegnare una procedura int proc (Uno u, Due d), lo studente dovra' consegnare SOLAMENTE il seguente codice:

/* Eventuali procedure di supporto */
int proc (Uno u, Due d){
bla bla bla /* codice della procedura */
}

E' importante che NON vengano inseriti nella consegna dell'esercizio le istruzioni #include <...>, #define ... , la procedura main e la definizione delle strutture dati.

Attenzione! Nella consegna di ogni esercizio, dovete inserire TUTTE le eventuali procedure o funzioni di supporto che sono necessarie per la verifica automatica di quell'esercizio (se riutilizzate una procedura definita in un altro esercizio, dovete reinserirla!).

Tema d'esame n. 61

Il tema di oggi e' ambientato nella hall di un hotel.
I tipi che sono qui sotto elencati permettono di rappresentare lo stato delle prenotazioni delle stanze, in un hotel che ha P piani ed S stanze in ogni piano.


Per semplicità assumiamo che l'hotel abbia solo due piani e cinque camere per piano.

#define P 2
#define S 5

Gli elementi del tipo Cliente sono strutture con tre campi di tipo stringa, contenenti rispettivamente cognome, nome ed indirizzo.

typedef struct Cliente{
char cognome[30];
char nome[30];
char indirizzo[60];
} Cliente;

Gli elementi del tipo Prenotazione rappresentano la prenotazione di una camera per una o due persone. Si tratta di valori di tipo struttura con due campi: un campo camera che puo' avere come valori NULL (se non e' prenotata) oppure l'indirizzo di un valore di tipo Cliente (il cliente che l'ha prenotata), ed un campo tipo che puo' avere valore 1 (se la prenotazione e' per una sola persona) oppure 2 (se la prenotazione e' per due persone).

typedef struct Prenotazione{
Cliente* camera; /* NULL = non prenotato */
int tipo; /* assumera' il valore 1 o il valore 2 */
} Prenotazione;

Un valore del tipo GiornoHotel rappresenta la situazione delle prenotazioni nell'hotel (che ha P piani e S camere per piano, ovvero in tutto P*S camere) in una certa data.

typedef struct GiornoHotel{
Prenotazione prenotaz[P][S];
int mese;
int giorno;
} GiornoHotel;

Infine, gli elementi di tipo Richiesta rappresentano le possibili richieste di prenotazione da parte di un cliente: camera per una persona o camera per due persone.

typedef enum Richiesta{UnaPersona, DuePersone} Richiesta;

Funzioni da implementare

  1. int prenota(GiornoHotel* g, Richiesta r, Cliente* c);
    Questa funzione verifica se nello stato *g delle prenotazioni dell'hotel c'è disponibilità di una camera, ed in caso positivo assegna la prima camera libera al cliente aggiornando opportunamente *g.
    La funzione restituisce 1 se la richiesta e' stata evasa, mentre in caso negativo (se non ci sono camere libere) la funzione restituisce 0.

  2. int camere_libere(GiornoHotel g);
    Questa funzione restituisce il numero totale di camere non ancora prenotate, visto lo stato g delle prenotazioni dell'hotel.

  3. int cancella(GiornoHotel* g, Cliente* c);
    Questa funzione rimuove tutte le prenotazioni effettuate da parte del cliente c nello stato delle prenotazioni *g.
    La funzione restituisce il valore 0 se non risultano prenotazioni a carico del cliente c, e restituisce 1 in tutti gli altri casi.