[Java] Metodo che restituisce un oggetto.

MrLion

Nuovo Utente
49
4
Hardware Utente
CPU
AMD Vishera FX-8320
Dissipatore
Arctic Freezer 13 pro co
Scheda Madre
Asrock 990FX Extreme 3
Hard Disk
Segate Barracuda 1TB
RAM
Corsair 1600 Mhz 8 GB
Scheda Video
AMD r9 280x Vapor x Tri x
Alimentatore
Corsair VS650 W
Case
Coller Master HAF 922
Periferiche
Tastiera Drevo Calibur Switch RED/ Mouse Logitech g203
Sistema Operativo
W10/Ubuntu
Salve ragazzi , ho iniziato da poco a studiare java e sto provando a fare qualche esercizio per capire come funzionano i costruttori e come interagiscono gli oggeti con i metodi , mi sono bloccato nell ' ultimo punto di un esercizio quando mi viene chiesto questo:
public Cerchio sommaRaggio(Cerchio c) : metodo che restituisce un nuovo oggetto Cerchio il cui raggio è la somma dei raggi dei cerchi rappresentati dall’oggetto ricevente e dall'oggetto c.
Non riesco a capire quali parametri passare e come restituire l'oggetto con la somma dei raggi.
Grazie mille in anticipo.
 
Ultima modifica:

fabio93

Utente Attivo
429
119
Hardware Utente
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
Hard Disk
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
Alimentatore
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Logitech G203
Sistema Operativo
Windows 10 Pro, Ubuntu 19.04

MrLion

Nuovo Utente
49
4
Hardware Utente
CPU
AMD Vishera FX-8320
Dissipatore
Arctic Freezer 13 pro co
Scheda Madre
Asrock 990FX Extreme 3
Hard Disk
Segate Barracuda 1TB
RAM
Corsair 1600 Mhz 8 GB
Scheda Video
AMD r9 280x Vapor x Tri x
Alimentatore
Corsair VS650 W
Case
Coller Master HAF 922
Periferiche
Tastiera Drevo Calibur Switch RED/ Mouse Logitech g203
Sistema Operativo
W10/Ubuntu

fabio93

Utente Attivo
429
119
Hardware Utente
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
Hard Disk
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
Alimentatore
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Logitech G203
Sistema Operativo
Windows 10 Pro, Ubuntu 19.04
Dovresti dire la traccia per intero, perché così non è molto chiaro e non sono sicuro di aver inteso correttamente. Comunque immagino che voglia dire di sommare il raggio del cerchio passato come argomento al metodo con quello del cerchio sul quale il metodo verrà invocato. Quindi da quel che capisco il metodo è definito nella classe Cerchio.
Ad esempio, hai due oggetti Cerchio, cerchio1 e cerchio2. Poi dichiari una terza variabile Cerchio ad es. cerchioSomma e la inizializzi assegnandole il valore di ritorno del metodo sommaRaggio.
Così: Cerchio cerchioSomma = cerchio1.sommaRaggio(cerchio2);
 

MrLion

Nuovo Utente
49
4
Hardware Utente
CPU
AMD Vishera FX-8320
Dissipatore
Arctic Freezer 13 pro co
Scheda Madre
Asrock 990FX Extreme 3
Hard Disk
Segate Barracuda 1TB
RAM
Corsair 1600 Mhz 8 GB
Scheda Video
AMD r9 280x Vapor x Tri x
Alimentatore
Corsair VS650 W
Case
Coller Master HAF 922
Periferiche
Tastiera Drevo Calibur Switch RED/ Mouse Logitech g203
Sistema Operativo
W10/Ubuntu
Posto tutto il testo:
Esercizio 1 (esercizio 5.4 del libro di testo). Nel package fond.esempi.capitolo5 è presente
una classe di nome Cerchio , i cui oggetti rappresentano cerchi nel piano. La classe dispone del
seguente costruttore e dei seguenti metodi di istanza:

public Cerchio(double r) : costruttore per creare un oggetto Cerchio che
rappresenta un cerchio di raggio r (si ricordi che il tipo double indica numeri reali).

public double diametro() : metodo che restituisce il diametro del cerchio
rappresentato dall’oggetto ricevente.

public double perimetro() : metodo che restituisce il perimetro del cerchio
rappresentato dall’oggetto ricevente.

