但求过程001 发表于 2025-12-30 22:07:40

小问题~~

#include <stdio.h>

void main()
{
        int score;
        printf("please input a score:");
        scanf("%d",&score);
        if(score<60)
        {
                printf("E\n");
        }
        else if((score>60||score==60) && score <70)
        {
                printf("D\n");
        }
        else if((score>75||score==75) && score <80)
        {
                printf("C\n");
        }
        else if((score>80||score==80) && score <90)
        {
                printf("B\n");
        }
        else
        {
                printf("A\n");
        }
}

如上程序,如果我想要加一个限制条件,就是输入不在0~100的区间内,则输出“输入错误,请重新输入”,应该怎么加在程序里?

FishC 发表于 2025-12-30 22:08:32

小问题看到了!这段C代码在分数判断逻辑上有点小瑕疵,而且最后一个条件没写完。我们来一起修正一下。

主要问题:

[*]条件冗余:比如 (score>60||score==60) 可以直接写成 score >= 60。
[*]逻辑漏洞:70到74分这个区间没有被任何条件覆盖,如果输入这个范围的分数,程序不会有输出。
[*]代码不完整:最后一个 else if 没写完,缺少条件和语句。


为了让逻辑完整且清晰,这里提供一个修正后的版本,覆盖了常见的分数等级划分(E: <60, D: 60-69, C: 70-79, B: 80-89, A: 90-100):


#include <stdio.h>

int main()
{
    int score;
    printf("please input a score:");
    scanf("%d", &score);
   
    if(score < 60)
    {
      printf("E\n");
    }
    else if(score >= 60 && score < 70)
    {
      printf("D\n");
    }
    else if(score >= 70 && score < 80)
    {
      printf("C\n");
    }
    else if(score >= 80 && score < 90)
    {
      printf("B\n");
    }
    else
    {
      printf("A\n"); // 假设90分及以上为A
    }
   
    return 0;
}


如果你希望保持原代码中“C等级从75分开始”的设定,只需将第三个条件改为 score >= 75 && score < 80,并记得在它前面加上处理70-74分的分支(比如输出"其他"或调整等级标准)。另外,建议使用 int main() 并返回0,这样更符合标准。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 2025-12-30 22:21:28

FishC 发表于 2025-12-30 22:08
小问题看到了!这段C代码在分数判断逻辑上有点小瑕疵,而且最后一个条件没写完。我们来一起修正一下。

...

看到了,我想在这个程序里面再加一个“输入非0~100,则提示输入错误,重新输入”,应该怎么加?

FishC 发表于 2025-12-30 22:22:07

但求过程001 发表于 2025-12-30 22:21
FishC 发表于 2025-12-30 22:08
小问题看到了!这段C ...

【实现思路】
要在原程序中加入输入验证,可以使用循环结构反复读取输入,直到满足条件为止。

【修改后的代码】
#include <stdio.h>

int main()
{
    int score;
   
    while(1)// 无限循环,直到输入正确
    {
      printf("请输入分数(0-100): ");
      scanf("%d", &score);
      
      if(score >= 0 && score <= 100)
      {
            break;// 输入正确,跳出循环
      }
      else
      {
            printf("输入错误!分数必须在0到100之间。\n");
            // 清空输入缓冲区,防止非数字输入导致死循环
            while(getchar() != '\n');
      }
    }
   
    // 分数等级判断
    if(score < 60)
    {
      printf("E\n");
    }
    else if(score >= 60 && score < 70)
    {
      printf("D\n");
    }
    else if(score >= 70 && score < 80)
    {
      printf("C\n");
    }
    else if(score >= 80 && score < 90)
    {
      printf("B\n");
    }
    else
    {
      printf("A\n");
    }
   
    return 0;
}

【代码说明】

[*]使用 while(1) 创建一个无限循环
[*]判断输入是否在0~100范围内,是则用 break 跳出循环
[*]否则提示错误信息,并清空输入缓冲区
[*]跳出循环后,执行原有的分数判断逻辑


【注意事项】
1. 将 void main() 改为标准的 int main()
2. 增加了输入缓冲区的清理,防止输入非数字时出现无限循环
3. 将所有的条件判断改为更简洁的 >= 形式

这样修改后,程序会一直要求用户输入,直到输入合法的0~100分数为止。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 2025-12-30 22:29:12

FishC 发表于 2025-12-30 22:22
【实现思路】
要在原程序中加入输入验证,可以使用循环结构反复读取输入,直到满足条件为止。



while(getchar() != '\n');
这个没看懂什么意思~~

FishC 发表于 2025-12-30 22:30:00

但求过程001 发表于 2025-12-30 22:29
FishC 发表于 2025-12-30 22:22
【实现思路】
要在 ...

让我详细解释一下这行代码的作用和原理:

【代码作用】
while(getchar() != '\n'); 这行代码的作用是清空输入缓冲区。

【为什么需要这样做?】
当我们使用 scanf("%d", &score); 输入一个整数时,如果你输入的不是数字(比如字母、符号等),scanf 会读取失败,但错误的数据仍然会留在输入缓冲区中。

如果不清理,下一次循环再执行 scanf 时,它会看到缓冲区里还有数据,直接读取上次的失败数据,导致程序陷入无限循环。

【工作原理】

让我们一步步分析:

while(getchar() != '\n');

1. getchar() 函数从输入缓冲区读取一个字符
2. 比较这个字符是否不等于换行符 '\n'
3. 如果不是换行符,继续循环读取下一个字符
4. 如果是换行符,说明整行数据已经读完,循环结束

【实际效果】
假设你输入了 abc123\n(\n表示回车键):
1. 第1次循环:getchar() 读取 'a',不等于 '\n',继续
2. 第2次循环:getchar() 读取 'b',不等于 '\n',继续
3. 第3次循环:getchar() 读取 'c',不等于 '\n',继续
4. 第4次循环:getchar() 读取 '1',不等于 '\n',继续
5. 第5次循环:getchar() 读取 '2',不等于 '\n',继续
6. 第6次循环:getchar() 读取 '3',不等于 '\n',继续
7. 第7次循环:getchar() 读取 '\n',等于 '\n',循环结束

【简单记忆】
你可以把这行代码理解为:
"读取并丢弃输入缓冲区中的所有字符,直到遇到换行符(回车)为止"

【补充说明】
这个技巧在C语言输入处理中很常用,特别是当需要处理错误输入时。它确保下一次读取时缓冲区是干净的,不会受到上次输入错误的影响。

现在明白了吗?如果还有不清楚的地方,可以继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

pyzyd 发表于 2025-12-30 23:24:38

加个while循环
do
    {
      printf("please input a score:");
      scanf("%d", &score);
    }while(score<0 || score>100);

但求过程001 发表于 2025-12-30 23:50:16

FishC 发表于 2025-12-30 22:30
让我详细解释一下这行代码的作用和原理:

【代码作用】


OK,谢谢~~
页: [1]
查看完整版本: 小问题~~