La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Ese 3 (del 3 Aprile 2003).

Presentazioni simili


Presentazione sul tema: "Ese 3 (del 3 Aprile 2003)."— Transcript della presentazione:

1 Ese 3 (del 3 Aprile 2003)

2 Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi siano di tipo Object e che le operazioni primitive in aggiunta al costruttore siano: push, pop, top e isempty Utilizzare una eccezione EmptyException (checked) per segnalare il caso eccezionale della pila vuota (in pop e top)

3 Specifica public class Stack {\\OVERVIEW: uno Stack e’ una collezione di \\oggetti(Object) organizzatiper ordine di inserimento con una politica \\ LIFO. E’ modificabile public Stack () { \\EFFECTS: costruisce uno Stack Vuoto } public boolean isEmpty() { \\EFFECTS: se this e’ vuoto restituisce true, altrimenti false} public Object top() throws EmptyException {\\EFFECTS: se this e’ vuoto sollevaEmptyException, altrimenti \\ritorna l’ultimo elemento inserito }

4 Metodi Modificatori public void pop() throws EmptyException { \\ MODIFIES: this \\ EFFECTS: se this non e’ vuoto rimuove l’ultimo elemento inserito, \\altrimenti solleva EmptyException } public void push (Object o) { \\ EFFECTS: se o e’ null solleva NullPointerException, altrimenti \\inserisce o nella pila L’eccezione NullPointer e’ unchecked, non e’ necessario riportarla nel throws !

5 Implementazione Rappresentazione: usiamo un Vector per implementare la pila Dobbiamo mantenere l’ordine di inserimento, per esempio l’ultimo elemento inserito sia l’ultimo elemento della pila (top della pila) Implementiamo i metodi di conseguenza

6 Assumiamo di avere deinito a parte l’eccezione
EmptyException (extends Exception) public class EmptyException extends Exception { public EmptyException(String s) {super(s);} }

7 public class Stack { \\ OVERVIEW: uno Stack e’ una collezione di oggetti (Objectt) organizzati per ordine di inserimento con una politica LIFO. E’ modificabile private Vector pila; \\rappresentazione privata public Stack () { \\ EFFECTS: costruisce uno Stack vuoto pila=new Vector();} public boolean isEmpty() { \\ EFFECTS: se this e’ vuoto restituisce true, altrimenti false if (pila.size()==0) {return true;} else return false; }

8 public Object top() throws EmptyException
{\\ EFFECTS: se this e’ vuoto sollevaEmptyException, altrimenti ritorna l’ultimo elemento inserito if (isEmpty()) {throw new EmptyException(“Stack.top”);}; return pila.get(pila.size()-1)); } public void pop() throws EmptyException { \\ MODIFIES: this \\EFFECTS: se this non e’ vuoto rimuove l’ultimo elemento inserito, altrimenti solleva EmptyException {throw new EmptyException(“Stack.pop”);}; pila.remove(pila.size()-1));}

9 public void push (Object o) {
\\ MODIFIES: this \\ EFFECTS: se o e’ null solleva NullPointerException, altrimenti inserisce o nella pila if (o==null) {throw new NullPointerException(“Stack.pop”);}; pila.add(o);} } Inserisce in fondo, come ultimo elemento

10 Procedura stand-alone
Definire una procedura stand-alone che, dato uno Stack contenente interi, lo modifichi, rimpiazzando gli ultimi due elementi inseriti con la loro somma. Va scritta usando solo la specifica di Stack (non vediamo la rappresentazione, ovvero la variabile d’istanza pila di tipo Vector) Bisogna fare attenzione che i valori ritornati da top hanno tipo apparente Object

11 public static void sum (Stack p) throws NondueValExc {\\REQUIRES: p contiene Integer
MODIFIES: p EFFECTS: rimpiazza gli ultimi due elementi inseriti in p con la loro somma, \\altrimenti solleva una eccezione NondueValExc int primo, secondo; try {primo =((Integer) p.top()).intValue();} catch(EmptyException e) {throw new NondueValExc(“sum”);} p.pop(); try {secondo =((Integer) p.top()).intValue();} {p.push(new Integer (primo)); throw new NondueValExc(“sum”);} p.push( new Integer (primo+secondo)); } Notate che se c’e’ solo un valore nella pila, prima di sollevare l’eccezione bisogna rimettere il valore tolto in precedenza

12 Commenti Se avessimo messo la rappresentazione pubblica, (ovvero il vettore pila) Implementazione piu’ efficiente, ma metodologicamente sbagliata (si rompe l’astrazione rendendo la procedura dipendente dall’implementazione di Stack) Bisogna usare i metodi pubblici forniti da Stack

13 Esempio public static void sum (Stack p) throws NondueValExc {
if (p.pila.size()<2) {throw new NondueValExc(“sum”);} int primo, secondo; primo =((Integer) p. pila.get(p.pila.size()-1).intValue(); secondo =((Integer) p. pila.get(p.pila.size()-2).intValue(); p.pila.remove(p.pila.size()-1); p.pila.set(p.pila.size(0-1), new Integer (primo+secondo)); }

14 Per Esercizio Definire una procedura stand-alone analoga
Restituisce la somma dei valori contenuti nella pila passata per parametro Non modifica la pila passata per parametro


Scaricare ppt "Ese 3 (del 3 Aprile 2003)."

Presentazioni simili


Annunci Google