二次表达式类测试时无法读取数组数据,出现垃圾值求助
问题分析与修复方案
嘿,我一眼就揪出了导致你看到垃圾值的核心问题,还有几个逻辑错误也得一起修正,咱们一步步来:
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
相关产品推荐
相关产品推荐

