C语言计算器重复选择功能异常问题求助
C语言计算器重复使用时异常问题修复
问题描述
开发C语言计算器时遇到异常:选择再次使用计算器时,程序有时直接终止,有时能正常运行。
原代码
#include <stdio.h> int main(void) { int xx; int Y, N; int a, b, c, d; int aa, bb, Sum, ee, ff, Multi; float cc, dd, Sub, gg, hh, Divi; printf("\n\nC a l c u l a t o r\n\n"); printf("C h o o s e :\n\n"); printf(" S u m ( 1 ) \t"); printf(" S u b t r a c t i o n ( 2 )\n\n"); printf(" M u l t i p l i c a t i o n ( 3 ) \t"); printf(" D i v i s i o n ( 4 )\n\n"); scanf("%d", &xx); a = 1; b = 2; c = 3; d = 4; Y = 10; N = 20; if (a == xx) { printf("\n\nE n t e r F i r s t N u m b e r :\n"); scanf("%d", &aa); printf("\n\nE n t e r S e c o n d N u m b e r :\n"); scanf("%d", &bb); Sum = aa + bb; printf("%d + %d = %d", aa, bb, Sum); xx = xx - 1; printf("\n\nC h o o s e a g a i n ?\n"); printf(" ( Y e s = = S a y 1 0 !)\n"); printf(" ( N o = = S a y 2 0 !)\n"); scanf("%d", &xx); if (Y == xx) { printf("\n\nC h o o s e :\n\n"); printf(" S u m ( 1 ) \t"); printf(" S u b t r a c t i o n ( 2 )\n\n"); printf(" M u l t i p l i c a t i o n ( 3 ) \t"); printf(" D i v i s i o n ( 4 )\n\n"); scanf("%d", &xx); } if (N == xx) { printf("\n\n F I N\n\n"); } } if (b == xx) { printf("\n\nE n t e r F i r s t N u m b e r :\n"); scanf("%f", &cc); printf("\n\nE n t e r S e c o n d N u m b e r :\n"); scanf("%f", &dd); Sub = cc - dd; printf("%f - %f = %f", cc, dd, Sub); xx = xx - 2; printf("\n\nC h o o s e a g a i n ?\n"); printf(" ( Y e s = = S a y 1 0 !)\n"); printf(" ( N o = = S a y 2 0 !)\n"); scanf("%d", &xx); if (Y == xx) { printf("\n\nC h o o s e :\n\n"); printf(" S u m ( 1 ) \t"); printf(" S u b t r a c t i o n ( 2 )\n\n"); printf(" M u l t i p l i c a t i o n ( 3 ) \t"); printf(" D i v i s i o n ( 4 )\n\n"); scanf("%d", &xx); } if (N == xx) { printf("\n\n F I N\n\n"); } } if (c == xx) { printf("\n\nE n t e r F i r s t N u m b e r :\n"); scanf("%d", &ee); printf("\n\nE n t e r S e c o n d N u m b e r :\n"); scanf("%d", &ff); Multi = ee * ff; printf("%d x %d = %d", ee, ff, Multi); xx = xx - 3; printf("\n\nC h o o s e a g a i n ?\n"); printf(" ( Y e s = = S a y 1 0 !)\n"); printf(" ( N o = = S a y 2 0 !)\n"); scanf("%d", &xx); if (Y == xx) { printf("\n\nC h o o s e :\n\n"); printf(" S u m ( 1 ) \t"); printf(" S u b t r a c t i o n ( 2 )\n\n"); printf(" M u l t i p l i c a t i o n ( 3 ) \t"); printf(" D i v i s i o n ( 4 )\n\n"); scanf("%d", &xx); } if (N == xx) { printf("\n\n F I N\n\n"); } } if (d == xx) { printf("\n\nE n t e r F i r s t N u m b e r :\n"); scanf("%f", &gg); printf("\n\nE n t e r S e c o n d N u m b e r :\n"); scanf("%f", &hh); Divi = gg / hh; printf("%f / %f = %f", gg, hh, Divi); xx = xx - 4; printf("\n\nC h o o s e a g a i n ?\n"); printf(" ( Y e s = = S a y 1 0 !)\n"); printf(" ( N o = = S a y 2 0 !)\n"); scanf("%d", &xx); if (Y == xx) { printf("\n\nC h o o s e :\n\n"); printf(" S u m ( 1 ) \t"); printf(" S u b t r a c t i o n ( 2 )\n\n"); printf(" M u l t i p l i c a t i o n ( 3 ) \t"); printf(" D i v i s i o n ( 4 )\n\n"); scanf("%d", &xx); } if (N == xx) { printf("\n\n F I N\n\n"); } } }
问题根源
- 无循环结构:原代码是顺序执行的独立
if分支,第一次操作完成后选择“再次使用”时,新输入的操作选项只会被后续的if分支检查,若后续分支不匹配(比如第一次选加法后再次选加法),程序会直接终止。 - 冗余变量与逻辑混乱:
a,b,c,d等变量完全多余,直接用常量1-4即可;操作完成后修改xx的值(如xx = xx -1)属于无效操作,会干扰后续判断。 - 重复代码:菜单打印逻辑重复多次,维护性差。
修复后的代码
#include <stdio.h> int main(void) { int choice; const int YES = 10, NO = 20; int num1_int, num2_int; float num1_float, num2_float; do { // 打印菜单 printf("\n\n===== 计算器 =====\n\n"); printf("选择操作:\n"); printf("1. 加法\n"); printf("2. 减法\n"); printf("3. 乘法\n"); printf("4. 除法\n\n"); printf("请输入选项(1-4): "); scanf("%d", &choice); // 执行对应操作 switch(choice) { case 1: printf("\n输入第一个整数: "); scanf("%d", &num1_int); printf("输入第二个整数: "); scanf("%d", &num2_int); printf("%d + %d = %d\n", num1_int, num2_int, num1_int + num2_int); break; case 2: printf("\n输入第一个浮点数: "); scanf("%f", &num1_float); printf("输入第二个浮点数: "); scanf("%f", &num2_float); printf("%.2f - %.2f = %.2f\n", num1_float, num2_float, num1_float - num2_float); break; case 3: printf("\n输入第一个整数: "); scanf("%d", &num1_int); printf("输入第二个整数: "); scanf("%d", &num2_int); printf("%d × %d = %d\n", num1_int, num2_int, num1_int * num2_int); break; case 4: printf("\n输入第一个浮点数: "); scanf("%f", &num1_float); printf("输入第二个浮点数(不能为0): "); scanf("%f", &num2_float); if(num2_float == 0) { printf("错误: 除数不能为0!\n"); } else { printf("%.2f ÷ %.2f = %.2f\n", num1_float, num2_float, num1_float / num2_float); } break; default: printf("无效选项,请重新输入!\n"); continue; // 跳过后续的再次选择,直接回到菜单 } // 询问是否继续 printf("\n是否继续使用计算器?\n"); printf("是(输入10) / 否(输入20): "); scanf("%d", &choice); } while(choice == YES); printf("\n\n程序结束\n\n"); return 0; }
修复说明
- 添加循环结构:用
do-while循环包裹整个流程,只要用户选择“是”就回到菜单重新选择操作,彻底解决重复使用时的终止问题。 - 替换为switch-case:相比多个独立
if,switch-case逻辑更清晰,减少冗余判断。 - 简化变量:移除无用变量,合并同类型操作的变量,提升代码可读性。
- 增加错误处理:针对除法添加除数为0的判断,避免运行时错误。
- 优化界面:简化菜单文字,让交互更直观。
内容的提问来源于stack exchange,提问作者SomeRandomCprogrammer
相关产品推荐
相关产品推荐

