Diploma Universitario in Ingegneria Informatica e Automatica Esame di Fondamenti di Informatica II (primo modulo) A.A. 1994/95 - Appello del 26 luglio 1995 - Prima parte Problema 1 Si vuole progettare una classe in modo tale che ogni oggetto della classe rappresenti, nell'ambito di una giornata, lo stato di un parcheggio con un determinato numero di piani ed un certo numero di posti macchina per ogni piano. La specifica del corrispondente tipo astratto e': TipoAstratto Parcheggio Commento ogni valore del tipo rappresenta lo stato di un parcheggio in una giornata Domini Parcheggio (dominio di interesse), Integer, Boolean, Auto Funzioni Crea : (Integer, Integer) --> Parcheggio precondizioni e postcondizioni per Crea(n, k) = p pre : n > 0, k > 0 post : il parcheggio p ha n piani e ognuno degli n piani ha k posti macchina, e tutti i posti di tutti i piani sono liberi QuantiPiani: (Parcheggio) --> Integer precondizioni e postcondizioni per QuantiPiani(p) = h pre : nessuna post : h e' il numero di piani di p QuantiPosti: (Parcheggio) --> Integer precondizioni e postcondizioni per QuantiPosti(p) = m pre : nessuna post : m e' il numero di posti macchina che ci sono in ogni piano di p Pieno : (Parcheggio) --> Boolean precondizioni e postcondizioni per Pieno(p) = b pre : nessuna post : b e' true se e solo se tutti i posti di tutti i piani di p sono occupati ArrivaAuto: (Parcheggio, Auto, Integer) --> (Parcheggio, Integer, Integer) precondizioni e postcondizioni per ArrivaAuto(p, a, o) = (q, i, j) pre : p non e' pieno e 0 <= o <= 23 post : q rappresenta la situazione risultante dal fatto che all'ora o l'auto a e' stata parcheggiata nel posto i del piano j di p, che non era occupato in p ParteAuto: (Parcheggio, Auto) --> Parcheggio precondizioni e postcondizioni per ParteAuto(p, a) = q pre : a e' parcheggiata in p post : q rappresenta la situazione risultante dal fatto che il posto dell'auto a in p non e' piu' occupato da alcuna auto Occupato: (Parcheggio, Integer, Integer) --> (Boolean, Auto, Integer) precondizioni e postcondizioni per Occupato(p, i, j) = (b, a, o) pre : 0 < i <= QuantiPosti(p); 0 < j <= QuantiPiani(p) post : b e' uguale a true se il posto i del piano j di p e' occupato, e in questo caso a e' l'auto che e' parcheggiata in tale posto dall'ora o; b e' invece pari a false se il posto i del piano j di p non e' occupato, e in questo caso a ed o non sono significativi FineTipoAstratto Si noti che la funzione ArrivaAuto deve decidere in quale posto parcheggiare l'auto in arrivo, ed aggiornare lo stato del parcheggio per rappresentare il fatto che l'auto viene parcheggiata in tale posto ad una data ora. Si noti anche che le funzioni ArrivaAuto e Occupato restituiscono una tripla. Scrivere una classe C++ che realizzi con side-effect e senza condivisione di memoria il tipo astratto di cui sopra. Si assuma di disporre di una classe Auto, per la quale le uniche operazioni disponibili all'esterno sono l'assegnazione e la verifica di uguaglianza. Si tenga presente che le operazioni di gran lunga piu' importanti e frequenti per la classe sono le operazioni Pieno e Occupato. Si noti che e' obbligatorio scrivere la definizione (cioe' il corpo istruzioni) delle funzioni: Crea, QuantiPiani, Pieno, Occupato ed una a scelta tra ArrivaAuto e ParteAuto. La definizione delle altre funzioni e' facoltativa. =============================================================================== Diploma Universitario in Ingegneria Informatica e Automatica Esame di Fondamenti di Informatica II (primo modulo) A.A. 1994/95 - Appello del 26 luglio 1995 - Seconda parte Problema 2 Si vuole realizzare una funzione esterna (non friend) alla classe Parcheggio che, dato un parcheggio p e due auto A1 e A2, restituisca - 0 se almeno una delle due auto non e' presente nel parcheggio p, - 1 se sono presenti entrambe le auto e A1 e' stata parcheggiata prima di A2, - 2 se sono presenti entrambe le auto e A2 e' stata parcheggiata prima di A1. Problema 3 Spiegare molto sinteticamente cosa significa ereditarieta' in un linguaggio con classi (o semplicemente in C++). Nella rappresentazione di tipi astratti mediante classi, l'ereditarieta' viene utilizzata secondo tre metodi principali. Illustrare brevemente almeno uno dei suddetti metodi.