鱼C论坛

 找回密码
 立即注册
查看: 60|回复: 10

[已解决]求助~

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

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


如上程序,为什么我在运行无误后,输入一个分数,例如70,回车,下面没有任何结果。。。。。
而我是看教学视频后打的这个程序,和视频上的一样,视频上就输入有反应,我这也没哪错呀,为啥没有输出。。。。。
最佳答案
3 天前


不客气!很高兴能帮到你。

编程就是这样,会在不断尝试和解决问题的过程中进步。你遇到的这些问题都非常典型,解决了它们,你的理解就又深了一层。

以后遇到任何问题,随时来问就好。

祝你学习愉快,加油!

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

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
按理,我输入一个分数,例如79,应该输出C才是对的~~回车后啥也没显示
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
你好!看到你的问题了。你的程序没有输出,主要是因为两个问题:一是 scanf 中的格式字符串有误,二是条件判断语句存在语法错误。下面我详细解释一下。

首先,scanf("%d\n", &score); 中的 \n 会导致程序在输入数字后继续等待额外输入(比如空格或非空白字符),然后才会继续执行。这可能是输入后没有立即响应的原因。

其次,条件语句如 if(score60 || score==60) 有语法错误:score60 应该是 score > 60。类似地,其他条件也有冗余,可以用更简洁的方式表达。

以下是修正后的代码。我建议使用 int main() 并返回 0,以符合标准C语言规范。


  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int score;
  5.     printf("please input a number: \n");
  6.     scanf("%d", &score); // 移除了 \n,避免输入阻塞

  7.     if (score >= 60 && score < 70)
  8.     {
  9.         printf("D\n");
  10.     }
  11.     else if (score >= 70 && score < 80)
  12.     {
  13.         printf("C\n");
  14.     }
  15.     else if (score >= 80 && score < 90)
  16.     {
  17.         printf("B\n");
  18.     }
  19.     else
  20.     {
  21.         printf("A\n");
  22.     }
  23.     return 0;
  24. }
复制代码


主要改动:
- 移除了 scanf 中的 \n
- 修正了条件判断,使用 >=< 来简化表达式。
- 将 void main() 改为 int main() 并添加了 return 0;

尝试运行这个修正后的版本,输入分数后应该能正常输出等级了。如果还有问题,请检查编译时是否有警告,并确保输入时只输入数字后按回车。

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

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
感谢解答,我的程序没有输出就是出错在scanf这里,不能加\n,我也不知道为啥,可能是我想多了,哈哈
void main() 和 int main() return 0; 有什么区别吗?
还有,score >=60这种写法没有错?我开始也是这样写的,后来看视频将>=分开写了,我以为>=是语法错误,就没敢用,呵呵
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
但求过程001 发表于 2025-09-07 23:46
感谢解答,我的程序没有输出就是出错在scanf这里,不 ...


你好!很高兴我的解答帮到了你。你提的这几个问题都非常好,是很多初学者都会遇到的困惑,我来逐一解释一下。

1.  关于 scanf 里的 '\n'
    你说得对,这里确实是想多了。:)
   

       
  • printf 中,\n 表示“换行”,是一个输出指令,告诉控制台把光标移到下一行。
       
  • 但在 scanf 中,格式字符串里的 \n 有着完全不同的含义。它意味着“匹配并丢弃任意数量的空白字符(包括空格、制表符、换行符)”,直到遇到一个非空白字符为止。
       

    所以,当你写成 scanf("%d\n", &score); 时,它的行为是:
   

       
  • 你输入数字(比如70)然后按回车。
       
  • %d 成功读取了数字70。
       
  • 接下来,它看到了格式字符串里的 \n,于是它开始等待并“吞噬”掉你输入的回车符。
       
  • 吞噬完之后,它发现格式字符串里还有一个 \n 的要求,但输入缓冲区里已经没有东西了,所以程序就会停在那里,等待你输入下一个非空白字符(比如随便按个空格再回车),它才会继续执行。
       

    这就造成了“程序好像卡住了,没有反应”的假象。实际上它正在耐心地等待你的下一个输入呢。所以,在 scanf 中读取数字、字符时,通常格式字符串里都不要加 \n

