RUBRICA TELEFONICA ================== L'obiettivo e' scrivere una classe RubricaTelefonica che puo' contenere contatti della forma ( persona, telefono, eventuali_altre_informazioni ) Vengono utilizzate le classi: - Persona (descrive una persona) - Contatto (classe astratta che descrive un contatto) - ContattoAmico (classe concreta che estende Contatto e descrive un contatto per una persona amica) - RubricaTelefonica (descrive una rubrica telefonica) Generare la documentazione con javadoc: javadoc Persona.java Contatto.java ContattoAmico.java RubricaTelefonica.java Aprire con un browser il file index.html e vedere la documentazione. ESERCIZIO 1 (usa tutte le classi menzionate) ============================================ Consideriamo il seguente programma: ------- file Esercizio1.java ----------- public class Esercizio1 { public static void main(String[] args) { RubricaTelefonica miaRubrica = new RubricaTelefonica(); miaRubrica.addContatto(new ContattoAmico("Marco Antonio", "Ferrari", "075654","casa in montagna")); miaRubrica.addContatto(new ContattoAmico("Giovanni", "Di Lauro", "3335769")); miaRubrica.addContatto(new ContattoAmico("Laura", "Bianchi", "02576543","telefono della nonna")); miaRubrica.addContatto(new ContattoAmico("Laura", "Bianchi", "333123456", "cellulare") ); miaRubrica.addContatto(new ContattoAmico("Mario", "Rossi", "0234567") ); miaRubrica.addContatto(new ContattoAmico("Mario", "Rossi", "0234567") ); miaRubrica.addContatto(new ContattoAmico("Mario", "Rossi", "0234567", "terza copia!!!") ); }// end main }// end class ------------------------------------------- i) Scrivere nel file Esercizio1.java, dentro la classe Esercizio1, un metodo statico public static void stampa(RubricaTelefonica r) che stampa la rubrica r specificata dall'argomento nel seguente formato: RUBRICA: ... contatti ... (uno per linea) NUMERO CONTATTI: ...numero dei contatti... (vedere gli esempi sotto). Per stampare i contatti, usare il ciclo for-each (si ricordi che RubricaTelefonica implementa l'interfaccia Iterable). Per stampare il numero dei contatti, usare il metodo getNumeroContatti della classe RubricaTelefonica. ii) Aggiungere nel main una chiamata al metodo stampa per stampare miaRubrica. Deve essere stampato: RUBRICA: Marco Antonio Ferrari 075654 casa in montagna Giovanni Di Lauro 3335769 Laura Bianchi 02576543 telefono della nonna Laura Bianchi 333123456 cellulare Mario Rossi 0234567 Mario Rossi 0234567 Mario Rossi 0234567 terza copia!!! NUMERO CONTATTI: 7 iii) Come si nota dalla stampa, nella rubrica e' stato inserito tre volte il contatto (Mario,Rossi,0234567) (si ricordi che, in base alla definizione di uguaglianza data, il terzo contatto relativo a Mario Bianchi e' uguale ai primi due). Questo viola la richiesta fatta nella specifica che nella rubrica non sono ammessi duplicati. Correggere il codice in modo che non vengano inseriti i duplicati (leggere con attenzione la specifica del metodo contains dell'intefaccia Collection riportata nella documentazione della classe RubricaTelefonica). Deve essere stampato: RUBRICA: Marco Antonio Ferrari 075654 casa in montagna Giovanni Di Lauro 3335769 Laura Bianchi 02576543 telefono della nonna Laura Bianchi 333123456 cellulare Mario Rossi 0234567 NUMERO CONTATTI: 5 iv) Ordinare miaRubrica usando il metodo ordina della classe RubricTelefonica e stamparla. La stampa deve produrre: Laura Bianchi 02576543 telefono della nonna Laura Bianchi 333123456 cellulare Giovanni Di Lauro 3335769 Marco Antonio Ferrari 075654 casa in montagna Mario Rossi 0234567 NUMERO CONTATTI: 5 Si noti che i contatti relativi a Laura Bianchi sono nell'ordine richiesto (la stringa 02576543 precede 333123456). ----------------- NOTA ==== Nei prossimi esercizi, per stampare la rubrica usare il metodo stampa definita nell'Esercizio 1 (il codice del metodo va copiato ogni volta nel file che contiene il metodo main). ESERCIZIO 2 =========== Aggiungere alla classe RubricaTelefonica i seguenti metodi: - public void cancellaContatto (Contatto cont) Elimina dalla rubrica, se c'e', il contatto uguale al contatto specificato dall'argomento (per le ipotesi fatte, esiste al piu' un contatto uguale a cont). - public void cancellaPersona(Persona p) Elimina dalla rubrica tutti i contatti relativi alla persona specificata dall'argomento. - public void cancellaTutto() Elimina dalla rubrica tutti i contatti. Tenere presente che: 1) L'interfaccia List definisce un metodo boolean remove(Object o) che cancella dalla lista la prima occorrenza dell'oggetto specificato dall'argomento. Il confronto fra un elemento della lista e l'oggetto da eliminare viene effettuato usando il metodo equals della classe Object (come avviene per il metodo contains). Il metodo restituisce true se un oggetto e' stato cancellato, false altrimenti (questa informazione va usata per sapere se il campo numeroContatti della classe RubricaTelefonica va decrementato). Il metodo e' dichiarato in List come "optional operation". Questo significa che non tutte le classi che implementano l'interfaccia List lo implementano! Va controllato. 2) Leggere con attenzione nella documentazion della classe RubricaTelefonica la nota sulla cancellazione di oggeti in una collezione. Consideriamo il seguente programma: ------- file Esercizio2.java ----------- public class Esercizio2 { // stampa la rubrica r public static void stampa(RubricaTelefonica r){ .... } public static void main(String[] args) { RubricaTelefonica miaRubrica = new RubricaTelefonica(); miaRubrica.addContatto(new ContattoAmico("Marco Antonio", "Ferrari", "075654","casa in montagna")); miaRubrica.addContatto(new ContattoAmico("Giovanni", "Di Lauro", "3335769")); miaRubrica.addContatto(new ContattoAmico("Laura", "Bianchi", "02576543","telefono della nonna")); miaRubrica.addContatto(new ContattoAmico("Laura", "Bianchi", "333123456", "cellulare") ); miaRubrica.addContatto(new ContattoAmico("Mario", "Rossi", "0234567") ); stampa(miaRubrica); miaRubrica.cancellaContatto(new ContattoAmico("Marco", "Ferrari", "075654")); miaRubrica.cancellaContatto(new ContattoAmico("Marco Antonio", "Ferrari", "075654")); stampa(miaRubrica); miaRubrica.cancellaPersona(new Persona("Giovanni","Bianchi")); miaRubrica.cancellaPersona(new Persona("Laura","Bianchi")); stampa(miaRubrica); miaRubrica.cancellaTutto(); stampa(miaRubrica); }// end main }// end class ----------------------------------------- Deve essere stampato: RUBRICA: Marco Antonio Ferrari 075654 casa in montagna Giovanni Di Lauro 3335769 Laura Bianchi 02576543 telefono della nonna Laura Bianchi 333123456 cellulare Mario Rossi 0234567 NUMERO CONTATTI: 5 RUBRICA: Giovanni Di Lauro 3335769 Laura Bianchi 02576543 telefono della nonna Laura Bianchi 333123456 cellulare Mario Rossi 0234567 NUMERO CONTATTI: 4 RUBRICA: Giovanni Di Lauro 3335769 Mario Rossi 0234567 NUMERO CONTATTI: 2 RUBRICA: NUMERO CONTATTI: 0 ESERCIZIO 3 =========== Implementare la classe public class ContattoLavoro extends Contatto che descrive un contatto per un collega di lavoro. Il contatto ha la forma (persona,telefono,ufficio) dove ufficio e' un numero intero che rappresenta il numero di ufficio. Per rappresentare l'ufficio definire il campo private int ufficio; La classe deve avere i seguenti costruttori, che costruiscono un contatto in base al valore specificato dagli argomenti: - public ContattoLavoro (Persona persona, String tel, int ufficio) - public ContattoLavoro (String nome, String cognome, String tel, int ufficio) La classe deve possedere il metodo - public int getUfficio() Restituisce il numero d'ufficio. Il metodo toString va riscritto in modo che venga aggiunto il numero d'ufficio alla stringa restituita dal metodo toString della superclasse. La classe eredita tutti gli i metodi delle classe Object e Contatto non riscritti. Scrivere un programma Esercizio3 che costruisce la seguente rubrica: RubricaTelefonica miaRubrica = new RubricaTelefonica(); miaRubrica.addContatto(new ContattoAmico("Marco Antonio", "Ferrari", "075654","casa in montagna")); miaRubrica.addContatto(new ContattoLavoro("Marco Antonio", "Ferrari", "021345", 121)); miaRubrica.addContatto(new ContattoLavoro("Marco Antonio", "Ferrari", "021345", 122)); miaRubrica.addContatto(new ContattoAmico("Giovanni", "Di Lauro", "3335769")); miaRubrica.addContatto(new ContattoAmico("Laura", "Bianchi", "02576543","telefono della nonna")); miaRubrica.addContatto(new ContattoAmico("Laura", "Bianchi", "333123456", "cellulare") ); miaRubrica.addContatto(new ContattoLavoro("Laura", "Bianchi", "0575664", 212) ); miaRubrica.addContatto(new ContattoAmico("Mario", "Rossi", "0234567") ); miaRubrica.addContatto(new ContattoAmico("Mario", "Rossi", "0234567") ); miaRubrica.addContatto(new ContattoAmico("Mario", "Rossi", "0234567", "terza copia!!!") ); miaRubrica.addContatto(new ContattoLavoro("Anna Maria", "Verdi", "0233343", 11) ); miaRubrica.addContatto(new ContattoLavoro("Anna Maria", "Verdi", "053654", 11) ); miaRubrica.addContatto(new ContattoLavoro("Mario", "Rossi", "0234567",34) ); i) Ordinare la rubrica e stamparla usando il metodo stampa definito nell'Esercizio 1. Deve essere stampato: RUBRICA: Laura Bianchi 02576543 telefono della nonna Laura Bianchi 0575664 212 Laura Bianchi 333123456 cellulare Giovanni Di Lauro 3335769 Marco Antonio Ferrari 021345 121 Marco Antonio Ferrari 075654 casa in montagna Mario Rossi 0234567 Anna Maria Verdi 0233343 11 Anna Maria Verdi 053654 11 NUMERO CONTATTI: 9 Si noti che i duplicati non sono stati inseriti. ii) Stampare i contatti relativi ad amici e i contatti di lavoro nella rubrica (usare due cicli for-each). Deve essere stampato: CONTATTI AMICI: Laura Bianchi 02576543 telefono della nonna Laura Bianchi 333123456 cellulare Giovanni Di Lauro 3335769 Marco Antonio Ferrari 075654 casa in montagna Mario Rossi 0234567 CONTATTI LAVORO: Laura Bianchi 0575664 212 Marco Antonio Ferrari 021345 121 Anna Maria Verdi 0233343 11 Anna Maria Verdi 053654 11 iii) Stampare l'elenco delle persone nella rubrica. Dato che una persona puo' comparire piu' volte nella rubrica, occorre prima creare una collezione in cui vanno inserite una sola volta le persone che compaiono nella rubrica. Deve essere stampato: PERSONE: Laura Bianchi Giovanni Di Lauro Marco Antonio Ferrari Mario Rossi Anna Maria Verdi ESERCIZIO 4 =========== Scrivere un programma Esercizio4 che legge da standard input un elenco di contatti relativi a amici o a colleghi di lavoro, li inserisce in una rubrica ed effettua le operazioni di stampa richieste nell'Esercizio 3. Una linea di input ha la forma A;nome;cognome;telefono oppure A;nome;cognome;telefono;descrizione oppure L;nome;cognome;telefono;ufficio Nei primi due casi viene inserito un contatto amico, nell'ultimo caso un contatto di lavoro. Il carattere ';' puo' essere usato esclusivamente per separare gli elementi su una linea di input. Come al solito, per provare l'esempio conviene scrivere l'input in un file, ad esempio in4.txt (attenzione a non lasciare linee vuote!), e poi redirigere lo standard input: java Esercizio4 < in4.txt ESEMPIO DI ESECIZIONE --------------------- Supponiamo che le linee sullo standard input siano: A;Vittorio;Zerbini;564334 A;Antonio Giuseppe;Abate;3336759823;cellulare azienda A;Antonio Giuseppe;Abate;33389765;cellulare personale L;Vittorio;Zerbini;0212345;123 A;Mario;Bianchi;053345699;recapito fine settimana A;Ugo;Ferrari;3336967856 A;Mario;Bianchi;02345699 A;Mario;Bianchi;02345699 A;Mario;Bianchi;02345699;altro duplicato che non deve essere inserito A;Mario;Bianchi;3335638766 L;Antonio;Rossi;0226746;11 A;Antonio;Rossi;3336784 L;Antonio;Rossi;0745362;11 A;Giovanni;Della Rovere;037223678 L;Antonio;Rossi;0745362;11 L;Antonio;Rossi;0745362;12 A;Giuseppina Maria;D'Avanzo;02565695;casa a Milano (da lunedi' a venerdi', escluso festivi) A;Margherita Giovanna;Delle Foglie;383454321;email: margio@hotmail.com Deve essere stampato: RUBRICA: Antonio Giuseppe Abate 3336759823 cellulare azienda Antonio Giuseppe Abate 33389765 cellulare personale Mario Bianchi 02345699 Mario Bianchi 053345699 recapito fine settimana Mario Bianchi 3335638766 Giuseppina Maria D'Avanzo 02565695 casa a Milano (da lunedi' a venerdi', escluso festivi) Giovanni Della Rovere 037223678 Margherita Giovanna Delle Foglie 383454321 email: margio@hotmail.com Ugo Ferrari 3336967856 Antonio Rossi 0226746 11 Antonio Rossi 0745362 11 Antonio Rossi 3336784 Vittorio Zerbini 0212345 123 Vittorio Zerbini 564334 NUMERO CONTATTI: 14 CONTATTI AMICI: Antonio Giuseppe Abate 3336759823 cellulare azienda Antonio Giuseppe Abate 33389765 cellulare personale Mario Bianchi 02345699 Mario Bianchi 053345699 recapito fine settimana Mario Bianchi 3335638766 Giuseppina Maria D'Avanzo 02565695 casa a Milano (da lunedi' a venerdi', escluso festivi) Giovanni Della Rovere 037223678 Margherita Giovanna Delle Foglie 383454321 email: margio@hotmail.com Ugo Ferrari 3336967856 Antonio Rossi 3336784 Vittorio Zerbini 564334 CONTATTI LAVORO: Antonio Rossi 0226746 11 Antonio Rossi 0745362 11 Vittorio Zerbini 0212345 123 PERSONE: Antonio Giuseppe Abate Mario Bianchi Giuseppina Maria D'Avanzo Giovanni Della Rovere Margherita Giovanna Delle Foglie Ugo Ferrari Antonio Rossi Vittorio Zerbini