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 (30 minuti): domande a risposta multipla a cui rispondere senza l'ausilio del compilatore Java
- Parte II (120 minuti): esercizi di programmazione da svolgere con l'ausilio del compilatore Java e della JVM
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?
- L'invocazione p.f() genera un errore di compilazione
- L'invocazione p.f() genera un errore a tempo di esecuzione
- L'invocazione p.g() genera un errore di compilazione
- L'invocazione p.g() genera un errore a tempo di esecuzione
Domanda 2
Una sola delle seguenti affermazioni è errata. Quale?
- Per creare un package è necessario creare una directory
- Una variabile protected è visibile in tutto il package di appartenenza della classe che la contiene
- 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
- 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?
- Rimpiazzando il segnaposto __ con 2, l'invocazione p.f() restituisce 2
- Rimpiazzando il segnaposto __ con super.f(), l'invocazione p.f() restituisce 1
- Rimpiazzando opportunamente il segnaposto __, l'invocazione p.f() può provocare il riempimento della pila dei record di attivazione
- 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?
- L'assegnazione String s = (String)x; non genera mai errori di compilazione
- L'assegnazione String s = (String)x; non genera mai errori di esecuzione
- L'assegnazione Object y = (String)x; non genera mai errori di esecuzione
- 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:
- costruttore;
- metodi getTarga(), getCilindrata() (per le sole auto) e getPosti() (per i soli pullman) che permettono di leggere i campi corripondenti.
- clone() copia profonda di due mezzi;
- equals() uguaglianza profonda di due mezzi;
- costoNoleggio() restituisce il costo giornaliero di noleggio del mezzo (come double), pari a cilindrata/20 per le auto, e 5*numero posti per i pullman;
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à:
- aggiungiMezzo(): che, dato un mezzo, lo aggiunge al parco dell'agenzia; se la targa del mezzo è già utilizzata lancia un'eccezione con il messaggio "targa esistente";
- eliminaMezzo(): che, data la targa b di un mezzo, lo elimina dal parco dell'agenzia; se la targa b non è utilizzata lancia un'eccezione con il messaggio "targa inesistente";
- listaAuto(): che restituisce una lista con tutte e sole le auto del parco mezzi;
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:
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∞]