一、程序需求与设计思路
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;
}
逐行解析
-
变量定义 :使用
float类型而非int,因为考试成绩可能包含小数(如88.5分) -
输入处理 :
scanf("%f", &score)读取浮点型数据,注意变量前必须加地址符& -
分支逻辑:
-
先判断非法输入(>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");
}
五、知识点总结与拓展
-
多分支if-else if结构:适用于多个互斥条件的判断,条件应按逻辑顺序排列(如从高到低、从特殊到一般)
-
区间判断 :必须使用逻辑与
&&连接两个关系表达式,不能直接使用数学中的连续不等式 -
关系运算符:结合性自左至右,结果为逻辑值(0为假,非0为真)
-
空语句:慎用空语句,避免因误加分号导致逻辑错误
-
拓展 :本程序也可使用
switch语句实现,但需要先将分数转换为整数区间(如score/10),适合分支更多的场景
参考出处
-
谭浩强《C程序设计(第五版)》第4章 选择结构程序设计
-
4.2 if语句实现选择结构
-
4.3 关系运算符和关系表达式
-
4.4 逻辑运算符和逻辑表达式
-
-
郝斌C语言自学入门教程 第5章 流程控制