Si consideri la classe astratta che specifica IL tipo di dato astratto Tabella



Scaricare 31 Kb.
15.12.2017
Dimensione del file31 Kb.

Metodologie di programmazione

5/6/2007


1. [12 punti] Si mostri l’evoluzione dello stato (ambiente delle classi, heap, pila) durante la valutazione delle seguenti dichiarazioni di classe e durante l’esecuzione del metodo main. Mostrando anche lo stato durante le chiamate dei metodi.
public class Up extends Object {

public static int w;

public int x;

public static void met1(int i) {

w=i+2;}

public void met2(Up p1)



{met1(5); int x=p1.w + this.x; x=p1.x+2;

p1.x=w+x}

{x=w+2;} }

public class Down extends Up {

public int z;

public int y;

public void met2(Up p1)

{int z=y; y=x+this.z; p1.x=this.x+z;}

{z=x+1; y=x+2} }
public class Princ extends Object {

public static void main (String [] args) {

Up p1 = new Up();

Up p2= new Down();

p1.met2(p2);

p1=new Down();

p1.met2(p2);


}}

2.[18 punti] Si consideri la seguente classe astratta che specifica il tipo di dato astratto “Albero binario etichettato”. Un albero binario è un albero in cui ogni nodo o è una foglia oppura ha esattamente due sottoalberi (sinistro e destro). Le etichette delle foglie sono valori sommabili (Addable). Definizione ricorsiva:

--caso base: una foglia con etichetta “n”

--caso ricorsivo: un nodo con etichetta “n”, e col riferimento al sottoalbero sinistro sx e destro dx, dove n e’ la somma dei valori di sx e dx.


public abstract class BESalbero {

// OVERVIEW: Un BESalbero è un albero binario, in cui nodi e foglie

// sono etichettati con valori omogenei sommabili. L’etichetta di un

// nodo è la somma delle etichette dei due suoi

// sottoalberi. Un BESalbero è modificabile

// Tipici valori astratti:

// n, se è una foglia etichettata n

// (n, a1, a2) , se è un nodo etichettato n con sottoalberi a1 ed a2

public abstract BESalbero sinistro () throws NotANode;



// EFFECTS: se this è una foglia solleva NotANode, altrimenti

// ritorna il sottoalbero sinistro di this

public abstract BESalbero destro () throws NotANode;



// EFFECTS: se this è una foglia solleva NotANode, altrimenti

// ritorna il sottoalbero destro di this

public abstract Addable etichetta ();



// EFFECTS: ritorna l’etichetta di this

public abstract boolean foglia();



// EFFECTS: se this è una foglia ritorna true, altrimenti ritorna

// false

public abstract BESalbero nuovoalbero (BESalbero d) throws ClassCastException, NullPointerException;



// EFFECTS: se d e’ null solleva NullPointerException;

// se le etichette di d non hanno lo stesso tipo

// delle etichette di this, solleva ClassCastException; altrimenti

// restituisce un nuovo BESalbero,

// i cui sottoalberi sinistro e destro sono this e d.

public abstract void rimpiazzasinistro (BESalbero s)throws ClassCastException, NullPointerException, NotANode;



// MODIFIES:this

// EFFECTS: se s è null solleva NullPointerException;

// se this è una foglia solleva NotANode,

// se il tipo delle etichette di s è diverso da quello delle

// etichette di this solleva ClassCastException, altrimenti

// rimpiazza il sottoalbero sinistro di this con s.

}
Si definisca una implementazione gerarchica con due sottoclassi concrete che realizzano i casi foglia e nodo, eseguendo quanto richiesto nel seguito:





  1. Per ciascuna delle due sottoclassi, si forniscano

    1. la specifica con eventuali dimostrazioni di validità della regola dei metodi, ove necessario.

    2. la rappresentazione, la funzione di astrazione e l’invariante di rappresentazione

    3. l’implementazione del costruttore con dimostrazione che preserva l’invariante di rappresentazione.

  2. Per la classe che realizza il caso nodo,

    1. Si fornisca l’implementazione dei metodi nuovoalbero e rimpiazzasinistro.



Condividi con i tuoi amici:


©astratto.info 2019
invia messaggio

    Pagina principale