修復原代碼的頭文件缺失、格式字符串錯誤、邏輯順序錯誤、語法錯誤、float/double 精度警告等問題。
#include <stdio.h>
#include <math.h>
int main(void) {
double a, b, c, s, area;
printf("請輸入三角形三邊長 (空格分隔): ");
if (scanf("%lf %lf %lf", &a, &b, &c) != 3) {
fprintf(stderr, "輸入格式錯誤\n");
return 1;
}
// 先驗證能否構成三角形
if (a + b > c && a + c > b && b + c > a) {
s = (a + b + c) / 2.0;
area = sqrt(s * (s - a) * (s - b) * (s - c));
printf("三角形面積 = %.4f\n", area);
} else {
printf("無法構成三角形:任意兩邊之和必須大於第三邊\n");
}
return 0;
}
$ gcc -std=c99 -Wall -Wextra -o triangle triangle.c
$ ./triangle
請輸入三角形三邊長 (空格分隔): 3 4 5
三角形面積 = 6.0000
$ ./triangle
請輸入三角形三邊長 (空格分隔): 3 3 7
無法構成三角形:任意兩邊之和必須大於第三邊
| 問題 | 修正 | 原因 |
|---|---|---|
| 頭文件 | `#include | 標準庫函數需聲明 |
| scanf 格式 | `"%lf %lf %lf"` | 匹配空白分隔,`%lf` 讀 double |
| 驗證先行 | 判斷在 sqrt 前 | 避免 sqrt(負數) 域錯誤 |
| 邏輯運算符 | `&&` 替換 `||` | 三條件必須同時成立 |
| 類型一致 | 全用 `double` | 消除精度損失警告,精度更高 |
| 語法完整 | `else` 後無分號 | C 語法規則 |