三角形面积计算需据已知条件选择公式:底×高÷2适用于已知垂直高,海伦公式适用于三边长;务必校验输入合法性、类型转换及边界条件。
0.5 * base * height 计算最可靠只要已知底边长度和对应高,C++ 里不需要调用任何特殊函数。浮点运算即可,注意类型匹配避免整数截断:
base 和 height 是 int,写成 0.5 * base * height 会先做整数乘法再转浮点,没问题;但写成 1/2 * base * height 就错——1/2 是整数除法,结果为 0
double 类型变量存储输入,或强制转成 double:static_cast(base) * height * 0.5
std::sqrt 必须包含 )当只有三条边 a、b、c 时,不能直接套底×高÷2,必须先验证能否构成三角形,再算半周长和面积:
double a = 3.0, b = 4.0, c = 5.0;
if (a + b <= c || a + c <= b || b + c <= a) {
// 不构成三角形
}
double s = (a + b + c) / 2.0;
double area = std::sqrt(s * (s - a) * (s - b) * (s - c));std::sqrt 在 中,漏包含会编译失败 而不是 ,因为等号情形是退化三角形(面积为 0),通常也要排除
int,计算 s * (s - a) * ... 前务必确保至少一个是 double,否则中间结果可能溢出或精度丢失
std::abs 或向量叉积来“强行通用”有人想用二维坐标点 A、B、C 算面积,然后套叉积公式 0.5 * abs((B.x - A.x)*(C.y - A.y) - (C.x - A.x)*(B.y - A.y))。这本身没错,但要注意:
std::abs 对 double 需要 ,对 int 是 ,混用会报错0.5 后应存为 double,否则隐式截断实际写程序时,用户输负数、零、非数字,std::cin >> x 失败后流状态未清,会导致后续读取全乱。必须处理:
if (!(std::cin >> base)) { std::cin.clear(); std::cin.ignore(10000, '\n'); /* 错误处理 */ }
s - a 等任一项为负,std::sqrt 会返回 NaN,但不会报异常,得靠 std::isnan(area) 主动检查三角形面积看似简单,真正卡住人的永远不是公式,而是输入合法性、类型转换细节和边界条件判断。