Laboratorio 9

Interfacce e classi di utilita` generale
Nello svolgimento degli esercizi si potranno utilizzare alcune classi, interfacce ed eccezioni generiche che sono state presentate a lezione e che non fanno parte della libreria standard.
  • Interfacce ed eccezioni
    • Il file Container.java contiene il codice dell'interfaccia Container, la quale definisce un contenitore astratto di oggetti.
    • Il file Dictionary.java contiene il codice dell'interfaccia Dictionary, la quale estende Container e definisce il tipo di dato astratto Dizionario. Il file contiene inoltre il codice della classe (eccezione) DictionaryItemNotFoundException.
    • Il file Set.java contiene il codice dell'interfaccia Set, la quale estende Container e definisce il tipo di dato astratto Insieme.
    • Il file SortedSet.java contiene il codice dell'interfaccia SortedSet, la quale estende Set e definisce il tipo di dato astratto Insieme Ordinato.
  • Classi
    • Il file ArrayDictionary.java contiene il codice della classe ArrayDictionary, la quale implementa Dictionary usando un array riempito solo in parte e ridimensionabile. La classe definisce inoltre una classe interna Pair.
    • Il file SortedArrayDictionary.java contiene il codice della classe SortedArrayDictionary, la quale estende ArrayDictionary usando un array ordinato riempito solo in parte e ridimensionabile
    • Il file ArraySet.java contiene il codice della classe ArraySet, la quale implementa Set usando un array riempito solo in parte e ridimensionabile.
    • Il file ArraySortedSet.java contiene il codice della classe ArraySortedSet, la quale implementa SortedSet usando un array ordinato riempito solo in parte e ridimensionabile.
Consigli per la prova di programmazione
Datevi delle priorita`. I vostri obiettivi principali devono essere i seguenti:
  1. Prima di tutto, realizzare un programma che rispetti le specifiche (senza fare cose in piu` o diverse).
    • Leggete sempre con grande attenzione le specifiche, perche` risolvere (eventualmente bene) un problema diverso da quello richiesto non serve a niente
    • Se ad esempio il problema chiede di realizzare un metodo statico, bisogna realizzare un metodo statico!
    • Se individuate una soluzione "migliore" che non usa un metodo statico... e` sbagliata!
  2. Scrivere codice che compili correttamente.
    • Per cominciare, quando scrivete una classe scrivete prima le firme di tutti i metodi, provvisti di corpi "fittizi": in questo modo il codice compilera` correttamente fin dall'inizio del vostro lavoro.
    • Per i metodi che restituiscono un valore void scrivete un corpo fittizio "vuoto" {}
    • Per i metodi che restituiscono valori non void scrivete un corpo fittizio contenente solo un enunciato di return: ad esempio {return 0;} per metodi che restituiscono valori numerici o char, {return false;} per metodi che restituiscono valori booleani, {return null;} per metodi che restituiscono riferimenti ad oggetti
    • Compilate molto spesso il vostro codice mentre lo scrivete. Ad esempio, effettuate una compilazione ogni volta che scrivete il corpo di un metodo. In questo modo eviterete (forse...) di trovarvi nella situazione in cui il compilatore segnala molti errori
  3. Scrivere codice che esegua correttamente. Concentratevi prima sulla realizzazione di un prototipo funzionante nel rispetto delle specifiche.
    • Verificate accuratamente il funzionamento del programma, soprattutto in eventuali situazioni limite. Per velocizzare il collaudo si possono preparare file di input da usare con la redirezione
    • Dopo aver realizzato un prototipo funzionante, fatene una copia cosi` da poter ripristinare in ogni momento una versione corretta
    • Se modificate il programma, ri-effettuate un collaudo dopo ogni modifica
    • Se non riuscite a far funzionare la modifica, ripristinate la situazione corretta usando la versione funzionante precedentemente salvata
Cercate di raggiungere questi tre obiettivi principali nell'ordine in cui sono stati discussi. In particolare cercate di produrre codice che almeno compila.
Una volta raggiunti gli obiettivi principali potete perseguire alcuni obiettivi secondari. In particolare, scrivere codice che
  1. sia efficiente: se avete usato un algoritmo di complessita` O(n2) e ve ne viene in mente uno di complessita` O(n log n), potete provare a realizzare quest'ultimo (avendo cura di salvare il lavoro gia` fatto!)
  2. gestisca coerentemente gli errori (tramite l'aggiunta di enunciati try/catch che consentano di catturare le principali eccezioni che potrebbero essere lanciate)
  3. rispetti regole stilistiche e contenga commenti
Per lo svolgimento della prova di programmazione sara` consentito l'uso di alcune classi della libreria standard che verranno specificate nel testo di esame
  • La documentazione della libreria standard sara` consultabile per tutta la durata della prova
  • Si trova sul sito dell'Aula Didattica Taliercio (seguite i link "Guide on-line", "Java 5 docs", "Java 2 Platform API Specification")
  • Saper consultare rapidamente la documentazione in linea nel sito dell'ADT e` molto importante: questa sara` la sola documentazione disponibile

Esercizio 0

Questionario di autovalutazione: risposte e statistiche

Esercizio 1

Argomento (ripasso): uso di tipi di dati astratti, dizionari

Dopo averle studiate, si effettui un semplice collaudo delle classi ArrayDictionary e SortedArrayDisctionary, usando la classe SimpleDictionaryTester.java. Notare come viene realizzata la fase di creazione di un dizionario leggendo dati da file, e come vengono realizzate le operazioni di ricerca e rimozione di coppie dal dizionario.
Il collaudo puo` essere effettuato usando il file coppie.txt.

Esercizio 2

Argomento (ripasso): uso di tipi di dati astratti, insiemi

Dopo averle studiate, si effettui un semplice collaudo delle classi ArraySet e ArraySortedSet, usando la classe SimpleSetTester.java. Notare che questa classe contiene metodi statici per effettuare l'unione, l'intersezione e la differenza tra insiemi, ed inoltre contiene un metodo statico per effettuare l'unione tra insiemi ordinati.
Il collaudo puo` essere effettuato usando i file ins1.txt e ins2.txt.

Esercizio 3 - Temi d'esame

Argomento: preparazione alla prova di programmazione

Attenzione: nei testi dei temi d'esame si fa riferimento alla possibilita` di utilizzare la classe StringTokenizer, che quest'anno non e` stata trattata in quanto obsoleta e sostituita dalla classe Scanner. Le soluzioni proposte non fanno uso di StringTokenizer

Tema 1 Tema 2 Tema 3 Tema 4 Tema 5 Tema 6