【问题标题】:Switch statement within a do...while loop(values stacking)do...while 循环中的 switch 语句(值堆叠)
【发布时间】:2021-10-10 05:54:09
【问题描述】:

我是一名学生,刚开始编程 4 周,我希望我能在这里获得帮助。所以我正在制作一个程序,您可以将十进制数字转换为八进制和二进制,反之亦然。程序继续要求用户选择,直到他们选择字母 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;
}

【问题讨论】:

  • 请给出准确的输入、预期结果和实际结果。
  • 什么是“huehue”
  • 建议:将数字从一个基数转换为另一个基数的实际逻辑移动到另一个函数或 function_s_,而不是全部内联到一个main.
  • k = n &gt;&gt; c 但如果 long 不是 32 位,您将无法始终将移位的 long 放入 int。负值也将是一个问题。如果您只对 ls 感兴趣,这可能并不“重要”。位。
  • 你初始化了一堆变量` r=0, e=0, dec=0, o=0, place=1; ` 在顶部,但不在循环中。

标签: c switch-statement do-while


【解决方案1】:

如果我选择“a”运行程序并输入 12,它会返回:

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

如果我再做一次:

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

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

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

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

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

以下是一些其他建议:

  1. 您的 switch 和最后一个 while 循环都检查相同的内容。如果使用 if-else if 循环,则可以使用 break 退出循环。另一个选项是设置一个done 指示变量并在循环中检查它。

  2. 我还将标准化choice 变量,即choice = tolower(choice),这样您就不必同时检查大小写。

  3. 考虑在主循环中驱动 i/o,然后调用返回数据的函数,然后主循环将其打印出来。

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

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

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

  7. 您读取的值 n 似乎没有经过验证。应该能够为十进制或八进制值键入“a”吗?还是 9 表示八进制值?与此相关,scanf() 可能会失败,因此请检查它返回的内容。

  8. 您说“d”退出,但程序逻辑不是“a”或“b”(小写或大写)退出。

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

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2021-03-08
    • 1970-01-01
    • 2020-05-07
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多