PUNTI, RETTANGOLI E QUADRATI NEL PIANO CARTESIANO =================================================== Lo scopo dell'esercizio e' quello di rappresentare punti, rettangoli e quadrati nel piano cartesiano usando uno stile Object Oriented. 1) Creare una directory in cui mettere i file Punto.java, Rettangolo.java, Quadrato.java e i file richiesti dagli esercizi. I commenti nei tre file .java sono stati scritti in modo da poter generare la documentazione in formato HTML con javadoc. Il comando javadoc Punto.java Rettangolo.java Quadrato.java genera la documentazione (aprire con un browser il file index.html). 2) Implementare i costruttori e i metodi delle classi Punto, Rettangolo e Quadrato seguendo le specifiche. 3) Per risolvere un esercizio deve essere stata implementata correttamente la classe scritta fra parentesi. NOTA ---- I file Punto.java, Rettangolo.java e Quadrato.java sono compilabili (i metodi restituiscono valore arbitrari e vanno corretti). ESERCIZIO 1 (classe Punto) ========================== Scrivere un programma che legge dalla linea di comando quattro interi x1, y1, x2, y2 e verifica se le seguenti proprieta' valgono: - (x1,y1) e' sopra (x2,y2) (metodo isUp) - (x1,y1) e' a sinistra di (x2,y2) (metodo isLeft) - (x1,y1) e' uguale a (x2,y2) (metodo equals) Per stampare il punto usare il metodo toString. ESEMPI DI ESECUZIONE -------------------- java Esercizio1 2 10 2 5 (2,10) e' sopra a (2,5) (2,10) e' a sinistra di (2,5) (2,10) non e' uguale a (2,5) -- java Esercizio1 20 10 2 10 (20,10) e' sopra a (2,10) (20,10) non e' a sinistra di (2,10) (20,10) non e' uguale a (2,10) --- java Esercizio1 0 0 -1 5 (0,0) non e' sopra a (-1,5) (0,0) non e' a sinistra di (-1,5) (0,0) non e' uguale a (-1,5) ---- java Esercizio1 -3 -3 -3 -3 (-3,-3) e' sopra a (-3,-3) (-3,-3) e' a sinistra di (-3,-3) (-3,-3) e' uguale a (-3,-3) ESERCIZIO 2 (classe Punto) ========================== A) Consideriamo il seguente programma: ------------------------ public class Esercizio2 { public static void main(String args[]){ Punto p1 = new Punto(1,2); Punto p2 = new Punto(1,2); Object p3 = p2; Object p4 = p1; if(p1.equals(p2)) System.out.println("p1 e' uguale a p2"); else System.out.println("p1 e' diverso da p2"); if(p1.equals(p3)) System.out.println("p1 e' uguale a p3"); else System.out.println("p1 e' diverso da p3"); if(p1.equals(p4)) System.out.println("p1 e' uguale a p4"); else System.out.println("p1 e' diverso da p4"); if(p1.equals(( Punto) p3)) System.out.println("p1 e' uguale a p3"); else System.out.println("p1 e' diverso da p3"); }// end main }// end class ------------------------ Eseguire Esercizio2 e motivare i messaggi stampati. B) Nella classe Punto aggiungere un metodo equals che riscrive il metodo equals della classe Object (overriding). Il metodo deve restituire true se l'oggetto passato come argomento e' un punto P e P e' uguale al punto che esegue il metodo, false altrimenti. Eseguendo il programma deve ora essere stampato: p1 e' uguale a p2 p1 e' uguale a p3 p1 e' uguale a p4 p1 e' uguale a p3 ESERCIZIO 3 (classe Rettangolo) =============================== Scrivere un programma che legge da standard input delle linee della forma x1 y1 x2 y2 dove x1, y1, x2 e y2 sono numeri interi. La linea rappresenta il rettangolo R avente (x1,y1) e (x2,y2) come vertici opposti. Per ogni rettangolo R letto, il programma deve stampare: - la stringa associata a R dal metodo toString; - i vertici di R nell'ordine restituito da getVertici; - il perimetro (getPerimetro) e l'area (getArea) di R. ESEMPIO DI ESECUZIONE -------------------- Supponiamo che le linee sullo standard input siano: 1 1 2 2 2 10 0 0 5 8 15 6 7 1 2 10 -4 10 4 -2 5 -10 -10 -20 L'output deve essere ((1,1),(2,2)) -- Vertici: (1,1) (1,2) (2,2) (2,1) -- Perimetro: 4 -- Area: 1 ((0,0),(2,10)) -- Vertici: (0,0) (0,10) (2,10) (2,0) -- Perimetro: 24 -- Area: 20 ((5,6),(15,8)) -- Vertici: (5,6) (5,8) (15,8) (15,6) -- Perimetro: 24 -- Area: 20 ((2,1),(7,10)) -- Vertici: (2,1) (2,10) (7,10) (7,1) -- Perimetro: 28 -- Area: 45 ((-4,-2),(4,10)) -- Vertici: (-4,-2) (-4,10) (4,10) (4,-2) -- Perimetro: 40 -- Area: 96 ((-10,-20),(5,-10)) -- Vertici: (-10,-20) (-10,-10) (5,-10) (5,-20) -- Perimetro: 50 -- Area: 150 --- Per leggere una linea dello standard input usare il metodo readLine della classe BufferedReader. Per estrarre da una linea gli interi, usare la classe java.util.StringTokenizer. Per eseguire il programma, scrivere l'input in un file e redirigere lo standard input. ESERCIZIO 4 (classe Rettangolo) =============================== Scrivere un programma Esercizio4 che legge otto interi a1,a2, ... , a8 dalla linea di comando e costruisce: - il rettangolo R1 avente vertici opposti (a1,a2) e (a3,a4); - il rettangolo R2 avente vertici opposti (a5,a6) e (a7,a8). Il programma stampa si se R1 contiene R2, no altrimenti. Usare il metodo contiene della classe Rettangolo. ESEMPI DI ESECUZIONE -------------------- java Esercizio4 0 0 10 10 0 0 5 5 si --- java Esercizio4 0 0 10 10 1 3 4 5 si --- java Esercizio4 1 1 4 4 0 0 3 3 no --- java Esercizio4 1 1 4 4 2 2 10 12 no --- java Esercizio4 -5 -7 -20 -23 -1000 4 1 2 no --- java Esercizio4 -1000 -10 200 20 1 2 3 4 si --- java Esercizio4 1 2 3 4 1 2 3 4 si ESERCIZIO 5 (classe Quadrato) ============================== Scrivere un programma Esercizio5 che legge da standard input delle linee di interi corrispondenti alla descrizione di rettangoli o quadrati. Piu' precisamente: i) Una linea in input della forma a b c d corrisponde a un rettangolo i cui vertici opposti sono (a,b) e (c,d). ii) Una linea in input della forma a b c corrisponde a un quadrato avente vertice in basso a sinistra (a,b) e lato c. Nel caso (i) va sempre costruito un rettangolo, anche se la figura e' un quadrato. Dopo aver letto tutte le linee, il programma stampa la descrizione delle figure in ordine inverso rispetto all'ordine di inserimento. Ogni linea di output ha la forma RETTANGOLO ... descrizione ... oppure QUADRATO ... descrizione ... dove la descrizione della figura e' come nell'Esercizio 3 (vedi anche esempio sotto). Si assume che le linee di input siano al massimo 100. --- Dato che l'ordine di stampa e' inverso rispetto a quello di lettura, le figure vanno memorizzate in un'opportuna struttura. Poiche' si conosce il numero massimo di figure, si puo' usare un array di rettangoli (Quadrato e' una sottoclasse di Rettangolo, quindi si puo' usare un riferimento di tipo Rettangolo per un oggetto di classe Quadrato). ESEMPIO DI ESECUZIONE --------------------- Supponiamo che le linee di input siano: 10 20 0 0 1 3 7 1 2 -4 -5 -10 5 7 -4 -1 -1 7 0 0 5 0 0 5 5 L'output deve essere: RETTANGOLO: ((0,0),(5,5)) -- Vertici: (0,0) (0,5) (5,5) (5,0) -- Perimetro: 20 -- Area: 25 QUADRATO: ((0,0),(5,5)) -- Vertici: (0,0) (0,5) (5,5) (5,0) -- Perimetro: 20 -- Area: 25 QUADRATO: ((-1,-1),(6,6)) -- Vertici: (-1,-1) (-1,6) (6,6) (6,-1) -- Perimetro: 28 -- Area: 49 RETTANGOLO: ((-10,-4),(7,5)) -- Vertici: (-10,-4) (-10,5) (7,5) (7,-4) -- Perimetro: 52 -- Area: 153 RETTANGOLO: ((-4,-5),(1,2)) -- Vertici: (-4,-5) (-4,2) (1,2) (1,-5) -- Perimetro: 24 -- Area: 35 QUADRATO: ((1,3),(8,10)) -- Vertici: (1,3) (1,10) (8,10) (8,3) -- Perimetro: 28 -- Area: 49 RETTANGOLO: ((0,0),(10,20)) -- Vertici: (0,0) (0,20) (10,20) (10,0) -- Perimetro: 60 -- Area: 200 Si noti che la prima figura stampata (ultima inserita) e' stata classificata rettangolo in quanto corrisponde alla linea di input 0 0 5 5 ESERCIZIO 6 (classe Quadrato) ============================= A) Eseguire il programma ---------------- public class Esercizio6 { public static void main(String args[]) { Rettangolo r = new Rettangolo(0,0,2,2); Quadrato q1 = new Quadrato(0,0,2); Object q2 = q1; if(r.equals(q1)) System.out.println("r e' uguale a q1"); else System.out.println("r e' diverso da q1"); if(r.equals(q2)) System.out.println("r e' uguale a q2"); else System.out.println("r e' diverso da q2"); }// end main }// end class ---------------- Motivare l'output ottenuto. B) Nella classe Rettangolo aggiungere uni metodo equals che riscrive il metodo equals della classe Object (overriding). Il metodo restituisce true se l'oggetto passato come argomento e' un rettangolo R e R e' uguale al rettangolo che esegue il metodo, false altrimenti. Eseguendo il programma deve ora essere stampato: r e' uguale a q1 r e' uguale a q2 NUOVI METODI DELLA CLASSE RETTANGOLO ==================================== Dati due rettangoli R1 e R2 diciamo che: - La copertura di R1 e R2 e' il piu' piccolo rettangolo R che contiene R1 e R2. Si noti che R e' sempre definito. - L'intersezione di R1 e R2 e' il piu' grande rettangolo R contenuto in R1 e R2. L'intersezione fra R1 e R2 puo' non essere definita (R1 e R2 sono disgiunti). Aggiungere alla classe Rettangolo i metodi: - public Rettangolo copertura(Rettangolo r) Restituisce la copertura del rettangolo che esegue il metodo e del rettangolo r passato come argomento. - public Rettangolo intersezione(Rettangolo r) Restituisce il rettangolo intersezione fra il rettangolo che esegue il metodo e il rettangolo r passato come argomento oppure null se l'intersezione non e' definita. Usare i metodi minXminY, ... della classe Punto. ESERCIZIO 7 =========== Scrivere un programma Esercizio7 che legge otto interi a1,a2, ... , a8 dalla linea di comando e costruisce: - il rettangolo R1 avente vertici opposti (a1,a2) e (a3,a4) - il rettangolo R2 avente vertici opposti (a5,a6) e (a7,a8). Il programma stampa - la copertura di R1 e R2; - l'intersezione fra R1 e R2 oppure "disgiunti" se l'intersezione non e' definita. ESEMPI DI ESECUZIONE -------------------- java Esercizio7 0 0 10 4 2 -4 6 20 ((0,-4),(10,20)) ((2,0),(6,4)) --- java Esercizio7 0 0 10 4 0 0 2 2 ((0,0),(10,4)) ((0,0),(2,2)) --- java Esercizio7 -1 -1 5 7 10 10 20 30 ((-1,-1),(20,30)) disgiunti --- java Esercizio7 0 0 10 4 1 1 17 2 ((0,0),(17,4)) ((1,1),(10,2)) --- java Esercizio7 1 1 17 2 0 0 10 4 ((0,0),(17,4)) ((1,1),(10,2)) --- java Esercizio7 0 0 10 4 15 0 17 2 ((0,0),(17,4)) disgiunti