Diploma Universitario in Ingegneria Informatica
Esame di Fondamenti di Informatica II - primo modulo
A.A. 1998/99 - Appello del 21 luglio 1999

Problema 1   Si consideri la seguente specifica del tipo astratto Deposito:

TipoAstratto Deposito
Sorte
Dep (sorta per il dominio di interesse)
Funzioni
  
Crea : () --> Dep
precondizioni e postcondizioni per Crea() = d
pre: nessuna
post: d è un deposito con 0 auto; ad ogni auto che entrerà nel deposito verrà associato un numero
QuanteAuto : (Dep) --> Intero
precondizioni e postcondizioni per QuanteAuto(d) = n
pre: nessuna
post: n è il numero di auto presenti in d
NuovaAuto : (Dep,Auto) --> Dep
precondizioni e postcondizioni per NuovaAuto(d,a) = e
pre: a non è nel deposito d
post: e è il deposito ottenuto da d aggiungendo l'auto a; alla nuova auto è associato il numero QuanteAuto(d)+1, che coincide con il numero di auto in e
DammiAuto : (Dep, Intero) --> Auto
precondizioni e postcondizioni per DammiAuto(d,i) = a
pre:
post: a è l'auto alla quale è associato il numero i in d
Svuota : (Dep) --> Dep
precondizioni e postcondizioni per Svuota(d) = e
pre: QuanteAuto(d) > 0
post: e è il deposito ottenuto da d togliendo tutte le auto
FineTipoAstratto

Domanda 1  Illustrare le scelte di progetto per realizzare il tipo astratto Deposito mediante una classe in C++ utilizzando lo schema con side-effect senza condivisione di memoria. Per riferirsi al tipo astratto Auto è necessario utilizzare la classe già definita Auto, della quale è nota solo la funzione Lunghezza(): la chiamata a.Lunghezza() restituisce un valore di tipo float che rappresenta la lunghezza in metri dell'auto a.

Domanda 2  Scrivere la classe Deposito che realizza il tipo astratto Deposito secondo le scelte di progetto illustrate per la Domanda 1.

Problema 2  Realizzare una funzione esterna (non friend) alla classe Deposito che, dato un deposito d ed un valore v di tipo float restituisca l'auto più lunga tra quelle presenti in d che sono di lunghezza minore di v. Se non esiste una tale auto, la funzione deve restituire un opportuno valore che indica tale condizione. Se ne esistono più d'una con la stessa lunghezza massima, la funzione ne deve restituire una qualunque.

Problema 3  Supponiamo che in un programma vi sia la necessità di gestire dei bersagli, e supponiamo che il progettista abbia definito il seguente frammento di software per questo scopo:

class Bersaglio
{public:
  Bersaglio() { quantiColpi = 0; iniziato = false; }
  void Start() { if (!iniziato) { iniziato = true; quantiColpi = 0; } }
  int End()  { if (iniziato)  { iniziato = false; return quantiColpi; } else return -1; }
  void Colpito() { if (iniziato) quantiColpi++; }
  int quantiColpi;
 private:
  bool iniziato;
};

int  NumeroColpi(Bersaglio b)
{ return b.quantiColpi; }
Dare una descrizione del significato della classe Bersaglio, fornire un giudizio motivato sulla qualità della classe rispetto alla coesione e all'information hiding, e dare indicazioni su eventuali miglioramenti da apportare.