C语言学习笔记 - 57.流程控制11 - 选择7 - if举例 - 成绩等级判定

一、程序需求与设计思路

1. 功能需求

编写程序实现考试成绩等级自动判定

  • 输入一个考试成绩(支持小数)

  • 按以下规则输出对应等级:

    • 90 ≤ 成绩 ≤ 100:优秀(A)

    • 80 ≤ 成绩 < 90:良好(B)

    • 60 ≤ 成绩 < 80:及格(C)

    • 0 ≤ 成绩 < 60:不及格(D)

  • 处理非法输入:

    • 成绩 > 100:输出"输入错误:成绩不能超过100分"

    • 成绩 < 0:输出"输入错误:成绩不能为负数"

2. 算法设计

采用多分支if-else if结构,按分数从高到低依次判断,保证每个分数只匹配一个分支。

二、核心语法易错点:区间判断的正确写法

1. 错误写法分析

数学中的区间表达式不能直接移植到C语言中 。例如,数学上的 90 ≤ score ≤ 100不能直接写成:

复制代码
90 <= score <= 100 // 错误写法!

错误原因

  • C语言中关系运算符的结合性是自左至右

  • 第一步计算 90 <= score,结果是逻辑值:真为1,假为0

  • 第二步计算 (90 <= score) <= 100,无论第一步结果是0还是1,都满足<=100,因此整个表达式永远为真

验证代码

复制代码
#include <stdio.h>
int main() {
    float score = 0;
    printf("表达式90<=score<=100的值为:%d\n", 90 <= score <= 100); // 输出1
    score = -10;
    printf("表达式90<=score<=100的值为:%d\n", 90 <= score <= 100); // 输出1
    return 0;
}

2. 正确写法

使用**逻辑与运算符&&**连接两个关系表达式,只有两边都为真时,整个表达式才为真:

复制代码
score >= 90 && score <= 100 // 正确写法

三、完整代码实现与逐行解析

复制代码
#include <stdio.h>

int main() {
    // 定义浮点型变量存储成绩,支持小数输入
    float score;
    
    // 提示用户输入
    printf("请输入您的考试成绩:");
    // 读取用户输入的浮点数
    scanf("%f", &score);
    
    // 多分支条件判断
    if (score > 100) {
        printf("输入错误:成绩不能超过100分\n");
    }
    else if (score >= 90 && score <= 100) {
        printf("等级:优秀(A)\n");
    }
    else if (score >= 80 && score < 90) {
        printf("等级:良好(B)\n");
    }
    else if (score >= 60 && score < 80) {
        printf("等级:及格(C)\n");
    }
    else if (score >= 0 && score < 60) {
        printf("等级:不及格(D)\n");
    }
    else { // 剩余情况:score < 0
        printf("输入错误:成绩不能为负数\n");
    }
    
    return 0;
}

逐行解析

  1. 变量定义 :使用float类型而非int,因为考试成绩可能包含小数(如88.5分)

  2. 输入处理scanf("%f", &score)读取浮点型数据,注意变量前必须加地址符&

  3. 分支逻辑

    • 先判断非法输入(>100),再从高到低判断各分数段

    • 每个分支的条件严格互斥,避免重叠

    • 最后一个else处理所有剩余情况(<0)

测试用例

输入值 预期输出
95.5 等级:优秀(A)
85 等级:良好(B)
72.3 等级:及格(C)
59 等级:不及格(D)
105 输入错误:成绩不能超过100分
-5 输入错误:成绩不能为负数

四、空语句的陷阱与注意事项

1. 空语句的定义

C语言中,单独一个分号;就是一个空语句,它不执行任何操作。

2. 常见错误

if语句的条件后误加分号,会导致if的语句体变为空语句,后续代码将无条件执行

复制代码
// 错误写法
if (score > 100); // 这里的分号将if语句体变成了空语句
printf("输入错误:成绩不能超过100分\n"); // 无论条件是否成立,都会执行

错误原因

  • if(score>100);是一个完整的if语句,语句体是空语句

  • 后面的printf成为独立语句,与前面的if无关

3. 正确写法

复制代码
if (score > 100) {
    printf("输入错误:成绩不能超过100分\n");
}

五、知识点总结与拓展

  1. 多分支if-else if结构:适用于多个互斥条件的判断,条件应按逻辑顺序排列(如从高到低、从特殊到一般)

  2. 区间判断 :必须使用逻辑与&&连接两个关系表达式,不能直接使用数学中的连续不等式

  3. 关系运算符:结合性自左至右,结果为逻辑值(0为假,非0为真)

  4. 空语句:慎用空语句,避免因误加分号导致逻辑错误

  5. 拓展 :本程序也可使用switch语句实现,但需要先将分数转换为整数区间(如score/10),适合分支更多的场景

参考出处

  1. 谭浩强《C程序设计(第五版)》第4章 选择结构程序设计

    • 4.2 if语句实现选择结构

    • 4.3 关系运算符和关系表达式

    • 4.4 逻辑运算符和逻辑表达式

  2. 郝斌C语言自学入门教程 第5章 流程控制