师:同学们,大家好,现在我们开始学习《算法与程序设计》第四章第三节——查找算法设计。提到查找,同学们能想到哪些相关的事情呢?比如查找邮件、信件,在网上查找信息、招聘广告,查找成绩以及电话归属地等。可以说,我们每天都在进行与查找有关的活动。那么,什么是查找呢?通过上述例子,我们可以总结:查找就是在一组对象中搜索某一目标,确定对象中是否存在这一目标。若有,则标出它的位置;若没有,则给出没有的信息。
了解了查找的概念,那么在计算机中它是如何实现的呢?接下来,我们通过一个小任务探究一下。某高二一班第一组有 6 名同学,分别是陈娜、程金、韩虎、朱萌、赵龙、李杰。我们要编写一个程序,查找某同学是否是该组的成员。
同学们还记得编制程序解决问题的一般步骤吗?我们一起来说一下,是分析问题、设计算法、编写程序、调试程序,最后测试结果。
那我们就先从分析问题讲起。针对这个问题,我们要找出已知条件和未知条件。已知条件是有 6 名同学,知道他们的名字;未知条件是要查找某同学是否在该组中。要实现查找某位同学是否在该组中,根据查找算法的思想,我们得建立一组查找对象,也就是这 6 名同学。现在问题来了,如何将这 6 名同学的姓名存储到程序中以便查找呢?同学们可以思考一下,是不是能用以前的办法,给每个同学都定义一个变量?但如果对象比较多,定义很多变量显然不是好方法。
其实在查找过程中,遇到大量同类型数据时,为方便查找,我们往往会把这些同类型的数据放在一个数组中。那什么是数组呢?又该如何声明数组?数组就是具有相同类型变量的集合,它的定义格式与之前学过的变量有相通之处。定义时,首先有 dim,这里要注意,定义的是数组变量,由数组名和数组下标组成,并且有数据类型。
知道了定义格式,那如何定义一个数组来存放 6 名同学的姓名呢?可以套用格式,先 dim,定一个变量名,数组名的定义方式和变量名一样,这里我们定义为 dim d。有 6 个数值,所以可以定义从 1 到 6,数据类型是字符串类型,因为要存储姓名。这里 d 是数组名称,1 是下标的下界,6 是下标的上界。这样就在内存中给数组分配了空间,方便存入数据。
同学们想一想,还有其他定义方式吗?中括号部分其实可以省略,有时我们会省略掉下标的下界。比如可以定义成 d(5),有的同学可能会疑惑,为什么是 5 呢?因为省略下标时,下标默认为 0,所以从 d(0) 这个元素开始,到 d(5) 刚好是 6 个元素。大家要注意,千万别直接写成 d(6),不然就有 7 个元素了。
知道了如何定义数组,那分配好空间后,如何对这些空间填充值呢?这就涉及数组的赋值,数组赋值有两种情况。对于少数元素的数组,可以通过单个赋值语句进行输入赋值;如果元素较多,就可以利用之前学过的 for 语句和 input box 进行输入。
那如何对 6 名同学的变量进行赋值呢?我们打开 VV 演示一下。这里定义了一个数组,由 1 - 6 这 6 个元素组成,由于人数少,我们可以像平时给变量赋值一样,直接对这六个元素进行赋值。同学们思考一下,如果要定义一个 1 - 100 个元素的数组,该怎么做呢?可以将数组下标上界直接改为 100,这样就有了 100 个数组元素。对于这 100 个数组元素,一个一个赋值效率太低,我们可以借助 for 循环语句。for i = 1 to 100,进行 100 次循环,然后 d(i) = i,将 i 的值赋值给变量,再 next i。当然,显示部分也要改成 100,这样就能把 1 - 100 的值快速赋给 1 - 100 个数组元素了。这就是数组赋值的两种形式,既可以像给变量赋值一样直接赋值,也可以利用循环语句赋值。
现在知道如何对数据赋值,能将 6 名同学的名称存储到程序中形成查找对象了,接下来看看如何查找。假设以朱萌同学为例,看看查找过程。首先定义一个数组存放名称作为查找对象,然后要查找朱萌,就给朱萌定义一个关键值,用 key 表示并赋值。有了数据和要找的关键值,怎么查找呢?是从中间查,还是随机查?有同学说从第一位开始找,非常好。
我们从第一位陈娜同学开始,与 key 进行对比,看是否是要找的值,显然不相同。不相同就继续找第二位,依次类推,当找到第四位时,发现值一样,这就说明查找成功。像这样从前往后依次逐个查找,如果找到了就显示成功,找不到就继续执行,直到数据全部找完,这种查找方式称为顺序查找。顺序查找是一种简单的查找方式,查找时一般从数据的第一位开始,按照数据顺序,查找时要注意与关键词对比是否匹配,匹配则查找成功,查到最后都没找到匹配值,就说明查找失败。
