用Java计算圆的面积
我需要写一个程序来计算一个圆的面积,我似乎什么都做对了,除了当我运行程序并输入数值时,面积计算结果为零用Java计算圆的面积,java,constructor,geometry,Java,Constructor,Geometry,我需要写一个程序来计算一个圆的面积,我似乎什么都做对了,除了当我运行程序并输入数值时,面积计算结果为零 public class Circle { private double radius; private double area; public Circle() { radius = 0; area = 0; } public Circle(double radius) { this.radius
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时,它将输出一个计算面积?您应该有一个基于当前半径计算面积的方法。不应设置区域
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();
}
}
如果确实希望将面积存储在变量中,则应在设置半径时对其进行更新。它不应该独立于“设置区域”设置。否则,您很容易受到不一致性的影响。此外,还有Josh Bloch的“高效Java”中的一个注释。虽然您的toString应该利用这个“计算区域”,而不是复制计算,但您不应该在公共API中调用任何toString。例如,如果您对getArea进行了重写,这将是一个问题,这意味着它的行为将与Circle.toString所期望的不同。这就是为什么我把私有的“calculateArea”放在那里。你应该有一个基于当前半径计算面积的方法。不应设置区域
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();
}
}
如果确实希望将面积存储在变量中,则应在设置半径时对其进行更新。它不应该独立于“设置区域”设置。否则,您很容易受到不一致性的影响。此外,还有Josh Bloch的“高效Java”中的一个注释。虽然您的toString应该利用这个“计算区域”,而不是复制计算,但您不应该在公共API中调用任何toString。例如,如果您对getArea进行了重写,这将是一个问题,这意味着它的行为将与Circle.toString所期望的不同。这就是为什么我将私有的“calculateArea”放在那里。您最初将
区域设置为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;
}
您最初将区域设置为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;
}
通过半径
而不是设置区域
方法中的区域
:
public void setArea( double radius )
{
area = (radius)*(radius)*Math.PI;
}
对于完整代码-在设置区域
方法中通过半径
而不是区域
:
public void setArea( double radius )
{
area = (radius)*(radius)*Math.PI;
}
对于完整的代码-这是我的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;
}
}
公共类圈子{
静态双rad;
公众圈(){
rad=0;
}
公共静态void setRad(){
扫描仪sc=新的扫描仪(System.in);
做{
而(!sc.hastNextDouble()){
sc.next();//此代码将跳过创建的异常
}
rad=sc.nextDouble();
}而rad<0;
System.out.println(“半径值为:“+rad”);
}
公共静态双getCirclearea(){
返回rad*rad*Math.PI;
}
公共静态双GetPercentration(){
返回2*Math.PI*rad;
}
}
这是我的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;
}
}
公共类圈子{
静态双rad;
公众圈(){
rad=0;
}
公共静态void setRad(){
扫描仪sc=新的扫描仪(System.in);
做{
而(!sc.hastNextDouble()){
sc.next();//此代码将跳过创建的异常
}
rad=sc.nextDouble();
}而rad<0;
System.out.println(“半径值为:“+rad”);
}
公共静态双getCirclearea(){
返回rad*rad*Math.PI;
}
公共静态双GetPercentration(){
返回2*Math.PI*rad;
}
}
你有没有打电话给设置区域
?您的设计是错误的。我没有看到任何获取输入以将其馈送到循环
实例的部件。我们也需要查看它。您的setArea
方法没有设置classarea
变量。使用this.area=…
,否则将覆盖输入参数。面积和半径应相互关联。如果将面积设置为给定值,则还应设置半径。如果你设置了半径,它也应该设置面积。否则,您将有一个半径为1、面积为10000的圆,而您的圆将不再是圆。您是否调用了setArea
?您的设计是错误的。我没有看到任何获取输入以将其馈送到循环
实例的部件。我们也需要查看它。您的setArea
方法没有设置classarea
变量。使用this.area=…
,否则将覆盖输入参数。面积和半径应相互关联。如果将面积设置为给定值,则还应设置半径。如果你设置了半径,它也应该设置面积。否则,你会有一个半径为1、面积为10000的圆,你的圆就不再是圆了,这甚至不会编译。在toString()方法中修改对象的状态是没有意义的。@JBNizet是的,我读错了方法。我想setArea(area)
返回了一个字符串。我更新了我的答案。我不想修改他的课程,这在很大程度上是没有意义的;我只是想解决他所说的问题,那根本不可能。在toString()方法中修改对象的状态是没有意义的。@JBNizet是的,我读错了方法。我想setArea(area)
返回了一个字符串。我更新了我的答案。我不想修改他的课程,这在很大程度上是没有意义的;我只是想解决他说的问题。欢迎来到StackOverflow!你能改进你的代码格式吗?