信息技术必修2第十单元模拟演练8.docx
《信息技术必修2第十单元模拟演练8.docx》由会员分享,可在线阅读,更多相关《信息技术必修2第十单元模拟演练8.docx(11页珍藏版)》请在冰豆网上搜索。
![信息技术必修2第十单元模拟演练8.docx](https://file1.bdocx.com/fileroot1/2022-10/11/e9bd11bd-249f-4d08-9585-5a78c7c9a318/e9bd11bd-249f-4d08-9585-5a78c7c9a3181.gif)
信息技术必修2第十单元模拟演练8
第8节 数组问题
模拟演练
1.有以下VB程序段:
a
(1)=68:
a
(2)=88:
a(3)=76:
a(4)=60:
a(5)=98:
a(6)=100:
a(7)=64:
a(8)=85:
a(9)=99:
a(10)=59
Fori=1To9
b(i)=Abs(a(i+1)-a(i))
c(b(i)\10)=c(b(i)\10)+1
Nexti
Fori=0To10
Ifc(i)>0ThenLabel1.Caption=Label1.Caption+“”+Str(c(i))
Nexti
数组c各元素初值为0,执行该程序段,标签Label1上显示的内容是( )
A.23211B.13221C.23221D.13
答案 B 本程序主要由两个For循环组成,第一个循环里完成的任务为给b(i)赋值,它的值为a(i+1)与a(i)之差的绝对值,给c数组做累加用,例如b
(1)的值是20,那么c
(2)的值加1,由于b
(1)到b(9)的值分别为20,12,16,38,2,36,21,14,40,则c数组的2,1,1,3,0,3,2,1,4这些位置的值在循环中依次被加1,可知c(0)=1,c
(1)=3,c
(2)=2,c(3)=2,c(4)=1。
第二个循环把c数组中,大于0的值依次输出在label1,所以输出13221,所以答案选B。
2.有VB编写的程序如下:
Dima(0To9)AsInteger,tasLong
t=Val(Text1.Text)
DoWhilet<>0
a(tMod10)=1
t=t\10
Loop
Fori=0To9
x=x+a(i)
Nexti
Text1中输入10242048,则程序执行后x的值为( )
A.1B.2C.5D.10
答案 C 本题先执行一个DoWhile循环,然后执行一个For循环,DoWhile循环的作用是把t从个位开始逐个取出来,作为数组a的位置,并且令这个位置的值为1,例如个位数是8,则a(8)=1,这里注意到如果这个位置出现多次,那么数组a中这个位置的值还是1,例如2出现了两次,那么a
(2)=1被执行了两次。
For循环就是把数组a中的值加起来存储到x,由于数组a中只有0,1,2,4,8这几个位置的值是1,所以x=5,所以答案选C。
3.某VB程序段如下:
Fori=1To5
b(a(i))=b(a(i))+1
Nexti
pa=0
Forj=1To10
Fork=1Tob(j)
pa=pa+1:
a(pa)=j
Nextk
Nextj
a
(1)到a(5)的初值依次是7、5、9、4、3,程序段运行后,数组a值依次是( )
A.7,9,5,4,3B.3,4,5,7,9
C.4,5,7,9,3D.9,7,5,4,3
答案 B 由于数组a初始值是7、5、9、4、3,因此第一个For循环后,数组b中b(3)、b(4)、b(5)、b(7)、b(9)的值分别1,那么接下来的双重For循环里,只在j等于3、4、5、7、9的时候内部的Fork=1tob(j)循环里的语句才会执行,例如循环到j=3时,由于b(3)=1,fork=1tob(3)循环里的语句就会执行一遍,pa变成了1,那么a
(1)=3,当循环到j=5的时候,pa就变成了2,a
(2)=5,依次类推,每次pa加1,并且a(pa)=j,相当于给数组a的1到5的位置重新赋值,巧妙地实现了排序的功能,所以答案选B。
4.有如下VB程序段:
n=Len(Text1.Text)
Fori=1Ton
a(i)=Mid(Text1.Text,i,1)
Nexti
DoWhilen>1
IfAsc(a(n))>=Asc(a(n-1))Then
m=1
Else
m=2
EndIf
b(m)=b(m)+1
n=n-1
Loop
数组b各元素的初始值都为0,文本框Text1的内容为“2018Python”。
执行程序后,变量b
(1)的值为( )
A.10B.6C.5D.4
答案 C 本题中先用数组a把输入的字符串分开来逐个存储,然后用DoWhile循环从后向前,逐个两两比较,如果后面的字符ASCII编码大于等于前面一个字符的编码,那么m=1,否则m=2,并且每次比较后都执行一遍b(m)=b(m)+1,即b
(1)统计出了后面字符比前1个字符编码大于等于的次数,b
(2)统计出了后面字符比前1个字符编码小的次数。
这里要注意A~Z的编码位65~90,a~z的编码是97~122,0~9的编码是48~57,根据输入的字符串“2018Python”,可知从后面开始往前逐个两两比较,后面字符编码大于等于前1个字符编码的次数是5,所以答案选C。
5.小吴编写了一个查找数组中不重复数据的VB程序,功能如下:
程序运行时在列表框List1中显示原始数据(存储在数组a中),单击“查找”按钮Command1后,在列表框List1中显示数组中元素值只出现一次的数据。
程序运行界面如图所示。
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Constn=10’数组元素的总数
Dima(1Ton)AsInteger
PrivateSubForm_Load()
’该过程对数组a进行赋值,并在列表框List1中显示,代码略
EndSub
PrivateSubCommand1_Click()
DimiAsInteger,jAsInteger,flag(1Ton)AsBoolean
’flag(i)记录第i个元素是否重复出现
Fori=1Ton ’flag(i)=true开始假设都只出现1次
flag(i)=True
Nexti
Fori=1Ton
Ifflag(i)Then
Forj=i+1Ton
Ifa(i)=a(i+1)Thenflag(i)=False:
flag(j)=False ’①
Nextj
EndIf
Nexti
Fori=1Ton
IfflagThenList2.AddItemStr(a(i)) ’②
Nexti
EndSub
答案 ①a(i)=a(j) ②flag(i)或flag(i)=True
解析 本程序用数组flag记录数组a的每个位置的值是否只出现一次。
利用双重循环对数组a中的每个位置的值进行统计,对每个a(i)只要用循环去找一遍i位置后面(用j表示i后面的位置)是不是有跟a(i)相同的值,如果有,则令flag(i)为false,并且flag(j)为false,说明这两个位置的值重复出现过。
①根据程序的意思,第1个改错的地方应该是把a(i)跟它后面位置的值都进行比较,所以答案是a(i)=a(j)。
②第2个位置所在的For循环为了输出没有重复出现的数据,所以这里要对每个i位置的flag(i)进行判断,答案是flag(i)=true或者flag(i)。
6.某游戏规则如下:
将2*n位队员按2人一组分成n个队(n<10),地面上有一排格子,共2*n个,每个格子都对应一个小于10的随机正整数。
游戏开始后,所有队员都选择站到一个空的格子里,等他们站满格子后,开始为每位队员进行记分。
记分规则:
每组甲乙两个队员,甲队员的分数是从自己所站的格子开始,按照格子序号递减,将这些格子中的数字一直累加到第1个格子。
乙队员的分数是从自己所站的格子开始,按照格子序号递增,一直将格子中的数字累加到第2*n个格子。
如果同一队的两名队员得到的分数相同,则该组参赛队获胜。
例如:
如图所示,有4个队8位队员,地上一排格子的数字依次为2、1、1、7、9、2、5、6。
若某队甲队员站在第4个格子,则其分数为2+1+1+7=11;乙队员站在第7个格子,则其分数为5+6=11。
两者相等,则该队获胜。
gz
(1)
gz
(2)
gz(3)
gz(4)
gz(5)
gz(6)
gz(7)
gz(8)
2
1
1
7
9
2
5
6
甲 乙
(1)假设有3队队员,地上一排格子的数字依次为6、7、3、4、3、9。
若某队甲队员站在第3个格子上,那么该队乙队员站在第 个格子上才能获胜。
(2)实现上述功能的VB程序如下。
请在划线处填入合适代码。
DimnAsInteger
Dimgz(1To20)AsInteger
PrivateSubCommand1_Click()
DimdfaAsInteger,dfbAsInteger
DimtaAsInteger,tbAsInteger
①
Randomize
Fori=1To2*n
gz(i)=Int(Rnd*9+1)
List1.AddItem“gz(“&i&”)”&gz(i)
Nexti
num=1
Forj=1To2*n
ta=j
dfa=zwdf(ta,True)
Fork=1To2*n
tb=k
②
Ifdfa=dfbThen
List2.AddItemnum&“甲队员(“&j&”)得分=”&dfa&“乙队员(“&k&”)得分=”&dfb
num=num+1
EndIf
Nextk
Nextj
List2.AddItem“获胜的站法共有:
”+ ③ +“种”
EndSub
Functionzwdf(pAsInteger,rAsBoolean)AsInteger
DimfsAsInteger
Ifr=TrueThen
④
fs=fs+gz(i)
Nexti
Else
Fori=pTo2*n
fs=fs+gz(i)
Nexti
EndIf
zwdf=fs
EndFunction
答案
(1)4
(2)①n=Val(Text1.Text) ②dfb=zwdf(tb,False)或dfb=zwdf(k,False) ③Str(num-1) ④Fori=pTo1Step-1或Fori=1Top
解析
(1)甲站在第3格上,往左累加,结果是16。
从最后一格往左累加,能得到16的是第4格。
(2)①结合窗体,通读程序,发现缺少输入语句,故填n=Val(Text1.Text)。
②需要结合理解自定义函数zwdf来填,zwdf有2个参数,第一个表示位置,第二个表示方向(True表示向左累加,False表示向右累加),由此,可先填第④空:
Fori=pTo1Step-1或者Fori=1Top。
回到主程序,第②空的下一个If语句的条件为dfa=dfb,dfa已在外层循环中赋值,其含义是从ta开始往左累加,则dfb应该为从tb开始往右累加,故填dfb=zwdf(tb,False)。
③用于输出所有能获胜的站法总数num,但要注