Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13

    Programma OOP, consiglii/aiuto completamento

    Salve a tutti, premetto che sono alle prime armi con la OOP.... Mi è stato assegnato l'esercizio qui sotto, l'ho svolto in gran parte, (non sono sicuro della totale essattezza), comunque sia mi sono bloccato nella creazione della classe "ScaffaleDiPoligoni", sopprattuttto nei metodi "sistemaPoligono" dove all'interno dell'if, nn so come verificare che il poligono "form" appartenga alla classe Triangle,Circle o Rettangle e come verificare succesivamente verificare quale lato sia il piu piccolo, cosi poi da sommarlo alla variabile shelf.

    Potete darmi qualche dritta???
    Inoltre, il codice è scritto con chiarezza e indentato corretamente??
    L'uso dei commenti è buono?

    P.S: Se vedete errori di ragionamento, ecc nel codice vi chiederei cortesemente di farmelo notare

    Grazie mille fin da ora

    codice:
     /*
    Realizza la classe Punto con tutti i metodi che ritieni opportuni più il metodo (statico) creaCasuale()
    che crea un punto casuale e lo restituisce. Successivamente crea la superclasse astratta Poligono che ha i
    metodi getPerimetro () e getArea(). Da questa classe derivano le classi Cerchio, Rettangolo e Triangolo.
    Per ciascuna di queste classi, dopo avere realizzato i metodi che ritieni opportuni, realizza un metodo statico
    creaCasuale() che crea un oggetto con valori a caso e lo restituisce.
    Realizza infine la classe ScaffaleDiPoligoni che è una collezione di (massimo) dieci poligoni sistemati in modo da
    occupare meno spazio possibile (i triangoli e i rettangoli sono poggiati sul lato più corto, le circonferenze
    occupano lo spazio del loro diametro: si trascuri l'eventuale contatto tra i poligoni al di sopra della retta presa in
    considerazione).
    I metodi di questa classe sono: getPorzioneOccupata(), getTotPoligoni(), getPoligono(i), sistemaPoligono(p),
    toString(). Il primo metodo restituisce la misura dello scaffale occupata. Il metodo getTotPoligoni() restituisce
    un intero tra 0 e 10 che rappresenta la quantità di poligoni già sistemati sullo scaffale. Il metodo getPoligono(i)
    restituisce un puntatore al poligono inserito in posizione i-esima. Il metodo sistemaPoligono(p) posiziona nel modo più
    opportuno il poligono sullo scaffale. Il metodo toString() presenta un elenco dei poligono inseriti sullo scaffale; di
    ciascun poligono si presenterà il tipo (Triangolo, Rettangolo, Cerchio), le sue caratteristiche
    (i vertici o il centro con il raggio) ed infine l'ingombro.
    Realizza infine una classe Test che sistema su uno scaffale un numero di poligoni a caso tra 5 e 10.
    I poligoni saranno scelti a caso tra quelli disponibili.
    I punti e l'eventuale misura del raggio saranno anch'essi casuali.
     */
    
    class Point {
        private int x;
        private int y;
        private static int x1;
        private static int y1;
        static int nPoint;
    
    
        //Costruttore
    
        public Point() {
            nPoint++;
        }
    
        public Point(int x, int y) {
            this.x = x;
            this.y = y;
            nPoint++;
        }
    
        //Getter e Setter di x,y e x1,y1
    
        public int getX() {
            return x;
        }
    
        public void setX(int x) {
            this.x = x;
        }
    
        public int getY() {
            return y;
        }
    
        public void setY(int y) {
            this.y = y;
        }
    
        public static int getX1() {
            return x1;
        }
    
        public static int getY1() {
            return y1;
        }
    
        //Metodo creazione punto casuale
    
        public static String creaCasuale() {
            //N casuale da 0.0 a 20
            x1 = (int) (20 * Math.random());
            y1 = (int) (20 * Math.random());
            return getX1() + " " + getY1();
        }
    }
    
    abstract class Poligono {
    
        //Metodi astratti
    
        public abstract double getPerimetro();
        public abstract double getArea();
       // public abstract String getPoligono();
    }
    
    class Rettangle extends Poligono{
        private double AB, BC, CD, DA;
        private static double Ab,Bc;
        private static String rettangle;
    
        //Costruttori
    
        public Rettangle (double AB, double BC){
            this.AB = AB;
            this.BC = BC;
        }
    
        public Rettangle(Point A, Point B, Point C, Point D){
    
            //Formula distanza tra due punti
    
            AB = Math.sqrt(Math.pow((B.getX()-A.getX()),2)+Math.pow((B.getY()-A.getY()),2));
            BC = Math.sqrt(Math.pow((C.getX()-B.getX()),2)+Math.pow((C.getY()-B.getY()),2));
            CD = Math.sqrt(Math.pow((D.getX()-C.getX()),2)+Math.pow((D.getY()-C.getY()),2));
            DA = Math.sqrt(Math.pow((A.getX()-D.getX()),2)+Math.pow((A.getY()-D.getY()),2));
        }
    
        public double getAB() {
            return AB;
        }
    
        public double getBC() {
            return BC;
        }
    
        public double getCD() {
            return CD;
        }
    
        public double getDA() {
            return DA;
        }
    
        public static double getAb() {
            return Ab;
        }
    
        public static double getBc() {
            return Bc;
        }
        //Metodi Perimetro e Area non Static
    
        @Override
        public double getPerimetro() {
            return (AB + BC) * 2;
        }
    
        @Override
        public double getArea() {
            return AB * BC;
        }
    
        //Metodi Static
    
        public static String creaCasuale() {
            //Creo i lati del Rettangolo
    
            Ab = (int)(20 * Math.random()) + 1;
            Bc = (int)(20 * Math.random()) + 1;
    
            //Per maggiore compresione utilizzo una variabile Stringa
    
            rettangle = ("AB=CD=" + Ab + " BC=DA=" + Bc);
            return rettangle;
        }
    
        public static double getPerimeter(){
            return (Ab + Bc) * 2;
        }
    
        public static double getAreA(){
            return Ab * Bc;
        }
    }
    
    class Triangle extends Poligono{
        private double AB, BC, CA;
        private static double Ab, Bc, Ca;
        private static String triangle;
    
        //Costruttore
        public Triangle(double AB, double BC, double CA) {
            this.AB = AB;
            this.BC = BC;
            this.CA = CA;
        }
    
        public Triangle(Point A, Point B, Point C){
    
            //Formula distanza tra due punti
    
            AB = (int)Math.sqrt(Math.pow((B.getX()-A.getX()),2)+Math.pow((B.getY()-A.getY()),2));
            BC = (int)Math.sqrt(Math.pow((C.getX()-B.getX()),2)+Math.pow((C.getY()-B.getY()),2));
            CA = (int)Math.sqrt(Math.pow((A.getX()-C.getX()),2)+Math.pow((A.getY()-C.getY()),2));
        }
    
        //Metodi getter
    
        public double getAB() {
            return AB;
        }
    
        public double getBC() {
            return BC;
        }
    
        public double getCA() {
            return CA;
        }
    
        public static double getAb() {
            return Ab;
        }
    
        public static double getBc() {
            return Bc;
        }
    
        public static double getCa() {
            return Ca;
        }
    
        //Metodi Perimetro e Area non Static
    
        @Override
        public double getPerimetro() {
            return AB +BC +CA;
        }
    
        @Override
        public double getArea() {
            double halfPerimeter = (AB +BC +CA)/2;
            return Math.sqrt( halfPerimeter * (halfPerimeter - AB) * (halfPerimeter - BC) * (halfPerimeter -CA));
        }
    
        //Metodi Static
    
        public static String creaCasuale() {
            //Creo i lati del Triangolo
    
            Ab = (int)(20 * Math.random()) + 1;
            Bc = (int)(20 * Math.random()) + 1;
            Ca = (int)(20 * Math.random()) + 1;
    
            //Per maggiore compresione utilizzo una variabile Stringa
    
            triangle = "AB= " + Ab + " BC= " + Bc + " CA= " + Ca;
            return triangle;
        }
    
        public static double getPerimeter(){
            return Ab + Bc + Ca;
        }
    
        public static double getAreA(){
            double halfPerimeter = (Ab +Bc +Ca)/2;
            return Math.sqrt( halfPerimeter * (halfPerimeter - Ab) * (halfPerimeter - Bc) * (halfPerimeter -Ca));
        }
    }
    
    class Circle extends Poligono{
        private double radius;
        private static final double piGreco = 3.14159;
        private static double radiuss;
    
        //Costruttori
    
        public Circle(double radius) {
            this.radius = radius;
        }
    
        //Metodi getter
    
        public double getRadius() {
            return radius;
        }
    
        public static double getRadiuss() {
            return radiuss;
        }
    
        //Metodo Area e Perimetro non Statici
    
        @Override
        public double getPerimetro() {
            return 2 * radius * piGreco;
        }
    
        @Override
        public double getArea() {
            return Math.pow(radius,2.0) * piGreco;
        }
    
        //Metodi Statici
    
        public static String creaCasuale() {
            //Creo il ragiio
    
            radiuss = (int)(20 * Math.random()) + 1;
    
            return "r = " + radiuss;
        }
    
        public static double getPerimeter(){
            return 2 * radiuss * piGreco;
        }
    
        public static double getAreA(){
            return Math.pow(radiuss,2.0) * piGreco;
        }
    }
    
    class ScaffaleDiPoligoni {
        private double shelf;
        private Poligono [] vetPoligoni = new Poligono [10];
        private int cnt = 0;
    
        //Costruttore
        public ScaffaleDiPoligoni(){}
    
        //Metodi
    
        public void sistemaPoligono(Poligono form){
    
            if(cnt < 10){
                vetPoligoni[cnt] = form;
                cnt++;
            }else {
                System.out.println("Raggiunto limite massimo di Poligoni sullo scaffale")}
        }
    
        public int getTotPoligoni() {
            return cnt;
        }
    
        public int getPorzioneOccupata(){
    
        }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Potete darmi qualche dritta???
    Inoltre, il codice è scritto con chiarezza e indentato corretamente??
    L'uso dei commenti è buono?
    Classe Point (ti è stato chiesto di creare Punto ... non Point in inglese):
    1) i campi statici x1/y1 NON hanno senso di esistere (e nemmeno getX1/getY1).
    2) costruttori ok. Vedo che tieni traccia di quante sono le istanze. Male non fa ma non mi sembra che sia stato richiesto.
    3) getter/setter ok
    4) creaCasuale no, non ha senso che restituisca String. Deve restituire un oggetto di quella classe! Non una stringa (che serve ben poco)


    Classe Poligono:
    1) getPerimetro()/getArea() astratti ok


    Classi Rettangle e Triangle (idem, è stato chiesto Rettangolo e Triangolo):
    1) mi paiono complesse e "contorte"
    2) creaCasuale idem non deve restituire un String


    Ripensa bene il tutto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13
    1) i campi statici x1/y1 NON hanno senso di esistere (e nemmeno getX1/getY1).
    Togliendoli come posso fare questo?? ma sopprattutto come ritorno l'oggetto??

    codice:
    public static String creaCasuale() {
            //N casuale da 0.0 a 20
            x1 = (int) (20 * Math.random());
            y1 = (int) (20 * Math.random());
            return getX1() + " " + getY1();
        }

    Per il resto ci sto lavoranod!!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Togliendoli come posso fare questo?? ma sopprattutto come ritorno l'oggetto??
    Generi x/y casuali, invochi il costruttore e .. restituisci l'oggetto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Classe Point (ti è stato chiesto di creare Punto ... non Point in inglese):
    1) i campi statici x1/y1 NON hanno senso di esistere (e nemmeno getX1/getY1).
    2) costruttori ok. Vedo che tieni traccia di quante sono le istanze. Male non fa ma non mi sembra che sia stato richiesto.
    3) getter/setter ok
    4) creaCasuale no, non ha senso che restituisca String. Deve restituire un oggetto di quella classe! Non una stringa (che serve ben poco)


    Classe Poligono:
    1) getPerimetro()/getArea() astratti ok


    Classi Rettangle e Triangle (idem, è stato chiesto Rettangolo e Triangolo):
    1) mi paiono complesse e "contorte"
    2) creaCasuale idem non deve restituire un String


    Ripensa bene il tutto.

    Ho rivisto un po' tutto, seguendo i tuoi consigli.

    Classe Punto
    codice:
    class Punto {
        private int x;
        private int y;
    
    
        //Costruttore
    
        public Punto() {
        }
    
        public Punto(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        //Getter e Setter di x,y
    
        public int getX() {
            return x;
        }
    
        public void setX(int x) {
            this.x = x;
        }
    
        public int getY() {
            return y;
        }
    
        public void setY(int y) {
            this.y = y;
        }
    
    
        //Metodo creazione punto casuale
    
        public static Punto creaCasuale() {
    
            //Crea Punto Casuale
            Punto staticPunto = new Punto( (int) (20 * Math.random()), (int) (20 * Math.random()));
    
            return staticPunto;
        }
    }
    Classe Triangolo
    codice:
    class Triangolo extends Poligono {
        private double AB, BC, CA;
    
        //Costruttore
        public Triangolo(double AB, double BC, double CA) {
            this.AB = AB;
            this.BC = BC;
            this.CA = CA;
        }
    
        public Triangolo(Punto A, Punto B, Punto C) {
    
            //Formula distanza tra due punti
    
            AB = (int) Math.sqrt(Math.pow((B.getX() - A.getX()), 2) + Math.pow((B.getY() - A.getY()), 2));
            BC = (int) Math.sqrt(Math.pow((C.getX() - B.getX()), 2) + Math.pow((C.getY() - B.getY()), 2));
            CA = (int) Math.sqrt(Math.pow((A.getX() - C.getX()), 2) + Math.pow((A.getY() - C.getY()), 2));
        }
    
        //Metodi getter
    
        public double getAB() {
            return AB;
        }
    
        public double getBC() {
            return BC;
        }
    
        public double getCA() {
            return CA;
        }
    
        //Metodi Perimetro e Area
    
        @Override
        public double getPerimetro() {
            return AB + BC + CA;
        }
    
        @Override
        public double getArea() {
            double halfPerimeter = (AB + BC + CA) / 2;
            return Math.sqrt(halfPerimeter * (halfPerimeter - AB) * (halfPerimeter - BC) * (halfPerimeter - CA));
        }
    
        //Metodi Static creaCasuale
    
        public static Triangolo creaCasuale() {
            //Creo i lati del Triangolo
    
            Triangolo TriCasuale = new Triangolo(((20 * Math.random()) + 1), ((20 * Math.random()) + 1), ((20 * Math.random()) + 1));
    
            return TriCasuale;
        }
    }
    Classe Rettangolo
    codice:
    class Rettangolo extends Poligono{
        private double AB, BC, CD, DA;
    
        //Costruttori
    
        public Rettangolo (double AB, double BC){
            this.AB = AB;
            this.BC = BC;
        }
    
        public Rettangolo(Punto A, Punto B, Punto C, Punto D){
    
            //Formula distanza tra due punti
    
            AB = Math.sqrt( Math.pow( (B.getX() - A.getX() ), 2 ) + Math.pow( (B.getY() - A.getY() ) , 2) );
            BC = Math.sqrt( Math.pow( (B.getX() - A.getX() ), 2 ) + Math.pow( (B.getY() - A.getY() ) , 2) );
            CD = Math.sqrt( Math.pow( (B.getX() - A.getX() ), 2 ) + Math.pow( (B.getY() - A.getY() ) , 2) );
            DA = Math.sqrt( Math.pow( (B.getX() - A.getX() ), 2 ) + Math.pow( (B.getY() - A.getY() ) , 2) );
        }
    
        public double getAB() {
            return AB;
        }
    
        public double getBC() {
            return BC;
        }
    
        public double getCD() {
            return CD;
        }
    
        public double getDA() {
            return DA;
        }
    
        //Metodi Perimetro e Area
    
        @Override
        public double getPerimetro() {
            return (AB + BC) * 2;
        }
    
        @Override
        public double getArea() {
            return AB * BC;
        }
    
        //Metodo Static creaCasuale
    
        public static Rettangolo creaCasuale() {
            //Creo Rettangolo casuale
    
            Rettangolo RetCasuale = new Rettangolo((20 * Math.random()) + 1, (20 * Math.random()) + 1);
    
            return RetCasuale;
        }
    }
    Classe cerchio
    codice:
    class Cerchio extends Poligono{
        private double radius;
        private final double piGreco = 3.14159;
    
        //Costruttori
    
        public Cerchio(double radius) {
            this.radius = radius;
        }
    
        //Metodi getter
    
        public double getRadius() {
            return radius;
        }
    
    
        //Metodo Area e Perimetro non Statici
    
        @Override
        public double getPerimetro() {
            return 2 * radius * piGreco;
        }
    
        @Override
        public double getArea() {
            return Math.pow(radius,2.0) * piGreco;
        }
    
        //Metodi Statici
    
        public static Cerchio creaCasuale() {
    
            Cerchio CerCasuale = new Cerchio((20 * Math.random()) + 1);
    
            return CerCasuale;
        }
    
    }
    Avendo cambiato i metodi creaCasuale, mi sorge una domanda spontanea,
    Come faccio a visualizzare la x e la y del Punto creato casualmente??
    Ho provato cosi, ma non sono sicuro che il primo e il secondo crea casuale si riferiscano allo stesso oggetto.
    codice:
    System.out.println( Punto.creaCasuale().getX() + " " + Punto.creaCasuale().getY());
    Oppure non ha senso stampare la x, e y essendo un metodo statico??

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Classe Punto
    Ok, corretta

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Classe Triangolo
    Qui c'è un problema concettuale. Detto in generale NON ha molto senso costruire un triangolo passando le lunghezze dei lati, perché NON è detto che date 3 lunghezze qualsiasi esse permettano di realizzare davvero la figura chiusa di un triangolo. Se ti dò 3 lunghezze es. 10 70 30 con queste NON fai un triangolo.
    Per un triangolo qualsiasi il modo sensato è passare 3 punti xy sul piano cartesiano.

    Inoltre dovresti cercare di incapsulare e ri-utilizzare meglio i concetti. In Triangolo fai 3 volte

    (int) Math.sqrt(Math.pow(( ...... ecc

    Qui stai cercando di calcolare la distanza tra 2 punti. Che è un concetto abbastanza utile e valido in generale. Allora perché non mettere in Punto questa funzionalità? Il testo iniziale NON proibisce una cosa del genere. Anzi, dice "dopo avere realizzato i metodi che ritieni opportuni"

    Ovvero, in Punto ha assolutamente senso mettere un metodo di istanza che fornisce la distanza tra il punto this (su cui invochi il metodo) e un altro Punto passato in argomento.

    Altro riutilizzo: in creaCasuale di Triangolo ... perché non sfruttare il creaCasuale di Punto?


    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Classe Rettangolo
    Rettangolo è sbagliata concettualmente in modo opposto a Triangolo. Il primo costruttore riceve 2 lati ed HA senso. Il secondo costruttore riceve 4 punti e questo NON ha senso, perché puoi creare qualunque quadrilatero che non è un rettangolo!

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Classe cerchio
    Cerchio ha senso ma semplicemente perché l'unica cosa che gestisci è il raggio, che ovviamente HA senso.
    Tieni anche presente che per il pi greco esiste gìà la costante Math.PI (Math è la classe java.lang.Math).

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Come faccio a visualizzare la x e la y del Punto creato casualmente??
    Ho provato cosi, ma non sono sicuro che il primo e il secondo crea casuale si riferiscano allo stesso oggetto.
    codice:
    System.out.println( Punto.creaCasuale().getX() + " " + Punto.creaCasuale().getY());
    Appunto ... sono due oggetti Punto differenti, quindi creaCasuale usato così ovviamente NON ha senso.

    Se vuoi puoi anche ridefinire il toString() nelle tue classi per fornire una rappresentazione testuale degli oggetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13
    Rettangolo è sbagliata concettualmente in modo opposto a Triangolo. Il primo costruttore riceve 2 lati ed HA senso. Il secondo costruttore riceve 4 punti e questo NON ha senso, perché puoi creare qualunque quadrilatero che non è un rettangolo!
    Succesivamente nell'ultima classe da creare mi chiede nel metodo toString
    codice:
    
    ciascun poligono si presenterà il tipo (Triangolo, Rettangolo, Cerchio), le sue caratteristiche
    (i vertici o il centro con il raggio) ed infine l'ingombro.
    
    Per il cerchio nel costruttore posso passare un Punto x,y e il raggio come un intero, e qui credo dovrebbe essere giusto concettualmente, mentre per il rettangolo credo di dover passare per forza i 4 punti, a questo punto nel costruttore è possibile mettere delle condizioni tipo if per verificare sia effetivamente un rettangolo? oppure come si potrebbe fare??

    P.S: i tuoi consigli mi sono utilissimi Grazie Mille

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Succesivamente nell'ultima classe da creare mi chiede nel metodo toString
    codice:
    
    ciascun poligono si presenterà il tipo (Triangolo, Rettangolo, Cerchio), le sue caratteristiche
    (i vertici o il centro con il raggio) ed infine l'ingombro.
    
    Per ciascuna classe ridefinirai il toString() componendo una stringa con i dati che ti sono stati chiesti. E li hai tutti, parametri o calcolati che siano.

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Per il cerchio nel costruttore posso passare un Punto x,y e il raggio come un intero, e qui credo dovrebbe essere giusto concettualmente
    Sì, per un cerchio ha senso in genere specificare:
    - punto xy centrale e raggio
    oppure
    - punto xy centrale e diametro

    Sono entrambi sensati.

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    mentre per il rettangolo credo di dover passare per forza i 4 punti
    Perché "per forza"? Dove sta scritto che devi passare 4 punti??

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    a questo punto nel costruttore è possibile mettere delle condizioni tipo if per verificare sia effetivamente un rettangolo?
    Se intendi che i 4 punti siano gli angoli di un rettangolo messo sul piano senza alcuna rotazione (ovvero le linee ideali dei lati sono solo perfettamente orizzontali e verticali), sì, è perfettamente possibile verificare se i punti formano davvero un rettangolo.

    Ma se i 4 punti fossero messi in modo tale da fare un rettangolo con una certa rotazione?? Sarebbe decisamente meno "banale" e più contorto/complesso da verificare.

    E poi c'è ancora un'altra questione. Se vuoi creare un rettangolo "casuale" NON puoi banalmente creare 4 punti casuali. Dovresti generare xy casuali di due angoli opposti e POI costruire i 4 punti.

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    P.S: i tuoi consigli mi sono utilissimi Grazie Mille
    Prego!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13
    Ricapitolando, ho corretto un po' di cose, ed ora la classe Triangolo, Cerchio, Punto, e Rettangolo dovrebbere essere giuste, ho aggiunto un nuovo metodo per trovare l'ingombro minimo per ogni classe (mi serivirà per la classe Scaffale di poligoni.

    PUNTO
    codice:
    /*
    Realizza la classe Punto con tutti i metodi che ritieni opportuni più il metodo (statico) creaCasuale()
    che crea un punto casuale e lo restituisce.
     */
    
    class Punto {
        private int x;
        private int y;
    
    
        //Costruttore
    
        public Punto() {
        }
    
        public Punto(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        //Getter e Setter di x,y
    
        public int getX() {
            return x;
        }
    
        public void setX(int x) {
            this.x = x;
        }
    
        public int getY() {
            return y;
        }
    
        public void setY(int y) {
            this.y = y;
        }
    
        public int CalcDistanza(Punto A, Punto B){
            //Distanza tra 2 punti
            int AB = (int) Math.sqrt( Math.pow( (B.getX() - A.getX() ), 2 ) + Math.pow( (B.getY() - A.getY() ) , 2) );
            return AB;
        }
    
        //Metodo creazione punto casuale
    
        public static Punto creaCasuale() {
    
            //Crea Punto Casuale
            Punto staticPunto = new Punto( (int) (20 * Math.random()), (int) (20 * Math.random()));
    
            return staticPunto;
        }
    }
    POLIGONO
    codice:
    /*
    Successivamente crea la superclasse astratta Poligono che ha i
    metodi getPerimetro () e getArea(). Da questa classe derivano le classi Cerchio, Rettangolo e Triangolo.
     */
    abstract class Poligono {
    
        //Metodi astratti
    
        public abstract double getPerimetro();
        public abstract double getArea();
        public abstract double ingombroMin();
    
    }
    RETTANGOLO
    codice:
    /*
    Per ciascuna di queste classi, dopo avere realizzato i metodi che ritieni opportuni, realizza un metodo statico
    creaCasuale() che crea un oggetto con valori a caso e lo restituisce.
     */
    class Rettangolo extends Poligono{
        private double AB, BC;
    
        //Costruttori
    
        public Rettangolo (double AB, double BC){
            this.AB = AB;
            this.BC = BC;
        }
    
        public double getAB() {
            return AB;
        }
    
        public double getBC() {
            return BC;
        }
    
        //Metodi Perimetro e Area
    
        @Override
        public double getPerimetro() {
            return (AB + BC) * 2;
        }
    
        @Override
        public double getArea() {
            return AB * BC;
        }
    
        //Metodo Static creaCasuale
    
        public static Rettangolo creaCasuale() {
            //Creo Rettangolo casuale
    
            Rettangolo RetCasuale = new Rettangolo((20 * Math.random()) + 1, (20 * Math.random()) + 1);
    
            return RetCasuale;
        }
    
        //metodo per trovare il lato più corto
    
        public double ingombroMin(){
            double min = Math.min(getAB(),getBC());
            return min;
        }
    
        public String toString(){
            return "[Rettangolo " + "AB=" + AB + " BC=" + BC + " Perimetro=" + getPerimetro() + "cm " + "Area=" + getArea() + "cm^2]";
        }
    }
    TRIANGOLO
    codice:
    /*
    Per ciascuna di queste classi, dopo avere realizzato i metodi che ritieni opportuni, realizza un metodo statico
    creaCasuale() che crea un oggetto con valori a caso e lo restituisce.
     */
    class Triangolo extends Poligono {
        private double AB, BC, CA;
    
        //Costruttore
    
        public Triangolo(Punto A, Punto B, Punto C) {
    
            //Formula distanza tra due punti
    
            AB = A.CalcDistanza(A, B);
            BC = B.CalcDistanza(B, C);
            CA = C.CalcDistanza(C, A);
        }
    
        //Metodi getter
    
        public double getAB() {
            return AB;
        }
    
        public double getBC() {
            return BC;
        }
    
        public double getCA() {
            return CA;
        }
    
        //Metodi Perimetro e Area
    
        @Override
        public double getPerimetro() {
            return AB + BC + CA;
        }
    
        @Override
        public double getArea() {
            double halfPerimeter = (AB + BC + CA) / 2;
            return Math.sqrt(halfPerimeter * (halfPerimeter - AB) * (halfPerimeter - BC) * (halfPerimeter - CA));
        }
    
        //Metodi Static creaCasuale
    
        public static Triangolo creaCasuale() {
            //Creo i lati del Triangolo
    
            Triangolo TriCasuale = new Triangolo(Punto.creaCasuale(), Punto.creaCasuale(), Punto.creaCasuale());
    
            return TriCasuale;
        }
    
        //metodo per trovare il lato più corto
    
        public double ingombroMin(){
            double min = Math.min(getAB(),getBC());
            min = Math.min(min, getCA());
            return min;
        }
    
        public String toString(){
            return "[Triangolo AB=" + AB + " BC=" + BC + "CA= " +CA+ " Perimetro=" + getPerimetro() + "cm " + "Area=" + getArea() + "cm^2]";
        }
    }
    CERCHIO
    codice:
    /*
    Per ciascuna di queste classi, dopo avere realizzato i metodi che ritieni opportuni, realizza un metodo statico
    creaCasuale() che crea un oggetto con valori a caso e lo restituisce.
     */
    
    class Cerchio extends Poligono{
        private double radius;
        private Punto vertice;
    
        //Costruttori
    
        public Cerchio(double radius, Punto vertice) {
            this.vertice = vertice;
            this.radius = radius;
        }
    
        //Metodi getter
    
        public double getRadius() {
            return radius;
        }
    
        public Punto getVertice() {
            return vertice;
        }
    
        //Metodo Area e Perimetro
    
        @Override
        public double getPerimetro() {
            return 2 * radius *  Math.PI;
        }
    
        @Override
        public double getArea() {
            return Math.pow(radius,2.0) *  Math.PI;
        }
    
        //Metodi Statici
    
        public static Cerchio creaCasuale() {
    
            Cerchio CerCasuale = new Cerchio(((20 * Math.random()) + 1), Punto.creaCasuale());
    
            return CerCasuale;
        }
    
        //metodo per trovare il lato più corto
    
        public double ingombroMin(){
           return radius*2;
        }
    
        public String toString(){
            return "[Cerchio " + "V(" + vertice.getX()+","+ vertice.getY()+")" + " r=" + radius + " Perimetro=" + getPerimetro() + "cm " + "Area=" + getArea() + "cm^2]";
        }
    }
    a questo punto ho iniziato l'ultima classe ossia
    codice:
    /*
    Realizza infine la classe ScaffaleDiPoligoni che è una collezione di (massimo) dieci poligoni sistemati in modo da
    occupare meno spazio possibile (i triangoli e i rettangoli sono poggiati sul lato più corto, le circonferenze
    occupano lo spazio del loro diametro: si trascuri l'eventuale contatto tra i poligoni al di sopra della retta presa in
    considerazione).
    I metodi di questa classe sono: getPorzioneOccupata(), getTotPoligoni(), getPoligono(i), sistemaPoligono(p),
    toString(). Il primo metodo restituisce la misura dello scaffale occupata. Il metodo getTotPoligoni() restituisce
    un intero tra 0 e 10 che rappresenta la quantità di poligoni già sistemati sullo scaffale. Il metodo getPoligono(i)
    restituisce un puntatore al poligono inserito in posizione i-esima. Il metodo sistemaPoligono(p) posiziona nel modo più
    opportuno il poligono sullo scaffale. Il metodo toString() presenta un elenco dei poligono inseriti sullo scaffale; di
    ciascun poligono si presenterà il tipo (Triangolo, Rettangolo, Cerchio), le sue caratteristiche
    (i vertici o il centro con il raggio) ed infine l'ingombro.
    */
    class ScaffaleDiPoligoni {
        private double shelf;
        private Poligono [] vetPoligoni = new Poligono [10];
        private int cnt = 0;
    
        //Costruttore
        public ScaffaleDiPoligoni(){}
    
        //Metodi
    
        public void sistemaPoligono(Poligono form){
    
                vetPoligoni[cnt] = form;
                cnt++;
                shelf += form.ingombroMin();
    
        }
    
        public int getTotPoligoni() {
            return cnt;
        }
    
        public int getPorzioneOccupata(){
            return (int) shelf;
        }
    
        public Poligono getPoligono(int i){
            return vetPoligoni[i];
        }
    
    
        public String toString(){
            for(int i=0; i <= cnt; i++) {
                return vetPoligoni[i].toString();
            }
        }
    }
    funziona tutto (non so se sia consettualmente corretto e chiaro), tranne il toString che deve restiture la lista dei poligoni inseriti, ho provato a farlo ma non funziona poichè restituisce un errore al return.
    1. In che altro modo lo posso fare??
    2. Dovrei teriocamente sulla classe, getPoligono, sistemaPoligono gestire delle eccezioni in caso l'array sia pieno oppure si richieda un elemento di indice i non presente?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    codice:
        public String toString(){
            for(int i=0; i <= cnt; i++) {
                return vetPoligoni[i].toString();
            }
        }
    E questo è sbagliato concettualmente, oltre al fatto che non compila proprio. Il compilatore non sa quale sarà il flusso di esecuzione del metodo toString a runtime. Sa però che il for ha una condizione che in teoria "potrebbe" essere subito false e quindi il corpo potrebbe non venire neanche eseguito. E il metodo resterebbe sguarnito di un return, che invece ci deve essere.

    Il for ti serve ma per comporre una stringa, non per restituire subito una stringa!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.