1 Progettazione gerarchica delle s- espressioni, utilizzando lereditarietà

Slides:



Advertisements
Presentazioni simili
/ fax
Advertisements

1 Le s-espressioni. 2 Un nuovo esempio completo: le s-espressioni Sexpr 4 alberi binari (possibilmente vuoti) che hanno sulle foglie atomi (stringhe)
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.
Interfacce Java.
Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.
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.
Le gerarchie di tipi.
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.
1 la competenza alfabetica della popolazione italiana CEDE distribuzione percentuale per livelli.
Programmazione Parametrica ( a.k.a. Generics )
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.
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.
Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.
Richiami di Java Multithreading. Threads (subclassing) public class A { public void a_method { C t = new C(); //C t = new C(String name); t.start(); …
Sezione: Costruttori Costruttori. Definizione dei costruttori Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il costruttore.
prompt> java SumAverage
// PROTOTIPI void costruisciLista(Pnodo &, string &); void stampaLista(Pnodo ); void creaNodo (int, Pnodo&); Pnodo inserisciNodoTesta (int,Pnodo &); Pnodo.
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.
JAVA C import java.util.*; #include <stdio.h>
Lettura e scrittura - Stream
Algoritmi e strutture dati Dizionari Alberi binari di ricerca (BST)
6.6Ordinamento di Vettori Ordinamento di dati –Applicazione computazionale importante –Virtualmente ogni organizzazione deve ordinare dei dati Enormi quantità
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 Meccanismi per la definizione di tipi di dato §la programmazione di applicazioni consiste in gran parte nella definizione di nuovi tipi di dato §un qualunque.
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 6: Classi e astrazione dati 1.Introduzione 2.Definizione delle strutture 3.Accedere ai membri.
Programmazione distribuita in Java
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Ricerca di una chiave: Search(x, k) if x == nil or k == x.key return x
22 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ore 10:00.
Lezione n° 05 Istituto Statale di Istruzione Superiore F. Enriques Corso JAVA.
JavaScript Lezione 5 Tipizzazione ed operazioni tra tipi diversi Istruzioni di input.
OUTPUT FORMATTATO La funzione printf consente di effettuare la stampa a video formattata. Sintassi: printf ( stringa_formato, arg0, arg1, … ); La stringa.
Fondamenti di Informatica Corsi di Laurea in Ingegneria Gestionale Canale AL ESERCITAZIONE 6 ARGOMENTI: LAVORARE CON CLASSI METODI DELLISTANZA, COSTRUTTORI.
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
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 Questionario di soddisfazione ATA - a. sc. 2008/09 Il questionario è stato somministrato nel mese di aprile Sono stati restituiti 29 questionari.
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.
1101 = x 10 x 10 x x 10 x = CORRISPONDENZE
Multiset. Progettare (specifica con identificazione delle eventuali astrazioni necessarie, incluse eccezioni, e implementazione) del tipo di dato Multiset,
Ad opera di: Matteo Donatelli e Maurizio Di Paolo Presentazione su : Elettropneumatica 1.
1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java.
Pippo.
Collection & Generics in Java
Fondamenti di informatica T-A Esercitazione 7 : Collezioni AA 2012/2013 Tutor : Domenico Di Carlo.
Bando Pittori e Scultori in Piemonte alla metà del ‘700
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[];
JDBC Java DataBase Connectivity SISTEMI ITIS B. CASTELLI Anno Scolastico
lun mar mer gio ven SAB DOM FEBBRAIO.
1 Un esempio con iteratore: le liste ordinate di interi.
1 Analisi della gestione finanziaria dal 04 Gennaio 2008 Fondo Pensione Astri Comparto Bilanciato report al: 4 giugno 2010.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
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.
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 Le s-espressioni. 2  Sexpr 4 alberi binari (possibilmente “vuoti”) che hanno sulle foglie atomi (stringhe) 4 sono la struttura dati base del linguaggio.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
1 Un esempio con iteratore: le liste ordinate di interi.
Sommario cos’è un tipo di dato astratto astrazione tramite specifica:
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

1 Progettazione gerarchica delle s- espressioni, utilizzando lereditarietà

2 Due implementazioni alternative delle s-espressioni alberi binari (possibilmente vuoti, nil ) che hanno sulle foglie atomi (stringhe) 4 la definizione ricorsiva del tipo come verrebbe scritta in ML –type sexpr = Nil | Atom of string | Cons of sexpr * sexpr 4 vogliamo dare due implementazioni alternative

3 Due implementazioni –type sexpr = Nil | Atom of string | Cons of sexpr * sexpr 4 vogliamo dare due implementazioni alternative 4 una è quella che abbiamo visto –ogni oggetto ha 4 campi solo alcuni di questi sono utilizzati nei vari casi della definizione ricorsiva 4 la seconda implementazione utilizza i sottotipi per realizzare i diversi casi 4 alcune operazioni possono essere comuni alle due implementazioni –Sexpr è una classe astratta e non un interfaccia

4 Specifica e implementazione della classe astratta Sexpr 1 public abstract class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) // scompaiono i costruttori // metodi astratti public abstract Sexpr cons (Sexpr s) throws NullPointerException; // EFFECTS: costruisce un nuovo albero binario che ha // this come sottoalbero sinistro ed s come // sottoalbero destro. Se this o s sono indefiniti, // solleva NullPointerException public abstract void rplaca (Sexpr s) throws NotANodeException; // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero sinistro // con s. Se this non è un nodo binario solleva // NotANodeException (checked) public abstract void rplacd (Sexpr s) throws NotANodeException; // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero destro // con s. Se this non è un nodo binario solleva // NotANodeException (checked)

5 Specifica e implementazione della classe astratta Sexpr 2 public abstract Sexpr car () throws NotANodeException; // EFFECTS: ritorna il sottoalbero sinistro di this. // Se this non è un nodo binario solleva // NotANodeException (checked) public abstract Sexpr cdr () throws NotANodeException; // EFFECTS: ritorna il sottoalbero destro di this. // Se this non è un nodo binario solleva // NotANodeException (checked) public abstract String getatom () throws NotAnAtomException; // EFFECTS: Se this non è una foglia solleva // NotAnAtomException (checked). Altrimenti ritorna la stringa // contenuta nella foglia public abstract boolean nullS() throws NullPointerException; // EFFECTS: ritorna true se this è lalbero vuoto, // altrimenti ritorna false. public abstract boolean atom () throws NullPointerException; // EFFECTS: ritorna false se this è un albero binario, // altrimenti ritorna true. public abstract String toString ();

6 Specifica e implementazione della classe astratta Sexpr 3 // Metodi concreti public Iterator leaves () // REQUIRES: this non deve essere ciclico // EFFECTS: ritorna un generatore che produrrà le foglie // nella frontiera di this (come Strings), da sinistra a // destra // REQUIRES: this non deve essere modificato finché // il generatore è in uso {return new LeavesGen(this,numerofoglie());} private int numerofoglie () { // riscritta senza usare la rappresentazione if (nullS()) return 0; if (atom()) return 1; try {return (car().numerofoglie() + cdr().numerofoglie()); } catch (NotANodeException e) {return 0; } }

7 Specifica e implementazione della classe astratta Sexpr 4 // classe interna concreta (implementazione che non utilizza // la rep di Sexpr private static class LeavesGen implements Iterator { private LeavesGen figlio; // sottogeneratore corrente private Sexpr io; // il mio albero private int quanti; // numero di elementi ancora da generare LeavesGen (Sexpr s,int n) { //REQUIRES: s != null quanti = n; if (quanti > 0) {io = s; if (io.atom()) return; try {figlio = new LeavesGen(io.car(), io.car().numerofoglie()); } catch (NotANodeException e) {} return; } public boolean hasNext() { return quanti > 0;} public Object next () throws NoSuchElementException { if (quanti == 0) throw new NoSuchElementException("Sexpr.leaves"); quanti--; if (io. atom()) try {return io.getatom();} catch (NotAnAtomException e) {} try {return figlio.next();} catch (NoSuchElementException e) {} try {figlio = new LeavesGen(io.cdr(), io.cdr().numerofoglie()); return figlio.next(); } catch (NotANodeException e) { throw new NoSuchElementException("Sexpr.leaves");}

8 Struttura della gerarchia type sexpr = Nil | Atom of string | Cons of sexpr * sexpr implementazione 1 implementazione 2 Sexpr classe astratta implementa solo leaves Sexpr1 AtomNil Node NilOrAtom classe astratta implementa quasi tutto

9 Implementazione di Sexpr1 1 public class Sexpr1 extends Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; public Sexpr1 () // EFFECTS: inizializza this alla Sexpr vuota {foglia = true; stringa = ""; } public Sexpr1 (String s) // EFFECTS: inizializza this alla foglia contenente s {foglia = true; stringa = s; } public Sexpr cons (Sexpr s) throws NullPointerException {if (s == null) throw new NullPointerException (Sexpr1.cons); Sexpr1 nuovo = new Sexpr1(); nuovo.sinistro = this; nuovo.destro = s; nuovo.foglia = false; return (Sexpr) nuovo; } public void rplaca (Sexpr s) throws NotANodeException {if (foglia) throw new NotANodeException("Sexpr.rplaca"); sinistro = s; return; }.....

10 Implementazione di Sexpr1 2 public class Sexpr1 extends Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa;... public String getatom () throws NotAnAtomException { if (!foglia || stringa == "") throw new NotAnAtomException("Sexpr1.getatom"); return stringa; } public String toString() { if (foglia) {if (stringa == "") return "nil"; else return stringa; } return "(" + sinistro.toString() + "." + destro.toString() + ")"; }

11 Come è fatta una Sexpr1 (((((new Sexpr1("a")).cons(new Sexpr1("a"))). cons((new Sexpr1("c")).cons(new Sexpr1("a")))). cons((new Sexpr1()).cons((new Sexpr1()).cons(new Sexpr1("b")))))) F F a F FF T TF T T T T T a a a b c

12 Limplementazione 2 type sexpr = Nil | Atom of string | Cons of sexpr * sexpr implementazione 2 Sexpr classe astratta implementa solo leaves AtomNil Node NilOrAtom classe astratta implementa quasi tutto

13 La classe Node 4 implementa il caso ricorsivo della definizione 4 notare che le specifiche di alcune operazioni astratte sono ridate perché diverse –definiscono un solo caso e quindi possono sollevare meno eccezioni oppure vediamo comunque insieme specifiche e implementazione

14 Implementazione di Node 1 public class Node extends Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private Sexpr sinistro, destro; public Node () {} // EFFECTS: inizializza this ad un nodo indefinito public Sexpr cons (Sexpr s) throws NullPointerException {if s == null throw new NullPointerException (Node.cons); Node nuovo = new Node(); nuovo.sinistro = this; nuovo.destro = s; return (Sexpr) nuovo; } public void rplaca (Sexpr s) // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero sinistro con s. // Non solleva NotANodeException {if s == null) throw new NullPointerException (Node.rplaca); sinistro = s; return; } public void rplacd (Sexpr s) // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero destro con s. // Non solleva NotANodeException {if s == null throw new NullPointerException (Node.rplacd); destro = s; return; }

15 Implementazione di Node 2 public class Node extends Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private Sexpr sinistro, destro; public Sexpr car () // EFFECTS: restituisce il sottoalbero sinistro di this. // Non solleva NotANodeException {return sinistro; } public Sexpr cdr () // EFFECTS: restituisce il sottoalbero destro di this. // Non solleva NotANodeException {return destro; } public String getatom () throws NotAnAtomException // EFFECTS: Solleva NotAnAtomException {throw new NotAnAtomException(Node.getatom);

16 Implementazione di Node 3 public class Node extends Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private Sexpr sinistro, destro; public boolean nullS () // EFFECTS: restituisce false {return false; } public boolean atom () // EFFECTS: restituisce false {return false; } public String toString () {return "(" + sinistro.toString() + "." + destro.toString() + ");} }

17 Nil e Atom 4 implementano quasi tutte le operazioni nello stesso modo –sono diverse solo su NullS, getatom e toString facciamo una classe astratta NilOrAtom in cui implementiamo le operazioni comuni –i metodi non definiti continuano a restare astratti come nella classe Sexpr e verranno implementati nelle due classi concrete Nil e Atom

18 La classe astratta NilOrAtom 1 public abstract class NilOrAtom extends Sexpr { // OVERVIEW: un NilOrAtom è un albero vuoto o una foglia public Sexpr cons (Sexpr s) throws NullPointerException {if s == null throw new NullPointerException (Node.cons); Node nuovo = new Node(); nuovo.sinistro = this; nuovo.destro = s; return (Sexpr) nuovo; } public void rplaca (Sexpr s) throws NotANodeException // EFFECTS: Solleva NotANodeException {if s == null throw new NullPointerException (NilOrAtom.rplaca); throw new NotANodeException (NilOrAtom.rplaca);; } public void rplacd (Sexpr s) throws NotANodeException // EFFECTS: Solleva NotANodeException {if s == null throw new NullPointerException (NilOrAtom.rplacd) ; throw new NotANodeException (NilOrAtom.rplacd);} public Sexpr car () throws NotANodeException // EFFECTS: Solleva NotANodeException {throw new NotANodeException (NilOrAtom.car); }

19 La classe astratta NilOrAtom 2 public abstract class NilOrAtom extends Sexpr { // OVERVIEW: un NilOrAtom è un albero vuoto o una foglia public Sexpr cdr () throws NotANodeException // EFFECTS: Solleva NotANodeException {throw new NotANodeException (NilOrAtom.cdr);} public boolean atom () // EFFECTS: Ritorna true {return true} }

20 La classe Nil public class Nil extends NilOrAtom { // OVERVIEW: un Nil è un albero vuoto public Nil () {} // EFFECTS: Crea un albero vuoto public boolean nullS () // EFFECTS: Ritorna true {return true ;} public String getatom () throws NotAnAtomException // EFFECTS: Solleva NotAnAtomException {throw new NotAnAtomException (Nil.getatom);} public String toString () {return nil ;} }

21 La classe Atom public class Atom extends NilOrAtom { // OVERVIEW: un Atom è una foglia String atomo; public Atom (String s) { atomo = s; } // EFFECTS: Crea ua foglia contenente s public boolean nullS () // EFFECTS: Ritorna false {return false ;} public String getatom () // EFFECTS: Restituisce la stringa contenuta nella foglia. Non solleva // NotAnAtomException {return atomo ;} public String toString () {return atomo;} }

22 Come è fatta una Sexpr (seconda implementazione) (((((new Atom("a")).cons(new Atom("a"))). cons((new Atom("c")).cons(new Atom("a")))). cons((new Nil()).cons((new Nil()).cons(new Atom("b")))))) a a a c b

23 Sexpr (mescoliamo le implementazioni) possiamo usare insieme (e mescolare) le 4 sottoclassi concrete di Sexpr –nil e gli atomi si possono indifferentemente costruire con i costruttori di Nil, Atom e Sexpr1 –la scelta fra il cons di Sexpr1 e quelli (tutti uguali) di Node, Atom o Nil è guidata dal tipo delloggetto (((((new Sexpr1("a")).cons(new Atom("a"))). cons((new Atom("c")).cons(new Atom("a")))). cons((new Sexpr1()).cons((new Nil()).cons(new Atom("b"))))))

24 Confrontiamo le specifiche per il supertipo ed i sottotipi: rplaca public abstract class Sexpr { public abstract void rplaca (Sexpr s) throws NotANodeException; // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero sinistro // con s. Se this non è un nodo binario solleva // NotANodeException (checked) public class Node extends Sexpr { public void rplaca (Sexpr s) // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero sinistro con s. // Non solleva NotANodeException public abstract class NilOrAtom extends Sexpr { public void rplaca (Sexpr s) throws NotANodeException // EFFECTS: Solleva NotANodeException 4 ok, perché –in Node, this è sempre un nodo binario –in NilOrAtom, this non è mai un nodo binario

25 Confrontiamo le specifiche per il supertipo ed i sottotipi: car public abstract class Sexpr { public abstract Sexpr car () throws NotANodeException; // EFFECTS: ritorna il sottoalbero sinistro di this. // Se this non è un nodo binario solleva // NotANodeException (checked) public class Node extends Sexpr { public Sexpr car () // EFFECTS: restituisce il sottoalbero sinistro di this. // Non solleva NotANodeException public abstract class NilOrAtom extends Sexpr { public Sexpr car () throws NotANodeException // EFFECTS: solleva NotANodeException 4 ok, perché –in Node, this è sempre un nodo binario –in NilOrAtom, this non è mai un nodo binario

26 Confrontiamo le specifiche per il supertipo ed i sottotipi: getatom public abstract class Sexpr { public abstract String getatom () throws NotAnAtomException; // EFFECTS: Se this non è una foglia solleva // NotAnAtomException (checked). Altrimenti ritorna la stringa // contenuta nella foglia public class Node extends Sexpr { public String getatom () throws NotAnAtomException // EFFECTS: Solleva NotAnAtomException public class Nil extends NilOrAtom { public String getatom () throws NotAnAtomException // EFFECTS: Solleva NotAnAtomException public class Atom extends NilOrAtom { public String getatom () // EFFECTS: Restituisce la stringa contenuta nella foglia. Non solleva // NotAnAtomException 4 ok, perché –in Node e in Nil, this non è mai una foglia –in Atom, this è sempre una foglia

27 Confrontiamo le specifiche per il supertipo ed i sottotipi: nullS public abstract class Sexpr { public abstract boolean nullS() throws NullPointerException; // EFFECTS: ritorna true se this è lalbero vuoto, // altrimenti ritorna false. Se this è indefinito solleva // NullPointerException public class Node extends Sexpr { public boolean nullS () // EFFECTS: restituisce false public class Nil extends NilOrAtom { public boolean nullS () // EFFECTS: Ritorna true public class Atom extends NilOrAtom { public boolean nullS () // EFFECTS: Ritorna false 4 ok, perché –in Node e in Atom, this non è mai un albero vuoto –in Nil, this è sempre un albero vuoto