if / else if / && / || / !
全部用进一个完整程序:输入分数,输出 A / B / C / D / E 五档等级,
还要处理“分数不在 0~100 之间”这种不合法的输入。
if / else if / && / || / !
全部用进一个完整程序:输入分数,输出 A / B / C / D / E 五档等级,
还要处理“分数不在 0~100 之间”这种不合法的输入。
第 5 讲:bool、比较运算符、if / else——两条路选一条。
第 6 讲:else if 串出多条路,&&、||、! 组合条件。
今天把它们拼成一个真正的小程序——这是模块二的收尾实战。
| 分数区间 | 等级 |
|---|---|
| 90 ~ 100 | A |
| 80 ~ 89 | B |
| 70 ~ 79 | C |
| 60 ~ 69 | D |
| 0 ~ 59 | E |
另外:如果输入的分数小于 0 或大于 100,要输出错误提示,不参与分级。
第 6 讲练习里提到过:else if 链可以用 >= 从高到低写,
也可以用 < 从低到高写,但方向和顺序必须搭配一致。
这次选从高到低,用 >=:先问“够不够 90 分”,
不够再问“够不够 80 分”……这更接近“达到多少分算什么等级”的直觉。
return 0; 从第 1 讲就在用,但它不一定要写在 main 的最后一行——
写在中间也行,效果是立刻结束 main,后面的代码都不执行。
把范围校验放在最前面,不合法就提前 return,后面的分级代码就不用再考虑“分数会不会超范围”:
if (!(score >= 0 && score <= 100)) {
std::cout << "输入错误:分数必须在 0 到 100 之间" << std::endl;
return 0; // 直接结束 main,下面的代码都不会执行
} #include <iostream>
int main() {
int score;
std::cout << "请输入分数(0~100):";
std::cin >> score;
// 先校验范围,不合法就提前结束
if (!(score >= 0 && score <= 100)) {
std::cout << "输入错误:分数必须在 0 到 100 之间" << std::endl;
return 0;
}
// 从高到低逐档判断
if (score >= 90) {
std::cout << "等级:A" << std::endl;
} else if (score >= 80) {
std::cout << "等级:B" << std::endl;
} else if (score >= 70) {
std::cout << "等级:C" << std::endl;
} else if (score >= 60) {
std::cout << "等级:D" << std::endl;
} else {
std::cout << "等级:E" << std::endl;
}
return 0;
}
第一个 if 用 !(score >= 0 && score <= 100)
校验范围——“不在 0 到 100 之间”就报错并 return。
走到第二个 if 时,score 一定在 0~100 之间,
所以 else 分支可以放心地代表“E”,不用再写 score >= 0。
把代码跑起来,依次输入下面这些值,检查输出是否和“期望输出”一致:
| 输入 | 期望输出 |
|---|---|
| 100 | 等级:A |
| 90 | 等级:A |
| 89 | 等级:B |
| 80 | 等级:B |
| 79 | 等级:C |
| 69 | 等级:D |
| 59 | 等级:E |
| 0 | 等级:E |
| -1 | 输入错误 |
| 101 | 输入错误 |
>= 和 > 用混了,或者顺序写错了。
把 A、B、C、D 分别再细分成三档(+ / 不带符号 / -),E 不细分。
比如 A 可以分成:
B/C/D 的细分边界自己定,不要求和 A 一样的比例。
else if 链会变长很多(十几个分支),顺序还是从高到低,
和原来的判断逻辑是同一种思路,只是粒度更细。
分别输入期中、期末分数,期中占 40%、期末占 60%,算出加权平均分后再判断等级。
double midterm, final_exam;
std::cout << "期中分数:";
std::cin >> midterm;
std::cout << "期末分数:";
std::cin >> final_exam;
double avg = midterm * 0.4 + final_exam * 0.6;
std::cout << "加权平均:" << avg << std::endl;
if (avg >= 90) {
std::cout << "等级:A" << std::endl;
} else if (avg >= 80) {
// ... 后面照抄 grade_classifier.cpp 的逻辑
} 要求:把省略的部分补全(照抄 grade_classifier.cpp 的 else if 链即可)。
avg 是 double,但 90、80 这些边界写的是整数——
avg >= 90 这样比较没问题吗?如果 avg 算出来是 89.999... 呢?
| 讲次 | 核心内容 |
|---|---|
| 第 5 讲 | bool、比较运算符、if / else |
| 第 6 讲 | else if 多分支、&& || ! |
| 第 7 讲 | 综合实战:输入校验 + 多档分级 |
程序现在能“看情况办事”了。但所有程序都还是从头跑到尾,只走一次。
while 开始。