Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoFrancesca Marrone Modificato 9 anni fa
1
Esercitazione 14 Marzo 2006
2
Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato al telefono: nome (di tipo String ) e numero di telefono (int) Definire un tipo di dato Elenco i cui oggetti descrivono collezioni (ordinate) di abbonati
3
Modo giusto di procedere Scegliere le variabili d’istanza che sono in grado di memorizzare le informazioni richieste Metterle private Implementare i metodi di conseguenza
4
Rappresentazione Privata Garantisce che il codice che usa - Elenco -Abbonato lo faccia tramite la loro interfaccia pubblica (metodi e costruttori della classe)
5
public class Abbonato{ private String nome; private int num; public Abbonato(String s,int n){ \\EFFECTS: crea un nuovo abbonato con nome s\\EFFECTS \\ e numero n nome=n; num=m; } public String nome(){ \\EFFECTS\\EFFECTS: restituisce il nome di this return nome; } public int numero(){ \\EFFECTS\\EFFECTS: restituisce il numero di this return num; }
6
\\ metodo overridden public boolean equals(Object o){ \\REQUIRES\\REQUIRES: o e’ di tipo Abbonato \\EFFECTS\\EFFECTS: restituisce true se this ed o sono uguali String x= ((Abbonato) o).nome; int y=((Abbonato) o).num; if (this.nome.equals(x) && this.num==y) {return true;} else {return false;} } NOTA: cast necessario perche’ il tipo apparente del parametro e’ Object ALTERNATIVA (OVERLOADING): public boolean equals(Abbonato o)
7
Elenco e’ una collezione di elementi di tipo Abbonato Gli Abbonati sono mantenuti all’interno dell’Elenco in modo ordinato rispetto al nome, ESEMPIO: (Francesca, 2867) <= (Marco, 133) Inoltre i numeri di telefono nell’elenco sono tutti diversi Va implementata usando l’interfaccia pubblica di Abbonato private String nome; ACCESSO PROIBITO private int num;
8
Per semplicita’ Facciamo vedere una versione non ordinata Implementiamo l’elenco usando una variabile di tipo Vector L’elenco e’ modificabile
9
public class Elenco{ //OVERVIEW: un Elenco e' una collezione (non ordinata) di Abbonati, // ognuno con un numero di telefono diverso private Vector persone; // memorizza l’elenco private static int proxnumero=1; // permette di generare nuovi numeri tel. public Elenco(){ \\EFFECTS: crea un nuovo elenco vuoto\\EFFECTS persone=new Vector(); }
10
public int cercanum(String s) { \\EFFECTS\\EFFECTS: restituisce il numero di telefono del primo abbonato presente in this che ha nome s, altrimenti restituisce 0 for (int j=0; j< persone.size();j++){ Abbonato a= (Abbonato) persone.elementAt(j); if (s.equals(a.nome()) ) {return a.numero();} } return 0; } cast necessari quando si leggono gli elementi del Vector per accedere alle informazioni dell’abbonato a bisogna usare l’interfaccia pubblica
11
public void inserisci(String s){ \\MODIFIES: this\\MODIFIES \\EFFECTS: aggiunge un nuovo Abbonato all’elenco (this)\\EFFECTS con nome s e con un nuovo numero di telefono Abbonato a=new Abbonato(s,proxnumero); proxnumero=proxnumero+1; persone.addElement(a); //inserimento non ordinato } public void rimuovi(String s){ \\MODIFIES: this\\MODIFIES \\EFFECTS: rimuove dall’elenco (this) tutti gli abbonati\\EFFECTS con nome s for (int j=0; j< persone.size();j++){ Abbonato a= (Abbonato) persone.elementAt(j); if (s.equals(a.nome()) ) persone.removeElementAt(j); //versione non ordinata }
12
public int cambia(String s, int x){ \\MODIFIES: this\\MODIFIES \\EFFECTS: se nell’elenco compare l’abbonato (s,x),\\EFFECTS rimpiazza il numero x con un nuovo numero di telefono y e lo restituisce for (int j=0; j< persone.size();j++){ Abbonato a= (Abbonato) persone.elementAt(j); if (s.equals(a.nome()) && x== a.numero()) {Abbonato nuovo=new Abbonato(s,proxnumero); persone.setElementAt(nuovo,j); // uso dell'interfaccia pubblica proxnumero=proxnumero+1; return nuovo.numero(); }} return 0;} public String toString(){ \\EFFECTS\\EFFECTS: standard String s="["; for (int j=0; j< persone.size();j++){ Abbonato a= (Abbonato) persone.elementAt(j); s= s + "(" + a.nome() + "," + a.numero() + ")";} return s + "]";}
13
Interfaccia Pubblica Elenco usa il tipo di dato Abbonato Sarebbe piu’ facile scrivere il codice di Elenco, accedendo alla rappresentazione di Abbonato
14
Esempio: metodo cambia Versione che usa solo l’interfaccia pubblica: Abbonato a= (Abbonato) persone.elementAt(j); if (s.equals(a.nome()) && x== a.numero()) {Abbonato nuovo=new Abbonato(s,proxnumero); persone.setElementAt(nuovo,j);} Versione che accede alle variabili: Abbonato a= (Abbonato) persone.elementAt(j); if (s.equals(a.nome) && x== a.num) {a.num=proxnumero;}
15
Interfaccia Pubblica Questo approccio e’ metodologicamente sbagliato Mantenere l’implementazione nascosta permette di -garantire proprieta’ del tipo di dato -rendere il codice che lo usa indipendente dalla sua implementazione
16
Esempio Se cambiassimo l’implementazione di Abbonato L’implementazione di Elenco scritta in base all’interfaccia pubblica continua a funzionare Le due implementazioni sono indipendenti Nell’altro modo ogni modifica del tipo di dato Abbonato richiederebbe di riprogettare anche Elenco
17
Esercizio Proposto Abbiamo visto: pila (Stack) di interi Mantiene gli elementi per ordine di inserimento (LIFO) Struttura dati analoga: coda (queue) Mantiene gli elementi per ordine di inserimento (FIFO)
18
Esempio Coda di elementi di tipo Intero: [8,5,9] - 9 e’ il primo elemento della coda (il primo arrivato) Se inseriamo l’elemento 3: [3,8,5,9] Se rimuoviamo il primo elemento: [3,8,5]
19
Per esempio: coda di interi isEmpty() serve per testare se la coda e’ vuota first() serve per leggere il primo elemento della coda, quello inserito per primo remove() rimuove il primo elemento della coda insert (int x) inserisce x nella coda come ultio elemento
20
Specifica (INTERFACCIA PUBBLICA) public class Coda { \\ OVERVIEW: una coda e’ una collezione di interi organizzati per ordine di inserimento con una politica FIFO. E’ modificabile public Coda () { \\ EFFECTS: costruisce una Coda Vuota } public boolean isEmpty() { \\ EFFECTS: se this e’ vuoto restituisce true, altrimenti false } public int first() { \\ REQUIRES: this non e’ vuoto \\ EFFECTS: restituisce il primo elemento di this }
21
public void remove() { \\ REQUIRES: this non e’ vuoto \\ MODIFIES: this \\ EFFECTS: se this non e’ vuoto rimuove il primo elemento} public void insert (int x) { \\ MODIFIES: this \\ EFFECTS: inserisce x nella coda (come ultimo elemento) } public void insertall (int[] a) { \\ MODIFIES: this \\ EFFECTS: inserisce gli elementi di a nella coda (dal primo all’ultimo) }
22
public boolean equals(Object o) { \\ REQUIRES: o e’ di tipo Coda \\ EFFECTS: restituisce true sse this ed o hanno gli stessi elementi} public String toString () { \\ EFFECTS: restituisce una stringa che descrive il contenuto di this, ovvero \\ la sequenza degli elementi }
23
Implementazione Simile a quella di Stack E’ meglio usare una variabile di tipo Vector per mantenere gli elementi private Vector coda; \\ rappresentazione privata
24
Rappresentazione Privata Non fa differenza dal punto di vista del codice che implementa Coda Ma solo dal punto di vista di chi usa il tipo di dato coda Dovete progettare anche una classe di procedure statiche che usano Coda
25
Specifica public class Proc { public static Coda add(Coda a, int x) { REQUIRES: a e’ diverso da null EFFECTS : restituisce una coda che e’ ottenuta da a, aumentando ogni elemento di x. Esempio: a=[4,3,9,1] e x=2 allora restituisce =[6,5,11,3] } public static int sum(Coda a) { REQUIRES: a e’ diverso da null EFFECTS : restituisce la somma degli elementi di a } public static Coda reverse(Coda a) { REQUIRES: a e’ diverso da null EFFECTS : restituisce una coda che e’ l’inverso di a Esempio: a=[4,3,9,1] allora restituisce =[1,9,3,4] }
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.