Corso di Programmazione - Prova Pratica - Quarto Appello - 11settembre 2002 - prova 130


L'esame di oggi ha a che fare con un distributore automatico di caffè.

Per ottenere un caffè dal distributore, un utente deve inserire delle monete (da 10, 20, o 50 centesimi). Il costo del caffé è di 70 centesimi, ed il distributore non restituisce nessun resto.

Il distributore, di tipo Distributore, lo possiamo pensare come un record di tre campi di interi: il campo disponibili esprime quanti caffé sono ancora erogabili dal distributore (e verrà decrementato ad ogni erogazione del servizio). Il campo incasso ci dice la somma totale del denaro immesso nel distributore (e verrà incrementato ad ogni erogazione del servizio). Infine, il campo moneteInserite è un array che serve a memorizzare le monete inserite prima che il caffé sia erogato: moneteInserite[0] dice quante monete da 10 centesimi sono state inserite, moneteInserite[1] quante monete da 20, e moneteInserite[2] quante monete da 50 centesimi. Se infatti la somma delle monete inserite non copre il costo caffé, o se il distributore non è più in grado di erogarne, sarà possibile all'utente annullare l'operazione ed avere indietro le monete inserite.


typedef struct Distributore{
	int disponibili;
	int incasso;

	int moneteInserite[3];
} Distributore;

Esercizio 1: Implementare le seguenti procedure:

void stampa(Distributore d);

La procedura stampa deve fornire a video una rappresentazione dello stato dei campi del distributore d passato come parametro attuale.


Esercizio 2: Implementare la seguente funzione:

int chiediCaffe(Distributore* d, int monete[3]);

Questa funzione restituisce 1 se le monete dell'array monete (la tabella delle monete inserite, passata come parametro attuale) hanno raggiunto o superato il costo del caffé e se il distributore ha ancora caffé disponibili. In tal caso, il distributore non restituisce il resto: l'incasso del distributore d viene incrementato dell'importo inserito, e viene decrementato il numero di caffé ancora a disposizione in d.
Qualora invece le monete inserite non coprano il costo della bibita, la funzione restituisce 0, e nel campo moneteInserite resterà traccia delle monete inserite (gli altri campi resteranno immutati), in attesa della funzione annulla.
Infine, se le monete inserite superano il costo del caffé ma quest'ultimo non risulta disponibile, la funzione restituisce -1, e nel campo moneteInserite resterÓ traccia delle monete inserite (gli altri campi resteranno immutati), in attesa, anche in questo caso, della funzione annulla.


Esercizio 3: Implementare la seguente funzione:

int annulla(Distributore* d);

La funzione annulla permette di azzerare l'operazione in corso. Le monete inserite successivamente all'erogazione dell'ultimo caffé vengono rese all'utente. Agli elementi del campo moneteInserite di d deve essere assegnato il valore 0. La funzione deve restituire l'importo totale reso all'utente.


IMPORTANTE:
La modalità di consegna dell'esame
è analoga a quella delle esercitazioni durante il corso: è sufficiente inviarlo come esercitazione numero 130.

Bisogna inserire esclusivamente la definizione delle funzioni richieste ed eventuali procedure o funzioni ausiliarie, per consentirne la correzione automatica.