如何在bool函数内的if语句为真时执行指定代码(三角形判断场景)
问题解决:正确判断三角形成立并执行后续逻辑
原始代码问题分析
你的代码核心错误是没有调用isTriangle函数并判断它的返回值,反而错误地判断了函数指针的地址(&isTriangle永远为真,因为函数地址非空),导致无论输入是否合法都会执行后续代码。另外还有几个小问题:
per变量未定义,需要手动计算三边之和- 三角形类型判断逻辑有重叠(比如等边三角形同时也是等腰,需要调整判断顺序)
- 缺少必要的头文件(比如
#include <iostream>)
修正后的代码
#include <iostream> #include <cmath> #include <algorithm> // 用于min/max函数 using namespace std; bool isTriangle(double sideA, double sideB, double sideC) { // 补充:边长必须大于0的合法性检查 if (sideA <= 0 || sideB <= 0 || sideC <= 0) { return false; } return (sideA + sideB > sideC && sideA + sideC > sideB && sideB + sideC > sideA); } bool isEquilateral(double sideA, double sideB, double sideC) { bool equi = (sideA == sideB && sideB == sideC); if (equi) { cout << " equilateral triangle."; } return equi; } bool isIsosceles(double sideA, double sideB, double sideC) { bool iso = (sideA == sideB || sideA == sideC || sideB == sideC); if (iso && !isEquilateral(sideA, sideB, sideC)) { cout << " isosceles triangle."; } return iso; } bool isRight(double sideA, double sideB, double sideC) { // 排序后确定斜边,避免浮点计算误差 double sides[3] = {sideA, sideB, sideC}; sort(sides, sides + 3); // 用平方比较,加入浮点精度容差 bool right = (fabs(sides[0]*sides[0] + sides[1]*sides[1] - sides[2]*sides[2]) < 1e-6); if (right) { cout << " and right-angled"; } return right; } int main() { double sideA, sideB, sideC; cout << "Enter the lengths of the three sides of a triangle -- "; cin >> sideA >> sideB >> sideC; // 核心修正:调用isTriangle函数并判断返回值 if (isTriangle(sideA, sideB, sideC)) { double per = sideA + sideB + sideC; cout << "This is a"; // 按优先级判断三角形类型:等边→等腰→不等边 bool equiFlag = isEquilateral(sideA, sideB, sideC); if (!equiFlag) { bool isoFlag = isIsosceles(sideA, sideB, sideC); if (!isoFlag) { cout << " scalene"; isRight(sideA, sideB, sideC); cout << " triangle."; } } else { isRight(sideA, sideB, sideC); } cout << "\nIts perimeter is " << per << endl; } else { cout << "This is not a triangle" << endl; } return 0; }
关键修正说明
- 正确调用判断函数:用
isTriangle(sideA, sideB, sideC)获取返回值,替代原本无效的函数指针判断 - 补充边长合法性检查:三角形边长必须大于0,否则直接判定为非三角形
- 修复周长变量:在
main中定义并计算周长per,避免未定义错误 - 调整类型判断顺序:先判断等边(特殊等腰),再判断普通等腰,最后判断不等边,避免重复输出冲突
- 优化直角三角形判断:通过排序确定斜边,用浮点精度容差解决浮点计算的精度误差问题
内容的提问来源于stack exchange,提问作者confusedPro
相关产品推荐
相关产品推荐

