logo
  • userLoginStatus

Welcome

Our website is made possible by displaying online advertisements to our visitors.
Please disable your ad blocker to continue.

Current View

Computer Engineering - Ingegneria del Software

Collection of exams 2013

Collections of notes, exercises or exams

Politecnico di Milano Anno accademico 2013-2014 Ingegneria del Software – Appello del 28 giugno 2013Cognome: Nome: Matricola: Sezione (segnarne una):BaresiGhezziSan PietroIstruzioni 1. La mancata indicazione dei dati anagraci e della sezione comporta l`annullamento del compito. 2. Al termine, consegnare solo i fogli distribuiti utilizzando il retro delle pagine in caso di necessit a. Non separare questi fogli. Eventuali fogli di brutta, ecc. non verranno in nessun caso presi in considerazione. E possibile scrivere in matita. 3. E possibile consultare liberamente libri, manuali o appunti. E proibito l'uso di ogni dispositivo elettronico (quali calcolatrici tascabili, telefoni cellulari, ecc.). 4. Non e possibile lasciare l'aula conservando il tema della prova in corso. 5. Tempo a disposizione: 2h. Esercizio 1: Esercizio 2: Esercizio 3: Esercizio 4: 1! Esercizio 1 Si considerino le seguenti dichiarazioni: public abstract class Point {public abstract double distance (Point p); } public class Point1D extends Point {private double c1; public Point1D (double c1) {this.c1 = c1; } public double getC1() {return c1; } public double distance (Point p) {return Math.abs(((Point1D) p).getC1()-c1); } } public class Point2D extends Point1D {private double c2; public Point2D (double c1, double c2) {super(c1); this.c2 = c2; } public double getC2() {return c2; } public double distance (Point p) {return Math.sqrt(Math.pow(((Point2D) p).getC1()-this.getC1(), 2) +Math.pow(((Point2D) p).getC2()-this.getC2(), 2)); } public double distance (Point2D p) {return Math.sqrt(Math.pow(p.getC1()-this.getC1(), 2) +Math.pow(p.getC2()-this.getC2(), 2)); } } Domanda 1 Quali dei due metodi distance della classe Point2D rappresenta un caso di overloading e quale invece rappresenta un caso di overriding?Soluzione:Il primo e' overriding, il secondo overloading, Domanda 2 La classe Point2D e un sottotipo della classe Point1D in base al principio di sostituibilit a? Motivare brevemente la risposta. Soluzione:I metodi non sono specicati in JML; tuttavia, essendo presente una implementazione, si pu o considerare il comporta- mento previsto dalla implementazione per ragionare sul principio di sostituibilit a. La classe Point2D non rispetta il principio di sostituibilit a in quanto il metodo overridden distance ha un comportamento normale (non eccezionale) solo se il parametro p e instanceof Point2D. Se p e instanceof Point1D, ma non Point2D, il metodo 2 lancia una ClassCastException. Questo comportamento non  e compatibile con quello di distance in Point1D, che invece ha un comportamento non eccezionale in entrambi i casi. Viene pertanto violata la regola dei metodi. Domanda 3 Dopo la seguente sequenza di dichiarazioni: Point p; Point1D p1; Point2D p2; segnare a anco di ciascuno dei seguenti assegnamenti se essi sono considerati corretti dal compilatore Java in base alle regole di tipo: p = p1; p = p2; p1 = p; p1 = p2; p2 = p1; Domanda 4 Si consideri il seguente frammento e si pieghi sinteticamente a parole l'effetto di ciascun assegnamento, indicando quali metodi vengono invocati in ciascun caso e scrivendo il risultato calcolato (valore stampato a video). Point p1 = new Point1D(0.0); Point p2 = new Point1D(1.0); Point p3 = new Point2D(0.0, 1.0); Point p4 = new Point2D(1.0, 0.0); double x; x = p1.distance(p2); System.out.println(x); x = p3.distance(p4); System.out.println(x); x = p1.distance(p3); System.out.println(x); x = p3.distance(p1); System.out.println(x); p1=p3; x = p2.distance(p1); System.out.println(x); x = p4.distance(p1); System.out.println(x); Soluzione: Point1D.distance 1.0 Point2D.distance 1.4142135623730951 Point1D.distance 0.0 Point2D.distance 3 Exception in thread "main" java.lang.ClassCastException: Point1D cannot be cast to Point2D Se poi l'esecuzione proseguisse: Point1D.distance 1.0 Point2D.distance 1.4142135623730951 Domanda 5 Si supponga di introdurre una classe Point3D sottoclasse di Point2D che denisce i punti in uno spazio a 3 dimensioni. Si esamini questo frammento di codice: Point p1 = new Point3D(1.0, 1.0, 1.0); Point2D p2 = new Point2D(0.0, 0.0); p2.distance(p1);spiegare sinteticamente che cosa succede durante l'esecuzione in corrispondenza della chiamata didistancee quale valore viene calcolato.Soluzione:chiama Point2D.distance e calcola la distanza fra(1:0;1:0)e(0:0;0:0). Domanda 6 Si supponga di aggiungere la seguente precondizione al metodo distance della classe Point1D: //@ requires p instanceof Point1D;La classe Point2D sarebbe considerabile sottotipo di Point1D in base al principio di sostituibilit a? Motivare sinteticamente la risposta.Soluzione:Ammettendo che il principio di sostituzione valesse senza la precondizione, la precondizione non violerebbe la regola dei metodi. Domanda 7 Si supponga che, oltre alla precedente modica della domanda 6, si aggiunga anche la seguente precondizione al metododistance (Point p)della classe Point2D: //@ requires p instanceof Point2D;La classe Point2D sarebbe considerabile sottotipo di Point1D in base al principio di sostituibilit a? Motivare sinteticamente la risposta.Soluzione:Ammettendo che il principio di sostituzione valesse senza la precondizione, la precondizione violerebbe la regola dei metodi, in quanto sarebbe piu' stringente della precondizione originale di Pont1D. Domanda 8 E se, per assurdo, nel metodo distance di Point1D si introducesse la precondizione: //@ requires p instanceof Point2D;e nel metododistance (Point p)della classe Point2D si introducesse: //@ requires p instanceof Point1D;la classe Point2D sarebbe considerabile sottotipo di Point1D in base al principio di sostituibilit a? Motivare sinteticamente la risposta.Soluzione:Ammettendo che il principio di sostituzione valesse senza le precondizioni, questo caso non violerebbe la regola dei metodi. Domanda 9 Si considerino le seguenti dichiarazioni che fanno riferimento allle dichiarazioni di classe fornite inizialmente (e cio e senza precon- dizioni): ArrayList l1; ArrayList l2; Quali dei seguenti assegnamenti corretto secondo il compilatore Java, e perch´ e? 4 l1 = l2; l2 = l1; Soluzione:Entrambi i casi sono considerati scorretti dal compilatore Java. Esercizio 2 Si supponga di voler specicare una classeLine, che offre un metodo osservatorepointsche restituisce unArrayList. Per semplicit a, si ipotizzi che la classe rappresenti solo rette oblique. 1. Si specichi un metodolineUpche restituisce una nuova Line i cui punti sono ordinati per ascisse crescenti. La precon- dizione afferma che i punti dell'ArrayList appartengono a una retta; la postcondizione afferma che nell'oggetto restituito i punti memorizzati in posizioni successive dell'ArrayList si trovano in posizioni successive della retta.Soluzione:La signa- ture del metodo non e' specicata. Diverse soluzioni sono possibili; per esempio, un producer che parta da un oggetto Line, oppure un creator che parta da un ArrayList di punti. Il fatto che i punti siano in linea puo' essere specicato dicendo che esiste un coeff. angolareme un termine notoqper cui tutti i puntipsono disposti lungo la retta individuata dameq: p.getC2() == m*p.getC1() + q . La specica per un producer diventa: /*@ requires points != null && points.size() >= 2 && @ (\exists double m; !Double.isNan(m) && !Double.isInfinite(m); @ (\exists double q; !Double.isNan(q) && !Double.isInfinite(q); @ ( orall Point2D p; p != null && points.contains(p); @ p.getC2() == m*p.getC1() + q))); @ ensures esult != null && @ esult.containsAll(points) && points.containsAll( esult) && @ ( orall int i; 0 = 2 && @ (\exists double m; !Double.isNan(m) && !Double.isInfinite(m); @ (\exists double q; !Double.isNan(q) && !Double.isInfinite(q); @ ( orall Point2D p; p != null && points.contains(p); @ p.getC2() == m*p.getC1() + q))); @ && esult != null && //qui riprende la ensures precedente @ esult.containsAll(points) && points.containsAll( esult) && @ ( orall int i; 0 = 2 && @ (\exists double m; !Double.isNan(m) && !Double.isInfinite(m); @ (\exists double q; !Double.isNan(q) && !Double.isInfinite(q); @ ( orall Point2D p; points.contains(p); @ p.getC2() == m*p.getC1() + q))) @ && @ ( orall int i; 0 0) && @ esult.points().get(i).getC1() < esult.points().get(i+1).getC1()) @ || @ (( esult.points().get(i+1)0, di cui quello in cima alla pila (c n)  e il cursore corrente. In particolare, una lista MultiLDCC ha inizialmente un solo cursore (che e anche il corrente), ma pu o anche “impilare” un nuovo cursore, come copia del cursore corrente, tramite un metodo pushCursor(). Il metodo popCursor() consente di eliminare il cursore in cima alla pila. Inne, islastCursor() consente di vericare se il cursore corrente e anche l'unico sulla pila. Tutti gli altri metodi di MultiLDCC sono specicati esattamente come quelli di LDCC, considerando che ciascuo di questi metodi si riferisce implicitamente al cursore corrente. Ad es. elements() restituisce sempre un ArrayList che contiene tutti e soli gli elementi della lista, con un elemento=null nella posizione del cursore corrente; moveLeft() muove a sinistra di una posizione il cursore corrente, ecc. Domanda 1 E possibile denire MultiLDCC come erede di LDCC, rispettando il principio di sostituzione? E' necessario motivare accuratamente la risposta.Soluzione:Poich´ e la specica dei metodi ereditati non cambia, sia la regola della segnatura che la regola dei metodi sono vericate. Occorre quindi stabilire se vale la regola delle propriet a. Nessuna delle propriet a elencate nella Overview della classe cambia avendo a disposizione pi u cursori (visto che se ne sua sempre uno solo alla volta), quindi il principio risulta rispettato. Il tutto dipende dall'ipotesi (del testo) che la pila dei cursori non sia mai vuota, e quindi la lista abbia senmpre un cursore corrente. Domanda 2 Come fareste a specicare in JML il metodo pushCursor, supponendo di avere a disposizione il tipo di dato astratto Pila? Si supponga che la specica di Pila sia quella tradizionale, con push, pop, top, size(), ecc., ma con un metodo osservatore content() che restituisce in un ArrayList tutti gli elementi della pila, dal fondo alla cima. Si noti che le informazioni disponibili non sono complete poter specicare il metodo pushCursor: e necessario aggiungere ulteriori elementi alla specica. 4 Soluzione: Non vi e alcun tipo di dati corrispondente ai cursori, mentre per specicare il comportamento a pila occorre conoscere il tipo degli elementi (es. Pila, ecc.).. Una soluzione e quella di aggiungere un metodo osservatore pilaCur- sori() che restituisce una Pila, in cui ogni elemento della Pila non e un cursore, ma una LDCC che contiene gli stessi elementi della MultiLDCC (che si suppone essere denita come erede di LDCC), ma ciascuno con il suo cursore. //@ensures (*tutti gli elementi() contenuti in esult sono identici a this.elementi(), //@ a parte il cursore.*); public Pila pilaCursori() E' a questo punto facile denire: //@ensures pilaCursori().top().equals(this) && //@ pilaCursori().size() == \old(pilaCursori().size()+1) && //@ ( orall int i; 0\le i && i 5) return -1; for (i = 0; i