高考信息技术大一轮优选课件+习题 9.docx
- 文档编号:5407981
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:18
- 大小:163.40KB
高考信息技术大一轮优选课件+习题 9.docx
《高考信息技术大一轮优选课件+习题 9.docx》由会员分享,可在线阅读,更多相关《高考信息技术大一轮优选课件+习题 9.docx(18页珍藏版)》请在冰豆网上搜索。
高考信息技术大一轮优选课件+习题9
第九单元 算法的程序实现
单元检测题组
时间:
40分钟
分值:
50分
一、选择题(每题3分,共27分)
1.对包含100个元素递增排序的数组a,采用对分查找法找某关键字,若查找不成功,则关键字的比较次数最多是( )
A.100B.6C.7D.8
答案 C 本题考查对分查找的基本原理。
n个元素中查找不成功的最多比较次数为[log2n]+1。
2.有如下某排序算法程序段:
Fori=1To3
k=i
Forj=i+1To6
Ifa(j)>a(k)Thenk=j
Nextj
t=a(i):
a(i)=a(k):
a(k)=t
Nexti
数组元素a
(1)到a(6)的值依次为“8,2,9,3,5,1”,经过该程序段“加工”后,数组元素a
(1)到a(5)的值依次为( )
A.8,2,9,3,5,1B.9,2,8,3,5,1
C.9,8,5,2,3,1D.9,8,5,3,2,1
答案 D 本题考查排序算法及其程序的实现。
i=1时,代入循环体,计算得到数组元素的值依次为9,2,8,3,5,1。
i=2时,代入循环体,计算得到数组元素的值依次为9,8,2,3,5,1。
i=3时,代入循环体,计算得到数组元素的值依次为9,8,5,3,2,1。
3.某VB程序段如下:
Fori=1To6
j=7
DoWhilej>i
Ifa(j)>a(j-1)Then
a(j)=a(j)+a(j-1)
a(j-1)=a(j)-a(j–1)
a(j)=a(j)-a(j-1)
EndIf
j=j-1
Loop
Nexti
Fori=3To6
s=s+a(i)
Nexti
Label1.Caption=Str(s)
已知数组元素a(l)到a(7)的值依次为“8,2,3,7,10,6,5”,则执行该程序段后,标签Label1中显示的是( )
A.21B.26C.41D.18
答案 A 首先理解a(j)=a(j)+a(j-1),a(j-1)=a(j)-a(j-1),a(j)=a(j)-a(j-1)这三个语句实际上就是将a(j)与a(j-1)两数据交换。
两数交换的经典写法是:
t=a,a=b,b=t。
程序首先实现数组a中的数据降序,得到“10,8,7,6,5,3,2”,而后将a(3),a(4),a(5),a(6)的值相加输出。
4.有如下程序段:
Dima(4)AsInteger
PrivateSubCommand1_Click()
DimsAsString
a
(1)=10:
a
(2)=30:
a(3)=20:
a(4)=40
s=doit(4)
Label1.Caption=s
EndSub
Functiondoit(kAsInteger)AsString
Ifk=1Then
doit=Str(a
(1))
Else
doit=doit(k-1)&Str(a(k))
EndIf
EndFunction
程序运行后,标签Label1中显示的内容是( )
A.10203040B.10302040
C.40302010D.40203010
答案 B 本题考查递归程序。
递归调用过程如下:
5.用以下对分查找算法:
在一个包含有重复元素且从小到大排序(相等元素排在一起)的整数数组a中,查找某个重复出现的整数key,其中数组元素的总个数是n。
i=1:
j=n
DoWhilei<=j
m=(i+j)\2
Ifa(m) Else j=m-1 EndIf Loop 那么执行该程序后,下列说法正确的是( ) A.程序可以找到重复元素key最开始出现的位置,该位置信息由变量i指示 B.程序可以找到重复元素key最后出现的位置,该位置信息由变量i指示 C.程序可以找到重复元素key最开始出现的位置,该位置信息由变量j指示 D.程序可以找到重复元素key最后出现的位置,该位置信息由变量j指示 答案 A 本题考查对分查找算法的理解和应用。 由程序可知,当i≤j时程序要循环,而循环时,当a(m)≥key时,变量j移动,这就表明当找到key时,指示变量j势必会跑到key所在位置的前面去,key所在位置由i来指示。 由升序排序和j的移动方向可知,这是起始位置。 6.有以下VB程序段 i=1: j=10: flag=True: cs=0 Key=Int(Rnd()*10)+28 DoWhilei<=jAndflag=True m=(i+j)\2: cs=cs+1 Ifa(m)=KeyThen flag=False ElseIfa(m) i=m+1 Else j=m-1 EndIf Loop 数组元素a (1)到a(10)依次是3101723273035404550,变量cs的值可能是( ) A.1或2B.2或3 C.3或4D.4或5 答案 C 本题考查对分查找,key=Int(Rnd()*10)+28即产生[28,37]的随机整数。 cs表示查找次数,10个数查找过程如下(只需要考虑28至37范围内的数): 3 10 17 23 27 30 35 40 45 50 ① ③ ④ ② 因此三次(如30)、四次(如35)都可能,找不到的情况也可能是三次(如28)或四次(如33),10个数不管找不找得到,最多查找次数不超过int(log210)+1=4次。 7.有如下程序段: Fori=1To2 k=i Forj=i+1To5 Ifd(k) Nextj Ifk<>iThent=d(k): d(k)=d(i): d(i)=t Nexti 经过该程序段“加工”后,数组元素d (1)到d(5)的值依次为“44,35,30,11,7”,则数组元素d (1)到d(5)的原始数据依次为( ) A.30,44,7,11,35B.30,11,44,7,35 C.44,30,11,7,35D.30,7,44,11,35 答案 D 该段程序仅进行了两趟排序,数据就已完成降序排序。 而选项A需要三趟,B、C两个选项都需要四趟才能使数据完成降序排序。 所以答案选D。 8.有如下VB程序段: i=1 j=6 s=“” Key=Text1.Text DoWhilei<=j m=Int((i+j)/2+0.5) s=s+“”+a(m) IfKey>a(m)Then i=m+1 Else j=m-1 EndIf Loop Text1.Text=s 数组元素a (1)到a(6)的值分别为“Beijing”“Guangdong”“Jiangsu”“Jiangxi”“Shanghai”“Zhejiang”,己按字典序排序。 当key的值为“Zhejiang”时,单击命令按钮Command1,文本框Text1中显示的内容为( ) A.JiangxiZhejiang B.JiangsuShanghaiJiangxiZhejiang C.JiangxiZhejiangShanghai D.JiangsuShanghaiZhejiang 答案 C 本题考查对分查找,第一次查找时i=1,j=6,得到m=4,因此s=“Jiangxi”,因为key>a(m),因此第二次查找时i=5,j=6,得到m=6,因此s=“JiangxiZhejiang”,此时key=a(m),执行j=m-1=5;因此第三次查找时i=5,j=5,得到m=5,因此s=“JiangxiZhejiangShanghai”,此时key>a(m),因此执行i=m+1=6,此时i>j,退出循环。 所以答案选择C。 9.有如下VB程序段: s=“7218634594”: n=Len(s): c=0 Fori=1Ton-1 a(i)=Val(Mid(s,i,2)) Nexti Fori=1Ton-2Step2 k=i Forj=i+2Ton-1Step2 Ifa(j) Nextj Ifk<>iThen t=a(i): a(i)=a(k): a(k)=t: c=c+1 EndIf Nexti Text1.Text=Str(c) 该程序段运行后,Text1中显示的内容是( ) A.1B.2C.3D.4 答案 B 首先获取a数组的各元素为72,21,18,86,63,34,45,59,94。 然后从外层Fori=1Ton-2Step2看出,仅对奇数位上的数据排序。 变量c统计排序过程中数据交换的次数。 第一趟排序,数据“72”与“18”交换。 第二趟排序,数据“72”与“45”交换。 而后奇数位上的数据已有序。 所以答案选B。 二、非选择题(共23分) 10.现有n根棍子,第i根棍子的长度为ai。 想要从中选出三根棍子组成周长尽可能长的三角形,输出最大的周长;若无法组成三角形,则输出0。 如当n=5,a={2,3,4,5,10}时,输出12,即选择了3、4、5。 当n=4,a={4,5,10,20}时,无法组成三角形,输出0。 加框处代码有误,请改正。 Dima(1To1000)AsInteger DimnAsInteger PrivateSubForm_Load() ’确定n的值和数组a的各个元素值,即每根棍子的长度值,代码略 EndSub Functionmax(xAsInteger,yAsInteger)AsInteger Ifx>yThen max=x Else max=y EndIf EndFunction PrivateSubCommand1_Click() DimiAsInteger,jAsInteger,kAsInteger DimansAsInteger,cAsInteger,longestAsInteger,restAsInteger ans=0 ’让i Fori=1Ton Forj=i+1Ton Fork=j+1Ton c=a(i)+a(j)+a(k) longest=max(longest,c)’① rest=c-longest’rest保存最短的两条边的和 Ifans>cThen’② ans=max(ans,c) EndIf Nextk Nextj Nexti Printans EndSub 答案 ①max(a(i),max(a(j),a(k)))(或其他写法) ②rest>longest 解析 由三重For循环和变量c的组成可以判断这是一个枚举算法,c是当前枚举到的周长。 而由程序的输出可知ans是最长的周长,显然要找到最大值,需要比较,还有一个很重要的条件就是三条边可以组成三角形。 大小比较的任务已经由ans=max(ans,c)来完成,那么第②空就是判断能否成为三角形的条件。 这里可以写成a(i)+a(j)>a(k)&a(i)+a(k)>a(j)&a(j)+a(k)>a(i)的复合表达式,但由前面的rest=c-longest可以猜测出longest保存了最长边,而rest是剩余两边之和。 于是第②空的条件可以简单地变成最短两边之和大于最长边,即rest>longest。 而第①空就是a(i),a(j),a(k)三者的最大值,可以迭代调用函数max(),即现调用任意两个,再调用第3个,如max(max(a(i),a(j)),a(k))或者任意交换这三个变量的书写位置都可以。 11.小王编写“合并区间”VB程序,功能如下: 窗体加载时,获取并存储合并前的区间数据,并显示在列表框List1中。 单击“合并”按钮后,以区间左端点数值对区间进行升序排序,然后相邻区间的相交进行合并,最后在列表框List2上显示合并后的区间。 程序运行如图所示: 实现以上功能的VB程序如下,在横处填入合适的代码。 Dima(1To20)AsInteger存储区间的左端点数值 Dimb(1To20)AsInteger存储区间的右端点数值 PrivateSubForm_Load() ’将区间左端点存入数组a,区间右端点存入数组b,并在列表框List1显示,代码略 EndSub PrivateSubCommand1_Click() DimiAsInteger,jAsInteger DimcurLAsInteger,curRAsInteger Fori=1Ton-1 Forj=lTon-i If ① Then t=a(j): a(j)=a(j+1): a(j+1)=t t=b(j): b(j)=b(j+1): b(j+1)=t EndIf Nextj Nexti curL=a (1): curR=b (1) Fori=2Ton If ② Then IfcurR Else List2.AddItem“["+Str(curL)+Str(curR)+"]” curL=a(i): curR=b(i) EndIf Nexti List2.AddItem“[”+Str(curL)+Str(curR)+“]” EndSub 答案 ①a(j)>a(j+1) ②a(i)<=curR ③curR=b(i) 解析 第①空,以区间左端点数值,即数组a,对区间进行升序排序。 第②空和第③空,这是需要合并区间的情况,首先理解变量curR的含义,curR表示第i个区间的上一个区间的右端点数值。 因此如果当前区间的左端点数值即a(i)<=curR,而当前区间的右端点数值即b(i)>curR时,上一个区间与当前区间就可以合并。 因此第②空填a(i)<=curR。 第③空是合并后,右区间curR则等于第i个区间右端点数值。 12.插数。 输入一个整数x,要将x插入到n(n<50)个有序(按降序排列)数据中,并使数据序列仍保持有序,试求出x应插入的位置。 界面设计如图所示。 程序说明: (1)其中n由文本框Text1中数据得到,x由文本框Text2中数据得到,插入位置显示在文本框Text3中。 (2)其中n个有序数据将通过随机函数Rnd产生,并对n个数进行降序排序后存入数组a中,同时显示在列表框List1中。 为了实现这一目标,完善下面的VB程序,在横线处填入合适的语句或表达式,完成程序设计。 PrivateSubCommand1_Click() Dima(1To50)AsInteger DimnAsInteger,iAsInteger DimxAsInteger,tempAsInteger Randomize List1.Clear n=Val(Text1.Text) x=Val(Text2.Text) ’随机产生n个数,并存放至a数组中 Fori=1Ton a(i)=Rnd*200+1 Nexti ’将数组a中的数按降序排序 Fori=2Ton Forj=nToiStep-1 If (1) Then temp=a(j): a(j)=a(j-1): a(j-1)=temp Nextj Nexti ’将排序后的数组元素显示在列表框List1中 Fori=1Ton List1.AddItemStr(a(i)) Nexti ’插入操作 If (2) Then i=n+1 Else (3) DoWhilex i=i+1 Loop Endif ’在文本框Text3中显示插入位置 Text3Text=Str(i) EndSub (1) 。 (2) 。 (3) 。 答案 (1)a(j)>a(j-1) (2)x<=a(n) (3)i=1 解析 本题主要考查排序算法的程序实现。 (1)本题采用了冒泡排序。 冒泡排序的算法特点是相邻两个元素的两两比较,并根据需要交换,代码中a(j)与a(j-1)的交换语句说明该程序采用了冒泡排序。 因为是降序排序,因此大的数在前,小的数在后,如果次序反了,则需要交换两数。 因此该处应该填: a(j)>a(j-1)。 (2)变量i用于存储x应该插入的位置。 由于数据源是从大到小排列,因此如果x小于或等于数据源中最后一个数据,则它应该插在最后面,这是最简单的情况。 该数据源总共有n个数,最后一个数据是a(n)。 因此如果x≤a(n),则i=n+1。 (3)如果x比数据源中最后一个数据要大,那么就要寻找它合适的位置。 方法是通过循环语句,将x与该数列中的每一个数据a(i)比较,如果xa(i),则当前的i值就是x该插入的位置。 13.n个数据的冒泡升序排序需要经过n-1遍的加工,每一遍加工自下而上比较相邻两个数据,把较小者交换到上面,在第i遍加工过程中需要进行n-i对数据的比较。 在某些情况下,第i遍加工过程中,在上面部分较小数据已经有序的情况下,不需要再进行n-i对数据的比较。 如对“17,18,19,24,23,20”这6个数据排序中,第1遍排序结束后数据为“17,18,19,20,24,23”,第2遍排序时不再需要对20及其前面3个数据进行比较。 以下程序实现了冒泡排序的优化,在横处填入合适的代码。 DimnAsInteger Dima(1To100)AsInteger ’n=10,排序前生成的数据存储在数组a中,并在列表框List1中显示,代码略 PrivateSubCommand1_Click() DimiAsInteger,jAsInteger,startAsInteger,tAsInteger i=2 DoWhilei Forj=nToiStep-1 If ① Then t=a(j): a(j)=a(j-1): a(j-1)=t ② EndIf Nextj i=start+1 Loop Fori=1Ton List2.AddItem ③ Nexti EndSub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高考信息技术大一轮优选课件+习题 高考 信息技术 一轮 优选 课件 习题