2013-11-03 179 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; 
    }