2014-09-22 41 views
0

我正在介紹Java課程,我的任務是編寫一個程序,該程序需要在三角形的三邊並返回類型以及區域。雙方必須根據作業單是整數,所以它被證明是一個痛苦的測試它,並提出整數比率來匹配每種類型。Java代碼爲三角形區域返回0

無論如何,我遇到的真正問題是它有時會給我正確的區域,有時它不會。例如6/8/10返回面積爲0.

任何想法/一般提示,以改善源?到目前爲止,我看起來像意大利麪條,但我有點受限,因爲我只允許使用我們到目前爲止所講的內容。

package trianglesides; 
import javax.swing.*; 
/* 
This program will receive three numbers from a user describing the lengths of 
the sides of a triangle. It will return and display the type of triangle and 
the area. 
*/ 
public class triangle_Sides { 
    public static void main(String[] args) { 
     int side1 = Integer.parseInt(JOptionPane.showInputDialog 
      ("Enter the integer length of side 1")); 
     int side2 = Integer.parseInt(JOptionPane.showInputDialog 
      ("Enter the integer length of side 2")); 
     int side3 = Integer.parseInt(JOptionPane.showInputDialog 
      ("Enter the integer length of side 3")); 
     int s = (side1 + side2 + side3)/2; 
     double area = Math.sqrt(s*(s-side1)*(s-side2)*(s-side3)); 
     if (side1 >= (side2 + side3) || 
      side2 >= (side1 + side3) || 
      side3 >= (side1 + side2)) { 
      JOptionPane.showMessageDialog(null, "That's no triangle."); 
     } 
     else { 
/*Equilateral*/ 
     if ((side1 == side2) && (side2 == side3)) { 
      JOptionPane.showMessageDialog(null, "This is an equilateral triangle with an area of " + area); 
     } 
/*Right and isosceles*/ 
     else if ((side1*side1) == ((side2*side2) + (side3*side3)) || 
       (side2*side2) == ((side1*side1) + (side3*side3)) || 
       (side3*side3) == ((side2*side2) + (side1*side1))) { 
      if (side1 == side2 || 
       side2 == side3 || 
       side3 == side1){ 
       JOptionPane.showMessageDialog(null, "This is right and isosceles triangle with an area of " + area); 
      } 
      else { 
       JOptionPane.showMessageDialog(null, "This is a right triangle with an area of " + area); 
      } 
     } 
/*Obtuse and isosceles*/ 
     else if ((side1*side1) > ((side2*side2) + (side3*side3)) || 
       (side2*side2) > ((side1*side1) + (side3*side3)) || 
       (side3*side3) > ((side2*side2) + (side1*side1))) { 
      if (side1 == side2 || 
       side2 == side3 || 
       side3 == side1){ 
       JOptionPane.showMessageDialog(null, "This is obtuse and isosceles triangle with an area of " + area); 
      } 
      else { 
       JOptionPane.showMessageDialog(null, "This is an obtuse triangle with an area of " + area); 
      } 
     } 
/*Acute and isosceles*/ 
     else if ((side1*side1) < ((side2*side2) + (side3*side3)) || 
       (side2*side2) < ((side1*side1) + (side3*side3)) || 
       (side3*side3) < ((side2*side2) + (side1*side1))) { 
      if (side1 == side2 || 
       side2 == side3 || 
       side3 == side1){ 
       JOptionPane.showMessageDialog(null, "This is acute and isosceles triangle with an area of " + area); 
      } 
      else { 
       JOptionPane.showMessageDialog(null, "This is an acute triangle with an area of " + area); 
      } 
     } 
     } 
    } 
} 

回答

1

發生這種情況,因爲變量小號不能是整數類型

變化

int s = (side1 + side2 + side3)/2; 

double s = (side1 + side2 + side3)/2.0; 
+0

對不起,但我不能讓你 – Nabin 2014-09-22 16:46:59

+0

不錯。謝謝,那對我來說很愚蠢。 – hunsbct 2014-09-23 16:12:14

+0

@ user3491551如果答案爲 – Nabin 2014-09-23 16:12:57

1
int s = (side1 + side2 + side3)/2; 

整數的舍入將ロ並減半。這不是你想要的。除以2.0並將結果代入double

Math.sqrt(s*(s-side1)*(s-side2)*(s-side3)) 

你正在做整數運算這個產品,它將環繞而不是失去精度。這不是你想要的。此外,這是famously not the expression of Heron's formula you want on computers.

對於一堆比較,你可以做得更好,首先按順序排序邊。除此之外,它對我來說看起來很合理。您可能會考慮將「讀取輸入和輸出」部分與「執行計算」部分分開,以便您可以更輕鬆地調試和測試計算。

+0

,可以勾選標記,謝謝! – hunsbct 2014-09-23 16:12:47