但求过程001 发表于 2025-9-7 23:31:21

求助~

#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,回车,下面没有任何结果。。。。。
而我是看教学视频后打的这个程序,和视频上的一样,视频上就输入有反应,我这也没哪错呀,为啥没有输出。。。。。

但求过程001 发表于 2025-9-7 23:32:03

按理,我输入一个分数,例如79,应该输出C才是对的~~回车后啥也没显示

FishC 发表于 2025-9-7 23:32:53

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

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

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

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


#include <stdio.h>

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

    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;
}


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

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

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

但求过程001 发表于 2025-9-7 23:46:38

感谢解答,我的程序没有输出就是出错在scanf这里,不能加\n,我也不知道为啥,可能是我想多了,哈哈
void main() 和 int main() return 0; 有什么区别吗?
还有,score >=60这种写法没有错?我开始也是这样写的,后来看视频将>=分开写了,我以为>=是语法错误,就没敢用,呵呵

FishC 发表于 2025-9-7 23:47:46

但求过程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 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 2025-9-7 23:56:09

谢谢

FishC 发表于 2025-9-7 23:56:30

但求过程001 发表于 2025-09-07 23:56
谢谢

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

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

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

祝你学习愉快,加油!

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

但求过程001 发表于 2025-9-8 00:00:04

还有个问题我没理解过来,将3个数字从小到大排列,用if if if实现,为什么不能用if else if .....

FishC 发表于 2025-9-8 00:01:29

但求过程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` 会在**新的数值基础上**继续进行判断和可能的交换。

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

**代码示例:**
#include

int main() {
    int a, b, c, temp;

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

    // 三个独立的 if 语句
    if (a > b) { // 第一步:确保a<=b
      temp = a;
      a = b;
      b = temp;
    }
    if (a > c) { // 第二步:在第一步的基础上,确保a<=c。现在a已经是a和b中较小的那个了。
      temp = a;
      a = c;
      c = temp;
    }
    if (b > c) { // 第三步:在前两步的基础上,确保b<=c。
      temp = b;
      b = c;
      c = temp;
    }

    printf("从小到大排列: %d %d %d\n", a, b, c);
    return 0;
}
**执行逻辑:**
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` 来排序:

// 错误的示范!
if (a > b) {
    // 交换 a 和 b
    temp = a;
    a = b;
    b = temp;
}
else if (a > c) { // 如果第一个if执行了,这里就直接被跳过了!
    // 交换 a 和 c
    temp = a;
    a = c;
    c = temp;
}
else if (b > c) { // 如果前两个有一个执行了,这里也会被跳过!
    // 交换 b 和 c
    temp = b;
    b = c;
    c = temp;
}

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 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 2025-9-8 00:15:49

解释的相当详细,感觉和逻辑思维有点关系,我先记着了,我可以看懂你的解答,但是今后再遇到不敢保证是否会写,哈哈~~
总之谢谢,晚安了~~

FishC 发表于 2025-9-8 00:16:20

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

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

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助~