高考浙江版高考信息技术 模拟演练 3.docx
- 文档编号:28332035
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:13
- 大小:37.05KB
高考浙江版高考信息技术 模拟演练 3.docx
《高考浙江版高考信息技术 模拟演练 3.docx》由会员分享,可在线阅读,更多相关《高考浙江版高考信息技术 模拟演练 3.docx(13页珍藏版)》请在冰豆网上搜索。
高考浙江版高考信息技术模拟演练3
第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,但要注意num的初值为1,故输出时应该为Str(num-1)。
7.问题描述:
有n个互不重复的数字,值的范围是[1,n],分别保存在数组元素a
(1)到a(n)中,若数字i保存在a(i),则认为数字i在正确的位置上。
若干个相互占用了位置的数字称为一组,一个在正确位置上的数字单独为一组,比如6个数字2,3,1,4,6,5分别保存在数组元素a(l)到a(6)中,则2、3、1为一组,4为一组,6、5为一组。
该程序的功能为输出每组的情况。
运行界面如图:
(1)数组元素a(l)到a(5)的值分别为2、5、3、1、4,这5个元素总共有 组。
(2)请补充代码。
Constn=10
Dima(1Ton)AsInteger’保存原始数据
Dimb(1Ton)AsBoolean’数组b用来标记相应的位置有没有找过
PrivateSubCommand1_Click()
DimiAsInteger,sumAsInteger,totalAsInteger
sum=0:
total=1’total表示第几组
i=1
List2.AddItem“第”+Str(total)+“组”
DoWhilesum DoWhileNotb(i) List2.AddItema(i) b(i)=True ① sum=sum+1 Loop Ifsum ② List2.AddItem“第”+Str(total)+“组” i=1 DoWhileb(i)’该循环用来查找下一组的开始位置 i=i+1 Loop EndIf Loop EndSub PrivateSubForm_Load() DimiAsInteger Randomize Fori=1Ton’产生n个不一样的整数,范围为[1,n] a(i)=Int(Rnd*n)+1 DoWhile ③ a(i)=Int(Rnd*n)+1 Loop Nexti Fori=1Ton List1.AddItema(i) b(i)=False Nexti EndSub Functionf(xAsInteger,yAsInteger)AsBoolean ’该函数的功能: 判断x和数组a中前y个数有没有重复 DimjAsInteger f=False Forj=1Toy Ifa(j)=xThenf=True: ExitFor Nextj EndFunction 答案 (1)2 (2)①i=a(i) ②total=total+1 ③f(a(i),i-1)或f(a(i),i-1)=True 解析 (1)第1组: 2,5,4,1;第2组: 3。 (2)当程序的逻辑结构复杂,函数较多时,我们最好按照程序的运行顺序去阅读代码,在本题中,我们可以先阅读Form_Load()和Functionf(),生成原始数据后,再去阅读Command1_Click(),才能理顺程序的逻辑结构。 生成原始数据时,要求产生n个不一样的整数存储在数组a中,所以每生成一个随机整数a(i),需要先判断它是否和数组a前(i-1)个元素重复,只有不重复,才能存储到数组a中。 如何理解“相互占用了位置的数字”呢? 当处理数组a的第i个元素时,若a(i)=j,表示数字j占用了位置i,则a(i)和a(j)是同一组元素,我们接下来去处理第j个元素,即令i=a(i)。 就这样从一个元素“跳”到同一组的下一个元素,直到跳回该组的第一个元素,由于该组的第一个元素对应的b(i)=True,退出循环。 以第1题提供的数据为例: 数组元素a (1)到a(5)的值分别为2、5、3、1、4。 刚开始i=1,a (1)=2,则执行i=2,a (2)=5,则执行i=5,a(5)=4,则执行i=4,a(4)=1,则执行i=1,因为b (1)=true,退出循环,由此得到第1组元素,输出顺序为2,5,4,1。 上述循环结束后sum=4,满足sum a(3)=3,则执行i=3,因为b(3)=true,退出循环,由此得到第2组元素: 3。 上述循环结束后sum=5,不满足sum 8.有N堆纸牌,编号分别为①,②,…。 每堆上有若干张,但纸牌总数必为N的倍数。 可以在任一堆上取若干张纸牌,然后移动。 移牌规则: 在编号为①的堆上取的纸牌,只能移到编号为②的堆上;在编号为N(N≥2)的堆上取的纸牌,只能移到编号为N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如N=4,4堆纸牌数分别为: ① ② ③ ④ 9 8 17 6 移动3次可达到目的: 从③取4张牌放到④(981310)→从③取3张牌放到②(9111010)→从②取1张牌放到①(10101010)。 现编写如下代码解决4堆任意张数牌的移动问题,请按提示补充划线句的代码: PrivateSubCommand1_Click() DimaverAsSingle DimstAsInteger’统计移动的步数 Dimssum,i,jAsInteger Dima(1To100)AsInteger a (1)=Val(Text1.Text)’读取各堆牌张数,求总张数aver a (2)=Val(Text2.Text) a(3)=Val(Text3.Text) a(4)=Val(Text4.Text) ssum=a (1)+a (2)+a(3)+a(4) aver=ssum\4’求牌的平均张数aver Fori=1To4 ① Nexti i=1 ’过滤初端和末端的0 j=4 DoWhilea(i)=0Andi<4 i=i+1 Loop DoWhilea(j)=0Andj>1 j=j-1 Loop st=0 DoWhilei ② a(i)=0 st=st+1 i=i+1 DoWhilea(i)=0Andi ③ Loop Loop Printst’输出移动次数 EndSub (1)划线①处 。 (2)划线②处 。 (3)划线③处 。 (4)若现有6堆牌,分别编号①②③④⑤⑥,各堆张数分别为15、2、4、7、8、6,按上述算法的思路,要使用最少的移动次数使每堆上纸牌数都一样多,则最少次数为 。 答案 (1)a(i)=a(i)–aver (2)a(i+1)=a(i+1)+a(i) (3)i=i+1 (4)3 解析 如果能想到把每堆牌的张数减去平均张数,题目就变成移动正数,加到负数中,使大家都变成0,那就意味着成功了一半! 拿本题来说,平均张数为10,每堆牌的张数减去平均张数,原张数9,8,17,6变为-1,-2,7,-4,其中没有为0的数,我们从左边出发: 要使第1堆的牌数-1变为0,只需将-1张牌移到它的右边(第2堆)-2中,结果是-1变为0,-2变为-3,各堆牌张数变为0,-3,7,-4;同理,要使第2堆变为0,只需将-3张牌移到它的右边(第3堆)中去,各堆牌张数变为0,0,4,-4;要使第3堆变为0,只需将第3堆中的4张牌移到它的右边(第4堆)中去,结果为0,0,0,0,完成任务。 每移动1次牌,步数加1。 其中出现的负数张牌的移动并不违反题意,其实从第i堆移动-m张牌到第(i+1)堆,等价于从第(i+1)堆移动m张牌到第i堆,步数是一样的。 如果张数中本来就有为0的怎么办呢? 如0,-1,-5,6,还是从左算起(从右算起也完全一样),第1堆是0,无需移牌,余下与上相同;再比如-1,-2,3,10,-4,-6,从左算起,第1次移动的结果为0,-3,3,10,-4,-6;第2次移动的结果为0,0,0,10,-4,-6,现在第3堆已经变为0了,可节省1步,余下继续。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高考浙江版高考信息技术 模拟演练 高考 浙江 信息技术 模拟 演练