Fondamenti di Informatica I

Corso di Laurea in Ingegneria Informatica e Automatica - Corso di Laurea in Ingegneria dei Sistemi Informatici

HomePage | Avvisi | Informatica Automatica | Sistemi Informatici | Programma | Materiale didattico | Esercitazioni | Esami | Anni Precedenti | Login

Esempio di compito di esame 2a prova intermedia


La durata complessiva del compito, che è diviso in due parti, è di 2 ore e 30 minuti:



Parte I: domande a risposta multipla (30 minuti)


Domanda 1

Si consideri il seguente frammento di programma Java:

public interface I {
    public void f();
}

public class C implements I {
    public void f() { }
    public void g() { }
}


Sia p una variabile di tipo I che contiene l'indirizzo di un oggetto di tipo C. Una sola delle seguenti affermazioni è corretta: quale?
  1. L'invocazione p.f() genera un errore di compilazione
  2. L'invocazione p.f() genera un errore a tempo di esecuzione
  3. L'invocazione p.g() genera un errore di compilazione
  4. L'invocazione p.g() genera un errore a tempo di esecuzione

Domanda 2

Una sola delle seguenti affermazioni è errata. Quale?
  1. Per creare un package è necessario creare una directory
  2. Una variabile protected è visibile in tutto il package di appartenenza della classe che la contiene
  3. Se si hanno due package pippo e pippo.paperino, la direttiva import pippo.*; importa tutte le classi/interfacce del package pippo e del package pippo.paperino
  4. Per specificare che una classe appartiene al package pippo.paperino, è necessario usare la direttiva package pippo.paperino;

Domanda 3

Si consideri il seguente frammento di programma contenente il segnaposto __:

public class A {
    public int f() { return 1; }
}

public class B extends A {
    public int f() { return __; }
}


Si consideri una variabile riferimento p di tipo A che punta a un oggetto di classe B. Una sola delle seguenti affermazioni è errata. Quale?
  1. Rimpiazzando il segnaposto __ con 2, l'invocazione p.f() restituisce 2
  2. Rimpiazzando il segnaposto __ con super.f(), l'invocazione p.f() restituisce 1
  3. Rimpiazzando opportunamente il segnaposto __, l'invocazione p.f() può provocare il riempimento della pila dei record di attivazione
  4. Indipendentemente dal modo in cui è rimpiazzato il segnaposto __, l'invocazione ((B)p).f() provoca sempre un'eccezione di tipo ClassCastException

Domanda 4

Sia x una variabile di tipo Object inizializzata. Una sola delle seguenti affermazioni è corretta. Quale?
  1. L'assegnazione String s = (String)x; non genera mai errori di compilazione
  2. L'assegnazione String s = (String)x; non genera mai errori di esecuzione
  3. L'assegnazione Object y = (String)x; non genera mai errori di esecuzione
  4. L'assegnazione x = "ciao"; genera un errore di compilazione

[ Risposte alle domande ]

Parte II: esercizi di programmazione (2 ore)


Esercizio 1 (ricorsione, strutture collegate)

Si consideri la seguente classe Nodo per strutture collegate lineari (SCL):

class Nodo {
   protected Nodo next;
   protected Object elem;
   public Nodo(Object elem, Nodo next) { this.elem=elem; this.next=next; }
}


Scrivere una classe pubblica Eserc1 con un metodo statico Nodo rimuoviDuplicati(Nodo p) che, data una SCL p, restituisce la SCL ottenuta da p rimuovendo tutti gli elementi duplicati. Il metodo deve creare una nuova lista (realizzazione funzionale) senza cambiare la lista data in ingresso. La soluzione del problema deve essere ricorsiva, eventualmente usando metodi privati ausiliari, senza usare alcuna istruzione di ciclo.

Scrivere la soluzione in modo da poter compilare ed eseguire con successo il seguente programma di prova senza doverlo modificare:

public class ProvaEserc1 {
    public static void main(String[] args){
        Nodo p = new Nodo("uno", new Nodo("due", new Nodo("tre", new Nodo("quattro", new Nodo("due", null)))));
        Nodo q = Eserc1.rimuoviDuplicati(p);
        stampa(p); // stampa: "uno due tre quattro due"
        stampa(q); // stampa: "uno due tre quattro" oppure "uno tre quattro due"
    }
    private static void stampa(Nodo p) {
        for (; p!=null; p=p.next) System.out.print(p.elem+ " ");
        System.out.println();
    }
}


Esercizio 2 (ereditarietà, late binding, package)

Un'agenzia di viaggio gestisce un parco mezzi a noleggio (auto e pullman). Per ciascun mezzo è di interesse la targa (String). Se il mezzo è un pullman, è di interesse anche il numero di posti (int). Se il mezzo invece è un'auto, la sua cilindrata (int).