public double area() : metodo che restituisce l’area del cerchio rappresentato
dall’oggetto ricevente.

public Cerchio sommaRaggio(Cerchio c) : metodo che restituisce un nuovo
oggetto Cerchio il cui raggio è la somma dei raggi dei cerchi rappresentati dall’oggetto
ricevente e dall’oggetto c .

Scrivere una classe di nome UsoCerchio , avente soltanto il metodo speciale main . Tale metodo
deve svolgere queste azioni:
1. Fare inserire all’utente tramite tastiera i raggi r1 e r2 di due cerchi nel piano.
2. Creare due oggetti Cerchio , c1 e c2 , di raggio rispettivamente r1 e r2 .
3. Stampare sullo standard output il diametro, il perimetro e l’area dei cerchi rappresentati
da c1 e c2 .
4. Creare un terzo oggetto Cerchio c3 , che rappresenti un cerchio di raggio pari alla somma
dei raggi dei cerchi rappresentati da c1 e c2 .
5. Stampare sullo standard output il diametro, il perimetro e l’area del cerchio rappresentato
da c3 .

Ovviamente io non ho il libro dal quale e' stato ricavato l'esrcizio , infatti ho ricreato la classe Cerchio e quella usoCerchio , per quanto riguarda i primi 3 metodi sono riuscito a farli , l'unico che mi manca e' il 4 non so cosa scrivergli dentro.
 

fabio93

Utente Attivo
429
119
Hardware Utente
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
Hard Disk
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
Alimentatore
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Logitech G203
Sistema Operativo
Windows 10 Pro, Ubuntu 19.04
Sì, credo che sia come ti ho detto. Nel metodo devi istanziare, con l'operatore new, un nuovo oggetto Cerchio il cui raggio sia la somma tra il raggio del cerchio passato come parametro e quello del cerchio corrente, ovvero quello su cui chiami il metodo con l'operatore ..
Puoi chiamarlo in uno dei seguenti modi:
Cerchio c3 = c1.sommaRaggio(c2);
Cerchio c3 = c2.sommaRaggio(c1);
 

MrLion

Nuovo Utente
49
4
Hardware Utente
CPU
AMD Vishera FX-8320
Dissipatore
Arctic Freezer 13 pro co
Scheda Madre
Asrock 990FX Extreme 3
Hard Disk
Segate Barracuda 1TB
RAM
Corsair 1600 Mhz 8 GB
Scheda Video
AMD r9 280x Vapor x Tri x
Alimentatore
Corsair VS650 W
Case
Coller Master HAF 922
Periferiche
Tastiera Drevo Calibur Switch RED/ Mouse Logitech g203
Sistema Operativo
W10/Ubuntu
quindi nel metodo:
Java:
public Cerchio sommaRaggio(Cerchio c)
<---- il parametro qui dento indica l'oggetto di classe c giusto?
{
Java:
Cerchio c3 = new Cerchio()
<---- dentro le parentesi devo mettere il parametro del raggio?
come valore di ritorno vuole un oggeto quindi return c3; però in tutto questo la somma non l'ho effettuata.

}
Sono confuso perdonami.
 
Ultima modifica:

fabio93

Utente Attivo
429
119
Hardware Utente
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
Hard Disk
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
Alimentatore
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Logitech G203
Sistema Operativo
Windows 10 Pro, Ubuntu 19.04
quindi nel metodo:
public Cerchio sommaRaggio(Cerchio c)<---- il parametro qui dento indica l'oggetto di classe c giusto?
{
Cerchio c3 = new Cerchio() <---- dentro le parentesi devo mettere il parametro del raggio?
come valore di ritorno vuole un oggeto quindi return c3; però in tutto questo la somma non l'ho effettuata.

}
Sono confuso perdonami.
Sì, può andare. Puoi anche scrivere direttamente return new Cerchio(r), dove r dev'essere ottenuto sommando il raggio del cerchio corrente con quello del cerchio c passato come parametro.

P.S.: per scrivere il codice sul forum è buona norma usare il tag code in modo da avere una visualizzazione più chiara (puoi anche cliccare sull'icona con i tre punti accanto allo smile e selezionare "Codice").

Sono confuso perdonami.
Tranquillo :-)
 

