我正在编写一个程序,在这个程序中,你要求用户输入三个数字,并告诉用户他们输入的数字是否可以是三角形,以及是哪种三角形.&



我编写了一个程序,要求用户输入三个数字,然后告诉用户他们输入的数字是否可以构成一个三角形,以及这个三角形是什么样的。他们输入的每个数字代表三角形的一条边。我让它通过了所有的测试用例,除了我输入的使三角形成为不等边三角形的边。else语句,应该是识别不等边三角形没有输出,我不知道为什么。

public static void main(String[] args) {
System.out.println("Hello, my name is Christian");
System.out.println("In this program you will enter three whole numbers andnI will tell you if the numbers you entered equal a triange.");


Scanner scan = new Scanner(System.in);
System.out.println("Please enter your first whole number:");
int sideA = Integer.parseInt(scan.nextLine());


System.out.println("Please enter your second whole number:");
int sideB = Integer.parseInt(scan.nextLine());


System.out.println("Please enter your third whole number:");
int sideC = Integer.parseInt(scan.nextLine());

// This if statement pulls in any combination of integers for evaluation. 
if (((sideA + sideB) > sideC)||((sideB + sideA) > sideA)||((sideA + sideC) > sideB)){

if (sideA == sideB && sideA == sideC) {
System.out.println("That is an equilateral triangle.");
} 
//this statement identifies any combination of integers that are not triangles.
if (((sideA + sideB) <= sideC)||((sideB + sideA) <= sideA)||((sideA + sideC) <= sideB)) {
System.out.println("That is not a valid triangle.");
}

if (sideA == sideB && (sideA + sideB) > sideC) {
System.out.println("That is an isosceles triangle.");
}

if (sideB == sideC && (sideB + sideC) > sideA) {
System.out.println("That is an isosceles triangle.");
}

if (sideC == sideA && (sideC + sideA) > sideB) {
System.out.println("That is an isosceles triangle.");

}

} else {
System.out.println("That is a scalene triangle.");
}
}

}

您基本上需要以下结构(伪代码):

if (is valid) {
if (is equilateral) {
print equilateral;
} else if (is isosceles) {
print isosceles;
} else {
print scalene;
}
} else {
print not valid;
}

或者稍微改变一下——这是我更喜欢的,因为它的结构更好地表明只有一个输出被选择:

if (is not valid) {
print not valid;
} else if (is equilateral) {
print equilateral;
} else if (is isosceles) {
print isosceles;
} else {
print scalene;
}

第一个if语句几乎总是正确的,而且很可能大多数情况至少满足其中一个条件。例如,"(sideB + sideA) <= sideA"对于任意两个非负数都是正确的,因此输入任意非负整数的边a和边b将导致第一个if语句是正确的,因此不进入else语句。

更好的方法是这样写(我使用"else if"如果只需要一行输出),我还添加了一个检查以确保整数是正的:

// this statement identifies any combination of integers that are not triangles.
if (((sideA + sideB) <= sideC) || ((sideB + sideC) <= sideA) || ((sideA + sideC) <= sideB) || sideA <=0 || sideB <=0 || sideC <=0) {
System.out.println("That is not a valid triangle.");
}
// this statement identifies any combination of integers that are equilateral triangles.
else if (sideA == sideB && sideA == sideC) {
System.out.println("That is an equilateral triangle.");
}
// this statement identifies any combination of integers that are isosceles triangles.
else if (sideA == sideB || sideB == sideC || sideA == sideC) {
System.out.println("That is an isosceles triangle.");
}
// this catches any scalene triangles.
else{
System.out.println("That is a scalene triangle.");
}

没有输出,因为外部if语句是错误的。首先,你不需要那么多括号——如果你删除它们,你可能会发现一个错误,尽管我不确定你在这里想检查什么:

if (sideA + sideB > sideC || sideB + sideA > sideA || sideA + sideC > sideB)

我想你在这里(在条件的第二部分)想写的是B + C>A,如果你想验证参数,你需要and而不是OR(因此内部的"这不是一个有效的三角形");语句将是多余的):

if (sideA + sideB > sideC && sideB + sideC > sideA && sideA + sideC > sideB)

然后我还建议在其中使用if-else if-else,因为在当前状态下,程序计算所有if语句,尽管找到了答案。

不等边三角形将是最后一个"else";块,而外部的else块(现在包含不等腰三角形输出)将是"无效三角形",类似于这样(您也可以将三个等腰语句合并为一个):

if (sideA + sideB > sideC && sideB + sideC > sideA && sideA + sideC > sideB) {
if (sideA == sideB && sideA == sideC) {
System.out.println("That is an equilateral triangle.");
} else if (
sideA == sideB && (sideA + sideB) > sideC
|| sideB == sideC && (sideB + sideC) > sideA
|| sideC == sideA && (sideC + sideA) > sideB
) {
System.out.println("That is an isosceles triangle.");
} else {
System.out.println("That is a scalene triangle.");
}
} else {
System.out.println("That is not a valid triangle.");
}

这是一种方法。

int[][] data = { { 1, 2, 3 }, { 1, 2, 8 }, { 8, 8, 8 },
{ 4, 8, 4 }, { 4, 5, 7 }, {7,7,8}, { 5, 3, -2 } };
for (int[] sides : data) {
System.out.printf("%s : %s%n", Arrays.toString(sides),
analyze(sides[0], sides[1], sides[2]));
}

打印

[1, 2, 3] : Is not a valid triangle.
[1, 2, 8] : Is not a valid triangle.
[8, 8, 8] : Is a equilateral triangle.
[4, 8, 4] : Is not a valid triangle.
[4, 5, 7] : Is a scalene triangle.
[7, 7, 8] : Is an isoceles triangle.
[5, 3, -2] : Is not a valid triangle.

  • 首先消除无效三角形。
  • 无效三角形是
    • 单侧或多侧<= 0
    • 任意边>=其他两个的和(捕获第一个标准)
  • 其余的是合法的,并通过标准测试进行评估。秩序很重要!
    • 第一次检查等边-所有边长度相等
    • 然后等腰-两条边等长
    • 默认为scalene。-没有等长边

public static String analyze(int a, int b, int c) {
if (a >= b + c || b >= a + c || c >= a + b){
return "Is not a valid triangle.";
}
if (a == b && b == c) {
return "Is a equilateral triangle.";
}

if (a == b || b == c || a == c) {
return "Is an isoceles triangle.";
}
return "Is a scalene triangle.";
}