C语言计算器复用历史结果功能异常问题求助
C语言计算器复用运算结果的逻辑错误修复
问题现象
开发的C语言计算器意图支持复用上一次运算结果,但仅在重复执行相同操作时结果正确,切换操作后逻辑出错。例如:
- 输入
5 6 +,得到正确结果11 - 输入
6 +,得到正确结果17(11+6) - 再输入
3 -,预期结果为14(17-3),实际得到20,逻辑完全混乱
错误根源
代码的核心问题出在输入处理和变量复用逻辑上:
- 循环开头的
b=r;语句完全无效,因为紧接着的scanf("%lf %lf %c",&a,&b,&ch);会直接覆盖b的值,根本没用到上次运算结果r - 输入格式强制要求必须输入两个数字+操作符,但用户复用结果时只输入一个数字+操作符,导致输入解析混乱,变量赋值完全错误
- 阶乘
!、倒数i这类单操作数功能,代码仍按双数输入处理,进一步加剧输入异常
修复方案
核心逻辑调整
- 区分首次输入与复用输入:允许后续输入仅提供一个数字+操作符,自动将上次运算结果作为第一个操作数
- 优化输入解析逻辑,支持两种输入格式:
数字1 数字2 操作符(首次/独立运算)、数字 操作符(复用上次结果) - 维护
last_result变量存储上次运算结果,在复用场景下自动填充第一个操作数
修改后的完整代码
#include<stdio.h> #include<math.h> double addition(double a, double b) { return a + b; } double soustraction(double a, double b) { return a - b; } double multiplication(double a, double b) { return a * b; } double division(double a, double b) { return a / b; } double reste_de_division(int a, int b) { return a % b; } double puissance(double a, double b) { double r = 1; for (int i = 0; i < b; i++) { r *= a; } return r; } double factorielle(double a) { double facto = 1; for (int i = 1; i <= a; i++) { facto *= i; } return facto; } double PGCD(int a, int b) { int pgcd = 1; for (int i = 1; i <= a && i <= b; ++i) { if (a % i == 0 && b % i == 0) pgcd = i; } return pgcd; } double PPCM(int a, int b) { int ppcm = (a > b) ? a : b; while (ppcm % a != 0 || ppcm % b != 0) ppcm++; return ppcm; } double inverse(double a) { return 1 / a; } int main() { double last_result = 0; char op = 0; int input_status; printf("\n***************************************\n"); printf(" + 加法\t\t- 减法\n"); printf(" * 乘法\t\t/ 除法\n"); printf(" %% 取余\t\tc 幂运算\n"); printf(" ! 阶乘\t\tg 最大公约数(PGCD)\n"); printf(" p 最小公倍数(PPCM)\t i 倒数\n"); printf(" q 退出\n"); printf("\n***************************************\n"); printf("输入规则:\n"); printf("1. 首次/独立运算:输入「数字1 数字2 操作符」\n"); printf("2. 复用上次结果:输入「数字 操作符」(自动将上次结果作为第一个操作数)\n"); do { // 清空输入缓冲区,避免残留字符干扰 while (getchar() != '\n'); printf("\n请输入:"); // 先尝试读取两个数字和操作符 double num1, num2; input_status = scanf("%lf %lf %c", &num1, &num2, &op); if (input_status == 3) { // 双数字输入,执行运算并更新last_result switch(op) { case '+': last_result = addition(num1, num2); break; case '-': last_result = soustraction(num1, num2); break; case '*': last_result = multiplication(num1, num2); break; case '/': last_result = division(num1, num2); break; case '%': last_result = reste_de_division((int)num1, (int)num2); break; case 'c': last_result = puissance(num1, num2); break; case 'g': last_result = PGCD((int)num1, (int)num2); break; case 'p': last_result = PPCM((int)num1, (int)num2); break; // 单操作数功能单独处理 case '!': last_result = factorielle(num1); break; case 'i': last_result = inverse(num1); break; } printf("运算结果:%.2lf", last_result); } else if (input_status == 2) { // 说明读取到一个数字和一个字符(操作符),复用last_result op = (char)num2; switch(op) { case '+': last_result += num1; break; case '-': last_result -= num1; break; case '*': last_result *= num1; break; case '/': last_result /= num1; break; case '%': last_result = reste_de_division((int)last_result, (int)num1); break; case 'c': last_result = puissance(last_result, num1); break; case 'g': last_result = PGCD((int)last_result, (int)num1); break; case 'p': last_result = PPCM((int)last_result, (int)num1); break; // 单操作数功能直接使用输入的数字 case '!': last_result = factorielle(num1); break; case 'i': last_result = inverse(num1); break; } printf("运算结果:%.2lf", last_result); } else { // 读取到单个字符(比如q)或者输入错误 char temp; scanf("%c", &temp); if (temp == 'q') { op = 'q'; break; } printf("输入格式错误,请重新输入"); continue; } } while (op != 'q'); printf("\n已退出计算器"); return 0; }
关键修复说明
- 输入解析优化:通过
scanf的返回值判断输入格式,自动适配双数字输入和复用结果的单数字输入 - 变量逻辑修正:用
last_result持久存储上次运算结果,在复用场景下自动作为第一个操作数参与运算 - 单操作数适配:针对阶乘、倒数这类仅需单个操作数的功能,单独处理输入逻辑,避免格式冲突
- 缓冲区清理:每次输入前清空缓冲区,解决上次输入残留字符导致的解析错误
内容的提问来源于stack exchange,提问作者Liamani El Mahdi
相关产品推荐
相关产品推荐

