GESP 二级 · GESP 202606 C++ 二级 第 15 题

选择题 · 答案 A · 考点:循环结构

← 整套速查表 GESP 二级 全部真题

题目

某学校举办“校园演讲比赛”,每位选手由 $8$ 位评委打分(分数为 $0 \sim 100$ 的整数),且每位评委必须打分。计分规则:去掉一个最高分,去掉一个最低分。如下程序通过键盘先输入选手编号,然后依次输入 $8$ 个分数,并计算最终得分。下列说法正确的是( )。

for (int i = 0; i < 10; i++) {
    int id, score;
    printf("输入选手编号: ");
    scanf("%d", &id);
    int max_score = 0, min_score = 100; // 最高分和最低分
    int total_score = 0; // 总分
    for (int j = 1; j < 9; j++) {
        printf("输入选手第%d个成绩:", j);
        scanf("%d", &score);
        if (max_score < score)
            max_score = score;
        if (min_score > score)
            min_score = score;
        total_score += score;
    }
    total_score = total_score - max_score - min_score;
    printf("%d号选手的成绩:\
            去掉一个最高分%d,\
            去掉一个最低分%d,\
            最后成绩是:%d", id, max_score, min_score, total_score);
}
答案:A

考点

循环结构

解题思维

在纸上逐行模拟程序执行,重点追踪变量值变化和输出语句。按照题目输入代入计算。正确答案A。

常见错误

关键提醒:C++中的^是异或运算符,不是乘方!2^5=7而非32。这是最高频的错误。

详细解析(节选)

【考点】循环结构|变量初始化|条件判断

1. 🎯 考纲定位 本题属于 GESP 二级《C++ 程序设计》模块第 5 单元"循环结构"的典型应用。命题人卡住的是"变量初始值选取"这一基础细节——很多考生会错误地认为 min_score 应初始化为 0,导致逻辑失效。

2. 🧠 解题思维 看到题先想"去掉一个最高分、去掉一个最低分"的数学本质:用累加器求和,再减去两个极值。关键观察是 max_score = 0, min_score = 100 的初始化逻辑正确:0 是分数下限,100 是上限,这样第一个分数进来就能触发 if 更新。每一步推理依据:for 循环控制输入次数(8 次),if 条件判断更新极值,total_score += score 累加。这一类题的通法是"极值初始化设为边界,循环中动态比较更新,最后从总和减去极值"。

3. 🪤 陷阱拆解 逐个选项拆解:B 错在把 min_score 初值改成 0——若第一个分数就是 0,后续 min_score > score 永远不成立,最低分永远锁在 0,逻辑崩塌;C 错在"必须"二字——< 和 > 已足够,改成 <= 和 >= 虽能覆盖相等情况,但非必需,命题人借此测试你是否理解"严格比较即可";D 错在"不能达到预期"——total_score = total_score - max_score - min_score; 是合法的赋值语句,无需额外变量。题目中最阴险的细节是"必须"这种绝对化表述,以及把 min_score 初值设为 0 这种看似合理实则致命的错误。点破"如果你只背结论、不理解本质,就会掉进这个陷阱"。

4. 🔄 反命题思维 站在命题人视角:如果把 min_score = 100 改成 min_score = 0,答案会变成 B 正确;如果把 < 改成 <=,答案会变成 C 正确;如果把 total_score = total_score - max_score - min_score; 改成 int total = total_score - max_score - min_score; total_score = total;,答案会变成 D 正确。一句话提醒:刷到类似题时,先问自己"命题人想考我什么"——这道题考的就是极值初始化的边界选取。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断