Corso di Programmazione - Prova Pratica - 19 giugno 2008


Giugno e' mese di tasse, e la prova di oggi ha a che fare con le code allo sportello dell'ufficio imposte. Come spesso capita in questo tipo di uffici, la coda delle persone in attesa e' una sola, e non appena uno dei tre sportelli disponibili risulta libero, il primo in coda viene servito. Al termine del colloquio con l'operatore di sportello, la sua pratica viene messa in fondo alla lista delle pratiche che lo stesso operatore, a fine orario di apertura, dovra' poi smaltire. Per semplicita', tali pratiche saranno identificate allo stesso modo con cui si identificano le persone, ovvero con il loro codice fiscale.

Per modellare questa situazione useremo i seguenti tipi:

typedef char Persona[16];  /* le persone sono identificate dal loro codice fiscale: 16 caratteri */

typedef struct ListaPersone{
     Persona persona;
     struct ListaPersone* next;
} ListaPersone;
 
typedef struct Sportello{
     Persona* servito;    /* indirizzo della persona servita allo sportello, NULL=sportello libero*/
     ListaPersone* lista; /* lista delle persone gia' servite a quello sportello */
} Sportello;

typedef struct Stato{
     ListaPersone* lista;     /* coda delle persone in attesa   
     Sportello sportello[3];  /* array di 3 sportelli
} Stato;

Esercizio 1: Implementare la seguente funzione:

int contaliTutti(Stato stato);

La funzione contaliTutti restituice il numero complessivo sia delle persone che sono ancora in coda in attesa di essere servite che di quelle che sono gia' state servite dai tre sportelli (ovvero che sono nelle rispettive liste).


Esercizio 2: Implementare la seguente funzione:

int libero(Stato stato);

La funzione libero verifica se uno degli sportelli e' libero (altrimenti restituisce -1), ed in tal caso restituisce l'indice di quello, tra gli sportelli liberi, che finora ha lavorato di meno (ovvero la cui lista di persone gia' servite e' piu' piccola). In caso di "parita' di lavoro fatto" tra sportelli, restituisce l'indice piu' basso.


Esercizio 3: Implementare la seguente procedura:

void nuovoArrivato(Stato *stato, char codiceFiscale[16]);

La procedura nuovoArrivato deve aggiornare lo stato dopo che una nuova persona, identificata dal codiceFiscale e' arrivata all'ufficio delle imposte, mettendola in fondo alla lista delle persone in attesa.


La modalitÓ di consegna dell'esame Ŕ analoga a quella delle esercitazioni durante il corso: Ŕ sufficiente inviarlo come esercitazione numero 148. Bisogna inserire esclusivamente la definizione delle procedure, per consentirne la correzione automatica.