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


L'esame di oggi ha a che fare con la biglietteria di una stazione.

Il costo di un biglietto ferroviario (di tipo Biglietto), di una certa fascia kilometrica è desumibile dalla tabella costante COSTO: per esempio, COSTO[fasciaA] è il costo di un biglietto di fascia A, e nel nostro caso tale costo ammonta a 3000 lire.

Per ottenere il biglietto ferroviario bisogna acquistare il biglietto in una biglietteria (quella della stazione, o quella di un'agenzia viaggi...). Un valore di tipo Biglietteria è un array di N file: 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 km di tipo intero (il numero di kilometri da percorrere) ed un campo next di tipo puntatore a ListaPersone (il prossimo elemento nella fila). La fascia A va da 0 a 30 kilometri (inclusi), la fascia B dai 31 ai 40 kilometri, la fascia C dai 41 ai 50, a fascia D dai 51 ai 60 km.

#define N 3
const int COSTO[] ={3000, 4000, 5000, 6000};
typedef enum Fascia {fasciaA, fasciaB, fasciaC, fasciaD} Fascia;

typedef struct ListaPersone{
	int km;
	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 NuovoUtente(Biglietteria b, int num);

La funzione NuovoUtente modella l'arrivo nella biglietteria b di un nuova persona che vuole acquistare un biglietto per una percorrenza di num kilometri: 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 Compra(Biglietteria b, int c);

Questa funzione modella la vendita di un biglietto al primo della fila 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:

double PercorrenzaMedia(Biglietteria b);

La funzione PercorrenzaMedia restituisce la media delle distanze che le persone che sono in fila agli sportelli della biglietteria b intendono percorrere.

 

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

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