PROVA PRATICA DEL 21 Giugno 2007 - n.60

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. 60

Il tema di oggi ci proietta nelle prossime vacanze al mare.
I tipi che sono qui sotto elencati permettono di rappresentare lo stato delle prenotazioni in uno stabilimento balnerare costituito da N file ed M colonne di postazioni, ciascuna delle quali ha un ombrellone e due sdraio.

Per semplicità assumiamo che lo stabilimento abbia solo due file e due colonne di postazioni.

#define N 2
#define M 2

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 Stato rappresentano una "postazione" nella spiaggia, costituita da un ombrellone e due sdraio. Si tratta di valori di tipo struttura con tre campi, i cui valori sono NULL oppure l'indirizzo di un valore di tipo Cliente (il cliente che ha prenotato in parte o totalmente tale postazione).

typedef struct Stato{
Cliente* sdraio1; /* NULL = non prenotato */
Cliente* sdraio2; /* NULL = non prenotato */
Cliente* ombrellone; /* NULL= non prenotato */
} Stato;

Gli elementi del tipo Mese e di tipo Data permettono di rapresentare una data nel periodo di apertura della spiaggia..

typedef enum Mese{Giu,Lug,Ago,Set} Mese;
typedef struct Data{ Mese mese; int giorno; } Data;

Gli elementi del tipo SpiaggiaGiorno sono strutture che rappresentano la situazione delle prenotazioni della spiaggia (che ha N righe e M colonne di postazioni, ovvero in totale N*M ombrelloni ed il doppio di sdraio) in un singolo giorno. Un valore di tipo Stagione è una lista ordinata di elementi di tipo SpiaggiaGiorno (intuitivamente, il campo next punta alla situazione della spiaggia in un giorno successivo).

typedef struct SpiaggiaGiorno{
Stato prenotazioni[N][M];
Data d;
struct SpiaggiaGiorno* next;
} SpiaggiaGiorno;

typedef SpiaggiaGiorno* Stagione;

Infine, gli elementi di tipo Richiesta rappresentano le possibili richieste di prenotazione da parte di un cliente: solo l'ombrellone, oppure ombrellone ed una sola sdraio oppure ombrellone ed entrambe le sdraio di una postazione.

typedef enum Richiesta{soloOmbrellone, unaSdraioEOmbrellone, dueSdraioEOmbrellone} Richiesta;

Funzioni da implementare

  1. int prenotazione(Data d, Richiesta r, Cliente c, Stagione s);
    Questa funziona verifica se nella stagione s c'è disponibilità dei servizi r nella data d come richiesti dal cliente c: in caso positivo, la funzione restituisce 1 e aggiorna lo stato della spiaggia, in caso negativo la funzione restituisce 0.

  2. int sdraio_occupate(Stagione s, Data d);
    Questa funzione restituisce restituisce il numero totale di sdraio già prenotate in data d nella stagione s.

  3. int giorni_cliente(Stagione s, Cliente* c) ;
    Questa funzione restituisce il numero totale di giorni nel quali risultano prenotazioni da parte del cliente c, nella stagione s (si osservi che un cliente può prenotare lo stesso giorno un solo ombrellone e 0, 1 o 2 sdraio).