Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Programmazione II e Laboratorio
Corso A e B Scritto del 13 aprile 2007
Esercizio 1 (punti 7) Si consideri la denizione del metodo delete, riportato qui di seguito, che cancella da una lista di valori interi concatenata con sentinella la prima occorrenza di un elemento in cui campo dato contiene lo stesso valore del parametro val passato come parametro:
public class MiaListaConcatenata { private class ListElem { private int dato; private ListElem next = null; [ ... ] public boolean delete(int val) { if (next == null) return false; if (next.dato != val) return next.delete(val); next = next.next; return true; } } private ListElem first; public MiaLista() { first = new ListElem(); } public boolean delete(int val) { if (first.dato == val) { first = first.next; return true; { else return first.delete(val); } [ ... ] }
Assumendo che la lista concatenata miaLista sia 3 4 5 6, si disegni lo stato dello stack e dello heap nei seguenti istanti per la chiamata miaLista.delete(5): allinizio della prima esecuzione di delete della classe ListElem; al termine della esecuzione di delete della classe ListElem che cancella lelemento con dato 5, prima che il blocco corrispondente sia rimosso dallo stack. 1
realizzare un metodo di rma: int sommaValoriFoglie(); per la classe GenericTreeArrayList che riporti la somma di tutti i valori dei dati memorizzati nelle foglie dellalbero (ma non nei nodi interni). Ad esempio, per lalbero riportato qui di seguito il risultato ` e: 10 + 3 + 6 + 7 + 9 + 10 + 11 = 56.
public A() { a++; c++; } public void metodoProva() { b++; d++; } public int getA() { return a; } public int getB() { return b; } public int getC() { return c; } public int getD() { return d; } }
Si risponda alle seguenti domande: (a) Quale tra i metodi della classe A restituisce il numero di istanze della classe stessa create no a quel momento? (b) Quale tra i metodi della classe A, se chiamato su una data istanza x di A, restituise il numero di volte che il metodo metodoProva ` e stato invocato su x? (c) Quale tra i metodi della classe A restituise il numero di volte che ` e stato utilizzato il metodo metodoProva da una qualsiasi istanza della classe A? (d) Quali tra i metodi della classe A potrebbero essere dichiarati static senza alterarne il signicato? (e) Quale tra i metodi della classe A restituir` a durante una qualsiasi esecuzione sempre lo stesso valore? E quale ` e il valore costante restituito? (f) Se in un dato momento di una esecuzione sono presenti nella memoria heap tre istanze della classe A, quante occorrenze delle variabili a, b, c e d sono presenti in memoria?
Esercizio 4 (punti 7) Sia data la seguente specica (interfaccia) per la struttura dati insieme di interi:
public interface InsiemeInteri { boolean isEmpty(); // test se linsieme e vuoto boolean member(int val); // test se val appartiene allinsieme void insert(int val); // inserisce un elemento dato boolean delete(int val); // cancella un elemento dato int remove(); // rimuove un elemento a caso restituendolo InsiemeInteri clone(); // restituisce una copia dellinsieme }
e sia InsiemeInteriImpl una classe che realizzi (implements) linterfaccia sopra riportata. Si realizzi un metodo di rma: InsiemeInteri differenzaInsiemi(InsiemeInteri a, InsiemeInteri b); che realizzi la dierenza insiemistica dei due insiemi passati come parametri (a b). Ad esempio, se a = {4, 2, 6, 1} e b = {5, 3, 1, 4} allora a b = {2, 6}. Suggerimenti: la dierenza a b ` e denita come linsieme degli elementi che appartengono ad a ma non a b, in altre parole si pu` o vericare per ogni elemento di a se questo non appartiene a b perch` e sia aggiunto allinsieme dierenza; se si desidera lasciare inalterati gli insiemi passati come parametri si eettui una copia di lavoro di questi mediante il metodo clone:
InsiemeInteri differenzaInsiemi(InsiemeInteri a, InsiemeInteri b) { InsiemeInteri aCopia = a.clone(); [ ... ] }
Nome: Corso: B
public class GenericTreeArrayList { private GenericNode root; public class GenericNode { private int dato; private ArrayList<GenericNode> children = new ArrayList<GenericNode>(); [ ... ] public int sommaValoriFoglie() { if (children.size() == 0) return this.getDato(); int somma = 0; for (GenericNode child: children) somma += child.sommaValoriFoglie(); return somma; } } public GenericTreeArrayList() { root = null; } [ ... ] public int sommaValoriFoglie() { if (root == null) throw new IllegalArgumentException("Albero vuoto"); else return root.sommaValoriFoglie(); } }
3.
(a) Il metodo getA. (b) Il metodo getD. (c) Il metodo getB. (d) I metodi getA e getB. (e) Il metodo getC; valore restituito 1. (f) a: una istanza, b: una istanza, c: tre istanze, d: tre istanze. 4.
InsiemeInteri differenzaInsiemi(InsiemeInteri a, InsiemeInteri b) { InsiemeInteri aCopia = a.clone(); InsiemeInteri diff = new InsiemeInteriImpl(); int elem; while (!aCopia.isEmpty()) { elem = aCopia.remove(); if (!b.member(elem)) diff.insert(elem); } return diff; }