編譯報錯:void return type assumed,且 s=sqrt(p(p-l1)(p-l2)(p-l3)) 行報錯。
void/int/double 等)。main 函數缺少返回類型:標準寫法 int main()。p(p-l1) 被解析為函數調用,實為乘法應寫 p * (p - l1)。s、p、l1 等未聲明類型。#include <iostream>
#include <cmath> // sqrt 函數
using namespace std;
// 正確:顯式返回類型 double
double calculateTriangleArea(double l1, double l2, double l3) {
// 海倫公式:p = (a+b+c)/2, S = sqrt(p(p-a)(p-b)(p-c))
double p = (l1 + l2 + l3) / 2.0;
double s = sqrt(p * (p - l1) * (p - l2) * (p - l3)); // 關鍵:加上 * 號
return s;
}
int main() { // 正確:int main()
double l1, l2, l3;
cout << "請輸入三角形三邊長: ";
cin >> l1 >> l2 >> l3;
// 三角形不等式判斷
if (l1 + l2 <= l3 || l1 + l3 <= l2 || l2 + l3 <= l1) {
cout << "無法構成三角形!" << endl;
return 1;
}
double area = calculateTriangleArea(l1, l2, l3);
cout << "所構成的三角形面積為:" << area << endl;
return 0;
}
| 錯誤代碼 | 問題 | 修正代碼 |
|---|---|---|
main() | 缺少返回類型 | int main() |
s=sqrt(p(p-l1)(p-l2)(p-l3)) | 缺少乘法運算符,p 被誤認為函數 | double p = ...; double s = sqrt(p * (p-l1) * (p-l2) * (p-l3)); |
| 無變量聲明 | C++ 強類型,必須聲明 | double l1, l2, l3, p, s; |
| 函數無返回類型 | 隱式 int 已廢棄 | double funcName(...) |
p(p-a)(p-b)(p-c) 可能因浮點誤差導致負數,建議 max(0.0, ...)。double,避免 float 精度不足。#include <cmath>
#include <limits>
double triangleAreaRobust(double a, double b, double c) {
// 邊長非負
if (a <= 0 || b <= 0 || c <= 0) return 0.0;
// 三角形不等式
if (a + b <= c || a + c <= b || b + c <= a) return 0.0;
double p = (a + b + c) * 0.5;
double areaSquared = p * (p - a) * (p - b) * (p - c);
// 浮點誤差修正
if (areaSquared < 0 && areaSquared > -std::numeric_limits<double>::epsilon()) {
areaSquared = 0;
}
if (areaSquared < 0) return 0.0; // 理論上不應發生
return std::sqrt(areaSquared);
}
核心錯誤在於 C++ 強制要求函數返回類型 及 數學表達式必須顯式寫出乘法符號 *。修正後代碼符合 C++11/14/17 標準,包含輸入驗證、數值穩定性處理,可直接編譯運行。