Corso di Laurea in Informatica

Programmazione

M. A. Alberti
Università degli Studi di Milano
A.A. 2005/06

Soluzioni prova scritta - V appello 15 settembre 2006

Home

Esercizio 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8

Esercizio 1

Risposte
  1. La compilazione della classe SuperCls ha successo
  2. Nella sottoclasse SottoCls il metodoA è sovraccaricato
  3. Il metodoB provoca errore, perché i due metodi hanno la stessa firma ma diverso prototipo. Si corregge cambiando il tipo di rientro in void nella sottoclasse e cambiando l'istruzione di return in una di stampa, ad esempio.
  4. Il metodoC è sovrascritto
  5. Il metodoD non causa errore, come potrebbe sembrare a prima vista, poichè è un metodo di classe nella SuperCls e di istanza nella sottoclasse. Si tratta di un sovraccaricamento, visto che cambiano i parametri.
  6. Il costruttore SottoCls () dà errore perché non richiama esplicitamente come prima istruzione il costruttore della superclasse mediante l'istruzione super (i)
  7. p.n vale 3
  8. p.x vale 6
  9. f.n vale 5
  10. f.metodoA (f.n, x) vale 40
  11. p.x vale 8, perché la chiamata al costruttore della superclasse super (i) ha passato il valore 5 al parametro i e il membro di classe x della SuperCls è stato perciò inizializzato a 5 + 3, quindi 8.
  12. p.metodoC (p.n) causa la stampa di 6
  13. f.metodoC (f.n) causa la stampa di 5
  14. p.x ora vale 3, perché il metodoC lo ha modificato
  15. f.metodoA (f.n, x) vale 15
  16. L'istruzione non è corretta per incampatibilità tra tipi. Il tipo void non può essere convertito a int.
  17. L'istruzione sarebbe corretta se guardassimo alla definizione del metodo nella sottoclasse, ma per poter compilare la sottoclasse abbiamo dovuto cambaire il suo prototipo ponendo a void il suo tipo di rientro anzichè int. Quindi anche questa istruzione alla fine non è corretta.
  18. La differenza in generale consiste nel fatto che se i metodi hanno un tipo di rientro allora possono essere usati in espressioni e in particolare in espressioni di assegnamento, se sono dichiarati void allora non possono.

Si vedano le classi SuperCls.java e SottoCls.java

Esercizio 2

Risposte
  1. L'output del ciclo for è costituito dai multipli di 5:
    0
    5
    10
    15
    20
    25
    30
  2. Output del ciclo while:
    1
    2
    3
    4
    5
    6
    7
    8
    9

Si veda il programma BreakContinue.java

Esercizio 3

Risposte
  1. tra -11 e 11
  2. tra 0 e 4
  3. rand.nextInt() % 13);
  4. (int) (Math.random () * 21) + 5;

Si veda il programma Numeri_random.java

Esercizio 4

Risposta
public static long fibonacci (int n)
{
	if (n == 0 || n == 1)
		return n;
	else return (fibonacci (n-1) + fibonacci (n-2));
}

Si veda il programma TestFibo.java.

Esercizio 5

Soluzione
Algoritmo per differenze successive:
static int mcd (int m, int n) {
   while (m > 0) {
      if (m < n) {
	   int temp = m;
	   m = n;
	   n = temp;
	}
	m -= n;
   }
   return n;
}
Algoritmo di Euclide
static int mcd (int m, int n) {
   int r = m % n;		// calcolo del resto tra m e n
   while (r > 0) {      	// fino a che il resto non diventa nullo
      m = n;			// scambiare la coppia (m, n) con la coppia (n, r)
      n = r;
      r = m % n;		// e ricalcolare il resto
   }
   return n;
}

Esercizio 6

Soluzione
Si veda il programma TestMCD.java che richiama la funzione mcd.

Esercizio 7

Soluzione
La classe Test richiama in un ciclo il metodo funzione che effettua il test di primalità. Quindi la classe stampa nel ciclo i numeri che risultano primi.

Si veda il programma Test.java.

Esercizio 8

Soluzione
Il programma stampa i numeri che risultano primi nell'intervallo [0, 30):
2
3
5
7
9
11
13
17
19
23
29

Si veda il programma Test.java.

Esercizio 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8


M.A. Alberti, 15 settembre 2006