Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.

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.
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.
Astrazione procedurale ed eccezioni
Polimorfismo Significato Significato Varie famiglie Varie famiglie Polimorfismo in java Polimorfismo in java Polimorfismo di Sottotipo: Apparato in Java.
1 Un esempio con iteratore: le liste ordinate di interi.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Eccezioni Metodi parziali Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento,
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 non vogliamo definire versioni differenti dell’astrazione corrispondente ad una collezione di elementi.
Astrazione di dati Esercizio 1. Si completi l’implementazione Poly.add data a lezione con la specifica e l’implementazione degli ausiliari min e max data.
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.
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.
Si dia la specifica del tipo di dato astratto Tabella.Una Tabella ha due colonne e un numero variabile di righe. Gli elementi della prima colonna sono.
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.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
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.
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.
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.
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.
Alcune Classi Standard Object, Vettori. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo.
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.
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.
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.
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.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

Esercitazione

Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili e numero di colonne fissato Il supertipo Tab definisce le caratteristiche ed operazioni comuni I sottotipi aggiungono caratteristiche particolari delle Tabelle, p.e. varie forme di ordinamento

Supertipo Il supertipo Tab definisce le caratteristiche ed operazioni comuni -Tabelle multi-dimensionali con dimensione variabile solo per il numero di righe -operazioni per scandirle e modificarle E’ una classe astratta (dato che il numero di colonne e’ fissato si puo’ memorizzare in una variabile d’istanza)

