我正在介绍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);
}
}
}
}
}
答案 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.
对于一堆比较,你可以通过先排序两侧来做得更好。除此之外,它看起来像是非常合理的代码。您可能会考虑将“读取输入和输出”部分与“执行计算”部分分开,以便您可以更轻松地调试和测试计算。