Corso di Programmazione - Prova Pratica - 10 gennaio 2001


Anno nuovo, vita nuova. Ed è anche tempo di bilanci. Nel 2000 avevamo fatto un bilancio preventivo relativo alle spese di casa, e con la fine dell'anno possiamo dire se le previsioni erano state accurate o meno. Ma questi due bilanci ci servono soprattutto per definire il nuovo bilancio preventivo, quello relativo al 2001. Lo facciamo in modo ottimista: per ogni voce, se si tratta di un'entrata prenderemo il massimo tra il valore preventivato e quello effettivo, mentre se si tratta di un'uscita, prenderemo il minore (in valore assoluto).

Un preventivo è un array di record aventi due campi: il campo voce descrive la tipologia di entrata o uscita (ad esempio: alimentari, stipendio, benzina,...), mentre il campo valore conterrà l'importo relativo a tale voce, che sarà positivo se si tratta di un'entrata e negativo se si tratta di un'uscita. Il numero di voci del bilancio è dato da una costante simbolica N_VOCI.

typedef struct Entry{
char *voce;
int importo;
} Entry;

typedef Entry Bilancio[N_VOCI];


Esercizio 1: Implementare la seguente procedura:

void stampa_bilanci(Bilancio preventivo, Bilancio consuntivo);

La procedura stampa_bilanci deve stampare a video, uno per riga, gli elementi della tabella passata come parametro attuale, secondo la seguente sintassi:

<voce>: <importo preventivo > --- <importo consuntivo>

Come ultima riga, deve stampare il saldo (ovvero la differenza tra entrate e uscite) dei due bilanci passati come parametri attuali.


Esercizio 2: Implementare la seguente procedura:

Bilancio* preventivo01(Bilancio preventivo00, Bilancio consuntivo00);

La funzione preventivo01 prende come parametri attuali due tabelle di tipo Bilancio, la prima contenente il bilancio preventivo del 2000 e la seconda quello consuntivo del 2000. La funzione deve restituire una nuova tabella, contenente gli importi preventivati relativi a ciascuna voce in accordo con la visione "ottimista" descritta sopra.


Esercizio 3: Implementare la seguente procedura:

Bilancio* elimina_voce(Bilancio bilancio, char* voce);

La funzione elimina_voce prende come parametri attuali una tabella di tipo Bilancio, ed un valore di tipo char*. Deve restituire una nuova tabella (dinamica) che è la copia della tabella passata con una riga in meno, quella relativa alla voce passata come secondo parametro.


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