图形化编程(源码):二分查找法查学号

-
当“开始”被点击
就像游戏里的“开始按钮”,点一下,程序就运行。 -
询问“请输入你要查询的学号”并等待
电脑会问你要查哪个学号,你输入数字,然后电脑等着你输完。 -
设置变量“学号”的值为“获得答复”
把你刚才输入的学号,存进一个叫“学号”的小盒子里。 -
重置计时器
让计时器归零,准备重新计时。 -
开始计时器
计时器开始跑秒。 -
重复执行直到……
一直重复做里面的动作,直到某个条件满足才停下。 -
最大值、最小值
这是两个“小盒子”,用来记录查找范围。
一开始,最大值是列表的长度(最后一项的位置),最小值是1(第一项的位置)。 -
设置变量“查找”的值为:四舍五入((最大值+最小值)/2)
在最大值和最小值的中间找一个位置(取中间数,四舍五入)。 -
如果“学号列表”的第“查找”项 = 学号
看看中间这个位置上的学号,是不是你要找的那个。 -
设置变量“最大值”的值为“查找”
如果中间项比要找的学号大,说明要找的学号在左边,就把最大值改成中间位置。 -
否则如果“学号列表”的第“查找”项 < 学号
如果中间项比要找的学号小,说明要找的学号在右边。 -
设置变量“最小值”的值为“查找”
把最小值改成中间位置。 -
否则
如果不是大于也不是小于,那就是等于(找到了)。 -
对话:把“学号在列表的第”、“查找”、“行”放在一起
告诉你在第几行找到了这个学号。 -
退出循环
找到了就停止重复查找。 -
如果“最大值” < “最小值”
如果查找范围缩小到没有了(最小值反而比最大值大),说明找不到。 -
对话“未查到学号”并持续2秒
告诉你要找的学号不存在。 -
停止计时器
程序结束,计时器停止。


一、先理解“查找范围”
想象你手里有一排按学号从小到大排好的卡片:
|
|
|
|
|
|
|
|
|
|---|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
-
最小值:左边能查到的位置(一开始是1)
-
最大值:右边能查到的位置(一开始是7)
查找范围就是:从“最小值”位置 到 “最大值”位置 这一块区域。
二、正常查找过程(以找学号 8 为例)
-
最小值=1,最大值=7
中间位置 = (1+7)/2 = 4
位置4的学号是12,比8大 → 所以学号8在左边 → 最大值变成4 -
现在最小值=1,最大值=4
中间位置 = (1+4)/2 = 2(四舍五入)
位置2的学号是5,比8小 → 所以学号8在右边 → 最小值变成2 -
现在最小值=2,最大值=4
中间位置 = (2+4)/2 = 3
位置3的学号是8 → 找到了!
三、为什么“差等于1”就查不到了?
关键原因在于:列表里的位置都是整数,而且程序用的是“四舍五入”取中间位置。
举个例子(还是找不存在的学号10)
|
|
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
第4步结束时:因为当差=1时,中间位置 = (3+4)/2 = 3.5 → 四舍五入 = 4
但位置3和位置4之间的“中间”已经没有整数位置可以新查了,
而且这两个位置在上一步已经比较过了,找不到就是真的找不到。
夜雨聆风