← 课程目录
第 7 讲 模块二:让程序做判断

实战:成绩等级判断器

7 / 24
💡
本节课目标
今天不学新语法,而是把前两讲的 if / else if / && / || / ! 全部用进一个完整程序:输入分数,输出 A / B / C / D / E 五档等级, 还要处理“分数不在 0~100 之间”这种不合法的输入。
开场

从两条路到一个项目

📖 理论讲解

模块二回顾

第 5 讲:bool、比较运算符、if / else——两条路选一条。 第 6 讲:else if 串出多条路,&&||! 组合条件。

今天把它们拼成一个真正的小程序——这是模块二的收尾实战。

需求

成绩等级判断器要做什么

📖 理论讲解

分级标准

分数区间等级
90 ~ 100A
80 ~ 89B
70 ~ 79C
60 ~ 69D
0 ~ 59E

另外:如果输入的分数小于 0 或大于 100,要输出错误提示,不参与分级。

设计

动手前先想清楚两件事

📖 理论讲解

顺序方向:从高到低,还是从低到高?

第 6 讲练习里提到过:else if 链可以用 >= 从高到低写, 也可以用 < 从低到高写,但方向和顺序必须搭配一致

这次选从高到低,用 >=:先问“够不够 90 分”, 不够再问“够不够 80 分”……这更接近“达到多少分算什么等级”的直觉。

📖 理论讲解

校验放在最前面:提前 return

return 0; 从第 1 讲就在用,但它不一定要写在 main 的最后一行—— 写在中间也行,效果是立刻结束 main,后面的代码都不执行

把范围校验放在最前面,不合法就提前 return,后面的分级代码就不用再考虑“分数会不会超范围”:

early_return.cpp CPP
if (!(score >= 0 && score <= 100)) {
    std::cout << "输入错误:分数必须在 0 到 100 之间" << std::endl;
    return 0;     // 直接结束 main,下面的代码都不会执行
}
实现

完整代码

grade_classifier.cpp CPP
#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

测试

边界值测试清单

⚡ 动手实操 约 15 分钟

逐个输入,验证输出是否符合预期

把代码跑起来,依次输入下面这些值,检查输出是否和“期望输出”一致:

输入期望输出
100等级:A
90等级:A
89等级:B
80等级:B
79等级:C
69等级:D
59等级:E
0等级:E
-1输入错误
101输入错误
💡
为什么测这些值
90/89、80/79 这类相邻边界最容易出错——如果哪一对的输出反了, 说明 >=> 用混了,或者顺序写错了。
拓展

再加点东西

练习 7-1

细分等级:A+ / A / A-

把 A、B、C、D 分别再细分成三档(+ / 不带符号 / -),E 不细分。 比如 A 可以分成:

  • 97 ~ 100:A+
  • 93 ~ 96:A
  • 90 ~ 92:A-

B/C/D 的细分边界自己定,不要求和 A 一样的比例。

提示
细分后 else if 链会变长很多(十几个分支),顺序还是从高到低, 和原来的判断逻辑是同一种思路,只是粒度更细。
练习 7-2

加权平均分

分别输入期中、期末分数,期中占 40%、期末占 60%,算出加权平均分后再判断等级。

weighted_avg.cpp CPP
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 链即可)。

💡
想一想
avgdouble,但 9080 这些边界写的是整数—— avg >= 90 这样比较没问题吗?如果 avg 算出来是 89.999... 呢?
小结

模块二回顾

📖 理论讲解

第 5~7 讲,你掌握了

讲次核心内容
第 5 讲bool、比较运算符、if / else
第 6 讲else if 多分支、&& || !
第 7 讲综合实战:输入校验 + 多档分级

程序现在能“看情况办事”了。但所有程序都还是从头跑到尾,只走一次

💡
下节课预告
如果要反复输入直到猜中数字、或者反复累加直到满足条件,“只走一次”就不够了—— 需要循环。模块三从 while 开始。