小北的身高是 1.65 米。班上有 n 个小朋友,小北想和身高最接近自己的人交朋友。如果有多个小朋友 与小北的身高差相同,小北想和其中身高较矮的第一个小朋友做朋友。横线处应该填入的是( )。
int n, i;
float target, h, best_height, min_diff, diff;cout << "请输入小朋友的人数: ";
cin >> n;
target = 1.65;
best_height = 0.0;
min_diff = 100.0;
for (i = 0; i < n; i++) {cout << "请输入第 " << (i + 1) << " 个小朋友的身高: ";
cin >> h;
if (h > target)
diff = h - target;
else
diff = target - h;
if (diff < min_diff) {
min_diff = diff;
best_height = h;
} else if (diff == min_diff) {
__________________
__________________
}
}cout << "小北的朋友身高为:" << best_height; A.
if (h < best_height)
best_height = h;B.
if (h > best_height)
best_height = h;C.
if (h > target)
best_height = h;D.
if (h >= best_height)
best_height = h;遍历所有身高,计算与目标值的绝对差值。维护当前最小差值和对应身高。遇到更小的差值直接更新;遇到相等差值时,根据题目要求(选较矮者)更新身高。这是典型的"找最值"问题,核心在于正确处理相等情况。
选项 B 和 D 都试图更新身高,但条件写反了——题目要求"较矮者",却用了大于或大于等于,会选到更高的人。选项 C 完全无关。浮点数相等判断看似危险,但在此题中 min_diff 初始化为 100.0,差值不会溢出,且题目设计保证相等时能正确触发,属于二级允许的简化处理。
本题考查 GESP 二级 算法模块 循环结构(第 2 章)与条件判断(第 3 章)的综合运用。命题人卡住的是"找最值"场景下对相等情况的处理——很多考生只关注"更小就更新",却忽略题目特意给出的"较矮优先"规则,导致在 diff 相等时盲目更新,选错答案。
看到题先想"遍历 + 维护最值"。关键观察:diff 是绝对差,min_diff 初始 100.0(足够大),best_height 初始 0.0(足够小)。推理链:1)计算 diff = |h - 1.65|;2)若 diff < min_diff,更新 min_diff 和 best_height;3)若 diff == min_diff,需要判断 h 与 best_height 的大小;4)题目要求"较矮者优先",所以只有当 h < best_height 时才更新。数值推演:假设 target=1.65,best_height=1.70,min_diff=0.05。新来 h=1.60,diff=0.05。diff==min_diff 成立,此时 h(1.60) < best_height(1.70),应更新 best_height 为 1.60。通法:找最值问题,遇到相等时按题目附加条件(如"较矮"、"较早"、"较小")决定更新。