高考信息技术大一轮优选课件+习题 9.docx

上传人:b****4 文档编号:5407981 上传时间:2022-12-16 格式:DOCX 页数:18 大小:163.40KB
下载 相关 举报
高考信息技术大一轮优选课件+习题 9.docx_第1页
第1页 / 共18页
高考信息技术大一轮优选课件+习题 9.docx_第2页
第2页 / 共18页
高考信息技术大一轮优选课件+习题 9.docx_第3页
第3页 / 共18页
高考信息技术大一轮优选课件+习题 9.docx_第4页
第4页 / 共18页
高考信息技术大一轮优选课件+习题 9.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

高考信息技术大一轮优选课件+习题 9.docx

《高考信息技术大一轮优选课件+习题 9.docx》由会员分享,可在线阅读,更多相关《高考信息技术大一轮优选课件+习题 9.docx(18页珍藏版)》请在冰豆网上搜索。

高考信息技术大一轮优选课件+习题 9.docx

高考信息技术大一轮优选课件+习题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

答案 ①a(j)

解析 第①空,从图中得知程序要实现升序排序,所以只有当后面的数据小于前面的数据时才需要数据交换,而从后面交换的语句中可以看出是a(j)与a(j-1)交换,所以填a(j)

第②空,冒泡升序排序优化即每一趟排序记录下最后一个数据交换的位置,那么下一趟排序时就不需要对该位置前面的数据进行比较了。

因此把每一趟的最后一个数据交换的位置定义为下一趟排序时的结束位置,所以start=j。

第③空,列表框中输出排序好的数组a,同时注意列表框输出结果是字符串类型。

14.查找最接近的数。

编写一个查找最接近的数的VB程序:

程序运行时,在文本框Text1中输入产生随机数的个数(1到100之间),单击命令按钮“产生随机数并升序排列”后,在列表框List1中显示已经按升序排列后的随机整数。

然后在文本框Text2中输入要查找的整数,单击命令按钮“查找”后,在标签Label3中显示随机整数序列中与待查找数最接近的整数(当最接近的数有2个时,输出较大的一个)。

程序运行效果如图所示。

实现上述功能的VB代码如下,请在横线处填入合适代码。

DimnAsInteger’存储随机数的个数

Dimf(1To100)AsBoolean’f(i)为true时表示随机整数i已经产生过

Dima(1To100)AsInteger’依次存放升序排序后的n个随机数

PrivateSubCommand1_Click()’命令按钮“产生随机数并升序排列”的单击事件

DimiAsInteger

Randomize

Fori=1To100

 f(i)=False

Nexti

n=Val(Text1.Text)

Fori=1Ton

 t=Int(Rnd*100+1)

 DoWhilef(i)=True

  t=Int(Rnd*100+1)

 Loop

  ①  

Nexti

j=0

Fori=1To100􀆳实现排序并输出

 Iff(i)=TrueThen

   ②  

  a(j)=i

  List1.AddItemStr(i)

 EndIf

Nexti

EndSub

PrivateSubCommand2_Click()􀆳命令按钮“查找”的单击事件

DimkeyAsInteger

key=Val(Text2.Text)

Ifkey<=a

(1)ThenLabel3.Caption=Str(a

(1)):

ExitSub

Ifkey>=a(n)ThenLabel3.Caption=Str(a(n)):

ExitSub

L=1:

R=n

DoWhileL<=R􀆳找到与key较为接近的两个数a(R)和a(L)

 m=(L+R)\2

 Ifkey<=a(m)Then

  R=m-1

 Else

  L=m+1

 EndIf

Loop

If ③ Then􀆳在a(R)和a(L)中选出更接近key的数 

 Label3.Caption=Str(a(R))

Else

 Label3.Caption=Str(a(L))

EndIf

EndSub

答案 ①f(t)=True②j=j+1③Abs(a(R)-key)

解析 ①处根据题干可知该处为产生不重复的随机数,产生之后将对应的f数组内的值改为True,标记该数字已产生,故①f(t)=True,②将产生的数依次输出,故②j=j+1,③通过对分查找到二个数a(R)、a(L),判别更接近key的数。

故③Abs(a(R)-key)

15.有100个大小形状一样的玻璃球,其中有1个玻璃球的重量轻于其

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1