(1)。
“Ifa(m)=Key”的情况下,是找到了关键词,因此直接输出结果,所以
(1)处填②。
a(m)>=a(l),那么a(m)一定在左侧升序段,可以肯定[l,m]这一段是严格递增的,此时如果a(m)>KeyAnda(l)<=Key,则能得到结论key一定在[l,m]这一段里,否则就是在a(m)的右边;a(m)=Key,则能得到结论key一定在[m,r]这一段里,否则就是在a(m)的左边。
11.査找并删除重复数据的算法是对数组a中每个元素逐个作为关键字进行从后往前查找,如果有重复,删除该数据后继续查找。
例如,第一次将a
(1)作为关键字,从a(10)到a
(1)进行逐个查找,如果和a
(1)相等,则删除该数据,然后继续查找;如果是a
(1)本身和它相等,则代表无重复数据。
编写VB程序,程序功能如下:
运行程序时,在列表框List1中显示数组a中的原始数据;单击“去除重复”按钮(Command1),在列表框List2中输出去除重复后的数组a中的数据,同时在标签Label1中显示删除的数据总个数,运行效果如图所示。
请回答下列问题:
(1)当数组a中的值依次为1,2,3,7,8,1,6,6,8,7时,共删除数据 (填写数值)个。
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Constmaxn=10
Dima(1Tomaxn)AsInteger
PrivateSubForm_Load()
’maxn个数据存储在数组a中,并在列表框List1中显示
’代码略
EndSub
PrivateSubCommand1_Click()
DimiAsInteger,nAsIntegern用于存储当前査找的数组长度
DimjAsInteger,keyAsIntegerkey用于存储本次查找关键字的数据位置
key=1:
n=maxn
DoWhilekey<=n
i=n
DoWhilea(i)<>a(key)
①
Loop
Ifi=keyThen未找到,重新下一査找关键字
key=key+1
Else找到重复数据,删除
Forj=iTon-1
②
Nextj
n=n-1
EndIf
Loop
Fori=1Ton
List2.AddItemStr(a(i))
Nexti
Label1.Caption=“共删除数据”+ ③ +“个”
EndSub
答案
(1)4
(2)①i=i-1 ②a(j)=a(j+1) ③Str(maxn-n)
解析
(1)略。
(2)①从底部开始逐个与a(key)比较,例如key=1时,a(10),a(9),…,a(i),…,a
(2)逐个与a
(1)比较,即数组下标递减i=i-1,若a(i)=a(key),则找到相同,循环结束。
②上面a(i)=a(key)循环结束后,若i=key,则意味着没有重复元素。
例如key=1时,只有a
(1)=a
(1),没有其他元素和a
(1)相等,就没有重复元素。
否则,意味着有重复元素,则需要去除重复元素。
后面的元素依次往前移动,即a(j)=a(j+1)。
③由于maxn是总共的数据个数,而n是剩下的数字个数,因此删除的数据个数就是Str(maxn-n)。