Corso di Programmazione - Prova Pratica - Sesto Appello - 7 settembre 2001 - prova 701

 

 


La prova odierna ha a che fare con una seggiovia

biposto.

 

La seggiovia può essere rappresentata come una

lista circolare i cui elementi (i seggiolini) sono

array di due elementi, in corrispondenza dei due posti.

Questi ultimi possono essere vuoti (il posto varrà in

questo caso 0), oppure occupati (ed il posto assumerà il

valore 1).

 

In una seggiovia ci sono sempre una stazione di partenza ed una

di arrivo. Le due stazioni sono rappresentate da altrettanti puntatori

alla seggiovia.

 

Per semplicità consideriamo solo il caso in cui la seggiovia sia utilizzata solo in

una direzione (si sale in seggiovia e si scende a piedi!).

 

 

  typedef int Seggiolino[2];
 
 typedef struct ListaSeggiolini{
              Seggiolino s;
              struct ListaSeggiolini* prossimo;
 } ListaSeggiolini;
 
 
 typedef struct Seggiovia{
              ListaSeggiolini* stazione_partenza;
              ListaSeggiolini* stazione_arrivo;
 } Seggiovia;
 
 
  

Le procedure che si devono implementare devono simulare il comportamento della seggiovia:

Seggiovia* crea(int k); 

La chiamata della funzione  crea(n) si presume sia sempre effettuata con il parametro attuale n multiplo di 2 e diverso da 0 (in caso contrario la funzione restituisce NULL). L’effetto della procedura è di creare una seggiovia con n seggiolini (inizialmente vuoti): nella stazione di partenza ci sarà il primo seggiolino, in quella di arrivo il seggiolino n/2-esimo.

 

 

void sali(Seggiovia s, int i); 

La chiamata della procedura  sali(a,b) si presume sia sempre effettuata con le seguenti condizioni sui  parametri attuali: i due campi della struttura a devono essere diversi da NULL e b deve essere compreso tra 0 e 2 (in caso contrario la procedura non fa nulla).

L’effetto della procedura è di far salire sul seggiolino che si trova in quel momento alla stazione di partenza (e che è ovviamente vuoto) b persone.

 

int scendi(Seggiovia s); 

La chiamata della funzione  scendi(a) si presume sia sempre effettuata con i due campi del parametro attuale a diversi da NULL (in caso contrario la funzione deve restituire 0).

L’effetto della funzione è di far scendere le persone che si trovano in quel momento sul seggiolino posizionato alla stazione di arrivo, e di restituirne il numero (0,1 o 2).

 

 

void muovi(Seggiovia* s); 

La chiamata della procedura  muovi(a) si presume sia sempre effettuata con il parametro attuale a ed i due campi di *a diversi da NULL  (in caso contrario la funzione non fa nulla). L’effetto della procedura è di far avanzare la seggiovia della distanza tra un seggiolino e l’altro.

 

 

int conta_passeggeri(Seggiovia s); 

La chiamata della funzione  conta(a) si presume sia sempre effettuata con i due campi del parametro attuale a diversi da NULL (in caso contrario la funzione deve restituire 0).

La funzione restituisce il numero totale di persone che si trovano sui seggiolini della seggiovia.

 

 

void stampa(Seggiovia s); 

La chiamata della procedura  stampa(a) si presume sia sempre effettuata con il parametro attuale a diverso da NULL (in caso contrario la funzione non fa nulla). L’effetto della procedura è di produrre sullo standard output una rappresentazione dettagliata dello stato della seggiovia.

 

 

 

 

IMPORTANTE

Per superare la prova è necessario che almeno TRE procedure siano implementate correttamente.

La modalità di consegna dell'esame è diversa dal solito: dovete inviare una messaggio di e-mail a cortesi@dsi.unive.it con subject "701 cognome nome matricola" e nel corpo del messaggio (non in attachment!) il codice relativo alle procedure richieste.