2.  void main() 和 int main() 的区别
    这是一个关于C语言标准的问题。
   

       
  • int main():这是C语言标准(如C89, C99, C11)规定的标准写法。操作系统在调用你的程序时,会期望程序在结束时返回一个整数值(退出状态码)给操作系统。return 0; 通常表示程序成功执行完毕。其他非零值通常用来表示不同的错误原因。
       
  • void main():这是一种非标准的、古老的写法。在某些特定的编译环境(比如很久以前的Turbo C)下可能被允许,但它不符合C语言标准。现代编译器(如GCC, Clang, MSVC)虽然为了兼容性可能不会报错,但会给出警告。坚持使用标准写法能让你的程序更具可移植性,在任何编译器下都能正确编译。
       

    所以,为了养成良好的编程习惯,请始终使用 int main(void)int main() 并在结尾加上 return 0;(如果程序正常结束)。

3.  关于 score >= 60
    >= (大于等于)是C语言中一个非常标准且常用的运算符,它的写法绝对没有错,而且比拆开写成 score>60 || score==60 要更简洁、更易读、更不容易出错。
    你视频里的老师把它拆开写,可能是为了在讲解时,向初学者更清晰地演示“或”逻辑运算符 || 的用法。但在实际编写代码时,直接使用 >= 才是最佳实践。你的直觉是正确的!

总结一下:
  • scanf 里不要乱加 \n
  • 坚持使用标准的 int main() { ... return 0; }
  • 放心大胆地使用 >= 这类比较运算符,它们就是为此而生的。


你的思考非常棒,能发现这些细节并提出问题,是学好编程的关键一步!继续加油!

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

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层    本楼为最佳答案   


不客气!很高兴能帮到你。

编程就是这样,会在不断尝试和解决问题的过程中进步。你遇到的这些问题都非常典型,解决了它们,你的理解就又深了一层。

以后遇到任何问题,随时来问就好。

祝你学习愉快,加油!

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

使用道具 举报

 楼主| 发表于 前天 00:00 | 显示全部楼层
还有个问题我没理解过来,将3个数字从小到大排列,用if if if实现,为什么不能用if else if .....
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 00:01 | 显示全部楼层
但求过程001 发表于 2025-09-08 00:00
还有个问题我没理解过来,将3个数字从小到大排列,用i ...


你好!这个问题问得非常好,它触及了编程中“顺序执行”和“分支选择”的一个核心区别。

简单直接的回答是:

**因为排序需要执行多个独立的操作,而 `if else if` 是一个“互斥”的选择结构。**

下面我用一个例子来详细解释,你就会彻底明白。

假设我们要将三个变量 `a`, `b`, `c` 从小到大排列。

**目标:** 我们可能需要多次交换(swap)值。比如,可能要先让 a 和 b 保持正确的大小关系,然后再去调整 a 和 c,最后再调整 b 和 c。这是一个分步的过程。

---

### 1. 为什么可以用多个独立的 `if` 语句?

因为每个 `if` 都是独立的检查点,程序会**逐个执行**每一个 `if` 的条件判断。如果前一个 `if` 执行了一次交换,改变了变量的值,下一个 `if` 会在**新的数值基础上**继续进行判断和可能的交换。

这就好比炒菜,你需要依次执行“放油”、“下菜”、“翻炒”、“加盐”等多个步骤。

**代码示例:**
  1. #include

  2. int main() {
  3.     int a, b, c, temp;

  4.     printf("请输入三个数字(用空格隔开): ");
  5.     scanf("%d %d %d", &a, &b, &c);

  6.     // 三个独立的 if 语句
  7.     if (a > b) { // 第一步:确保a<=b
  8.         temp = a;
  9.         a = b;
  10.         b = temp;
  11.     }
  12.     if (a > c) { // 第二步:在第一步的基础上,确保a<=c。现在a已经是a和b中较小的那个了。
  13.         temp = a;
  14.         a = c;
  15.         c = temp;
  16.     }
  17.     if (b > c) { // 第三步:在前两步的基础上,确保b<=c。
  18.         temp = b;
  19.         b = c;
  20.         c = temp;
  21.     }

  22.     printf("从小到大排列: %d %d %d\n", a, b, c);
  23.     return 0;
  24. }
复制代码

