Corso di Laurea in Informatica

Programmazione

M. A. Alberti
Università degli Studi di Milano
A.A. 2003/04

Soluzioni agli esercizi del III compitino - 28 gennaio 2004

II Compitino | Home

Esercizio 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11

Esercizio 1

Risposte
Nella classe Bassa
  1. Il metodo_1 è sovrascritto;
  2. Il metodo_2 è un sovraccaricamento;
  3. Il metodo_3 dà errore, perché non si puņ sovrascrivere un metodo statico con uno non statico;
  4. Il metodo_4 costituisce un sovraccaricamento del metodo di classe, legittimo ma sconsigliabile.

Si veda la classe Alta.java.

Esercizio 2

Risposta
Il compilatore trova un errore all'istruzione SubBase sb = new SubBase(10);. I parametri nel costruttore non sono corretti. Infatti la sottoclasse SubBase eredita solo il costruttore di default dalla superclasse, ovvero il costruttore senza parametri. Per rimediare occorre definire il costruttore della sottoclasse che accetta un parametro di tipo int, ad esempio public SubBase(int i) {}

Si veda la classe Test.java.

Esercizio 3

Risposta

La sequenza è la successione dei numeri dispari. Ogni numero si ottiene dal precedente sommando 2. Quindi il passo base della funzione ricorsiva sarà if (n == 0) return 1;, mentre il passo induttivo return 2 + f(n-1).

Si veda la classe Test3.java.

Esercizio 4

Soluzione
L'andamento dello stack delle chiamate dei metodi, dopo aver letto ciascun token dall'espressione aritmetica scritta in notazione postfissa
14 1 5 4 - + / 2 1 + + 2 *
e rappresentato sinteticamente, è il seguente:

stack: 4
5 5 1 1
1 1 1 1 2 2 2 3 2
14 14 14 14 14 14 7 7 7 7 10 10 20
token:
14 1 5 4 - + / 2 1 + + 2 *

Esercizio 5

Soluzione
  1. Non lecito. Genera l'errore in compilazione: incompatible types. Un oggetto della classe Studente non è necessariamente anche della classe Dottorando, quindi questa istruzione č un assegnamento non corretto;
  2. Corretto. Un oggetto della classe Dottorando è anche della classe Studente, quindi può essere passato come parametro implicito al metodo esami_sostenuti() della classe Studente, che viene ereditato;
  3. Non corretto. L'oggetto s non è stato istanziato. Lecito, invece, in quanto visibilità.
  4. Non corretto. Potrebbe essere lecito se, sulla variabile s, si effettua un cast al tipo Dottorando, come nel codice: ((Dottorando)s).dottorato = "fisica";
  5. Non corretto, poiché l'array tutoraggio non è stato istanziato. Lecito per quanto riguarda la visibilità, essendo tutoraggio un membro della classe Dottorando dichiarato come tipo array di oggetti di tipo Studenti.

Si veda il programma Test5.java.

Esercizio 6

Risposta

Il ciclo viene compilato ma non viene eseguito e solleva un'eccezione a runtime, in particolare una java.lang.NullPointerException. Infatti, le singole posizioni dell'array non sono state istanziate e perciò contengono il valore iniziale di default null. Non si può quindi inviare il messaggio (concat) a un oggetto inesistente.

Si veda il programma Test6.java

Esercizio 7

Soluzione
public Object pop() {
   if (cima == null)
      throw new PilaVuotaException();
   else {
      Object risultato = cima.dato;
      cima = cima.pros;
      return risultato;
}

Si veda il programma Stack.java nella cartella Stack_lista

Esercizio 8

Soluzione
Una eccezione non controllata:
public class PilaVuotaException extends RuntimeException {
}

Esercizio 9

Soluzione
public void aggiungi(Object x) {
   //creazione del nuovo nodo
   Nodo t = new Nodo();
   t.dato = x;
   t.pros = null;
	  
   //inserimento del nodo
   if (primo == null)      //caso di coda inizialmente vuota   
      primo = ultimo = t;
   else {                  //caso di coda non vuota
      ultimo.pros = t;     //collega il nuovo nodo dopo l'ultimo  
      ultimo = t;          //aggiorna il riferimento ultimo
   }
}

Si veda il programma Coda.java nella cartella Coda_lista

Esercizio 10

Soluzione
public boolean hasNext() {
   if (indice == anno.length)
      return false;
   else 
      return true;
}
public Object next() {
   return (Object)anno[indice++];
}
public int mese() {
   return indice + 1;
}

Esercizio 11

Soluzione
Le succesive chiamate di funzione:
funzione ([ a b c ])
return 1 + funzione ([ b c ])						^3
           return 1 + funzione ([ c ])				^2
                      return 1 + funzione ([ ])		^1
			         return 0     	^0
   
La funzione funzione calcola la lunghezza della lista passata in input (ad esempio [ a b c ]), dapprima avanzando con le chiamate ricorsive successive, che vengono impilate sullo stack delle chiamate fino a quella con la lista vuota come parametro ([ ]), quindi disallocando le chiamate e riportando all'ambiente chiamante 1 + il valore ricevuto dalla chiamata appena conclusa.

Esercizio 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11


M.A. Alberti, 28 gennaio 2004