Sei sulla pagina 1di 7

Corso di Laurea in Informatica

Programmazione II e Laboratorio
Corso B Scritto del 4 aprile 2007

Esercizio 1 (punti 9) Data MiaListaConcatenata (senza sentinella in testa):


public class MiaListaConcatenata { private class ListElem { private int dato; private ListElem next = null; public ListElem getNext() { return next; } public void setNext(ListElem next) { this.next = next; } [ ... ] } private ListElem first; public MiaListaConcatenata() { first = null; } [ ... ] }

si realizzi, in versione iterativa o ricorsiva a scelta, un metodo con rma: void cancellaPari(); per la classe MiaListaConcatenata che cancelli tutti gli elementi della lista in posizione pari (il primo elemento della lista ` e in posizione dispari).

Esercizio 2 (punti 9) Sia data la classe che realizza lalbero generico:


public class GenericTreeArrayList { private GenericNode root; public class GenericNode { private int dato; private ArrayList<GenericNode> children = new ArrayList<GenericNode>(); [ ... ] } public GenericTreeArrayList() { root = null; } [ ... ] }

realizzare un metodo di rma: int contaFoglieNodiInterni(); per la classe GenericTreeArrayList che conta il numero di nodi interni presenti nellalbero. Ad esempio, lalbero riportato qui di seguito ha 6 nodi interni.

Esercizio 3 (punti 6) Dato il seguente frammento di codice Java:


class A { public void metodoUno() { System.out.println("MetodoUno della classe A"); this.metodoDue(); } public void metodoDue() { System.out.println("MetodoDue della classe A"); } } class B extends A { public void metodoDue() { System.out.println("MetodoDue della calsse B"); } }

(a) Sia data la sequenza di istruzioni A a = new A(); A b = new B();, dire quale ` e la stampa eettuata a console dellesecuzione delle istruzioni: (a-1) a.metodoUno(); (a-2) b.metodoUno(); (a-3) a.metodoDue(); (a-4) b.metodoDue(); (b) Sia data la sequenza di istruzioni B b = new A(); b.metodoDue();, ` e possibile compilarla? Nel caso sia possibile, quale ` e la stampa eettuata a console dallesecuzione di tale istruzione? Nel caso non sia possibile, spiegarne il motivo. (c) Sia Ist(A) e Ist(B ) linsieme di tutti gli oggetti di tipo A e tipo B di un programma in un ` vero che linsieme Ist(B ) ` certo istante di tempo. E e incluso in Ist(A)?

Esercizio 4 (punti 3) Si consideri la sequenza di istruzioni:


[ ... ] x = 3; try { istruzione-1; x++; istruzione-2; x++; } catch (Eccezione err) { x++; } x++; System.out.println("valore x: " + x); [ ... ]

Supponendo che sia istruzione-1 che istruzione-2 possono sollevare una eccezione di tipo Eccezione, si risponda alle seguenti domande: (a) Se istruzione-1 solleva una eccezione, dire se listruzione di stampa viene eseguita. Nel caso di risposta aermativa dire quale ` e il valore stampato. (b) Se istruzione-2 solleva una eccezione, dire se listruzione di stampa viene eseguita. Nel caso di risposta aermativa dire quale ` e il valore stampato. (c) Se istruzione-1 e istruzione-2 non sollevano alcuna eccezione, dire se listruzione di stampa viene eseguita. Nel caso di risposta aermativa dire quale ` e il valore stampato. Punti totali: 27/27.

Scritto di Programmazione II e Laboratorio del 04/04/2007 SOLUZIONI Cognome: Matricola:


1.

Nome: Corso: B

public class MiaListaConcatenata { private class ListElem { private int dato; private ListElem next = null; public ListElem getNext() { return next; } public void setNext(ListElem next) { this.next = next; } [ ... ] public void cancellaPariR() { if (next == null) return; next = next.getNext(); if (next != null) next.cancellaPariR(); } } private ListElem first; public MiaListaConcatenata() { first = null; } [ ... ] public void cancellaPari() { if (first == null) return; ListElem iterator = first; while ((iterator != null) && (iterator.getNext() != null)) { iterator.setNext((iterator.getNext()).getNext()); iterator = iterator.getNext();

} } public void cancellaPariR() { if (this.isEmpty()) return; first.cancellaPari(); } }

2.

public class GenericTreeArrayList { private GenericNode root; public class GenericNode { private int dato; private ArrayList<GenericNode> children = new ArrayList<GenericNode>(); [ ... ] public int contaNodiInterni() { if (children.size() == 0) return 0; int nodiInterni = 0; for (GenericNode child: children) nodiInterni += child.contaFoglieNodiInterni(); return nodiInterni + 1; } } public GenericTreeArrayList() { root = null; } [ ... ] Coppia contaFoglieNodiInterni() { if (root == null) return 0; else return root.contaNodiInterni(); }

3.

(a-1) a.metodoUno(); MetodoUno della classe A MetodoDue della classe A (a-2) b.metodoUno(); MetodoUno della classe A MetodoDue della classe B (a-3) a.metodoDue(); MetodoDue della classe A (a-4) b.metodoDue(); MetodoDue della classe B (b) Non ` e possibile compilarla. Non ` e possibile assegnare ad una variabile di una sottoclasse un oggetto di una sopraclasse. (c) Vero. 4.

(a) Viene eseguita, il valore stampato ` e: 5. (b) Viene eseguita, il valore stampato ` e: 6. (c) Viene eseguita, il valore stampato ` e: 6.