Linguaggi di Programmazione II
II Prova in itinere
Cognome e Nome:
Numero di Matricola:
Matricole con le due ultime cifre dispari
Spazio riservato alla correzione
1
/5
2
/10
3
/10
4
/30
5
/25
6
/20
totale
/100
Non usare altri fogli, usare solo lo spazio sottostante. Fogli differenti da questo non saranno presi in considerazione per
la correzione. Non è consentito usare libri o appunti!
1. [5 punti] Considerate il frammento di codice seguente:
public class T
{
public void m(final int x, int y)
{
int a;
final int b;
class C implements I
{
public void f( )
{
…
}
}
int c;
…
}
private int t;
}
Indicate a quali variabili può accedere il metodo f e giustificate la risposta.
Soluzione: la classe interna C può accedere alle variabili istanza definite nell’ambito di
visibilità della classe T senza alcuna restrizione, ma può accedere a variabili locali solo se
sono state dichiarate final. Quindi il metodo f può accedere alle variabili x, b e t.
Pag. 1
Linguaggi di Programmazione II
II Prova in itinere
Matricole con le due ultime cifre dispari
2. [10 punti] Sia B una classe e sia A una classe che implementa l’interfaccia I. Indicare quali
dei seguenti assegnamenti sono leciti e giustificare la risposta.
A
B
I
I
a
a
a
a = new A();
b = new B();
i1 = a; //primo assegnamento
i2 = b; //secondo assegnamento
= (I)b; //terzo assegnamento
= i1;
//quarto assegnamento
= (A)i1; //quinto assegnamento
Soluzione: Gli assegnamenti corretti sono il primo e il quinto. Infatti la classe A implementa
l’interfaccia I, quindi la conversione dal tipo A al tipo dell’interfaccia nel primo assegnamento è
lecita. Nell’assegnamento 5, il tipo interfaccia viene convertito al tipo originario mediante un
cast.
L’assegnamento 2 è scorretto perché la classe B non implementa l’interfaccia I.
L’assegnamento 3 è scorretto perché non è possibile usare il cast per convertire dal tipo B al tipo
dell’interfaccia.
L’assegnamento 4 è scorretto: per convertire dal tipo interfaccia al tipo originario A è necessario un
cast, come avviene nell’assegnamento 5.
Pag. 2
Linguaggi di Programmazione II
II Prova in itinere
Matricole con le due ultime cifre dispari
3. [10 punti] Descrivere a cosa serve la parola chiave super e mostrarne l’utilizzo con un breve
esempio di codice.
Soluzione: La parola chiave super viene utilizzata per:
•
invocare il costruttore della superclasse, e.g.,. super(initialBalance);
•
invocare un metodo della superclasse, e.g. super.deposit(amount);
/**
Un conto corrente che addebita commissioni per ogni transazione.
*/
public class CheckingAccount extends BankAccount
{
/**
Costruisce un conto corrente con un saldo assegnato.
@param initialBalance il saldo iniziale
*/
public CheckingAccount(double initialBalance)
{
// chiama il costruttore della superclasse
super(initialBalance);
// inizializza il conteggio delle transazioni
transactionCount = 0;
}
//metodo sovrascritto
public void deposit(double amount){
transactionCount++;
//chiama il metodo deposit della superclasse
super.deposit(amount);
}
//metodo sovrascritto
public void withdraw(double amount){
transactionCount++;
// chiama il metodo withdraw della superclasse
super.withdraw(amount);
}
//metodo nuovo
public void deductFees(){
if (transactionCount > FREE_TRANSACTIONS){
double fees = TRANSACTION_FEE *
(transactionCount – FREE_TRANSACTIONS);
//chiama il metodo withdraw della superclasse
super.withdraw(fees);
}
transactionCount = 0;
}
private int transactionCount;
private static final int FREE_TRANSACTIONS = 3;
private static final double TRANSACTION_FEE = 2.0;
}
Pag. 3
Linguaggi di Programmazione II
II Prova in itinere
4.
Matricole con le due ultime cifre dispari
[30 punti] Scrivere un applet che consenta all’utente di specificare un cerchio con due pressioni
del pulsante del mouse, la prima per indicare la posizione del centro e la seconda per indicare un
punto sulla circonferenza. Quando l’utente preme per la prima volta, disegnate un cerchietto per
indicare il centro, quando preme per la seconda volta, disegnate il cerchio.
Suggerimento: nel gestore degli eventi del mouse dovete tenere traccia del fatto che sia già stato ricevuto il punto
che rappresenta il centro in un evento precedente. I punti devono essere istanze della classe Point2D.Double
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
public class Cerchio
{
/**
Costruisce un oggetto Cerchio
@param duePunti l’array di punti specificati dall’utente
*/
public Cerchio(Point2D.Double[] duePunti)
{
punti = duePunti;
}
/**
Disegna il cerchio, dati due punti
Il primo punto è il centro, il secondo è un qualsiasi punto sulla
circonferenza.
@param g2 il contesto grafico
*/
public void disegna(Graphics2D g2)
{
// Calcola il centro del cerchio
double x = punti[0].getX();
double y = punti[0].getY();
Point2D.Double centro = new Point2D.Double(x, y);
// Calcola il raggio del cerchio
double raggio = Math.sqrt(Math.pow(centro.getX() - punti[1].getX(), 2)
+ Math.pow(centro.getY() - punti[1].getY(), 2));
// Costruisce il cerchio e lo disegna
Ellipse2D.Double cerchio
= new Ellipse2D.Double(centro.getX() - raggio,
centro.getY() - raggio, 2 * raggio, 2 * raggio);
g2.draw(cerchio);
}
private Point2D.Double[] punti;
}
Pag. 4
Linguaggi di Programmazione II
II Prova in itinere
import
import
import
import
import
import
import
Matricole con le due ultime cifre dispari
java.applet.Applet;
java.awt.Graphics;
java.awt.Graphics2D;
java.awt.event.MouseAdapter;
java.awt.event.MouseEvent;
java.awt.geom.Ellipse2D;
java.awt.geom.Point2D;
public class CerchioApplet extends Applet
{
public CerchioApplet()
{
clicks = 0;
punti = new Point2D.Double[MAX_CLICKS];
// classe interna per l’ascoltatore
class MousePressListener extends MouseAdapter
{
public void mousePressed(MouseEvent event)
{
if (clicks >= MAX_CLICKS) return;
int mouseX = event.getX();
int mouseY = event.getY();
punti[clicks] = new Point2D.Double(mouseX, mouseY);
clicks++;
repaint();
}
}
// aggiunge l’ascoltatore di eventi alla finestra dell’applet
MousePressListener listener = new MousePressListener();
addMouseListener(listener);
}
public void paint(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;
if (clicks < MAX_CLICKS)
{
for (int i = 0; i < clicks; i++)
{
double x = punti[i].getX();
double y = punti[i].getY();
Ellipse2D.Double cerchietto
= new Ellipse2D.Double(x - RADIUS, y - RADIUS,
2 * RADIUS, 2 * RADIUS);
g2.draw(cerchietto);
}
}
else
{
Cerchio c = new Cerchio(punti);
c.disegna(g2);
}
}
private int clicks;
private Point2D.Double[] punti;
private final int MAX_CLICKS = 2;
final double RADIUS = 2;
}
Pag. 5
Linguaggi di Programmazione II
II Prova in itinere
Matricole con le due ultime cifre dispari
5. [25 punti] Definire una superclasse astratta FigureGeometriche e tre sottoclassi Cerchio,
Rettangolo e TriangoloIsoscele. Per ciascuna classe, definire le variabili istanza per le
dimensioni che caratterizzano il tipo di figura, il costruttore per la creazione di un’istanza di ciascuna
figura date le dimensioni, e due metodi getArea() e getPerimetro(), che restituiscono
rispettivamente l’area e il perimetro della figura.
public abstract class FigureGeometriche
{
public abstract double getArea();
public abstract double getPerimetro();
}
public class TriangoloIsoscele extends FigureGeometriche
{
public TriangoloIsoscele(double b, double h)
{
base = b;
altezza = h;
}
public double getArea()
{
return base * altezza /2 ;
}
public double getPerimetro()
{
double mezzabase = base/2;
double lato = Math.sqrt(mezzabase * mezzabase + altezza * altezza);
return 2*lato + base;
}
private double base;
private double altezza;
}
public class Cerchio extends FigureGeometriche
{
public Cerchio(double r)
{
raggio = r;
}
public double getArea()
{
return raggio * raggio * Math.PI;
}
public double getPerimetro()
{
return 2 * raggio * Math.PI;
}
private double raggio;
}
Pag. 6
Linguaggi di Programmazione II
II Prova in itinere
Matricole con le due ultime cifre dispari
public class Rettangolo extends FigureGeometriche
{
public Rettangolo(double b, double h)
{
base = b;
altezza = h;
}
public double getArea()
{
return base * altezza;
}
public double getPerimetro()
{
return 2 * base + 2 * altezza;
}
private double base;
private double altezza;
}
Pag. 7
Linguaggi di Programmazione II
II Prova in itinere
Matricole con le due ultime cifre dispari
6. [20 punti] Scrivere un programma di Test per le classi create nell’esercizio precedente. Creare un
array di figure geometriche, contenente cinque oggetti per ognuna delle classi create, assegnando a
ciascuna dimensione un valore casuale. Stampare la somma delle aree e dei perimetri di tutte le
figure presenti nell’array.
.public class Test
{
public static void main(String [] args)
{
FigureGeometriche [] fg = new FigureGeometriche[15];
for (int i = 0; i < 15; i++){
if( i<5)
fg[i] = new Cerchio(Math.random()*10);
else if (i < 10)
fg[i] = new TriangoloIsoscele(Math.random()*10,Math.random()*10);
else fg[i] = new Rettangolo(Math.random()*10, Math.random()*10);
}
double areaTotale = 0;
double perimetroTotale = 0;
for (int i = 0; i < 15; i++){
areaTotale += fg[i].getArea();
perimetroTotale += fg[i].getPerimetro();
}
System.out.println(“Area totale: “ + areaTotale);
System.out.println(“Perimetro totale: “ + perimetroTotale);
}
}
Pag. 8