Devono essere supportate le seguenti funzionalità relative ai mezzi:


Scrivere una gerarchia di classi pubbliche (con tutte le variabili private) in modo da poter compilare ed eseguire il seguente programma di prova senza doverlo modificare:

import agenzia.mezzi.Auto;
import agenzia.mezzi.Pullman;
import agenzia.Mezzo;

public class ProvaEserc2 {
   public static void main(String[] args){
       Mezzo a1 = new Auto("BZ156FX", 1620); // auto 1620 cc
       Mezzo p1 = new Pullman("AH111GW", 80); // pullman 80 posti
       Mezzo a2 = (Mezzo)a1.clone();
       Mezzo p2 = (Mezzo)p1.clone();
       System.out.println(a1==a2); // false
       System.out.println(p1==p2); // false
       System.out.println(a1.equals(a2)); // true
       System.out.println(p1.equals(p2)); // true
       System.out.println(a2.costoNoleggio()); // 81.0
       System.out.println(p2.costoNoleggio()); // 400.0
       System.out.println(a2.getTarga()+" "+((Auto)a2).getCilindrata()); // BZ156FX 1620
       System.out.println(p2.getTarga()+" "+((Pullman)p2).getPosti()); // AH111GW 80
   }
}


Esercizio 3 (eccezioni, Collections Framework, RTTI, generics)

L'agenzia di viaggi dell'esercizio 2 vuole poter gestire il suo parco mezzi mediante una classe pubblica ParcoMezzi con le seguenti funzionalità:


Scrivere la soluzione in modo da poter compilare ed eseguire con successo il seguente programma di prova senza doverlo modificare:

import java.util.*;
import agenzia.mezzi.*;
import agenzia.Mezzo;
import agenzia.ParcoMezzi;
import agenzia.EccezioneMezzi;

public class ProvaEserc3 {
   public static void main(String[] args){
       ParcoMezzi p = new ParcoMezzi();
       p.aggiungiMezzo((Mezzo)new Auto("BZ156FX", 1620));
       p.aggiungiMezzo((Mezzo)new Pullman("FC138BA", 100));
       p.aggiungiMezzo((Mezzo)new Auto("BQ971AH", 1995));
       List<Auto> l = p.listaAuto();
       stampa(l); // BZ156FX 1620 e BQ971AH 1995
       p.eliminaMezzo("BZ156FX");
       stampa(p.listaAuto()); // BQ971AH 1995
       try {
           p.aggiungiMezzo((Mezzo)new Pullman("FC138BA", 80)); // deve generare una eccezione
           System.out.println("errore: dovrebbe generare un'eccezione");
       }
       catch(EccezioneMezzi e) {
           System.out.println(e.getMessage()); // deve stampare: targa esistente
       }
       try {
           p.eliminaMezzo("BZ156FX"); // deve generare una eccezione
           System.out.println("errore: dovrebbe generare un'eccezione");
       }
       catch(EccezioneMezzi e) {
           System.out.println(e.getMessage()); // deve stampare: targa inesistente
       }
   }
   private static void stampa(List<Auto> l){
       for (int i=0; i<l.size(); i++) {
           Auto a = l.get(i);
           System.out.println(a.getTarga()+" "+a.getCilindrata());
       }
   }
}


Esercizio 4 (iteratori)

Rendere la seguente classe Nodo iterabile in modo che sia possibile scandire tutti e soli gli elementi di tipo String contenuti nella SCL:

class Nodo {
   protected Nodo next;
   protected Object elem;
   public Nodo(Object elem, Nodo next) { this.elem=elem; this.next=next; }
}


Scrivere il programma in modo da poter compilare ed eseguire il seguente programma di prova con successo senza doverlo modificare:

ProvaEserc4.java
import java.util.*;

public class ProvaEserc4 {
    public static void main(String[] args){
        Nodo p = new Nodo("uno", new Nodo(2, new Nodo(3, new Nodo("quattro", new Nodo(5, null)))));

        if (!Iterable.class.isInstance(p))
            System.out.println("Errore: Nodo dovrebbe essere iterabile");

        Iterator i = p.iterator();
        while (i.hasNext())
            System.out.println(i.next()); // stampa: uno quattro

        try {
            Object x = i.next();
            System.out.println("errore: dovrebbe generare un'eccezione");
        }
        catch(NoSuchElementException e) {
            System.out.println("ok, eccezione NoSuchElementException");
        }

        try {
            i.remove();
            System.out.println("errore: dovrebbe generare un'eccezione");           
        }
        catch(UnsupportedOperationException e){
            System.out.println("ok, eccezione UnsupportedOperationException");
        }
    }
}


[Soluzioni esercizi di programmazione: online browsing oppure archivio zip]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.3
Page was generated in 0.4028 seconds