Corso di Laurea in Informatica

Programmazione

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

Soluzioni II compitino - 10 dicembre 2003

Compitino precedente | Home | Compitino successivo

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

Esercizio 1

Risposte
  1. indice: 2
  2. per cercare un'occorrenza di mercoledì:
    for (i=0; i < settimana.length; i++)
    	if (settimana[i].equals("mercoledì"))
    		break;
    System.out.println ("mercoledì\tindice: " + i);	
    
  3. settimana[3]
  4. settimana[4].charAt(1)
  5. settimana[4].indexOf('e')
  6. 4
  7. settimana[settimana.length-1]
  8. 5

Si veda la classe Test1.java che genera le risposte.

Esercizio 2

Soluzione

Le due espressioni booleane non sono equivalenti ma complementari, ovvero una è la negazione dell'altra, come si può vedere applicando la legge di De Morgan. La tabella di verità delle due espressioni è la seguente:

a b c a && (b||c) (!c && !b)|| !a
f f f f v
f f v f v
f v f f v
f v v f v
v f f f v
v f v v f
v v f v f
v v v v f
Si veda la classe Test2 che genera questa tabella di verità.

Esercizio 3

Soluzione
public class Parole {
	private String valore;
	Parole() {
		this.valore = new String();
	}
	Parole(String s) {
		this.valore = s;
	}
}
È possibile definire metodi con lo stesso nome e più di un costruttore se le entità da definire sono distinguibili tramite la segnatura. Ovvero i metodi o costruttori devono differire per l'ordine o il numero o il tipo dei parametri. Questa caratteristica si chiama overloading.
Si veda la classe Parole.java che genera le risposte.

Esercizio 4

Soluzione
public static String contrai(String s) {
	String new_s = new String();
	for (int i=0; i < s.length(); i=i+2)
		new_s += s.charAt(i);
	return new_s;
}
Sarebbe anche possibile definire un metodo d'istanza per fare la stessa operazione sul campo valore di un oggetto, che diventa il parametro implicito del metodo. In questo caso il metodo non necessita del parametro esplicito. I due metodi avrebbero segnatura diversa e non si avrebbe ambiguità ma avremmo overloading dei due metodi.
public String contrai() {
	String new_s = new String();
	for (int i=0; i < this.valore.length(); i=i+2)
		new_s += this.valore.charAt(i);
	return new_s;
}
Il modo di chiamare i due metodi ovviamente sarebbe diverso. Nel primo caso il metodo è di classe e quindi non richiede necessariamente l'istanziazione di un oggetto della classe, ma basta l'espressione:
Parole.contrai("macchina")
da usarsi in una istruzione come ad esempio:
String s = Parole.contrai("macchina")
Nel secondo caso, occorre invece aver inizializzato un oggetto come in:
Parole par = new Parole("anfiteatro");
String nuova = p.contrai();
Si veda la classe Parole.java.

Esercizio 5

Risposta
public static Rettangolo trasformazione(Rettangolo unRett) {
	return new Rettangolo(unRett.origine.x, unRett.origine.y, 2*unRett.amp, 2*unRett.alt);
}
Si veda la classe Rettangolo.java

Esercizio 6

Risposta
qua
pluto
pippo
num1: 32
num2: 12
11
9
7
5
3
1
num1: 32
num2: 1
Si veda la classe Test6.java

Esercizio 7

Risposta
L'istruzione new Fiore() genera un errore. Il costruttore di default senza parametri non può essere invocato poiché sono già stati definiti costruttori con parametri.

Esercizio 8

Soluzione
Il ciclo while:
while (i >= 0 && i < MAX) {
	vettore [i]++;
	i = (int) (Math.random() * (MAX+1));
}
Il ciclo for:
for (int j = 0; j < MAX; j++)
	if (vettore [j] >= 1)
		System.out.println (j + "\t" + vettore [j]);
Un ciclo while potrebbe aver generato i numeri causuali: 0 2 4 2 4 1 4 2 1 4 5 e quindi avrebbe inizializzato l'array vettore = {1, 2, 3, 0, 4} causando la stampa:
0	1
1	2
2	3
4	4
Si veda la classe Analisi.java.

Esercizio 9

Soluzione
Il costruttore Stilo(int, String)
public Stilo (int pen, String tipo) {
	this.pennino = pen;
	this.tipo = tipo;
}
Il metodo uguale(Stilo s):
public boolean uguale (Stilo s) {
	return (pennino == s.pennino 
              && tipo.equals(s.tipo)
              && colore.equals(s.colore)
              && inchiostro.equals(s.inchiostro));
}
Si veda la classe Stilo.java.

Esercizio 10

Risposta
Il codice causa errore perchè le variabili pelikan e parker sono state dichiarate ma non istanziate quindi non è possibile inviare il messaggio caricaInchiostro(String) a oggetti inesistenti. Nel caso le due variabili fossero state istanziate ad esempio con le istruzioni: pelikan = new Stilo() e parker = new Stilo() allora sarebbe stato eseguito il ramo else a causa del diverso valore del campo inchiostro.

Esercizio 11

Soluzione
Nello spezzone di codice si cerca di definire una interface come si può capire dall'uso della parola riservata implements nella definizione della classe Stilo nell'esercizio seguente. Il codice va completato nel seguente modo
interface ConColore {
	void setColore(String); 
	String getColore(); 
}

Esercizio 12

Soluzione
La classe Stilo va completata aggiungendo l'implementazione dei metodi prescritti dall'interfaccia ConColore
Stilo implements ConColore {
	...
	void setColore(String c) {
		this.colore = c;
	}
	String getColore() {
		return this.colore;
	}
}

Esercizio 13

Soluzione
Lo spezzone non genera errori in compilazione. Consiste nella dichiarazione e dimensionamento dell'array deposito con elementi di tipo ConColore. L'array viene poi inizializzato con oggetti di classe Stilo che correttamente implementa l'interfaccia ConColore. Ai singoli elementi dell'array vengono lanciati i messaggi getColore() che sono propri dell'interfaccia. Il compilatore nel valutare la correttezza dell'istruzione controlla che il metodo che viene lanciato sia dell'interfaccia. Se si volesse invece stampare il tipo di ogni elemento dell'array, facendo riferimento ad una caratteristica della classe particolare Stilo che implementa l'interfaccia, allora andrebbe effettuato un cast esplicito su ciascun elemento. Infatti è solo durante l'esecuzione del programma che effettivamente nelle posizioni dell'array ci saranno oggetti di classe Stilo. Il compilatore può solo effettuare controlli statici sulla correttezza delle istruzioni.
stampa(((Stilo)deposito[i]).getTipo());

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


M.A. Alberti, 10 dicembre 2003