1
Corso di laurea in Informatica AA 2007/08 Programmazione, M.A. Alberti Prova scritta – IV appello, 11 luglio 2008
Cognome Nome
Matricola
1
Stabilire qual’è l’output del seguente codice Java, supponendo che sia stata dichiarata la variabile int i:
for (i = 1; i < 10; i++) { if (i%3 == 0) break;
System.out.println (i);
}
System.out.println (i);
1 2
3 // valore della variabile i all'uscita dal ciclo
for (i = 1; i < 10; i++) { if (i%3 == 0) continue;
System.out.println (i);
}
System.out.println (i);
1 2 4 5 7 8
10 // valore della variabile i all'uscita dal ciclo for (i = 1; i < 10; i++) {
if (i%3 == 0) System.exit(0);
System.out.println (i);
}
System.out.println (i);
1 2
// il programma si interrompe senza eseguire la stampa fuori dal ciclo
2
Supponete sia definita una classe BarcaVela derivata dalla classe Barca e supponete che quest’ultima classe abbia definito i metodi pubblici velocitàNodi() e accendiMotori().
Un oggetto di classe BarcaVela risponde ai metodi velocitàNodi() e accendiMotori()?
SI NO
Questi metodi dovranno eseguire le stesse azioni sia per gli oggetti di classe BarcaVela sia per gli oggetti di classe Barca, sempre e comunque? SI NO Come si chiama in Java il concetto di specializzazione dei metodi? sovrascrittura
Se per la classe BarcaVela è stato definito il metodo alzareRanda(), questo può essere
invocato su un oggetto di classe Barca? SI NO
3
Data la classe seguente con i costruttori elencati:
class Dipendente { private String nome;
Dipendente(){
nome = new String();
}
Dipendente(String unNome) { nome = unNome;
} }
AA 2007/08 Programmazione, Prof. M.A. Alberti IV appello, 11 luglio 2008
2 E’ possibile al di fuori della classe cambiare il valore del membro nome di un oggetto già
istanziato? SI NO
Se nella classe è stato definito un metodo pubblico che accede al campo nome public void modificaNome (String nuovoNome) {
nome = nuovoNome;
}
Per estendere la classe con una specializzazione, introduciamo la sottoclasse Impiegato, completare quindi il codice seguente opportunamente:
class Impiegato extends Dipendente { private int settore;
// 1, 2, 3 ad esempio Impiegato() {
super();
settore = 1;
// valore di default }
Impiegato
(String unNome, int unSettore) { super(unNome);
settore = unSettore;
} }
Supponendo di aver eseguito l’istruzione: Impiegato imp = new Impiegato();
E’ possibile accedere al campo nome della superclasse? SI NO Per accedere al campo nome è corretta l’espressione: imp.nome ? SI NO
Esistono altri modi? SI NO
Definire il codice di possibili alternative, per accedere al campo:
public String riportaNome (){
return nome;
}
In generale, in una sottoclasse è possibile accedere direttamente ad un campo privato di
un’istanza della superclasse? SI NO
In una sottoclasse è possibile usare un metodo privato della superclasse? SI NO
4
Scrivere il metodo init che inizializza con numeri dispari un array di interi di dimensione MAX, passato come parametro. L’array inizializzato andrà riportato all’ambiente chiamante. A scelta si usi un ciclo for o un ciclo while:
public static int[] init(int[] a) { for (int i=0; i < MAX; i++) a[i]=2*i + 1;
return a;
}
public static int[] init(int[] a) { int i=0;
while (i < MAX)
AA 2007/08 Programmazione, Prof. M.A. Alberti IV appello, 11 luglio 2008
3 a[i]=2*++i + 1;
return a;
}
5
Scrivere un metodo per rimuovere un elemento in posizione data da un array che verrà quindi riportato all’ambiente chiamante modificato. Sia la posizione dell’elemento da rimuovere sia l’array sono passati come parametri. Per rimuovere l’elemento si deve procedere ad eseguire lo slittamento di una posizione di tutti i valori dell’array dalla posizione data alla fine dell’array. Alla fine del processo la posizione finale e quella precedente risultano uguali e quindi quella finale viene posta al valore di defualt 0. Si supponga cha l’array sia un array di interi. Ad esempio la rimozione dell’elemento 2 dall’array [23 45 1 65 87] genera l’array [23 45 65 87 0]
public static int[] rimuovi(int p, int[] a) { for (int i = p; i < a.length-1;)
a[i]=a[++i];
a[a.length-1] = 0;
return a;
}
6
Utilizzando la classe StringTokenizer implementare un ciclo for necessario per inizializzare l’array di stringhe frase. Ad esempio: se in input è data la frase “questo è un esame” allora l’array frase dovrà essere inizializzato a [questo, è, un, esame].
System.out.print("input una riga di testo: ");
String riga = Keyboard.readString();
StringTokenizer processore_di_riga = new StringTokenizer(riga);
String [] frase = new String[processore_di_riga.countTokens()];
for (int i = 0; processore_di_riga.hasMoreTokens(); i++) frase[i] = processore_di_riga.nextToken();
7
La classe Numeri ha un membro d’istanza numeri di tipo array di interi di lunghezza MAX. Si scrivano i metodi per inizializzare l’array e per contare i valori pari archiviati. Cioè si scrivano i metodi:
int[] init() che inizializza un array con numeri pseudo-casuali compresi tra 1 e 10 (estremi inlcusi) e lo riporta all’ambiente chiamante
int conta() che conta i numeri pari contenuti nell’array membro d’istanza.
class Numeri {
final int MAX = 20;
private int [] numeri;
Numeri() {
numeri = new int[MAX];
}
public int[] init() {
for (int i = 0; i < MAX; i++)
AA 2007/08 Programmazione, Prof. M.A. Alberti IV appello, 11 luglio 2008
4 numeri[i] = (int) (Math.random() * 10) + 1;
return numeri;
}
public int conta() { int i =0, cont = 0;
while (i < MAX)
if (array_numeri[i++]%2 == 0) cont++;
return cont;
} }
Quindi sarebbe possibile istanziare un oggetto di classe Numeri Numeri oggetto_num = new Numeri();
e poi si potrebbe invocare i metodi sopra citati:
oggetto_num.init()
Poiche il metodo riporta l’array che inizializza anche all’ambiente si potrebbe inoltre utilizzare l’invocazione del metodo per inizializzare un array accessorio. Ad esempio int[] archivio = oggetto_num.init()
8
Per valutare una espressione aritmetica scritta in notazione postfissa, si usa una struttura dati di tipo Last In First Out. Disegnate lo stato dello stack utilizzato per valutare l’espressione quando si sia arrivati a scandire l’espressione fino al token 3:
1 5 + 2 * 3 1 + / ^
.
1 stack
5 2 3 3 4
↑ direzione
crescita 1 1 6 6 12 12 12 12 3
token
letto 1 5 + 2 * 3 1 + /