Corso di Programmazione - Prova Pratica - Quarto Appello - 6 giugno 2001 - prova 501


L'esame di oggi ha a che fare con uno spettacolo in piazza da parte di una squadra di sbandieratori.

Il tipo Piazza è un array bidimensionale di dimensione N*N (dove N è una costante fissata da una apposita direttiva #define): gli elementi dell'array corrispondono alle posizioni nelle quali si può trovare uno sbandieratore.
Gli elementi di una piazza (un valore di tipo Piazza) sono di tipo puntatore a Sbandieratore. Il valore NULL di un elemento della tabella corrisponde al fatto che in quella posizione della piazza non c'e' nessuno sbandieratore.

Il tipo Sbandieratore è una struttura, che ha come campi un numero (che identifica lo sbandieratore), ed una lista di bandiere (quelle che ha in mano).

Il tipo Bandiera è un tipo enumerazione che ha come valori Blu e Rossa.

	#define N 4

typedef enum Bandiera {Blu, Rossa} Bandiera; typedef struct ListaBandiere{ Bandiera bandiera; struct ListaBandiere* next; } ListaBandiere; typedef struct Sbandieratore{ int numero; ListaBandiere* bandiere; } Sbandieratore; typedef Sbandieratore* Piazza[N][N];

Implementare le seguenti procedure:

  1. Sbandieratore* CreaSbandieratore(int num);

    La funzione CreaSbandieratore(k) restituisce il puntatore ad un nuovo sbandieratore identificato dal valore intero k, con nessuna bandiera in mano (il campo bandiere deve essere inzializzato a NULL).


  2. void PrendiBandiera(Sbandieratore* s, Bandiera b);

    La chiamata della procedura PrendiBandiera(s,b) corrisponde al fatto che allo sbandieratore puntato da s viene data una nuova bandiera, b, che si aggiunge alla lista delle bandiere che ha in mano (bisogna allocare memoria!).


  3. void EntraInPiazza(Piazza p, Sbandieratore* s, int n, int m);

    La chiamata della procedura EntraInPiazza(piazza,s,n,m) modifica lo stato della piazza piazza: lo sbandieratore puntato da s entra nella piazza piazza e si posiziona nella cella di coordinate (n,m).


  4. int PassaBandiera(Piazza p, int x1, int y1, int x2, int y2);

    La chiamata della funzione PassaBandiera(piazza, x1, y1, x2, y2) corrisponde al passaggio di una bandiera dallo sbandieratore in posizione (x1,y1) a quello in posizione (x2,y2). La funzione restituisce 0 se quando viene chiamata una delle due posizioni è vuota oppure se lo sbandieratore in posizione (x1,y1) non ha bandiere in mano, e restituisce 1 altrimenti.


  5. int CambiaPosizione(Piazza p, int x1, int y1, int x2, int y2);

    La chiamata della funzione CambiaPosizione(piazza, x1, y1, x2, y2) corrisponde al movimento di uno sbandieratore dalla posizione (x1,y1) alla posizione (x2,y2). La funzione restituisce 0 se la posizione (x1,y1)è vuota oppure se la posizione (x2,y2)è già occupata da un altro sbandieratore (e in questi casi non fa nulla), mentre restituisce 1 se il movimento è possibile (e lo attua).


  6. void EsciDallaPiazza(Piazza p, int n, int m);

    La chiamata della procedura EsciDallaPiazza(piazza, n, m) fa uscire di scena definitivamente dalla piazza lo sbandieratore presente nella cella di coordinate (n,m), liberando tutta la momoria occupata da lui e dalle bandiere che ha in mano (che spariscono con lui). Se la cella è vuota, la procedura non fa nulla.

  7. void Stampa(Piazza p, int n);

    La chiamata della funzione Stampa(piazza, N) produce una rappresentazione sullo standard output dello stato dello spettacolo presente nella piazza (di dimensione N*N): per ogni cella dice se e' vuota oppure no, e in quest'ultimo caso qual'e' il numero dello sbandieratore che la occupa e quante e quali bandiere egli ha in mano.

IMPORTANTE: