Calcul de l'aire d'un cercle en Java


J'ai besoin d'écrire un programme pour calculer l'aire d'un cercle et il me semble que tout va bien sauf lorsque j'exécute le programme et que j'entre les valeurs, le calcul de la surface apparaît comme zéro.

public class Circle {

    private double radius;
    private double area;

    public Circle() {
        radius = 0;
        area = 0;
    }

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public double getArea() {
        return area;
    }

    public void setArea(double area) {
        area = radius * radius * Math.PI;
    }

    public String toString() {
        return "The radius of the circle is: " + radius + ", and the area is: " + area;
    }
}

Que dois-je changer pour que lorsque mon code de test appelle le toString, il génère une zone calculée?

Author: Paul Kappock, 2013-11-03

6 answers

Vous devriez avoir une méthode calculer l'aire en fonction du rayon actuel. La zone ne doit pas être définie.

public class Circle {
    private double radius;

    public Circle() {
        radius = 0;
    }

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public double getArea() {
        return calculateArea();
    }

    private double calculateArea() {
        return radius * radius * Math.PI;
    }

    public String toString() {
        return "The radius of the circle is: " + radius + ", and the area is: "
                + calculateArea();
    }
}

Si vous souhaitez stocker area dans une variable, vous devez la mettre à jour lorsque vous définissez le rayon. Il ne devrait pas être défini indépendamment de "setArea". Sinon, vous êtes vulnérable à l'incohérence. Aussi, une note de Josh Bloch "Java efficace". Bien que votre toString devrait tirer parti de cette "zone calculée" plutôt que de répliquer le calcul, vous ne devriez pas avoir toString appelez n'importe quoi dans votre API publique. Ce serait un problème si, par exemple, vous outrepassiez getArea, ce qui signifierait qu'il se comporterait différemment de votre cercle.toString attend. C'est pourquoi j'ai mis le "calculateArea" privé là-dedans.

 3
Author: sdanzig, 2015-05-19 18:20:58

Passer radius au lieu de area dans la méthode setArea:

public void setArea( double radius )  
{
    area = (radius)*(radius)*Math.PI;
}   

Pour le code complet- http://pastebin.com/jggRrUFd

 0
Author: satya, 2013-11-03 19:35:26

Ceci est ma version de la classe Circle_Math, avec la validation d'entrée et avec le nombre minimum de lignes / opérations et d'espace mémoire pour faire le travail. Veuillez laisser un commentaire si vous le souhaitez.

public class circle {
    static double rad;

    public circle() {
        rad = 0;
    }

    public static void setRad() {
        Scanner sc = new Scanner(System.in);

        do {
            while (!sc.hasNextDouble()) {
                sc.next();// this code is to skip the exception created 
            }
            rad = sc.nextDouble();
        } while (rad < 0);

        System.out.println("radius value is:" + rad);

    }

    public static double getCirclearea() {
        return rad * rad * Math.PI;
    }

    public static double getCircumference() {
        return 2 * Math.PI * rad;
    }

}
 0
Author: Hayan S Kh, 2015-05-19 20:23:22
import java.util.Scanner;
public class Circle {
    // variable PI is readable only;
    // constant value
    public static final double PI = 3.14;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);

        System.out.print("Enter raduis: ");
        double raduis = input.nextDouble();

        double area = PI * raduis * raduis;
        System.out.print("Circle area = " + area);

    }

}
 0
Author: Fadi, 2016-02-08 07:26:47
public static double getAreaOfCircle(int radius){
        return Math.PI*radius*radius;
    }
 0
Author: Neeraj Gahlawat, 2017-02-16 05:34:43

Vous avez initialement défini le area sur 0. Vous avez créé une méthode pour changer cela, mais ne l'avez jamais appelée. Donc l'appeler. Changer ceci:

public String toString() {
    return "The radius of the circle is: " + radius + ", and the area is: " + area;
}

À ceci:

public String toString() {
    setArea(area); // change the value of the area
    return "The radius of the circle is: " + radius + ", and the area is: " + area;
}
 -2
Author: Michael Yaworski, 2013-11-03 19:04:20