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