**执行逻辑:**
1.  第一个 `if` 比较 a 和 b,如果 a 大,就交换,保证 a <= b。
2.  程序**继续执行**第二个 `if`,此时它用(可能已经交换过的)新的 a 值和 c 比较。如果 a 大,就交换,保证 a 是三个数里最小的。
3.  程序**继续执行**第三个 `if`,此时比较 b 和 c,如果 b 大,就交换,保证 b <= c。至此,排序完成 `(a <= b <= c)`。

**关键:** 这三个操作**都需要被执行**,而不是只选其中一个。

---

### 2. 为什么不能用 `if else if` 结构?

因为 `if else if` 是一个**互斥的、单一选择**的结构。一旦某个 `if` 或 `else if` 的条件为真,执行了它的代码块,程序就会**跳过**后面所有的 `else if` 和 `else` 分支。

这就好比问你“中午吃什么?”,选项是“面条、米饭、饺子”。你只能从中**选一个**来吃。

如果我们错误地使用 `if else if` 来排序:

  1. // 错误的示范!
  2. if (a > b) {
  3.     // 交换 a 和 b
  4.     temp = a;
  5.     a = b;
  6.     b = temp;
  7. }
  8. else if (a > c) { // 如果第一个if执行了,这里就直接被跳过了!
  9.     // 交换 a 和 c
  10.     temp = a;
  11.     a = c;
  12.     c = temp;
  13. }
  14. else if (b > c) { // 如果前两个有一个执行了,这里也会被跳过!
  15.     // 交换 b 和 c
  16.     temp = b;
  17.     b = c;
  18.     c = temp;
  19. }

  20. printf("结果: %d %d %d\n", a, b, c); // 结果很可能是错误的!
复制代码


**会发生什么?**
假设输入是 `3, 2, 1`。
1.  第一个条件 `if (3 > 2)` 为真,执行交换。现在顺序变为 `a=2, b=3, c=1`。
2.  因为第一个 `if` 被执行了,程序直接跳过后面所有的 `else if`,直接去执行 `printf`。
3.  最终输出的顺序是 `2, 3, 1`,这显然不是从小到大排序的!

**问题就在于**,我们本来需要执行后续的 `(a > c)` 和 `(b > c)` 的判断来进一步调整顺序,但 `else if` 的机制阻止了这一切的发生。

---

### 总结

| 特性 | 多个独立的 `if` | `if else if` 链 |
| :--- | :--- | :--- |
| **执行方式** | 顺序执行,每一个都会判断 | 互斥执行,只选其一 |
| **适用场景** | **需要执行多个操作**时(比如排序的多个步骤) | **从多个选项中选择一个**时(比如成绩分级、菜单选择) |
| **类比** | 做菜的多个步骤:洗菜、切菜、炒菜 | 选择题:A、B、C、D 只能选一个 |

所以,在你的排序问题里,你需要的是“完成多个任务”,而不是“选择一个分支”,所以必须使用多个独立的 `if` 语句。

希望这个解释能彻底解决你的疑惑!思考得非常深入,继续加油!

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

使用道具 举报

 楼主| 发表于 前天 00:15 | 显示全部楼层
解释的相当详细,感觉和逻辑思维有点关系,我先记着了,我可以看懂你的解答,但是今后再遇到不敢保证是否会写,哈哈~~
总之谢谢,晚安了~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 00:16 | 显示全部楼层
但求过程001 发表于 2025-09-08 00:15
解释的相当详细,感觉和逻辑思维有点关系,我先记着了 ...


不客气,你能看懂就说明已经理解了这个核心概念,这本身就是非常大的进步!

你的感觉非常准,这确实和逻辑思维密切相关。编程本质上就是把一个大问题拆解成多个小步骤(用独立的 `if` 实现),或者是在多个可能性中选择一条路(用 `if else if` 实现)。

刚开始不敢写太正常了,所有人都这样。最好的学习方法就是:

1.  **多写**:哪怕照着例子敲一遍,运行一下,看看结果,手感就来了。
2.  **从简单开始**:先写两个数的排序,彻底搞明白后,再挑战三个数。
3.  **画图或口头解释**:写代码前,先在纸上画画流程图,或者自己像老师一样把步骤讲一遍。你能把这个过程讲清楚,代码自然就写出来了。

你已经发现了学习编程的关键——不只是看懂,还要理解背后的“为什么”。保持这个习惯,你一定会进步神速的。

晚安,好梦!下次遇到问题随时再来。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-10 06:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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