某学校举办“十佳歌手大奖赛”,经过选拔最终参赛选手有 25 人,评委 10 人,最终计分规则为去掉一个最高分去掉一个最低分作为该参赛选手的最终得分,并输出该得分。如果单个评委可给满分为 10 分,则相关说法正确的是( )。
float total_score, max_score, min_score, now_score;
for (int i = 0; i < 25; i++) {
max_score = 0; // 记录最高分
min_score = 10; // 记录最低分
total_score = 0; // 记录总分
for (int j = 0; j < 10; j++) {
cin >> now_score; // 录入评委打分
max_score = max(max_score, now_score); // L1
min_score = min(min_score, now_score); // L2
total_score += now_score;
}
cout << (total_score - max_score - min_score);
}答案C。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。
整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。
【考点】循环控制|max/min极值统计|运算符等价性
🎯 考纲定位 本题考查 GESP 大纲中"循环与数组"模块,属于二级必考内容。命题人用"去极值"这个经典需求,卡住的是学生是否理解"统计极值"与"排序极值"的本质区别,以及是否知道 max/min 函数在循环中的正确初始化时机。
🧠 解题思维 看到题先想"要去掉一个最高分和一个最低分",关键观察是"最高分"和"最低分"是动态统计出来的,不是预先知道。每一步推理的依据是:循环里每读一个分数,都要更新当前遇到的最高和最低,因此 max 和 min 必须在内层循环里实时维护,而外层循环每次处理一个选手时,都要重置 max、min 和 total_score,否则前一个选手的数据会污染下一个选手。所以正确的做法是内层循环里初始化 max=0, min=10, total=0,然后内层循环里更新 max、min 和累加 total。
🪤 陷阱拆解 选项 A 说"需要排序",这是偷换概念——去极值不需要排序,只需要记录极值即可。选项 B 说"三行代码应移到外层循环外",这会导致每个选手的 max 和 min 被上一个选手的数据覆盖,完全错误。选项 C 指出 L1 和 L2 可以改成 if 或?:,这是正确的,因为 max 和 min 函数本质就是 if 判断,两种写法等价。选项 D 说"+="不能写成赋值",这是绝对化表述,C++ 里+=和赋值是完全等价的,只是写法不同。
🔄 反命题思维 如果把"去掉一个最高分和一个最低分"改成"去掉前两个最高分",那程序逻辑就要变——需要保留两个最大值,排序或多次遍历;如果把"去掉"改成"取最低分",那只需要维护 min 即可,max 可以省略。刷到类似题时,先问自己"命题人想考我什么",比如"max/min 的初始化时机""+=与赋值的等价性""排序与统计的区别"等,避免被表面文字迷惑。