2013-11-03 96 views
1

我需要编写一个程序来计算圆的面积,除了当我运行程序并输入面积计算值为零时,我似乎已经拥有了一切。在Java中计算圆的面积

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; 
    } 
} 

我需要改变什么,以便当我的测试代码调用toString时,它会输出一个计算区域?

+0

你打电话'setArea'?你的设计是错误的。 –

+0

我没有看到任何获取输入的部分将它提供给'Circle'实例。我们也需要看到它。 – Jack

+0

http://pastebin.com/RYUFY7AQ –

回答

3

您应该有一个基于当前半径的方法计算区域。不应该设置区域。

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(); 
    } 
} 

如果您确实希望将区域存储在变量中,则应在设置半径时更新它。它不应该从“setArea”独立设置。否则,你很容易出现不一致。此外,还有Josh Bloch的“有效的Java”的说明。虽然你的toString应该利用这个“计算区域”而不是复制计算,但你不应该在公共API中调用任何东西。例如,如果您取消getArea,这意味着它的行为与Circle.toString所期望的不同。这就是为什么我把私人的“calculateArea”放在那里。

-2

您最初将area设置为0.您创建了一个方法来更改该方法,但从未调用该方法。所以打电话吧。更改此:

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

这样:

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

这甚至不会编译。修改toString()方法中的对象状态是没有意义的。 –

+0

@JBNizet是的,我读的方法错了。我以为'setArea(area)'返回一个字符串。我更新了我的答案。我不想修改他的班级,这在大多数情况下是毫无意义的;我只是想解决他所说的问题。 –

0

radius,而不是areasetArea方法:

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

完整代码 - http://pastebin.com/jggRrUFd

0

这是我的版本Circle_Math类,带有条目验证和最少数量的行/操作和内存空间来完成工作。如果你愿意,请留下评论。

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

欢迎来到StackOverflow!你能否改善你的代码格式?阅读更多在http://stackoverflow.com/editing-help – ericbn

+0

罗杰那:)谢谢你的建议。 –

0
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
public static double getAreaOfCircle(int radius){ 
     return Math.PI*radius*radius; 
    }