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

二次表达式类测试时无法读取数组数据,出现垃圾值求助

问题分析与修复方案

嘿,我一眼就揪出了导致你看到垃圾值的核心问题,还有几个逻辑错误也得一起修正,咱们一步步来:

1. 构造函数的致命bug:根本没初始化成员变量

你的带参数构造函数里,a = a;这种写法完全是无效操作——因为形参a的优先级比类成员变量a高,这句代码只是把形参a赋值给它自己,类里的a、b、c还是未初始化的垃圾值!

修复方法(二选一):

  • 用this指针明确指向成员变量:
quadraticExpression::quadraticExpression(double a, double b, double c) {
    this->a = a;
    this->b = b;
    this->c = c;
}
  • 给形参换个名字,避免和成员变量冲突:
quadraticExpression::quadraticExpression(double a_val, double b_val, double c_val) {
    a = a_val;
    b = b_val;
    c = c_val;
}

另外,这个构造函数加inline没意义(定义在类外部),建议去掉。

2. 求根函数逻辑完全颠倒:返回的不是根而是y值

你现在的getFirstRoot()和getSecondRoot(),计算出x后又代入表达式返回了y值,这完全搞反了!根是满足ax²+bx+c=0的x值,不是代入后的结果。而且你误用了abs(b),正确的求根公式是(-b ± sqrt(b²-4ac))/(2a)。

修正后的求根函数(含异常处理):

double quadraticExpression::getFirstRoot() const {
    if (a == 0) {
        if (b != 0) {
            // 一次函数:0x²+bx+c=0,根为 -c/b
            return -c / b;
        }
        throw domain_error("No unique root (infinite or no roots)");
    }
    double discriminant = b*b - 4*a*c;
    if (discriminant < 0) {
        throw domain_error("No real roots");
    }
    return (-b + sqrt(discriminant)) / (2*a);
}

double quadraticExpression::getSecondRoot() const {
    if (a == 0) {
        throw domain_error("Only one root (linear expression) or no roots");
    }
    double discriminant = b*b - 4*a*c;
    if (discriminant < 0) {
        throw domain_error("No real roots");
    }
    return (-b - sqrt(discriminant)) / (2*a);
}

3. getNumberOfRoots()逻辑错误:基于错误值判断

原来的判断完全依赖错误的返回值(y值),正确的逻辑应该根据系数和判别式来判断:

int quadraticExpression::getNumberOfRoots() const {
    if (a == 0 && b == 0) {
        if (c == 0) {
            // 0x²+0x+0=0,所有x都是解
            return INFINITE_ROOTS;
        } else {
            // 0x²+0x+c=0,c≠0,无解
            return NO_ROOTS;
        }
    }
    if (a == 0) {
        // 一次函数,有且仅有一个根
        return ONE_ROOT;
    }
    double discriminant = b*b - 4*a*c;
    // 处理浮点数精度问题,用极小值判断是否为0
    if (discriminant > 1e-9) {
        return TWO_ROOTS;
    } else if (fabs(discriminant) <= 1e-9) {
        return ONE_ROOT;
    } else {
        return NO_ROOTS;
    }
}

4. 其他小优化

  • evaluate函数可以简化成一行:return a*x*x + b*x + c;
  • 判断浮点数是否相等时,建议用fabs(val) < 1e-9替代直接==,避免精度误差导致的错误判断。

把这些修改完成后,你的测试代码就能正确读取a、b、c的值,并且准确计算函数值和根的情况了。

内容的提问来源于stack exchange,提问作者victiminvesta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:47:06