Algoritmi e strutture dati Esercitazione in laboratorio del 16 maggio 2002 1. Accendere il PC e collegarsi alla sessione di Windows 2000 2. Verificare la presenza del supporto minimo per Java a. jdk1.2 o successivo b. JCreator Lite v. 2.00 3. Far girare una piccola applicazione di prova (ad es.: stampa su console di “Ciao mondo!”) per assicurarsi che la macchina virtuale Java funzioni correttamente 4. Procurarsi la classe ConsoleReader (file ConsoleReader.java, disponibile sul sito Web del corso all’indirizzo http://www.dis.uniroma1.it/~damore/asd/listati/ConsoleReader/ConsoleReader. java.html) a. Trattasi di una classe per agevolare l’input da console, distribuita assieme al volume: C. S. Horstmann. Concetti di informatica e fondamenti di Java 2. Apogeo, 2000. b. Esaminarne la documentazione nonché i metodi disponibili i. readInt(), readDouble(), readLine() ecc. ii. esempio di uso (lettura di una stringa da console): ConsoleReader lettore = new ConsoleReader(System.in); String s = letore.readLine(); iii. Attenzione: la lettura di caratteri a 8 bit non funziona correttamente! c. Modificare la semplice applicazione di prova affinché utilizzi la classe ConsoleReader (ad es.: stampa di n volte “Ciao mondo!”, con n letto da tastiera) 5. Realizzare una semplice applicazione che, utilizzando un opportuno albero binario, consenta il gioco “Indovina l’animale”, in cui l’applicazione, tramite domande poste all’utente, tenta di indovinare il nome di un animale scelto dall’utente. L’applicazione (da console) utilizza un albero binario nei cui nodi interni sono memorizzate domande che essa potrà porre all’utente, sfruttandone le risposte (sì o no) per discendere nell’albero ed ottenere una nuova domanda da porre all’utente (ad es., per risposta “sì” scendere nel sottoalbero sinistro e per risposta “no” scendere in quello destro). In ciascuna foglia dell’albero è invece memorizzato il nome di un animale individuato dal percorso (univoco) radice – foglia, in maniera che l’animale sia caratterizzato dalle domande/risposte presenti in tale percorso. mammifero quadrupede cavallo pesce muggisce mucca cane marino sogliol a cobra anguilla Esempio: Quando, durante il gioco, l’applicazione giunge ad una foglia, essa propone il nome di animale ivi memorizzato. Se la risposta non è corretta, l’applicazione si arrende e: chiede all’utente il nome dell’animale che non è riuscita ad indovinare chiede all’utente la formulazione di una domanda che consenta di distinguere l’animale proposto da quello da indovinare. Se, ad esempio, l’applicazione giunge alla foglia “cane”, ma la risposta esatta era “gatto”, l’applicazione chiede una domanda utilizzabile per distinguere un gatto da un cane: l’utente potrebbe inserire il testo “miagola”. In tal caso l’applicazione dovrà modificare l’albero come segue: mammifero quadrupede cavallo pesce muggisce mucca miagola marino sogliol a cobra anguilla gatt cane o per l’inserimento di nuove informazioni esegue i seguenti In pratica, l’algoritmo passi: a. “stacca” la foglia b. inserisce al suo posto un nodo contenente la nuova domanda c. crea un nuovo nodo corrispondente alla risposta “sì” e contenente l’animale che non era riuscito ad indovinare; tale nodo diviene figlio “sì” del nodo domanda d. collega la foglia (scollegata al punto a.) al nodo inserito al punto b., rendendola figlio “no” del nodo domanda Si suggerisce di realizzare due classi ANode e ATree: la prima istanzia nodi, la seconda istanzia alberi. Ė opportuno realizzare anche una classe TestAnimali contenente il metodo main per l’avvio del programma. Coloro che non si sentano in grado di risolvere l’esercizio possono visualizzare uno schema astratto delle prime due classi, sebbene ciò sia altamente sconsigliato, cliccando sui collegamenti AbstractANode e AbstractATree. 6. Discutere la soluzione costruita e confrontare l’albero implementato con un albero binario di ricerca: quali le differenze e quali le affinità?