关于编写的逻辑的编码不正确

时间:2018-09-29 08:40:36

标签: c

该程序需要执行直到按下'q'。但是下面我写的代码只执行第一种情况,然后停止执行其他情况。例如:案例1。如果我的输入是p,q,则仅执行p case,而不执行q。 case 2.如果我的输入是g,q,则仅执行g case,而不执行q。

   int main()
    {
        int i,n,cnt;
        char value[10]={0,0,0,0,0,0,0,0,0,0};
        int index; float values,Max;
        int *val;
        bool quit=false;
        float num[10]={1.500, 2.200, 7.300, 9.200, 7.400, 7.500, -8.000, 1.500, 12.000, 0.000};
        for(i=0;i<20;i++)
        {
            scanf("%c",&value[i]);
            if(value[i]=='r')
            {
                scanf("%d", &index); 
                scanf(", %3f",&values);
            }
            if((value[i] =='p')|(value[i] =='q')|(value[i] =='r')|(value[i] =='g')|(value[i] =='s'))
            {
                cnt++;
            }
        }


      for(i=0;i<cnt;i++)
        { 
            while(!quit)
            {
                 switch(value[i])
                {
                    //printf("Command (p/g/r/s/q):");
                    case 'p':
                    {
                        printf("Command (p/g/r/s/q):");
                        printValues(&num,10);
                        return;
                    }
                    case 'g':
                    {
                        printf("Command (p/g/r/s/q):");
                        Max= largestElement(&num,10);
                        printf("Max=%0.3f",Max);
                        return;
                    }
                    case 'r':
                    {
                        printf("Command (p/g/r/s/q):");
                        replaceElement(&num,index,values);
                        printValues(&num,10);
                       return;
                    }
                    case 's':
                    {
                        printf("Command (p/g/r/s/q):");
                        sortOnValue(&num,10);
                        printValues(&num,10);
                        return;
                    }
                    case'q':
                    {
                        printf("Command (p/g/r/s/q):");
                        quit= true;
                        break;
                    }
                    default:
                    {
                        printf("help");
                        return;
                    }
            }
        }

   }
   return 0;
}   

2 个答案:

答案 0 :(得分:0)

这里的问题很少。

  1. for(i=0;i<20;i++),您正在访问范围之外,因此您的循环应该是     for(i=0;i<10;i++)

  2. 您需要在格式字符串中添加' '才能使用换行符(\n)。

        `scanf(" %c",&value[i]);`
    
  3. 您使用的是|而不是||运算符,因此您的if应该是

         if((value[i] =='p')||(value[i] =='q')||(value[i] =='r')||(value[i] =='g')||(value[i] =='s'))
            {
                cnt++;
            }
    
  4. 在切换用例中,您使用的是return而不是break

    更改此

               case 'p':
                {
                    printf("Command (p/g/r/s/q):");
                    printValues(&num,10);
                    return;
                }
    

               case 'p':
                {
                    printf("Command (p/g/r/s/q):");
                    printValues(&num,10);
                    break;
                }
    
  5. while(!quit)循环内的for没用,当在switch case中使用break语句时,将导致无限循环。因此,请删除while(!quit)并按如下所示更改for循环。

    for(i=0;i<cnt&&!quit;i++)

  

旁注::现在是您的好时机   learn-how-to-debug-small-programs

答案 1 :(得分:0)

在大多数case块中,您可能希望break而不是return退出开关。目前,您要从main()返回并因此退出程序。 break将控制权转移到开关的末尾,然后您的程序可以继续。

然后case 'q'块将返回返回值以退出程序。