Programmazione II Esercitazione del 27 marzo 2014 ================================ (0) Un Vocabolario e' una collezione di associazioni del tipo 'chiave -> valore', dove sia 'chiave' che 'valore' sono stringhe, e valgono le seguenti proprieta': - non ci possono essere due associazioni per la stessa chiave; - le associazioni sono ordinate in base alla chiave. [Sulle chiavi (oggetti della classe String) e' definito il metodo "int compareTo(String s)" che resituisce un numero negativo se this precede lessicograficamente s, positivo nel caso contrario, e 0 se sono uguali. Infatti String implements Comparable.] Rappresentiamo astrattamente un vocabolario con n associazioni come ===================== chiave-1 -> valore-1 chiave-2 -> valore-2 ... chiave-n -> valore-n ==================== dove chiave-i < chiave-(i+1) per ogni 0 <= i < n. (1) Fornire (SCRIVENDO UN'INTERFACCIA JAVA) la specifica del tipo di dati astratto "Vocabolario" con le seguenti operazioni a) controllo se esiste una associazione per una data chiave b) ricerca di un valore in base alla chiave c) inserimento di una nuova associazione nel vocabolario d) cancellazione di una associazione dal vocabolario, in base alla chiave (2) La OVERVIEW del TdA e' quella fornita sopra al punto (0): copiarla in un commento. Per ogni metodo, oltre all'intestazione (scegliendo un nome informativo e indicando parametri formali e tipo del risultato), decidere quali eccezioni puo' lanciare e indicarle nell'intestazione. Fornire la specifica di ogni metodo, con le clausole REQUIRES, MODIFIES e EFFECTS. L'interfaccia deve compilare correttamemnte. In particolare, se si inserisce una associazione "key -> value" e esiste gia' una associazione per la chiave "key", la vecchia associazione deve essere sovrascritta. (3) Completata l'interfaccia, copiarla nel file "VocabolarioGe.java" e rendere generica la specifica usando i tipi generici Java. Il nuovo TdA si deve chiamare "VocabolarioGen" e rappresenta un Vocabolario come sopra, dove le chiavi sono sempre di tipo String ma i valori sono del tipo T. Cambiare con attenzione le operazioni, in modo consistente con la modifica da String a T del tipo dei valori. (4) Scambia i file che realizzano le specifiche, Vocabolario.java e VocabolarioGen.java, con il primo collega che trovi che (1) non abbia svolto l'esercizio con te (2) sia pronto a scambiare le specifiche con te. (5) Implementare le specifiche del collega, scegliendo rappresentazione concreta, definendo funzione di astrazione e invariante di rappresentazione, e implementando tutti i metodi secondo la specifica. Si suggerisce di implementare direttamente la versione generica. Interagire con il collega se si trovano errori, imprecisioni o ambiguita' nella sua specifica. Per la rappresentazione concreta del TdA, usare una delle classi di Java che implementano l'interfaccia List (si veda http:docs.oracle.com/javase/7/docs/api/java/util/List.html) per esempio Vector, LinkedList, ArrayList. Quindi il Vocabolario sara' una lista di associazioni, ordinate per chiave. Naturalmente si possono usare altre variabili d'istanza, se si vuole. (7) Controllare la correttezza dell'implementazione usando le asserzioni Java e un programma di test. (6) Dimostrare la correttezza dell'implementazione, e cioe': - che ogni metodo preservi l'invariante di rappresentazione - che ogni metodo sia implementato correttamente rispetto alla specifica. ===================================================================