Esercitazione 14 Marzo 2006. Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Tipi di dato astratti Lista, Pila, Coda, Albero.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
29 febbraio 2008 Progettare tipi di dato astratti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Metodologie di Programmazione = decomposizione basata su astrazioni
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Nota (rif. alla lezione precedente): Vector vs ArrayList Le classi generiche Vector e ArrayList sono sostanzialmente equivalenti, ma: I metodi.
1 Un esempio con iteratore: le liste ordinate di interi.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Liste di Interi Esercitazione. IntList Lista di interi Problema tipico: memorizzare una sequenza di valori [6,0,9,3….9] Vediamo un tipo di dato utile.
Compitino del 2004 Alberi Generici. Idea Si vuole un tipo di dato astratto che definisca una struttura ad albero in cui nodi e foglie hanno associato.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
1 Gerarchie e polimorfismo: liste. 2 Generalizzare le liste di interi  List 4 lista di oggetti –non modificabile 4 vorremo poi definire un sottotipo.
Esercitazione Object, Vettori, Liste. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo lo.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
1 Astrazione sul controllo: gli iteratori. 2 Gli iteratori 4 perché vogliamo iterarare “in modo astratto” 4 iteratori e generatori in Java –specifica.
LIP: 9 Maggio Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni.
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
1 Un esempio: le liste ordinate di interi. 2 Liste ordinate  OrderedIntList 4 lista ordinata di interi –modificabile.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
LIP: 8 Marzo 2005 Vettori. Abbiamo visto L’uso di Vector come alternativa all’uso di arrays Rivediamo l’esercizio dell’altra volta.
Esercitazione del 7 marzo 2008 Ereditarieta’. Esercizio: soluzione Implementare la seguente specifica che definisce un tipo di dato Libro.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
Ese 3 (del 31 Marzo 2004). Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare.
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
1 Le s-espressioni. 2  Sexpr 4 alberi binari (possibilmente “vuoti”) che hanno sulle foglie atomi (stringhe) 4 sono la struttura dati base del linguaggio.
Esercizio 3. Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare i commenti.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
Primo Compitino Terzo Esercizio Implementare il tipo di dato astratto Table un oggetto di tipo Table ha due colonne e un numero variabile di righe.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
Alcune Classi Standard Object, Vettori. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 Abbiamo visto come si definiscono insiemi di stringhe, insiemi di interi, insiemi di caratteri, etc.
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
LIP: 18 Aprile 2008 Interfacce. Rappresentazione Lista val next vuota Lista vuota: any true Lista non vuota: any true 154 false 24 false.
Ex.1 - Astrazioni su Dati Si abbia il tipo di dato stack di interi, IntStack, specificato sotto: public class IntStack { \\ OVERVIEW: uno Stack è una collezione.
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

Esercitazione 14 Marzo 2006

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

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

Rappresentazione Privata Garantisce che il codice che usa - Elenco -Abbonato lo faccia tramite la loro interfaccia pubblica (metodi e costruttori della classe)

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; }

\\ 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)

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;

Per semplicita’ Facciamo vedere una versione non ordinata Implementiamo l’elenco usando una variabile di tipo Vector L’elenco e’ modificabile

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(); }

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

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 }

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 + "]";}

Interfaccia Pubblica Elenco usa il tipo di dato Abbonato Sarebbe piu’ facile scrivere il codice di Elenco, accedendo alla rappresentazione di Abbonato

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;}

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

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

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)

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]

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

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 }

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) }

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 }

Implementazione Simile a quella di Stack E’ meglio usare una variabile di tipo Vector per mantenere gli elementi private Vector coda; \\ rappresentazione privata

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

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] }