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

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");
    }
  }
}

问题根源

  1. 无循环结构:原代码是顺序执行的独立if分支,第一次操作完成后选择“再次使用”时,新输入的操作选项只会被后续的if分支检查,若后续分支不匹配(比如第一次选加法后再次选加法),程序会直接终止。
  2. 冗余变量与逻辑混乱:a,b,c,d等变量完全多余,直接用常量1-4即可;操作完成后修改xx的值(如xx = xx -1)属于无效操作,会干扰后续判断。
  3. 重复代码:菜单打印逻辑重复多次,维护性差。

修复后的代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:26:04