Corso di Programmazione - Prova Pratica - Terzo Appello - 21 febbraio 2001 - prova 401


L'esame di oggi ha a che fare con la biglietteria di un museo.

Un valore di tipo Biglietto può essere intero o ridotto. Il suo costo è desumibile dalla tabella costante COSTO: per esempio, COSTO[intero] è il costo di un biglietto intero e nel nostri caso ammonta a 10000 lire.

Per ottenere il biglietto di entrata al museo, bisogna acquistare il biglietto in una delle biglietterie. Un valore di tipo Biglietteria è un array di N righe: ogni elemento dell'array corrisponde alla fila di fronte ad uno degli N sportelli della biglietteria.

Ogni fila è un puntatore ad una lista di tipo ListaPersone. Un valore di tipo ListaPersone è un record con un campo age di tipo intero (l'età della persona) ed un campo next di tipo puntatore a ListaPersone (il prossimo elemento nella fila). Una persona paga il biglietto intero se ha un'età compresa tra i 10 ed i 60 anni (estremi inclusi), altrimenti paga il biglietto ridotto.

#define N 3
const int COSTO[] ={10000, 5000};
typedef enum Biglietto {intero, ridotto} Biglietto;


typedef struct ListaPersone{
	int age;
	struct ListaPersone* next;
} ListaPersone;


typedef ListaPersone* Biglietteria[N];

Esercizio 1: Implementare le seguenti procedure:

Biglietteria* Crea();

La funzione Crea alloca nello heap una nuova biglietteria, cioè un array di N file di persone, inizializzandole tutte a NULL.

 

void NuovoArrivato(Biglietteria b, int age);

La funzione NuovoArrivato modella l'arrivo di un nuova persona, di età age, che vuole visitare il museo: questa persona per prima cosa dovrà mettersi in una della file della biglietteria b. Sceglierà ovviamente di mettersi alla fine della fila più breve.


Esercizio 2: Implementare la seguente funzione:

int Paga(Biglietteria b, int c);

Questa funzione modella la vendita di un biglietto al primo della coda di indice c della biglietteria b. La funzione restituisce il prezzo del biglietto che la persona all'inizio della fila deve pagare (restituisce 0 se la fila c-esima è vuota). All'uscita da questa funzione, la fila c-esima ha un elemento in meno (quello che corrisponde alla persona che ha pagato il biglietto), a meno che la fila c-esima non fosse vuota precedentemente (in tal caso la fila c-esima continua a rimanere uguale a NULL).

Attenzione: la funzione deve liberare (mediante il comando free) la memoria relativa all'elemento di tipo ListaPersone che viene tolto dalla lista.


Esercizio 3: Implementare la seguente funzione:

int Incasso(Biglietteria b);

La funzione Incasso restituisce l'incasso relativo alle persone che ancora sono nelle varie file della biglietteria b e che devono ancora pagare.

 

void Stampa(Biglietteria b);

La procedura Stampa deve fornire a video una rappresentazione dello stato della biglietteria b passata come parametro attuale.

 


IMPORTANTE:
La modalità di consegna dell'esame
è analoga a quella delle esercitazioni durante il corso: è sufficiente inviarlo come esercitazione numero 401.

Bisogna inserire esclusivamente la definizione delle funzioni richieste ed eventuali procedure o funzioni ausiliarie, per consentirne la correzione automatica.

Per superare la prova è necessario che almeno uno dei tre esercizi sia corretto (ovvero che la compilazione abbia successo e che l'esecuzione soddisfi la specifica data).