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

选择题 · 答案 A

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

题目

某班级人数不知,连续输入成绩直到输入负数停止,输入结束后求出平均成绩。在以下 C++ 代码横线处应填入是( )。

double totalScore = 0; // 总分
int studCount = 0; // 总人数
while (________) { // 此处填写代码
    cin >> score;
    if (score < 0)
        break;
    totalScore += score;
    studCount += 1;
}
cout << "平均分=" << totalScore / studCount;
答案:A

解题思维

看到'输入负数停止'且循环体内已有break,第一反应就是while条件要恒真,让循环能跑起来。

常见错误

最容易掉进两个坑:一是把条件写成false,导致循环直接跳过,studCount为0,最后除以0程序崩溃;二是受英语习惯影响选True,C++里布尔常量必须小写,True是语法错误。

详细解析(节选)

这道题考查的是while循环条件的构造,特别是当循环体内已经处理了终止条件(哨兵值)时,循环头该填什么。命题人把'输入负数停止'这个逻辑拆开了:在循环头只负责让循环转起来,把判断负数并break的工作全塞进了循环体里。这种写法就是为了卡住那些机械记忆'先判断再执行'的学生,诱导他们去循环头里写'score >= 0',结果造成逻辑重复且类型不匹配。

拿到题先想什么?看到'连续输入直到负数停止',第一反应是'循环条件应该是什么'。但千万别急着写表达式,先扫一眼循环体:里面已经有'if (score < 0) break;'。这说明负数已经在体内处理了,循环体一定会被执行至少一次。既然体内已经负责'刹车',循环头就只负责'点火',点火条件自然是恒真,让程序一直跑直到体内主动停下。通法:遇到'输入直至遇到特殊值'的题目,若特殊值在体内判断,while条件填true;若特殊值在条件判断,则填对应的表达式。

代入法验证一下选项:B和D填false,循环条件一开始就不成立,循环体一次都不执行,studCount保持0,最后cout输出时totalScore/0会除以0崩溃,这是最致命的边界陷阱。C填True,C++语法里布尔常量必须小写,True是非法的,编译器直接报错。A填true,正确。真正阴险的是命题人把score<0判断放在体内,诱使你以为条件要写!score<0,结果逻辑重复且类型不匹配。

反命题思维也很重要:如果把哨兵值改成'输入0停止',while条件就应填score>0(因为0已在体内处理);若改成'输入非负数停止',条件就应填true依然成立。刷到类似题先问:特殊值是在体内还是条件里处理?这决定了while条件的真假性。

考频与趋势:基础语法在题库共考过1295题,覆盖11个考试级别,逐年分布中2023年287题、2024年413题、2025年401题,说明这类题是高频考点。运算符与表达式共考过261题,其中GESP二级考了70题,占比很高。结合近年考频看,GESP二级对循环控制、布尔常量大小写、以及'体内判断+循环头恒真'这种组合陷阱的考查力度在2023-2025年明显上升,未来可能继续以'完善程序'形式出现,重点考察学生能否识别循环体内的终止逻辑并正确设置循环头。暂无足够依据预测具体年份题目形式变化,但保持对布尔常量大小写和循环条件恒真/假两种模式的敏感度是必须的。

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