Super Tipo public abstract class Tab{ //OVERVIEW: un Tab e’ una tabella di interi con un numero //fissato di colonne ed un numero variabile di righe. E’ modificabile public Tab(int x){ \\ EFFECTS: inizializza this alla tabella vuota con x colonne}

public abstract void insert(int [] a) throws NullPointerException, DimException; \\MODIFIES:this \\ EFFECTS: se a e’ null solleva NullPointerException, \\se la dimensione di a e’ diversa dal numero di colonne di this \\ solleva DimException, altrimenti aggiunge a come riga di this public abstract void set(int i, int j, int el) throws DimException; \\MODIFIES:this \\ EFFECTS: se this contiene la casella i, j sostituisce il valore \\corrente con el, altrmenti solleva DimException

Super Tipo public abstract int rows(); \\ EFFECTS: restituisce il numero di righe di this public int colums(){ \\ EFFECTS: restituisce il numero di colonne di this} public abstract int read(int i, int j) throws DimException; \\ EFFECTS: se this contiene la casella i, j restituisce il valore \ corrente, altrimenti solleva l’eccezione DimException

Super Tipo public Iterator elements(){ \\ EFFECTS: restituisce un generatore che fornisce gli elementi \\ di this scandendo la tabella riga per riga} Concreto===> si puo’ definire usando il metodo astratto read

Implementazione Per implementare la classe astratta (variabile colums protected) Implementare il costruttore ed i metodi concreti Non c’e’ invariante ne’ funzione di astrazione (tipico delle classi astratte)

Esercizio Definire un sottotipo concreto di Tab (OrdTab) Definisce un caso particolare di Tab, in cui le righe della tabella sono ordinate in base alla prima colonna (in modo crescente) Ex :

Parte I Definire la specifica del sottotipo: proprieta’ dati+ metodi La specifica puo’ cambiare (essere raffinata) a patto che valga il principio di sostituzione

Parte II: implementazione Definire la rappresentazione del sottotipo Invariante e funzione di astrazione

Parte III Implementare costruttori e metodi Dimostrare che soddisfano l’invariante e le loro specifiche

public abstract class Tab{ //OVERVIEW: un Tab e’ una tabella di interi con un numero //fissato di colonne ed un numero variabile di righe. E’ modificabile protected int colums; public Tab(int x){ \\ EFFECTS: inizializza this alla tabella vuota con x colonne colums=x;}

public abstract void insert(int [] a) throws NullPointerException, DimException; \\MODIFIES:this \\ EFFECTS: se a e’ null solleva NullPointerException, \\se la dimensione di a e’ diversa dal numero di colonne di this \\ solleva DimException, altrimenti aggiunge a come riga di this public abstract void set(int i, int j, int el) throws DimException; \\MODIFIES:this \\ EFFECTS: se this contiene la casella i, j sostituisce il valore \\corrente con el, altrmenti solleva DimException

public abstract int rows(); \\ EFFECTS: restituisce il numero di righe di this public int colums(){ \\ EFFECTS: restituisce il numero di colonne di this return colums;} public abstract int read(int i, int j) throws DimException; \\ EFFECTS: se this contiene la casella i, j restituisce il valore corrente

public Iterator elements(){ \\ EFFECTS: restituisce un generatore che fornisce gli elementi \\ di this scandendo la tabella riga per riga return new TabGen(this); } private static class TabGen implements Iterator{ private Tab tabella; // tabella da scandire private int rig; //riga corrente private int col; // colonna corrente

public TabGen( Tab t){ \\REQUIRES: t non e’ null tabella=t; col=1; rig=1;} public boolean hasnext(){ if (rig <= tabella.rows() & & col <= tabella.colums()) {return true;} else {return false;} } NOTA: se e’ vuota rows e colums sono 0

public Object next() throws NoSuchElementException{ try{ Integer el= new Integer( tabella.read(rig,col)); if (col=tabella.colums()) {rig++; col=1;} else {col++;} return el;}} catch (DimException e) {throw new NoSuchElementException(“Tab.next”);} } NOTA: si sfrutta l’eccezione lanciata dal metodo read

Specifica della Sottoclasse public class OrdTab extends Tab{ //OVERVIEW: un Tab e’ una tabella di interi con un numero //fissato di colonne ed un numero variabile di righe. Le righe //sono mantenute ordinate in base al primo elemento //E’ modificabile public OrdTab(int x){ \\ EFFECTS: inizializza this alla tabella vuota con x colonne}

public void insert(int [] a) throws NullPointerException, DimException{ \\MODIFIES:this \\ EFFECTS: se a e’ null solleva NullPointerException, \\se la dimensione di a e’ diversa dal numero di colonne di this \\ solleva DimException, altrimenti aggiunge a come riga di this \\ rispettando l’ordinamento} public void set(int i, int j, int el) throws DimException{ \\MODIFIES:this \\ EFFECTS: se this contiene la casella i, j sostituisce il valore \\corrente con el, altrimenti solleva DimException}

public int rows(){ \\ EFFECTS: restituisce il numero di righe di this} public int read(int i, int j) throws DimException{ \\ EFFECTS: se this contiene la casella i, j restituisce il valore \\ corrente, altrimenti solleva Dimexception} Contiene solo costruttore e i metodi concreti (mancanti), colums e elements sono ereditati Le specifiche sono raffinate per alcuni metodi (solo per l’inserimento)

Principio di sostituzione Le proprieta’ dei dati del sottotipo sono piu’ forti (una tabella ordinata e’ un tipo particolare di tabella) Le specifiche di tutti i metodi sono uguali ( a parte insert) La post-condizione di insert del sottotipo implica quella del supertipo (regola dei metodi)

Implementazione private Vector rap; Utilizziamo un Vector per memorizzare le righe le righe (deve essere possibile aggiungere righe) rap.get(i) contiene un array di interi che rappresenta la riga in posizione i La variabile colums della superclasse e’ ereditata e visibile (protected), tipico delle classi astratte

Funzione di astrazione ed Invariante Alpha(c) = tabella che ha c.colums colonne e c.rap.size() righe e contiene nella casella i,j c.rap.get(i-1)[j-1]

Funzione di astrazione ed Invariante I(c) = c.rap != null & & per ogni 0 < = i,j < c.rap.size() (c.rap.get(i) != null ed e’ un array di interi & c.rap.get(i).length==c.colums) & (c.colums>=1 & i c.rap.get(i)[0] <= c.rap.get(j)[0] )

Implementazione public class OrdTab extends Tab{ private Vector rap; public OrdTab(int x){ \\ EFFECTS: inizializza this alla tabella vuota con x colonne super(x); rap=new Vector();} Chiama il costruttore della superclasse (potrebbe anche modificare colums direttamente) Inizializza il Vector

public void insert(int [] a) throws NullPointerException, DimException{ \\MODIFIES:this \\ EFFECTS: se a e’ null solleva NullPointerException, \\se la dimensione di a e’ diversa dal numero di colonne di this \\ solleva DimException, altrimenti aggiunge a come riga di this \\ rispettando l’ordinamento if (a.length != colums) throw new DimException(“Tab.insert”); if (colums ==0) {return;} else {int i= 0; boolean inserito=false; while (i < rap.size() & & ! inserito) { int [] riga= (int[] ) rap.get(i); if (a[0] < = riga[0] ) {rap.insert(i,a); inserito=true;} else {i++;}} if (! inserito) {rap.add(a);} }

public void set(int i, int j, int el) throws DimException{ \\MODIFIES:this \\ EFFECTS: se this contiene la casella i, j sotituisce il valore corrente con el ( e la riordina), altrimenti solleva DimException if ( ! (1< = i < = rap.size() & & 1 <= j < = colums) ) throw new DimException(“Tab.set”); if (j==1) {int[] riga= (int[] ) rap.get(i-1) ; riga[0]=el; rap.remove(i-1); insert(riga);} else {int[] riga= (int[] ) rap.get(i-1) ; //i-esima riga riga[j-1]=el;} //j-esima colonna } public int rows(){ \\ EFFECTS: restituisce il numero di righe di this return rap.size();}

public int read(int i, int j) throws DimException{ \\ EFFECTS: se this contiene la casella i, j restituisce il valore corrente if (!( 1< = i < = rap.size() & & 1 <= j < = colums)) throw new DimException(“Tab.read”); int[] riga= (int[] ) rap.get(i-1) ; //i-esima riga returna riga[j-1];} //j-esima colonna Nota: l’invariante garantisce le proprieta’ del Vector, e garantisce che non si acceda ad oggetti null