1 Un esempio con iteratore: le liste ordinate di interi.

Slides:



Advertisements
Presentazioni simili
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Advertisements

LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
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.
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.
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Esercizi su alberi binari
tipo astratto, implementazione, algoritmi
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su alberi binari
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.
Alberi binari Definizione della struttura dati: struct tree { };
Astrazione procedurale ed eccezioni
1 Un esempio con iteratore: le liste ordinate di interi.
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 non vogliamo definire versioni differenti dell’astrazione corrispondente ad una collezione di elementi.
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.
Specifiche. Scopo e significato delle specifiche (1) Lo scopo di una specifica è di definire il comportamento di un ’ astrazione. Gli utenti si baseranno.
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.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
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.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
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.
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.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
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 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
Esercizi iteratori. Matrice import java.util.Iterator; public class MatrixIterator implements Iterator { private Matrix matrix; private int currentRow.
1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 Abbiamo visto come si definiscono insiemi di stringhe, insiemi di interi, insiemi di caratteri, etc.
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:

1 Un esempio con iteratore: le liste ordinate di interi

2 Le liste ordinate  OrderedIntList 4 lista ordinata di interi –modificabile 4 problema: con i metodi forniti non possiamo accedere agli elementi 4 essenziale la presenza di un iteratore 4 aggiungiamolo

3 Specifica di OrderedIntList 1 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j // costruttore public OrderedIntList () // EFFECTS: inizializza this alla lista vuota // metodi public void addEl (int el) throws DuplicateException // MODIFIES: this // EFFECTS: aggiunge el a this, se el non occorre in // this, altrimenti solleva DuplicateException public void remEl (int el) throws NotFoundException // MODIFIES: this // EFFECTS: toglie el da this, se el occorre in // this, altrimenti solleva NotFoundException

4 Specifica di OrderedIntList 2 public boolean isIn (int el) // EFFECTS: se el appartiene a this ritorna // true, altrimenti false public boolean isEmpty () // EFFECTS: se this è vuoto ritorna true, altrimenti // false public int least () throws EmptyException // EFFECTS: se this è vuoto solleva EmptyException // altrimenti ritorna l’elemento minimo in this public Iterator smallToBig () // EFFECTS: ritorna un generatore che produrrà gli // elementi di this (come Integers), in ordine // crescente // REQUIRES: this non deve essere modificato finché // il generatore è in uso public boolean repOk () public String toString () }

5 Specifica di OrderedIntList 3 public class OrderedIntList { public OrderedIntList () public void addEl (int el) throws DuplicateException public void remEl (int el) throws NotFoundException public boolean isIn (int el) public boolean isEmpty () public int least () throws EmptyException public Iterator smallToBig () public boolean repOk () public String toString ()} 4 senza l’iteratore, non ci sarebbe nessuna operazione per accedere gli elementi  DuplicateException e NotFoundException checked

6 Implementazione con un albero binario di ricerca public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; 4 la rep contiene –una variabile boolean che ci dice se la lista è vuota –la variabile intera che contiene l’eventuale valore dell’elemento –due (puntatori a) OrderedIntList s che contengono la lista di quelli minori e quelli maggiori, rispettivamente 4 implementazione ricorsiva

7 Come è fatta una OrderedIntList 12F F 4 F FF T TF T T T T T

8 Come implementare il generatore? 4 Dobbiamo generare i valori in ordine crescente 4 Dobbiamo seguire una strategia di visita dell’albero in ordine simmetrico 4 visitando nell’ordine il sottoalbero sinistro (prima), poi la radice (val) e poi il sottoalbero destro (dopo) 4 Esempio: 4, 5, 8, 12…. 4 Il generatore deve necessariamente essere ricorsivo

9 Idea 4 Per iterare su un oggetto, private boolean vuota; private OrderedIntList prima, dopo; private int val; 4 Usiamo il generatore del sottoalbero prima per generare tutti valori piu’ piccoli della radice 4 Quando sono finiti generiamo la radice, contenuta in val 4 Poi usiamo il generatore del sottoalbero dopo per generare tutti valori piu’ grandi della radice 4 Per sapere quando abbiamo finito passiamo al generatore il numero di elementi della lista

10 Iteratore public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; public Iterator smallToBig () // EFFECTS: ritorna un generatore che produrrà gli // elementi di this (come Integers), in ordine // crescente // REQUIRES: this non deve essere modificato finché // il generatore è in uso {return new OLGen(this, count());} 4 al generatore viene passato il numero di elementi della lista – calcolato dal metodo privato count

11 Metodo ausiliario private int count () { if (vuota) return 0; return 1 + prima.count() + dopo.count(); } 4 Calcola il numero di elementi della lista – ricorsivo

12 Generatore private static class OLGen implements Iterator { private int cnt; // numero di elementi ancora da generare private OLGen figlio; // sottogeneratore corrente private OrderedIntList me; // il mio nodo La variabile cnt memorizza il numero di elementi ancora da generare La variabile figlio memorizza il sottogeneratore in uso Figlio sara’ il generatore del figlio sinistro di me (fino a che ci sono elementi), poi quello del figlio destro

13 Costruttore ricorsivo public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; private static class OLGen implements Iterator { private int cnt; // numero di elementi ancora da generare private OLGen figlio; // sottogeneratore corrente private OrderedIntList me; // il mio nodo OLGen (OrderedIntList o, int n) { // REQUIRES: o != null cnt = n; if (cnt > 0) { me = o; figlio = new OLGen(o.prima, o.prima.count()); } 4 Figlio e’ inizialmente il generatore del sottoalbero sinistro

14 Metodi 1 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; private static class OLGen implements Iterator { private int cnt; // numero di elementi ancora da generare private OLGen figlio; // sottogeneratore corrente private OrderedIntList me; // il mio nodo public boolean hasNext () { return cnt > 0; }  si noti l’uso di cnt per rendere efficiente anche questo metodo

15 Metodi 2 public Object next () throws NoSuchElementException { if (cnt == 0) throw new NoSuchElementException(“OrderedIntList.smallToBig”) ; cnt --; try { return figlio.next(); } catch (NoSuchElementException e) { // se arriva qui ha finito tutti quelli prima figlio = new OLGen(me.dopo, cnt); return new Integer(me.val); } } si genera il valore chiamando il metodo next del sottogeneratore corrente a meno che il metodo non sollevi una eccezione (non ci sono piu’ elementi nel sottoalbero) se non ci sono piu’ elementi nel sottoalbero, ma cnt non e’ zero, allora vuol dire che abbiamo finito I valori di prima dobbiamo generare la radice (val) e cambiare figlio, deve ora generare tutti quelli di dopo

16 Alternativa 4 Invece di mantenere il numero di elementi che mancano potremmo usare una variabile booleana che indica se siamo ancora nel sottoalbero di sinistra 4 Quando il sottogeneratore solleva l’eccezione perche’ sono finiti gli elementi 4 Terminiamo se siamo a destra 4 Generiamo la radice e cambiamo sottogeneratore altrimenti

17 Funzione di astrazione Dato un oggetto g di tipo OLGen ci dice qual’e’ la corrispondente sequenza di elementi che ancora devono essere generati Devo sapere se il sottogeneratore figlio sta ancora iterando su prima o se stiamo iterando su dopo (lo possiamo sapere guardando il numero di elementi che mancano)   (c) = se c.cnt = 0 allora [], altrimenti // se ha finito tutti quelli prima   (c) =  (c.figlio) se il numero di elementi di  (c.figlio) è c.cnt / se non ha finito tutti quelli prima altrimenti  (c) =  (c.figlio) + [Integer(c.me.val)] +  (OLGen(c.dopo))

18 I (c) = c.cnt = 0 oppure (c.cnt > 0 e c.me != null e c.figlio != null e (c.cnt = c.figlio.cnt + 1 oppure c.cnt = c.figlio.cnt + c.me.dopo.count() + 1)) Invariante Esprime le proprieta’ degli oggetti concreti, in particolare per quello che riguarda il valore di cnt

19 Esercizio 4 Dimostrate che il costruttore ed I metodi soddisfano l’invariante 4 I metodi next e hasnext soddisfano le specifiche

20 Esercizio 4 Estendere la classe QueuewithPriority con il metodo public Iterator elementi () throws { \\EFFECTS\\EFFECTS: ritorna un generatore che fornisce tutti gli elementi della coda (String) in base in ordine decrescente (in base all’ordinamento della coda)