You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:35:36