Corso di Laurea in Informatica

Programmazione

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

Soluzioni prova scritta - I appello 6 febbraio 2004

I Compitino | II Compitino | III Compitino | Home

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

Esercizio 1

Risposte
La costruzione di un oggetto di una sotto-classe richiede che venga dapprima costruito un oggetto della super-classe. Poiché il costruttore della classe Verde richiede un parametro allora il costruttore di un oggetto di VerdeMare deve esplicitamente chiamare il costruttore del padre, invocando super cui passare il parametro gr per inizializzare il campo gradazione del padre. Lo stesso parametro potrà essere usato per inizializzare il campo gradazione privato del figlio.
VerdeMare(int gr) {
	super(gr);
	gradazione = gr;
}
Dopo aver eseguito le istruzioni indicate si ottiene:
Verde matita = new Verde(3);
	matita.metodo_2();		verde
	matita.metodo_1();		3
	matita.metodo_3();		1
	matita.gradazione;		4
VerdeMare penna = new VerdeMare(2);
	penna.metodo_2();		verde
	penna.metodo_1();		2
	penna.metodo_3();		2
VerdeMare stilo = new VerdeMare(1);
	stilo.metodo_3();		3
	penna.metodo_3();		3
	((Verde)stilo).gradazione;	1

Si vedano le classi Verde.java e VerdeMAre.java per verificare l'output.

  • Esercizio 2

    Risposta
    Il compilatore trova un errore nel compilare la classe Test alla riga 4, contenente l'istruzione SubBase sb = new SubBase(10);. Non esiste un costruttore con parametri. Infatti la sottoclasse SubBase non eredita costruttori e avrebbe solo il costruttore di default, ovvero il costruttore senza parametri. Ma un oggetto di classe SubBase dovrebbe comunque costruire il padre chiamandone esplicitamente il costruttore. Per rimediare occorre definire il costruttore della sottoclasse che accetta un parametro di tipo int, ad esempio public SubBase(int i) {}, e che lo passi al costruttore del padre.
    SubBase(int i) {
    	super(i);
    }
    

    Si veda la classe Test.java.

    Esercizio 3

    Risposta

    La sequenza è ottenuta raddoppiando il numero precedente e sommando l'intero 1. Quindi il passo base della funzione ricorsiva sarà if (n == 0) return 1;, mentre il passo induttivo return 2 * f(n-1) + 1.

    Si veda la classe Test3.java.

    Esercizio 4

    Soluzione
    L'andamento dello stack che viene utilizzato da un metodo che controlla che le parentesi siano bilanciate nell'espressione
    ( a ) ( ( ( b ) ( ( c ) ) ( d ) ) )
    :

    stack: ( (
    ( ( ( ( ( ( ( (
    ( ( ( ( ( ( ( ( ( ( ( (
    ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (
    token:
    ( a ) ( ( ( b ) ( ( c ) ) ( d ) ) )

    E nell'espressione seguente, in cui si verifica che dopo la lettura dell'ultimo token lo stack non sarà vuoto; indicazione del fatto che le parentesi non sono bilanciate:
    ( ( a ) ( ( b ) )
    stack: ( (
    ( ( ( ( ( (
    ( ( ( ( ( ( ( ( (
    token:
    ( ( a ) ( ( b ( (

    Esercizio 5

    Risposta
    Le istruzioni necessarie potranno essere le seguenti:
    StringTokenizer st = new StringTokenizer("questo č un esame");
    while (st.hasMoreTokens()) 
    {
    	System.out.println(st.nextToken());
    }
    

    Il metodo nextToken() della classe StringTokenizer riporta un oggetto di classe String. Si veda la classe Test5.java.

    Esercizio 6

    Risposte
    L'espressione, in notazione postfissa,
    1 5 + 2 * 3 1 + /
    
    corrisponde all'espressione, in notazione infissa:
    (1 + 5) * 2 / (3 + 1)
    
    Mentre l'espressione, in notazione prefissa,
    / + 8 4 * 2 + 1 1 
    
    corrisponde all'espressione, in notazione infissa:
    (8 + 4) / 2 * (1 + 1)
    

    Esercizio 7

    Risposte
    1. Falso, un classe può implementare più di una interface.
    2. Vero, si usa un'interfaccia per dichiarare metodi che diverse classi dovranno implentare. Un'interfaccia può essere implementata da diverse classi.
    3. Falso, una classe che implementa un'interfaccia non può rinviare alle sottoclassi l'impementazione dei metodi della stessa. Questo concetto è invece realizzato dalla dichiarazione di una classe abstract.
    4. Vero, un'interfaccia puņ essere usata per dichiarare variabili come un tipo di dato.
    5. Vero, una classe dichiarata abstract non può essere istanziata perchè contiene metodi astratti, ma può avere sottoclassi che li implementino.
    6. Falso, per il motivo espresso al punto precedente.
    7. Falso.
    8. Costituisce una creazione di array e una sua inizializzazione a valori di default.
    9. Vero.
    10. Falso. La segnatura contraddistingue ciascun metodo sovraccaricato. Il tipo di rientro non è rilevante.
    11. Falso. Se la segnatura è univoca per ciascun metodo sovraccaricato allora il tipo di rientro può anche essere diverso.
    12. Falso. Nella sovrascrittura occorre mantenere il prototipo e cambiare il corpo del metodo.

    Esercizio 8

    Risposte
    1. stringa partenza = "i seguaci" Ciclo While stringa arrivo = stringa vuota
      stringa partenza = "i seguaci" Ciclo DoWhile: stringa arrivo = i seguac
    2. stringa partenza = "imbuto" Ciclo While stringa arrivo = stringa vuota
      stringa partenza = "imbuto" Ciclo DoWhile: segnala l'errore
      StringIndexOutOfBoundsException: String index out of range: 6
      	at java.lang.String.charAt(String.java:516)
      	at DoWhile.main(DoWhile.java:12)
      Exception in thread "main" Process Exit...
      

    Si vedano le classi While.java e DoWhile.java.

    Esercizio 9

    Soluzione
    public void push(Object o)
    {
    	NodoStack t = new NodoStack();
    	t.dato = o;
    	t.pros = cima;
    	cima = t;
    }
    
    Una fotografia della situazione della memoria heap durante l'esecuzione delle istruzioni:
    Stack s = new Stack(); 
    s.push(Integer(2)); 
    s.pop(); 
    s.push(Integer(5));
    s.push(Integer(7));
    

    Si veda il programma Stack.java nella cartella Stack_lista.

    Esercizio 10

    Soluzione
    public boolean hasMoreElements() {
       if (indice == cesto.length)
          return false;
       else 
          return true;
    }
    public Object nextElement() {
       return (Object)cesto[indice++];
    }
    

    Si veda il programma EnumerationDemo.java.

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


    M.A. Alberti, 6 febbraio 2004