MrLion

Nuovo Utente
49
4
Hardware Utente
CPU
AMD Vishera FX-8320
Dissipatore
Arctic Freezer 13 pro co
Scheda Madre
Asrock 990FX Extreme 3
Hard Disk
Segate Barracuda 1TB
RAM
Corsair 1600 Mhz 8 GB
Scheda Video
AMD r9 280x Vapor x Tri x
Alimentatore
Corsair VS650 W
Case
Coller Master HAF 922
Periferiche
Tastiera Drevo Calibur Switch RED/ Mouse Logitech g203
Sistema Operativo
W10/Ubuntu
Allora bro ho fatto un paio di tentativi e non sto capendo lo stesso come fare, ti posto tutto il codice:
Java:
package costruttore;


    public class Cerchio
    { 
         double raggio = 0;
         double diametro = 0;
         double perimetro = 0;
         double area = 0;
        //COSTRUTTORE DI CLASSE CERCHIO AVENTE COME PARAMETRO
        // IL RAGGIO DI TIPO DOUBLE.
        public Cerchio(double r)
        {
            raggio = r;
          
        }
        public double diametro(double r )
        { 
          
            diametro = r*2;
            return diametro ;
        }
      
        public double perimetro(double r)
        {
          
            perimetro = (Math.PI * 2)* (r);
            return perimetro;
        }
            public double area(double r)
            {
                area = Math.PI * (r * r);
                return area;
              
            }

Java:
package costruttore;
import java.util.Scanner;
public class UsoCerchio {

    public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            double r1 = input.nextDouble();
            double r2 = input.nextDouble();
            Cerchio c1 = new Cerchio(r1);
            Cerchio c2 = new Cerchio(r2);
            System.out.println("Inserisci il raggio del primo cerchio:" + r1);
            c1.diametro(r1);
            c1.perimetro(r1);
            c1.area(r1);
            System.out.println("Il Diametro del primo cerchio e':" + c1.diametro);
            System.out.println("Il Perimetro del primo cerchio e':" + c1.perimetro);
            System.out.println("L'area del primo cerchio e':" + c1.area);
          
            System.out.println("Inserisci il raggio del secondo cerchio:" + r2);
            c2.diametro(r2);
            c2.perimetro(r2);
            c2.area(r2);
            System.out.println("Il Diametro del secondo cerchio e':" + c2.diametro);
            System.out.println("Il Perimetro del secondo cerchio e':" + c2.perimetro);
            System.out.println("L'area del secondo cerchio e':" + c2.area);
          
    }     

}
Non riesco a creare quel metodo in modo che possa anche usare con il nuovo oggetto gli altri metodi.
I metodi Get and Set ancora non li ho studiati.
 

fabio93

Utente Attivo
429
119
Hardware Utente
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
Hard Disk
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
Alimentatore
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Logitech G203
Sistema Operativo
Windows 10 Pro, Ubuntu 19.04
Era corretto come avevi scritto nel post precedente, mancava solo la somma dei raggi.
Ah e gli attributi (diametro, perimetro, ecc.) vanno dichiarati private.
 

MrLion

Nuovo Utente
49
4
Hardware Utente
CPU
AMD Vishera FX-8320
Dissipatore
Arctic Freezer 13 pro co
Scheda Madre
Asrock 990FX Extreme 3
Hard Disk
Segate Barracuda 1TB
RAM
Corsair 1600 Mhz 8 GB
Scheda Video
AMD r9 280x Vapor x Tri x
Alimentatore
Corsair VS650 W
Case
Coller Master HAF 922
Periferiche
Tastiera Drevo Calibur Switch RED/ Mouse Logitech g203
Sistema Operativo
W10/Ubuntu
avevo fatto cosi , pero' quando facevo
Java:
c3.Diametro()
dentro le parentesi voleva passato un parametro che era o r1 o r2 e non la somma dei raggi.
 

fabio93

Utente Attivo
429
119
Hardware Utente
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
Hard Disk
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
Alimentatore
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Logitech G203
Sistema Operativo
Windows 10 Pro, Ubuntu 19.04
avevo fatto cosi , pero' quando facevo
Java:
c3.Diametro()
dentro le parentesi voleva passato un parametro che era o r1 o r2 e non la somma dei raggi.
Dalla traccia che hai postato prima si capisce che il metodo diametro(), insieme a perimetro() e area(), non deve prendere nessun argomento in input. Deve semplicemente restituire il valore del diametro utilizzando l'attributo raggio per calcolarlo. Il raggio ce l'hai già, perché lo hai inizializzato nel costruttore, quindi non occorre passarlo come argomento.

