輸入三角形三邊長 x, y, z,程式需完成以下任務:
正確條件為 三組兩邊之和均大於第三邊:
if (x + y > z && x + z > y && y + z > x) // 原代碼誤用 ||,此處已修正
注意:原始碼中使用 || 會導致判定錯誤(如 1,2,3 會被誤判為合法),實際應用務必改為 &&。
p = x + y + zs = p/2; area = sqrt(s*(s-x)*(s-y)*(s-z))| 類型 | 判定條件 | 備註 |
|---|---|---|
| 直角三角形 | x²+y²==z² || x²+z²==y² || y²+z²==x² | 浮點數比較建議引入誤差範圍 fabs(a-b) < 1e-6 |
| 等腰三角形 | 恰好兩邊相等(排除等邊) | 原代碼邏輯正確:(x==y || x==z || y==z) && !(x==y && y==z) |
| 等邊三角形 | x==y && y==z | 同時滿足等腰條件,但通常單獨分類 |
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
float perimeter(float x, float y, float z);
float area(float x, float y, float z);
int is_triangle(float x, float y, float z);
int is_right(float x, float y, float z);
int is_isosceles(float x, float y, float z);
int is_equilateral(float x, float y, float z);
int main() {
float x, y, z;
printf("Enter three side lengths: ");
if (scanf("%f %f %f", &x, &y, &z) != 3) return 1;
if (is_triangle(x, y, z)) {
printf("Perimeter: %.2f\nArea: %.2f\n", perimeter(x, y, z), area(x, y, z));
printf(is_right(x, y, z) ? "Right triangle!\n" : "Not a right triangle.\n");
printf(is_isosceles(x, y, z) ? "Isosceles triangle!\n" : "Not isosceles.\n");
printf(is_equilateral(x, y, z) ? "Equilateral triangle!\n" : "Not equilateral.\n");
} else {
printf("Cannot form a triangle!\n");
}
system("pause");
return 0;
}
float perimeter(float x, float y, float z) { return x + y + z; }
float area(float x, float y, float z) {
float s = perimeter(x, y, z) / 2.0;
return sqrt(s * (s - x) * (s - y) * (s - z));
}
int is_triangle(float x, float y, float z) {
return (x + y > z) && (x + z > y) && (y + z > x) && x > 0 && y > 0 && z > 0;
}
int is_right(float x, float y, float z) {
float xx = x*x, yy = y*y, zz = z*z;
return (fabs(xx + yy - zz) < 1e-6) || (fabs(xx + zz - yy) < 1e-6) || (fabs(yy + zz - xx) < 1e-6);
}
int is_isosceles(float x, float y, float z) {
return (fabs(x - y) < 1e-6 || fabs(x - z) < 1e-6 || fabs(y - z) < 1e-6) && !is_equilateral(x, y, z);
}
int is_equilateral(float x, float y, float z) {
return fabs(x - y) < 1e-6 && fabs(y - z) < 1e-6;
}
|| 改為 &&,並增加邊長大於 0 檢查。1e-6 閾值避免精度問題導致誤判。is_ 前綴表達布林語義,提升可讀性。scanf 返回值,防止非數字輸入導致未定義行為。