【问题标题】:While loops and nested if do not work togetherWhile 循环和嵌套 if 不能一起工作
【发布时间】:2020-01-17 17:26:48
【问题描述】:

当没有while循环时,代码运行良好。因为 İt 没有起作用,嵌套 if 中的最后一个 else。声明者是“无效字符”。但如下所示,它不起作用。错误在哪里?我试图删除 while 循环。它跑了。但是,以这种方式,它不起作用。在我看来,这种情况是while循环的一个特定条件。

#include <stdio.h>

int main(void)
{
   unsigned int aCount = 0; 
   unsigned int bCount = 0; 
   unsigned int cCount = 0; 
   unsigned int dCount = 0;
   unsigned int fCount = 0; 

   puts("Enter the letter grades." );
   puts("Enter the EOF character to end input." );
   int grade; // one grade 

   // loop until user types end-of-file key sequence
    while (( grade = getchar()) != EOF) { //while

        if(grade == 'A'|| grade == 'a')
        {
            ++aCount;
        }
        else if(grade == 'B' || grade == 'b')
        {
            ++bCount;
        }
        else if(grade == 'C' || grade == 'c')
        {
            ++cCount;
        }
        else if(grade =='D' || grade == 'd')
        {
            ++dCount;
        }
        else if(grade == 'F' || grade =='f')
        {
            ++fCount;
        }
        else
        {
            puts("invalid character");

        }

   }//while





   // output summary of results
   puts("\nTotals for each letter grade are:");
   printf("A: %u\n", aCount);
   printf("B: %u\n", bCount); 
   printf("C: %u\n", cCount); 
   printf("D: %u\n", dCount); 
   printf("F: %u\n", fCount); 

return 0;
} 

【问题讨论】:

  • 是的。什么不起作用?
  • “它不起作用”到底是什么意思? 如何你知道它不起作用?程序的预期和实际输出是什么?
  • 优化技巧 - 有一个 int count[5] 数组,然后递增 count[tolower(grade) - 'a']
  • 建议:使用grade = tolower(grade),这样您只需比较一个字符而不是大小写。
  • @EugeneSh。你的意思是count[6]。最后一个等级是 F,而不是 E。

标签: c loops nested


【解决方案1】:

在`while 中使用if 没有问题。

正如评论所述,等级之间的空格和换行符将导致它打印“无效字符”。您应该忽略这些字符而不是打印消息。

当用户在行首键入 EOF 字符时,循环将结束。

#include <stdio.h>
#include <ctype.h>

int main(void)
{
   unsigned int aCount = 0; 
   unsigned int bCount = 0; 
   unsigned int cCount = 0; 
   unsigned int dCount = 0;
   unsigned int fCount = 0; 

   puts("Enter the letter grades." );
   puts("Enter the EOF character to end input." );
   int grade; // one grade 

   // loop until user types end-of-file key sequence
    while (( grade = getchar()) != EOF) { //while
        grade = tolower(grade);
        if(grade == 'a')
        {
            ++aCount;
        }
        else if(grade == 'b')
        {
            ++bCount;
        }
        else if(grade == 'c')
        {
            ++cCount;
        }
        else if(grade == 'd')
        {
            ++dCount;
        }
        else if(grade =='f')
        {
            ++fCount;
        }
        else if (isspace(grade)) {
            // ignore whitespace
        }
        else
        {
            printf("invalid character '%c'\n", grade);
        }

   }//while

   // output summary of results
   puts("\nTotals for each letter grade are:\n");
   printf("A: %u\n", aCount);
   printf("B: %u\n", bCount); 
   printf("C: %u\n", cCount); 
   printf("D: %u\n", dCount); 
   printf("F: %u\n", fCount); 

return 0;
} 

【讨论】:

  • 非常感谢。我明白了。是的。例如,我写“a”,然后按 Enter。 En 输入 == \n。现在是真的。
【解决方案2】:

'\n' 也算作一个字符,' ' 也是如此。总而言之,您永远不会检查这些字符。 代码如下:

#include <stdio.h>

int main(void)
{
   unsigned int aCount = 0; 
   unsigned int bCount = 0; 
   unsigned int cCount = 0; 
   unsigned int dCount = 0;
   unsigned int fCount = 0; 

   puts("Enter the letter grades." );
   puts("Enter the EOF character to end input." );
   int grade; 


    while (( grade = getchar()) != EOF  ) { 

        if(grade == 'A'|| grade == 'a')
        {
            ++aCount;
        }
        else if(grade == 'B' || grade == 'b')
        {
            ++bCount;
        }
        else if(grade == 'C' || grade == 'c')
        {
            ++cCount;
        }
        else if(grade =='D' || grade == 'd')
        {
            ++dCount;
        }
        else if(grade == 'F' || grade =='f')
        {
            ++fCount;
        }
        else if(grade =='\n' || grade==' ')
        {
            continue;

        }
        else
        {
        puts("invalid character");
        }
   }


   puts("\nTotals for each letter grade are:");
   printf("A: %u\n", aCount);
   printf("B: %u\n", bCount); 
   printf("C: %u\n", cCount); 
   printf("D: %u\n", dCount); 
   printf("F: %u\n", fCount); 

return 0;
} 

【讨论】:

  • 提示说它以 EOF 结尾,而不是换行符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2018-04-03
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多