do...while 循环中的 Switch 语句(值堆叠)

Switch statement within a do...while loop(values stacking)

我是一名学生,刚开始编程 4 周,我希望我能在这里 huehue 得到帮助。所以我正在制作一个程序,您可以在其中将十进制数转换为八进制数和二进制数,反之亦然。程序继续要求用户选择,直到他们选择字母 d 退出程序。该程序一开始似乎 运行 很好,但是当我尝试再次使用相同的字母和输入值时,输出似乎是从上次的输出堆叠而来,我猜没有覆盖(抱歉,如果我的术语或语法错了,我的英语不是很好)我需要改变什么?想不通呼呼呼

#include<stdio.h>
#include<math.h>

int main(){
    int  c, k, r=0, e=0, dec=0, o=0, place=1;
    long n;
    char choice, new, d;
    
  
   do{ 
    printf("Choices:\na. Decimal to binary and octal\nb. Octal to decimal and binary\nd. Exit.\n\n");
    printf("enter your choice:\t");
    printf("\n");
    
    scanf(" %c", &choice);
    
    switch(choice){
            
        case 'A':
        case 'a':
            printf("Conversion: Decimal to binary and octal.\n");
            printf("Enter number:\n");
            scanf("%ld", &n);
            printf("%ld is ", n);
           
                for (c =28; c >= 0; c--){
                k = n >> c;

                    if (k & 1)
                        printf("1");
                    else
                        printf("0");
                        }
            printf(" in Binary Form. \n");
                
            printf("%ld is ", n);
            
            while (n != 0)
                    {
                        o=o+(n%8)*place;
                        n=n/8;
                        place=place*10;
                    }
            printf("%ld in Octal Form.\n\n", o);
        break;
            
        case 'b':
        case 'B':
            printf("Conversion: Octal to decimal and binary.\n");
            printf("Enter number:\n");
            scanf("%ld", &n);
            printf("%ld is ", n);
               
                for (c =28; c >= 0; c--)
                    {
                    k = n >> c;

                        if (k & 1)
                        printf("1");
                        else
                        printf("0");
                    }
            printf(" in Binary Form.\n", n, k);
                
            printf("%ld is ", n);
                while(n!=0)
                    {
                        r=n%10;
                        dec=dec+r*(pow (8, e));
                        n=n/10;
                        e++;
                    }
            printf("%ld in Decimal Form.\n", dec);
        
        default:
            printf("Exit.\n\n");
        break;
      
         
    }
    
   }while(choice == 'a'|| choice =='A'|| choice == 'b'|| choice =='B');
    
    return 0;
}

如果我 运行 选择 'a' 的程序并输入 12,它 returns:

12 is 00000000000000000000000001100 in Binary Form. 
12 is 14 in Octal Form.

如果我再做一次:

12 is 00000000000000000000000001100 in Binary Form. 
12 is 1414 in Octal Form.

作为问题的一部分,您应该告诉我们这种详细程度。

最小(大概)修复是将您初始化的变量移动到循环中:

int main() {
   char choice;
   do { 
      int  c, k, r=0, e=0, dec=0, o=0, place=1;
      long n;
      char new, d;
      ...

我移动了所有的声明,即使只需要移动已初始化的声明。这减少了变量的范围,这通常是一个好习惯。

这里有一些其他的建议:

  1. 你的开关和最后一个 while 循环检查同样的事情。如果改用 if-else if 循环,则可以使用 break 退出循环。另一个选项是设置一个 done 指标变量并在循环中检查它。

  2. 我还会规范化 choice 变量,即 choice = tolower(choice) 这样您就不必检查大小写了。

  3. 考虑在主循环中驱动i/o,然后调用一个函数returns主循环打印出的数据。

  4. 使用函数消除重复(即二进制算法应该是一个单独的函数)。

  5. 二进制算法看起来不对,btw,为什么要循环29次?你传递一个 long 可能是 64 位(至少它在我的系统上)。

  6. 您阅读(签名)很长时间但不处理负值。 @WeatherVane.

  7. 您读取的值 n 似乎未经过验证。应该能够键入 'a' 作为十进制或八进制值?或者 9 表示八进制值?与此相关,scanf() 可能会失败,因此请检查它 returns.

  8. 你说 'd' 退出但程序逻辑不是 'a' 或 'b'(小写或大写)退出。

  9. 格式对阅读您的代码的人很重要,因此请修复 for (c =28; c >= 0; c--){ 的错误缩进。我还建议您使用制表符(或 8 个空格)。这将鼓励您尽量减少代码缩进的级别。