LABORATORIO 9 - IMPLEMENTAZIONE DI CLASSI ========================================= Seguire i seguenti passi: I) Definire l'interfaccia pubblica a. identificare i metodi da mettere a disposizione b. per ogni metodo: - il tipo del valore restituito (es. void, double, ...) - il nome del metodo - l'elenco delle variabili paramentro del metodo (se ce ne sono) con i loro tipi (es. String nome) II) Definire i campi e i costruttori III) Documentare classe e metodi secondo il formato standard di javadoc: - prima della dichiarazione della classe un commento sulla classe - prima di ogni metodo un commento sullo scopo del metodo stesso - dopo il commento sullo scopo: - per ogni parametro un commento che inizia con @param - per ogni valore restituito un commento che inizia con @return - lanciare javadoc Menu.java per produrre la documentazione IV) Dichiarare i campi o variabili di istanza. V) Implementare i costruttori e i metodi della classe uno alla volta, compilando spesso VI) Realizzare una classe Tester per collaudare la classe E` opportuno fare le fasi V e VI in parallelo, realizzando man mano, per ogni costruttore e metodo della classe, il codice nel Tester per collaudarlo. ___________________________________________________________________ Esercizio 1 - classe NumeroComplesso ------------------------------------ Progettare e implementare una classe NumeroComplesso le cui istanze siano numeri complessi della forma a + ib dove a (parte reale) e b (coefficiente della parte immaginaria) sono valori di tipo double. La classe deve avere: - un costruttore per creare un'istanza di NumeroComplesso di cui sono specificati la parte reale e il coefficiente della parte immaginaria - un costruttore per creare un'istanza di NumeroComplesso di cui e` specificata solo la parte reale L'implementazione della classe deve comprendere i seguenti metodi: * NumeroComplesso piu(NumeroComplesso compl). Restituisce la somma fra questo numero complesso (ossia, il numero che esegue il metodo) e il numero complesso specificato dal parametro. Nota: (a + ib) + (c + id) = (a + c) + i(b + d) * NumeroComplesso per(NumeroComplesso compl) Restituisce il prodotto fra questo numero complesso e il numero complesso specificato dal parametro. Nota: (a + ib) * (c + id) = (ac - bd) + i(ad + bc) * eventuali altri metodi accessori ritenuti necessari. Test di NumeroComplesso Scrivere una classe NumeroComplessoTester che legge da linea di comando due numeri complessi, ne calcola somma e prodotto e stampa la sequenza dei numeri letti, la somma e il prodotto. I due numeri complessi vengono forniti specificando i valori a, b, c, d, dove a e b rappresentano rispettivamente la parte intera e il coefficiente della parte immaginaria del primo numero complesso e c e d rappresentano rispettivamente la parte intera e il coefficiente della parte immaginaria del secondo numero complesso. ESEMPIO ------- Il comando java NumeroComplessoTester 0.5 0.1 1.3 2 deve produrre il seguente output: Numeri inseriti: 0.5 + i0.1 1.3 + i2.0 Somma: 1.8 + i2.1 Prodotto: 0.45 + i1.13 ___________________________________________________________________ Esercizio 2 - classe Conto Bancario ---------------------------------- Realizzare una classe Conto. Un conto e` descritto dal saldo. La classe deve permettere di - creare un conto senza deposito iniziale, - creare un conto con un deposito iniziale, - versare - prelevare - chiedere il saldo Scrivere una classe ContoTester per collaudare la classe testando ciascun metodo e costruttore. ___________________________________________________________________ Esercizio 3 - classe Robot -------------------------- Progettare e implementare una classe Robot le cui istanze siano robot caratterizzati dall'essere accesi o spenti, da una coppia di interi che specifica le coordinate della loro posizione sul piano cartesiano e dalla direzione di marcia, dove le possibili direzioni sono quattro: Nord, Est, Sud, Ovest. La classe deve essere progettata in modo che: - La creazione di un'istanza di Robot avvenga specificando * due interi (coordinate x e y); in questo caso si assume che il robot sia spento; * un booleano (acceso) e due interi (coordinate x e y); La direzione di marcia del robot inizialmente e` verso Nord. - L'implementazione della classe deve comprendere i seguenti metodi: * accendi() mette lo stato di accensione del robot a true; * spegni() mette lo stato di accensione del robot a false; * avanti(int) aggiorna eventualmente (solo se e` acceso) le coordinate della posizione del robot * aDestra() fa ruotare eventualmente il robot di 90 gradi in senso orario, modificando la direzione di marcia. * aSinistra() fa ruotare eventualmente l'auto di 90 gradi in senso antiorario, modificando la direzione di marcia. * toString() produce una descrizione dello stato del robot * eventuali altri metodi accessori ritenuti necessari. Test di Robot Scrivere una classe RobotTester che crea un Robot e gli fa eseguire i seguenti comandi (oppure che li legge da un file, vedi sotto) - accendere - avanzare di 4 - girare a destra - avanzare di 2 - girare a destra - avanzare di 1 - girare a destra - avanzare di 1 - spegnere - avanzare di 5 - girare a sinistra - accendere - avanzare di 2 - girare a sinistra - avanzare di 3 - spegnere Il programma deve stampare l'azione e lo stato del robot dopo ogni comando. Ad esempio: On --> robot acceso in (0,0) verso N A 4 --> robot acceso in (0,4) verso N D --> robot acceso in (0,4) verso E A 2 --> robot acceso in (2,4) verso E D --> robot acceso in (2,4) verso S A 1 --> robot acceso in (2,3) verso S D --> robot acceso in (2,3) verso W A 1 --> robot acceso in (1,3) verso W Off --> robot spento in (1,3) verso W A 5 --> robot spento in (1,3) verso W S --> robot spento in (1,3) verso W On --> robot acceso in (1,3) verso W A 2 --> robot acceso in (-1,3) verso W S --> robot acceso in (-1,3) verso S A 3 --> robot acceso in (-1,0) verso S Off --> robot spento in (-1,0) verso S dove 'A' e` sempre separata dall'intero che segue con un solo spazio e A sta per avanti S sta per sinistra D sta per destra On sta per accendi Off sta per spegni In alternativa, per testare il Robot, scrivere una classe RobotTester che legge da standard input una sequenza di righe della forma: On A 4 D A 2 D A 1 D A 1 Off A 5 S On A 2 S A 3 Off Vale la pena di salvare i comandi in un file e leggerli da li' ridirigendo il file su standard input. ___________________________________________________________________ Esercizio 4 - classe Menu ------------------------- Realizzare una classe Menu. Un menu e` descritto dalla lista delle opzioni disponibili. La classe deve permettere di definire e visualizzare menu del tipo: 1) Crea un nuovo account 2) Fai log-in in un account esistente 3) Help 4) Esci La classe deve permettere di - creare un menu privo di opzioni - aggiungere un'opzione alla fine del menu - aggiungere un'opzione in un punto del menu - visualizzare il menu Scrivere una classe MenuTester per collaudare la classe testando ciascun metodo e costruttore. ___________________________________________________________________ Esercizio 5 - classe Persona - c.f. cognome ------------------------------------------- Il codice fiscale personale, cioe' delle persone fisiche, e' composto da 16 caratteri alfanumerici, ricavati in base al cognome, nome, sesso, data e luogo di nascita. In particolare i primi tre caratteri sono ricavati dal cognome secondo il seguente algoritmo: - Se il cognome ha almeno 3 consonanti, prendere le prime 3 consonanti nel loro ordine. Ad esempio: Rossi ---> RSS De la Rosa ---> DLR Dell'Olmo ---> DLL Si noti che gli spazi nel cognome "De la Rosa", cosi' come l'apostrofo nel cognome "Dell'Olmo" non vengono presi in considerazione. - Se le consonanti nel cognome sono meno di tre, si prelevano anche le vocali, sempre nel loro ordine, per aggiungerle dopo le consonanti, quante bastano a formare una sequenza di 3 caratteri. Ad esempio: Elmi ---> LME Api ---> PAI De Buoi ---> DBE L'Aiuole ---> LLA - Nel caso in cui un cognome abbia meno di tre lettere, la parte di codice viene completata aggiungendo la lettera X. Ad esempio: Fo ---> FOX Re ---> REX Scrivere una classe Persona i cui oggetti sono caratterizzati da un cognome, che disponga dei metodi: - public String codCognome() che restituisce i primi tre caratteri del codice fiscale della persona - private static boolean isVocale(char c) che restituisce true se il carattere c e' una vocale, false altrimenti. Perche' e` un metodo statico? Suggerimento: lavorare fin dall'inizio in UpperCase per semplificare il compito. Testare la classe con un programma che legge da standard input una sequenza di cognomi, uno per riga, e per ciascuno stampa i primi tre caratteri del codice fiscale (vedi es sotto). Esempi di esecuzione --------------------- Se l'input e': Verdi De la Rosa Dell'Olmo Elmi Api L'Api Le Api L'Aiuole De L'Aiuole De Le Aiuole De L'Aia Boa Bo L'output deve essere: Verdi ---> VRD De la Rosa ---> DLR Dell'Olmo ---> DLL Elmi ---> LME Api ---> PAI L'Api ---> LPA Le Api ---> LPE L'Aiuole ---> LLA De L'Aiuole ---> DLL De Le Aiuole ---> DLL De L'Aia ---> DLE Boa ---> BOA Bo---> BOX