Java代码为三角区域返回0

时间:2014-09-22 16:29:59

标签: java geometry joptionpane

我正在介绍Java课程,我的任务是编写一个程序,它接收三角形的三个边并返回类型和区域。根据分配表,边必须是整数,因此它被证明是一种痛苦的测试,并提出整数比率以匹配每种类型。

无论如何,我遇到的真正问题有时它给了我正确的区域,有时它并没有。例如,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);
            }
        }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为变量 s 不能是整数类型

更改

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

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

答案 1 :(得分: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.

对于一堆比较,你可以通过先排序两侧来做得更好。除此之外,它看起来像是非常合理的代码。您可能会考虑将“读取输入和输出”部分与“执行计算”部分分开,以便您可以更轻松地调试和测试计算。