鱼C论坛

 找回密码
 立即注册
查看: 38|回复: 7

小问题~~

[复制链接]
发表于 昨天 22:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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的区间内,则输出“输入错误,请重新输入”,应该怎么加在程序里?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 22:08 | 显示全部楼层
小问题看到了!这段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):


  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int score;
  5.     printf("please input a score:");
  6.     scanf("%d", &score);
  7.    
  8.     if(score < 60)
  9.     {
  10.         printf("E\n");
  11.     }
  12.     else if(score >= 60 && score < 70)
  13.     {
  14.         printf("D\n");
  15.     }
  16.     else if(score >= 70 && score < 80)
  17.     {
  18.         printf("C\n");
  19.     }
  20.     else if(score >= 80 && score < 90)
  21.     {
  22.         printf("B\n");
  23.     }
  24.     else
  25.     {
  26.         printf("A\n"); // 假设90分及以上为A
  27.     }
  28.    
  29.     return 0;
  30. }
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

...

看到了,我想在这个程序里面再加一个“输入非0~100,则提示输入错误,重新输入”,应该怎么加?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 22:22 | 显示全部楼层
但求过程001 发表于 2025-12-30 22:21
FishC 发表于 2025-12-30 22:08
小问题看到了!这段C ...


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

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

  2. int main()
  3. {
  4.     int score;
  5.    
  6.     while(1)  // 无限循环,直到输入正确
  7.     {
  8.         printf("请输入分数(0-100): ");
  9.         scanf("%d", &score);
  10.         
  11.         if(score >= 0 && score <= 100)
  12.         {
  13.             break;  // 输入正确,跳出循环
  14.         }
  15.         else
  16.         {
  17.             printf("输入错误!分数必须在0到100之间。\n");
  18.             // 清空输入缓冲区,防止非数字输入导致死循环
  19.             while(getchar() != '\n');
  20.         }
  21.     }
  22.    
  23.     // 分数等级判断
  24.     if(score < 60)
  25.     {
  26.         printf("E\n");
  27.     }
  28.     else if(score >= 60 && score < 70)
  29.     {
  30.         printf("D\n");
  31.     }
  32.     else if(score >= 70 && score < 80)
  33.     {
  34.         printf("C\n");
  35.     }
  36.     else if(score >= 80 && score < 90)
  37.     {
  38.         printf("B\n");
  39.     }
  40.     else
  41.     {
  42.         printf("A\n");
  43.     }
  44.    
  45.     return 0;
  46. }
复制代码


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


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

while(getchar() != '\n');
这个没看懂什么意思~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 22:30 | 显示全部楼层
但求过程001 发表于 2025-12-30 22:29
FishC 发表于 2025-12-30 22:22
【实现思路】
要在 ...


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

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

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

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

【工作原理】

让我们一步步分析:

  1. 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 23:24 | 显示全部楼层
加个while循环
  1. do
  2.     {
  3.         printf("please input a score:");
  4.         scanf("%d", &score);
  5.     }while(score<0 || score>100);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 23:50 | 显示全部楼层
FishC 发表于 2025-12-30 22:30
让我详细解释一下这行代码的作用和原理:

【代码作用】

OK,谢谢~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-31 04:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表