C++除法答题程序错误排查:输入正确结果却判定错误
问题分析与修复方案
核心问题点
- 整数除法导致结果失真:
divR1和divR2都是int类型,divR1 / divR2执行的是整数除法(比如59/89会得到0,而非实际的0.6629...),赋值给double类型的solution也无法修正这个错误结果,这是程序误判的根本原因。 - 浮点数直接用
==比较存在精度问题:用户输入的近似值(如0.66)和精确计算的浮点值存在微小误差,直接用相等判断会误判为错误。 - 计数变量未正确累加:
divC + 1和divI + 1仅做了加法运算,没有把结果赋值回变量,导致正确/错误次数统计完全无效。 - 随机数范围不符合需求:
rand()%100生成0-99的数,可能出现除数为0的情况,且不满足题目1-100的要求。 - 缺少循环逻辑:当前程序仅运行一次就退出,无法重复进行练习。
修复后的代码
#include <iostream> #include <cstdlib> #include <ctime> #include <cmath> // 用于计算浮点数绝对值 using namespace std; int main() { int divC = 0, divI = 0; srand(static_cast<unsigned int>(time(0))); char exitChoice = 'n'; do { // 生成1-100的随机数,避免除数为0 int divR1 = rand() % 100 + 1; int divR2 = rand() % 100 + 1; double reDiv = 0; // 强制转换为浮点数后执行除法,得到精确的浮点结果 double solution = static_cast<double>(divR1) / divR2; cout << "---------DIVISION---------" << endl; cout << "Operation " << divR1 << " / " << divR2 << endl; cout << "Answer: "; cin >> reDiv; // 用误差范围判断浮点数是否近似相等,允许0.01的误差 if (fabs(reDiv - solution) < 0.01) { cout << "Correct." << endl; divC++; // 正确次数累加 } else { cout << "Incorrect. The correct answer is " << solution << endl; divI++; // 错误次数累加 } cout << "EXIT? [Y/N]: "; cin >> exitChoice; } while (exitChoice != 'Y' && exitChoice != 'y'); // 循环直到用户选择退出 // 退出时输出统计结果 cout << "Total correct: " << divC << ", Total incorrect: " << divI << endl; return 0; }
修复说明
- 将其中一个整数强制转换为
double后再做除法,确保得到正确的浮点运算结果。 - 使用
fabs(reDiv - solution) < 0.01判断两个浮点数是否近似相等,适配用户输入的近似值,避免精度问题导致的误判。 - 把
divC +1改为divC++,实现正确的计数累加。 - 随机数调整为
rand()%100 +1,生成1-100的整数,避免除数为0的异常。 - 添加
do-while循环,支持用户重复进行除法练习,直到输入Y/y退出。 - 退出时输出正确和错误的总次数,增强交互体验。
内容的提问来源于stack exchange,提问作者LeNobody009
相关产品推荐
相关产品推荐