Comunque è molto semplice: devi realizzare un metodo che prende in input un Cerchio c e restituisce un nuovo Cerchio avente per raggio la somma del raggio di c e quello del cerchio corrente.
Basta scrivere
Codice:
public Cerchio sommaRaggio(Cerchio c)  {
    return new Cerchio(raggio + c.raggio);
}
oppure
Codice:
public Cerchio sommaRaggio(Cerchio c)  {
    double nuovoRaggio = (this.diametro() + c.diametro()) / 2;
    return new Cerchio(nuovoRaggio);
}
Nel primo esempio ho utilizzato direttamente l'attributo raggio (anche se è privato lo posso fare perché sono all'interno della stessa classe), nel secondo invece ho ricavato il raggio dividendo per 2 il diametro ottenuto invocando l'omonimo metodo.
La keyword this indica che sto invocando il metodo su "questo" oggetto, cioè sull'oggetto corrente.

Hai fatto qualche errore nel main:
prima di tutto trovo strano che visualizzi il messaggio "Inserisci il raggio del primo cerchio" quando in realtà l'utente lo ha già inserito e hai già letto questo valore con lo Scanner; poi, i metodi area(), perimetro() e diametro(), come ho scritto sopra, non prendono argomenti in input. Devono semplicemente restituire un valore.
E quando stampi i valori nelle println devi chiamare i suddetti metodi, non accedere direttamente agli attributi della classe Cerchio che, ripeto, vanno dichiarati privati, in ossequio al principio dell'information hiding che è alla base dell'Object Oriented.
 

MrLion

Nuovo Utente
49
4
Hardware Utente
CPU
AMD Vishera FX-8320
Dissipatore
Arctic Freezer 13 pro co
Scheda Madre
Asrock 990FX Extreme 3
Hard Disk
Segate Barracuda 1TB
RAM
Corsair 1600 Mhz 8 GB
Scheda Video
AMD r9 280x Vapor x Tri x
Alimentatore
Corsair VS650 W
Case
Coller Master HAF 922
Periferiche
Tastiera Drevo Calibur Switch RED/ Mouse Logitech g203
Sistema Operativo
W10/Ubuntu
Grazie mille Fabio sono riuscito a fare sommare i raggi e a stamparli , non riesco a stampare diametro , perimetro e area di questo nuovo oggetto Cerchio , pribabilmente perche' ho forzato tutto il programma con il passaggio dei parametri anche quando stampavo i metodi.
infatti provando a fare
Codice:
c.diametro();
vuole come parametro uno dei due raggi dati in input.
Domani sistemo tutto il programma inizando a dichiare private gli attributi e scrivendo i metodi correttamente rispettando l-information hiding.
 

fabio93

Utente Attivo
429
119
Hardware Utente
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
Hard Disk
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
Alimentatore
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Logitech G203
Sistema Operativo
Windows 10 Pro, Ubuntu 19.04
Dimenticavo, è sufficiente/meglio che la classe Cerchio abbia solo l'attributo raggio, non anche diametro, area e perimetro. Sono inutili, perché questi valori si calcolano a partire dal raggio.
 

MrLion

Nuovo Utente
49
4
Hardware Utente
CPU
AMD Vishera FX-8320
Dissipatore
Arctic Freezer 13 pro co
Scheda Madre
Asrock 990FX Extreme 3
Hard Disk
Segate Barracuda 1TB
RAM
Corsair 1600 Mhz 8 GB
Scheda Video
AMD r9 280x Vapor x Tri x
Alimentatore
Corsair VS650 W
Case
Coller Master HAF 922
Periferiche
Tastiera Drevo Calibur Switch RED/ Mouse Logitech g203
Sistema Operativo
W10/Ubuntu
Si infatti ha senso solo l'attributo raggio , se hai altri consigli da darmi sono ben accetti :ok:.
Grazie ancora per l'aiuto.
 

Entra

oppure Accedi utilizzando