【加试题】某对分查找算法的VB程序段如下:
key = Val(Text1.Text)
i = 1: j = 10
Text2.Text = ""
Do While i <= j
m = Int((i + j) / 2 + 0.5)
If key = a(m) Then Exit Do 'Exit Do表示退出循环
If key < a(m) Then j = m - 1 Else i = m + 1
Text2.Text = Text2.Text + Str(a(m))
Loop数组元素a(1)到a(10)的值依次为“8,17,24,30,36,40,55,58,61,66”,文本框Text1中输入的值是30,执行该程序段,文本框Text2中显示的是
这题就是让你当个‘人肉编译器’,把代码里的二分查找过程在纸上一步步模拟出来。拿到题先圈出初始的 i=1, j=10 和 key=30,然后死磕那个 mid 的计算公式:Int((i+j)/2+0.5)。每次循环只盯住三个动作:算 mid、比大小、更新边界,顺便把 a(mid) 的值记下来拼到 Text2 里。千万别一上来就背结论,老老实实按循环迭代推,这样就不会被选项里的数字顺序绕晕。
最容易栽跟头的地方是那个 mid 的取值。很多同学看到 (i+j)/2 就以为直接除,忘了 VB 里 Int 函数的特性:Int(x) 是向下取整。题目特意加了个 +0.5,就是为了把中点向上取整(比如 (1+10)/2=5.5,加 0.5 变 6,Int 后就是 6)。如果你按常规四舍五入或者向下取整算错 mid,后面 i 和 j 的更新就会全错,Text2 里输出的数字顺序自然也就跟正确答案对不上。另外,有些同学会忽略循环终止条件 i<=j,或者在 key 等于 a(m) 时忘记 Exit Do,导致多输出一堆数字,这也是个典型坑。
这道题考查的是二分查找(对分查找)算法在 VB 中的实现细节,特别是中点计算的取整规则以及循环过程中的状态更新。命题人特意在 mid 计算公式里加了个 +0.5,就是为了测试学生是否真正理解 Int 函数的向下取整特性,以及这种写法等价于向上取整的数学含义。很多学生看到 (i+j)/2 就习惯性地想成四舍五入,或者误以为 Int 只是去掉小数部分,结果在计算 (1+10)/2=5.5 时,如果没加 0.5 直接 Int 就是 5,加了 0.5 变成 6,正好是向上取整。这个细节就是命题人埋的第一个坑。拿到题,首先要明确数组 a 是有序的:8,17,24,30,36,40,55,58,61,66,共 10 个元素。key 输入的是 30,我们目标是找到 30 在数组中的位置,同时程序会把每次查找到的中间值 a(m) 拼接到 Text2.Text 后面,用空格分隔。现在我们来一步步模拟循环。
初始状态:i=1, j=10, Text2.Text=""。
第一次循环:i<=j 成立。计算 m = Int((1+10)/2 + 0.5) = Int(5.5+0.5) = Int(6) = 6。此时 a(6) = 40。比较 key(30) 与 a(6)(40),30 < 40,所以 j = m - 1 = 5。Text2 拼接 a(6),即 Text2.Text = "40"。
第二次循环:i=1, j=5,i<=j 成立。计算 m = Int((1+5)/2 + 0.5) = Int(3+0.5) = Int(3.5) = 3。此时 a(3) = 24。比较 key(30) 与 a(3)(24),30 > 24,所以 i = m + 1 = 4。Text2 拼接 a(3),即 Text2.Text = "40 24"。
第三次循环:i=4, j=5,i<=j 成立。计算 m = Int((4+5)/2 + 0.5) = Int(4.5+0.5) = Int(5) = 5。此时 a(5) = 36。比较 key(30) 与 a(5)(36),30 < 36,所以 j = m - 1 = 4。Text2 拼接 a(5),即 Text2.Text = "40 24 36"。
第四次循环:i=4, j=4,i<=j 成立。计算 m = Int((4+4)/2 + 0.5) = Int(4+0.5) = Int(4.5) = 4。此时 a(4) = 30。比较 key(30) 与 a(4)(30),相等,触发 Exit Do,循环结束。
最终 Text2.Text 的内容是 "40 24 36",对应选项 B。整个过程中,mid 的计算始终遵循向上取整规则,这是 VB 里 Int((i+j)/2+0.5) 的标准写法,用来处理奇数长度区间的中点问题。如果学生误以为 mid 是向下取整,第一次循环就会算出 m=5,a(5)=36,后续路径全偏,Text2 就会变成 "36 24" 之类的错误结果,正好对应选项 C 或 D 的干扰项。另外,题目里 Text2.Text 初始化为空字符串,每次循环都用 += 拼接,所以输出顺序就是查找过程中访问的 mid 值的顺序,而不是最终找到的位置,这点也要特别注意。从考频趋势看,二分查找在近年信息技术考试中属于高频考点,尤其是涉及具体代码模拟和边界条件处理的题目,往往要求学生不仅懂原理,还要能精确复现每一步的逻辑。预测未来命题可能会继续在这个方向挖坑,比如改变数组长度、调整 key 的值,或者在循环条件里加一些额外的逻辑判断,但只要抓住 mid 计算和状态更新这两条主线,就能稳稳拿分。