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:

Stato* inizializza();

La funzione inizializza restituisce l'indirizzo di una nuova variabile dinamica di tipo Stato che rappresenta la situazione iniziale ad inizio giornata: la lista delle persone in attesa e' ancora vuota, tutti e tre gli sportelli sono ancora liberi, e per ognuno dei tre sportelli, la lista delle persone gia' servite e' ancora vuota.


Esercizio 2: Implementare la seguente procedura:

void avantiIlProssimo(Stato *stato);

La procedura avantiIlProssimo verifica se uno degli sportelli e' libero (altrimenti non fa nulla!), ed in tal caso toglie dalla lista delle persone in attesa il primo arrivato (se la lista delle persone in attesa e' vuota non fa nulla), e ne assegna l'indirizzo al campo servito 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'" tra sportelli, la persona sara' servita da sportello[i] con indice i piu' basso.


Esercizio 3: Implementare la seguente procedura:

void fattoAncheQuesto(Stato *stato, int num_sportello);

La procedura fattoAncheQuesto deve aggiornare lo stato dopo che la persona che e' allo sportello di indice num_sportello e' stata servita: al campo servito di tale sportello viene assegnato il valore NULL, e la persona che era allo sportello viene inserita in cima alla lista delle persone gia' servite associata allo sportello stesso.


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