Multiset. Progettare (specifica con identificazione delle eventuali astrazioni necessarie, incluse eccezioni, e implementazione) del tipo di dato Multiset,

Slides:



Advertisements
Presentazioni simili
1 Le s-espressioni. 2 Un nuovo esempio completo: le s-espressioni Sexpr 4 alberi binari (possibilmente vuoti) che hanno sulle foglie atomi (stringhe)
Advertisements

1 Progettazione gerarchica delle s- espressioni, utilizzando lereditarietà
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Alcune Classi Standard Object, Vettori. Esercizio dellultima volta Superclasse Persona Sottoclasse Libro.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Esercizio 2. Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) durante la valutazione delle seguenti dichiarazioni di classe.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
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.
Programmazione Parametrica ( a.k.a. Generics ). Introduzione ai meccanismi e concetti della programmazione parametrica Generics e relationi di sottotipo.
Layouts and Graphics. component - container - layout Un Container contiene [0 o +] Components Il Layout specifica come i Components sono disposti nel.
Model – View - Controller
Esempio: Tombola! Parte seconda.
Unified Modeling Language class C {…} class B extends C {…} Esiste una notazione grafica per mostrare le relazioni di ereditarietà. Object StringC B Tutte.
prompt> java SumAverage
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
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 Ultima Lezione del Corso di Fondamenti di Informatica 1 a.a – 06 Ma 29-Nov-2005.
1. Conoscere luso delle collezioni in Java Comprendere le principali caratteristiche nelle varie classi di Collection disponibili Saper individuare quali.
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
1 Implementazione di Linguaggi 2 PARTE 6 Implementazione di Linguaggi 2 PARTE 6 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
CAPITOLO 6 LA GESTIONE DELLE ECCEZIONI IN JAVA. ECCEZIONI E catch/throw Consentono di realizzare goto non locali void GrowZebra(Zebra mz) { try { for.
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.
Array Ricerca Ordinamento Fusione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
Java Collections.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Fondamenti di Informatica Corsi di Laurea in Ingegneria Gestionale Canale AL ESERCITAZIONE 6 ARGOMENTI: LAVORARE CON CLASSI METODI DELLISTANZA, COSTRUTTORI.
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2003/2004.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Ese 2 (del 31 Marzo 2004). Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) durante la valutazione delle seguenti dichiarazioni.
Collection & Generics in Java
Stack Già visto l’altra volta senza gestione eccezioni, le prime tre slide servono solo come ripasso, dalla quarta argomento nuovo class Stack { int data[];
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.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.
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.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
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 Astrazione sul controllo: gli iteratori. 2 Gli iteratori 4 perché vogliamo iterarare “in modo astratto” 4 iteratori e generatori in Java –specifica.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
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.
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.
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.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
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.
Sommario cos’è un tipo di dato astratto astrazione tramite specifica:
concetti ed applicazioni
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

Multiset

Progettare (specifica con identificazione delle eventuali astrazioni necessarie, incluse eccezioni, e implementazione) del tipo di dato Multiset, multiinsieme di dati del medesimo tipo. In aggiunta al costruttore si abbiano come operazioni primitive insert, remove, isin. Si progetti poi il tipo di dato MaxMultiset che estende Multiset mantenendo aggiornato il valore che rappresenta la massima molteplicità degli elementi del multiinsieme. Provare che i metodi realizzati soddisfano l'invariante e la loro specifica.

Classe Multiset, Metodo isin public class Multiset { //OVERVIEW: un Multiset e' un insieme di elementi omogenei in //cui ogni elemento puo' occorrere piu' volte, es. {1,5,4,1,4}. //E' modficabile private vector els; private class type; //metodi public Multiset () { //EFFECTS: inizializza un multiinsieme vuoto els=new vector(); } public boolean isin(Object x) { //EFFECTS: se x e' un elemento di this restituisce true, altrimenti //false if (x==null) return false; for (int i=0; i<els.size(); i++) { Pair p=(Pair)els.get(i); if (x.equals(p.left())) return true; } return false; }

Classe Multiset, Metodo insert public void insert(Object x) throws NullPointerException, ClassCastException { //EFFECTS: se x e' null solleva NullPointerException, se x non e' omogeneo //agli elementi di this solleva ClassCastException, altrimenti inserisce x in //this //MODIFIES: this if (x==null) throw NullPointerException(" "); if (els.size()==0) type=x.getclass(); else { if (!type.isinstance(x)) throw ClassCastException(" "); } if (!isin(x)) { Pair p=new Pair(x,new Integer(1)); els.add(p); } else { for (int i=0; i<els.size(); i++) { Pair q=(Pair) els.get(i); if (x.equals(q.left())) { int y=(Integer) q.right.intValue(); y++; Pair p=new Pair(x, new Integer(y)); els.set(i,p); } } }

public void remove(Object x) { //EFFECTS: rimuove un'occorrenza di x da this //MODIFIES: this if (!isin(x)) return; for (int i=0; i<els.size(); i++) { Pair p=(Pair) els.get(i); if (x.equals(p.left())) { int y=(Integer) p.right().intvalue(); y--; if (y>0) els.set(i, newPair(x,new Integer(y))); else els.remove(i); } } Classe Multiset, Metodo remove

protected Iterator elements() { //EFFECTS: ritorna gli elementi del multiinsieme this nella //forma di coppie (elemento,molteplicita') return new MultisetGen(this); } Classe Multiset, Iterator elements

Classe MultisetGen private static class MultisetGen implements Iterator { //OVERVIEW: restituisce come Pair tutti gli elementi di un //multiinsieme che le viene passato private Multiset set; private int current; //metodi public MultisetGen(Multiset m) { //EFFECTS: inizializza set a m e current a 0 set=m; current=0; } public boolean hasnext() { //EFFECTS: se ci sono ancora elementi nel multiinsieme da //ritornare ritorna true, altrimenti false return (current<set.els.size()); } public Object next() throws NoSuchElementException { //EFFECTS: restituisce il prossimo elemento del multiinsieme //se ce ne sono, altrimenti solleva un'eccezione if (current=set.els.size()) throw NoSuchElementException; Pair p=(Pair) set.els.get(current); current++; return p; } }

Classe MaxMultiset, metodo maxmul public class MaxMultiset extends Multiset{ //OVERVIEW: un MaxMultiset e' un Multiset che mantiene traccia //della massima molteplicita' dei suoi elementi private int max; //metodi public MaxMultiset () { //EFFECTS: richiama il costruttore di Multiset e inizializza la //molteplicita' massima a 0 super(); max=0; } public int maxmul() { //EFFECTS: restituisce il valore della molteplicita' massima return max; }

public void insert (object x) throws NullPointerException, ClassCastException { //EFFECTS: richiama la insert di Multiset ed aggiorna la //molteplicita' massima //MODIFIES: this super.insert(x); max=0; aggiornamax(); } public void remove (object x) { //EFFECTS: richiama la remove di Multiset ed aggiorna la //molteplicita' massima //MODIFIES: this super.remove(x); max=0; aggiornamax(); } Classe MaxMultiset, metodi insert e remove

Classe MaxMultiset, metodo aggiornamax private void aggiornamax() { //EFFECTS: aggiorna la molteplicita' massima degli elementi //di this //MODIFIES: this Iterator g = elements(); while (g.hasnext()) { Pair p = (Pair)g.next(); if ((Integer) p.right.intvalue()>max) max = (Integer) p.right.intvalue(); }

Funzione di astrazione e invariante Multiset (c) = S : c.els.get(i).left() occorre c.els.get(i).right.intvalue() volte in S i:0 i<c.els.size I Multiset (c) = c.els null & (c.els.size()>0 c.type null) & i,j 0 i j < c.els.size() ( c.els.get(i).left().getClass()=c.type & c.els.get(i).right.intvalue()>0 & c.els.get(i).left() c.els.get(j).left() )

Funzione di astrazione e invariante MultisetGen (c) = [ c.els.get(current).left().. c.els.get(c.set.els.size()-1).left() ] I MultisetGen (c) = c.set Multiset (c) & 0 c.current < c.set.els.size()

Funzione di astrazione e invariante MaxMultiset (c) = Multiset (c) I MaxMultiset (c) = c.max 0 & c.max>0 x Multiset (c)|x occorre c.max volte & x Multiset (c) la molteplicita' di x e' c.max

Costruttore public Multiset () { //EFFECTS: inizializza un multiinsieme vuoto els=new vector(); } Il costruttore della classe Multiset soddisfa l'invariante e la specifica (banalmente), infatti: I Multiset (c) = c.els null & (c.els.size()>0 c.type null) & i,j 0 i j < c.els.size() ( c.els.get(i).left().getClass()=c.type & c.els.get(i).right.intvalue()>0 & c.els.get(i).left() c.els.get(j).left() )

Metodo isin public boolean isin(Object x) { //EFFECTS: se x e' un elemento di this restituisce true, altrimenti //false if (x==null) return false; for (int i=0; i<els.size(); i++) { Pair p=(Pair)els.get(i); if (x.equals(p.left())) return true; } return false; } Il metodo isin soddisfa l'invariante (non modifica nulla) e la specifica: - se x=null x (this) ed isin ritorna false - se x null e x (this) allora nel ciclo for viene individuata la coppia (x,n) e isin ritorna true - se x null e x (this) allora il ciclo for termina la sua esecuzione senza trovare alcuna coppia utile e isin ritorna false

Metodo insert Il metodo insert soddisfa l'invariante: - se x=null solleva un'eccezione ed esce - se x null ma x non e' omogeneo al tipo di this, il metodo solleva un'eccezione ed esce Il metodo non effettua nessuna modifica. Assumendo vera l'invariante prima di invocare il metodo, l'invariante rimane soddisfatta anche dopo l'esecuzione del metodo. public void insert(Object x) throws NullPointerException, ClassCastException { //EFFECTS: se x e' null solleva NullPointerException, se x non e' omogeneo //agli elementi di this solleva ClassCastException, altrimenti inserisce x in //this //MODIFIES: this if (x==null) throw NullPointerException(" "); if (els.size()==0) type=x.getclass(); else { if (!type.isinstance(x)) throw ClassCastException(" "); } if (!isin(x)) { Pair p=new Pair(x,new Integer(1)); els.add(p); } else { for (int i=0; i<els.size(); i++) { Pair q=(Pair) els.get(i); if (x.equals(q.left())) { int y=(Integer) q.right.intValue(); y++; Pair p=new Pair(x, new Integer(y)); els.set(i,p); } } }

Metodo insert Il metodo insert soddisfa l'invariante: - se x null e this e' vuoto inizializza this alla classe di x. c.els.size()>0 c.type null e' soddisfatta, nel momento in cui un elemento e' inserito in this ( c.els.size()>0 ) il tipo di this viene inizializzato ( c.type null ). - se x null e this e' del tipo di x inserisce x in (this) Tutte le condizioni dell'invariante rimangono banalmente soddisfatte anche dopo l'esecuzione del metodo. public void insert(Object x) throws NullPointerException, ClassCastException { //EFFECTS: se x e' null solleva NullPointerException, se x non e' omogeneo //agli elementi di this solleva ClassCastException, altrimenti inserisce x in //this //MODIFIES: this if (x==null) throw NullPointerException(" "); if (els.size()==0) type=x.getclass(); else { if (!type.isinstance(x)) throw ClassCastException(" "); } if (!isin(x)) { Pair p=new Pair(x,new Integer(1)); els.add(p); } else { for (int i=0; i<els.size(); i++) { Pair q=(Pair) els.get(i); if (x.equals(q.left())) { int y=(Integer) q.right.intValue(); y++; Pair p=new Pair(x, new Integer(y)); els.set(i,p); } } }

Metodo insert Il metodo insert soddisfa la specifica: - se x=null solleva un'eccezione ed esce - se x null e this e' di tipo diverso dal tipo di x solleva un'eccezione ed esce - se x null e this e' vuoto inizializza this alla classe di x. - se x null e this e' del tipo di x: - se x this trova (x,y) e la aggiorna in (x,y+1) - se x this crea una nuova coppia (x,1) e la inserisce nel multiinsieme public void insert(Object x) throws NullPointerException, ClassCastException { //EFFECTS: se x e' null solleva NullPointerException, se x non e' omogeneo //agli elementi di this solleva ClassCastException, altrimenti inserisce x in //this //MODIFIES: this if (x==null) throw NullPointerException(" "); if (els.size()==0) type=x.getclass(); else { if (!type.isinstance(x)) throw ClassCastException(" "); } if (!isin(x)) { Pair p=new Pair(x,new Integer(1)); els.add(p); } else { for (int i=0; i<els.size(); i++) { Pair q=(Pair) els.get(i); if (x.equals(q.left())) { int y=(Integer) q.right.intValue(); y++; Pair p=new Pair(x, new Integer(y)); els.set(i,p); } } }

Metodo remove Il metodo remove soddisfa l'invariante: - se x (this) il metodo esegue una return senza fare nulla Assumendo vera l'invariante prima di invocare il metodo, l'invariante rimane soddisfatta anche dopo l'esecuzione del metodo. public void remove(Object x) { //EFFECTS: rimuove un'occorrenza di x da this //MODIFIES: this if (!isin(x)) return; for (int i=0; i<els.size(); i++) { Pair p=(Pair) els.get(i); if (x.equals(p.left())) { int y=(Integer) p.right().intvalue(); y--; if (y>0) els.set(i, newPair(x,new Integer(y))); else els.remove(i); } }

Metodo remove Il metodo remove soddisfa l'invariante: - se x (this) il metodo rimuove x da (this) Tutte le condizioni dell'invariante rimangono banalmente soddisfatte anche dopo l'esecuzione del metodo. Si noti che le condizioni sono soddisfatte anche nel caso in cui x sia l'unico elemento di (this), il tipo di this resta immutato e verra' cambiato solo ad una nuova chiamata di insert, poiche' this.set.els.size() sara' uguale a 0. public void remove(Object x) { //EFFECTS: rimuove un'occorrenza di x da this //MODIFIES: this if (!isin(x)) return; for (int i=0; i<els.size(); i++) { Pair p=(Pair) els.get(i); if (x.equals(p.left())) { int y=(Integer) p.right().intvalue(); y--; if (y>0) els.set(i, newPair(x,new Integer(y))); else els.remove(i); } }

Metodo remove Il metodo remove soddisfa la specifica: - se x (this) il metodo esegue una return senza fare nulla - se x (this) il metodo cerca la coppia (x,y) e decrementa y - se y-1> 0 aggiorna la coppia (x,y) al valore (x,y-1) - se y-1=0 elimina la coppia (x,y) dal multiinsieme public void remove(Object x) { //EFFECTS: rimuove un'occorrenza di x da this //MODIFIES: this if (!isin(x)) return; for (int i=0; i<els.size(); i++) { Pair p=(Pair) els.get(i); if (x.equals(p.left())) { int y=(Integer) p.right().intvalue(); y--; if (y>0) els.set(i, newPair(x,new Integer(y))); else els.remove(i); } }