高考专题复习专题十 矩阵问题信息技术Word文件下载.docx
《高考专题复习专题十 矩阵问题信息技术Word文件下载.docx》由会员分享,可在线阅读,更多相关《高考专题复习专题十 矩阵问题信息技术Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
m=______①____
Else
pa=Start
pb=Start
Fori=1Tom*m
b(pb)=a(pa)
pb=pb+1
IfiModm=0Then
____②______
Else
pa=pa+m
EndIf
Nexti
____③______
Start=Start+m*m
Loop
Fori=StartTon
b(i)=a(i)
Nexti
′依次输出转换后数据b
(1)、b
(2)、……b(n)中,代码略
EndSub
解析 n=120时,可依次分割出3个数据块,元素的个数分别为64(8×
8)、49(7×
7)、4(2×
2),剩余元素为3个。
所以第3个数据块为4个元素。
剩余数量Left<
m*m,意味着当前剩余数量不够分割成m×
m。
下一次尝试m-1方块。
例如left=50,m=8,不够分割成8×
8,下依次尝试7×
7。
通过变量i,找出变量i和下一次数组a下标之间的关系。
通过观察发现每一段pa的值公差都为3,只需要计算出每一段的首项,该段后面的依次pa+3即可。
分析得出,每一段首项下标pa=i\3+1,后面的依次为pa=pa+3。
推广到n个数据,m×
m方阵中。
每一段首项下标pa=i\m+start,后面的依次为pa=pa+m。
分割之后剩余数量left减去m*m。
答案
(1)4
(2)①m=m-1 或m=int(sqr(left))
②pa=start+i\m或pa=start+i/m 或pa=pa-(m-1)*m+1 或pa=start+(pa-start+1)modm
③left=left-m*m
1.矩阵中所有数据均存储在一个数组中,从第1列开始先存储一行,接着再存储下一行。
2.一个m行n列的数组,在列表框中输出时,用一个字符串变量表示一行,共循环m次。
他是一张二维表。
一般来说,用i表示某个元素所处的行,用j表示某个元素所处列。
3.矩阵的问题就是研究存储数组元素下标与他所在行和列的关系。
1.矩阵中某个元素的位置跟他前面有完整行数及所在列数有关,若矩阵的大小为m行n列,矩阵问题就是研究矩阵元素位置(i,j)和数组下标pa对应关系,pa=(i-1)*n+j,表达的含义是该元素处在第i行,说明他前面有i-1个完整行,该元素处在第j列,说明除了完整的行,还有j列是零头。
2.通常用双重循环来遍历整个矩阵,变量i和j表示行和列,也可以用一重循环输出,但此时循环变量表示数组下标。
代码如下。
Fori=1Tom
s="
"
Forj=1Ton
s=s+a(i-1)*n+j
Nextj
List1.AddItems
Fori=1Tom*n
s=s+a(i)
IfiModn=0Then
List1.AddItems
EndIf
3.若用一重循环来遍历m行n列矩阵,则下标为i数组元素所处行为(i-1)\n,他所处的列为(i-1)Modn+1
【例】编写“矩形面积”程序,实现如下功能:
按一定比例随机生成a
(1)至a(100)数组元素的值:
0或1(0多1少);
将这100个数组元素,按行依次转化为10×
10的二维阵列;
当数组元素的值为0时显示成“□”,当数组元素的值为1时显示成“◆”,并在列表框List1中输出。
寻找阵列中,由“□”字符构造出的最大面积的矩形,在标签Label1中显示最大面积所占的单位数。
程序运行界面如图所示。
实现上述功能的VB代码如下:
Dima(1To100)AsInteger
DimiAsInteger,sAsInteger,smaxAsInteger
′用于随机生成数据,并将阵列按规则在列表框中输出,该部分功能的代码略。
smax=0
Fori=1To100
Ifa(i)=0Thens=search(i)
Ifs>
smaxThensmax=s
Label1.Caption=“最大面积的矩形,占”+Str(smax)+“个单位。
”
Functionsearch(iAsInteger)AsInteger
DimxAsInteger,x1AsInteger,xendAsInteger
DimyAsInteger,y1AsIntegerDimsAsInteger
x=(i-1)Mod10+1 ′起始列号
y=(i-1)\10+1 ′起始行号
x1=x:
y1=y:
xend=10
search=0
DoWhiley1<
=10
If__a((y1__-__1)__*__10__+__x)__=__1__Then__Exit__Do ′判断
x1=x
DoWhilex1<
=xend
Ifa((y1-1)*10+x1)=1Then
x1__=__x1__–__1 ′改错
x1=x1+1
Loop
y1=y1+1
s=(x1-x)*(____①____)填空
Ifs>
searchThensearch=s
EndFunction
(1)根据程序的运行界面,没有Caption属性的控件为__________类(单选,填字母:
A.窗体/B.命令按钮/C.列表框/D.标签)。
(2)程序代码中,去除“判断”处语句,是否会影响程序的结果__________(选填:
是/否)。
(3)程序代码中,“改错”处的语句有误,请改正。
(4)程序代码中,将“填空”处的语句补充完整。
解析 自定义函数的功能是从第i个位置开始查找最大矩形面积,x和y表示第i个元素所处的行号和列号。
查找的过程是先扫描x行中所有列,找到一个不为0的就表示该行的列数,退出内循环。
接着再扫描下一行,找出构成一个最大的面积。
若删除划线处语句,进入内循环后,也马上退出内循环,此时的列数为0,面积也为0。
答案
(1)C
(2)否 (3)x1=Xend+1或ExitDO
(4)①y1-y
【变式训练】数组a规模为(m+1)×
n,其中a
(1)~a(m*n)元素中存储数据,数据中m×
n个元素按行序排列成一个数字矩阵如图所示。
计算每列数据的和依次存储在m+1行对应的数组元素中。
依据算法思想,设计一个计算并存储的程序,实现该功能的VB程序如下,但加框处代码有错,请改正。
Constm=6
Constn=5
Dima(1To(m+1)*n)AsInteger
DimiAsInteger,jAsInteger
′读取m×
n个正整数,依次存入数组a中,代码略
Fori=1Ton
=sum(i) ′
(1)
′将计算后数据,按m+1行,n列输出到列表框中,代码略
Functionsum(yAsInteger)AsInteger′函数功能是计算每列数据和
sum=0
Fori=
′
(2)
sum=sum+a(i)
解析 每列的和放在m+1行,因此他前面有完整的m行,在自定义函数中,计算y列的和,分别为y,y+n,y+2*n等等。
答案
(1)a(m*n+i)
(2)ytom*nStepn
1.编写VB程序,实现如下功能:
在文本框Text1中输入整数n(1-10),生成n2个10到99之间的随机整数,单击“生成矩阵”按钮Command1,并以n行n列矩阵的形式显示在列表框List1中,再单击“对角线”按钮Command2,则在标签Label1中输出该矩阵对角线(左上角到右下角)上的数值,运行界面如图所示,程序代码如下。
请在划线处填入合适的代码。
DimiAsInteger,nAsInteger
′随机生成n2个10~99之间的整数的代码略
PrivateSubCommand1_Click() ′将n2个数以矩阵形式显示在List1中
DimsAsString
s=” ”
Fori=1To____①____
s=s+Str(a(i))
If____②____Then
List1.AddItems
s=” ”
Nexti
PrivateSubCommand2_Click() ′将对角线上的数输出在Label1中
DimdjxAsString
Fori=1to____③____
djx=djx+____④____
Label1.Caption=djx
解析 共有n*n个元素,当i是n倍数的时候,表示一行结束,要输出该行,同时变量初始化。
共有n个对角线,他们的下标分别为1,n+2,2n+3,可以找到规律是有多少完整行加列数。
答案 ①n*n ②iModn=0 ③n ④a((i-1)\n*n+(i-1)Modn+1)
2.对一个n×
n的矩阵以“行”为单位进行升序排序,如下表所示是一个4×
4的矩阵以行为单位进行升序排序。
小杜编写了实现上述功能的程序,程序功能如下:
程序运行时,在文本框Text1中输入n(1<
=n<
=10),单击“产生”按钮Command1产生n×
n个随机数,随机数的范围为[0,9],随机存储在数组a中,并以矩阵的形式在列表框List1上显示。
单击“排序”按钮Command2,对矩阵以“行”为单位进行升序排序,并在列表框List2输出排序后的矩阵。
在程序运行界面如下图所示,实现上述功能的VB程序如下,请在划线处填入合适的代码。
DimnAsInteger
′随机生成数并存储在List1中 代码略
PrivateSubCommand1_Click() ′按行排序
DimiAsInteger,jAsInteger,tAsInteger
DimsAsString
s=” ”
Fori=1To______①____
k=i
Forj=i+1To____②____
Ifa(j)<
a(k)Thenk=j
Ifk<
>
iThent=a(k):
a(k)=a(i):
a(i)=t
If IModn=0 Then List2.AddItems:
s=” ”
Nexti
PrivateSubCommand2_Click() ′按列排序
DimiAsInteger,jAsInteger,tAsInteger
DimsAsString
Fori=1Toi-1
Forj=i+nTo____③____
解析 n个数需排n-1趟,每一趟的结束位置是该行的最后一个数。
同样的,若按列排序,每列的最后一个位置在最后一行。
答案 ①n-1 ②(i-1)[BS)]*n ③(n-1)*n+(i-1)Modn+1 stepn
3.小岩设计了一个顺时针旋转矩阵的程序,其功能为:
运行程序时,在文本框Text1中输入矩阵规模n,点击“产生矩阵”按钮Command1,在列表框List1中显示一个n*n的矩阵,该矩阵数据由从1开始的连续自然数组成。
点击“旋转矩阵”按钮Command2,该矩阵顺时针旋转90度并显示在列表框List2中,此后每点一次“旋转矩阵”按钮Command2,列表框List2中显示的矩阵顺时针旋转90度。
请完成程序填空。
DimstAsString
Dimb(1To100)AsInteger
′产生矩阵,代码略
PrivateSubCommand2_Click() ′旋转矩阵
Fori=1Ton ′行
st=” ”
Forj=1Ton ′列
b((i-1)*n+j)=____①____
st=st+adj(Str(b((i-1)*n+j)),3)
List2.AddItemst
Nexti
Functionadj(aAsString,nAsInteger)AsString
′在字符串a前加入适当的空格,使a的长度为n位,代码略
解析 从题图上可知,发生了行号和列号的互换。
答案 ①j+(i-1)*n
4.在美国国家信息交换码中,ASCII值从32到127是可以打印并显示的字符,把这96个字符随机调整次序,生成密码本。
根据输入的密钥和明文,单击“加密”按钮Command1,输出密文。
基本算法如下。
1)用数组mab分别记录1~96个字符的ASCII值,用数组zm记录对应字符在密码本中位置,如mab(9)=65,表示密码本中第9个字符是“A”,则对应的zm(65)=9;
2)把密钥中每个字符的ASCII值的各个数字进行累加(如Hi分别为(7+2)+(1+0+5)),将累加的和除以9取余数后加7,作为将密码本转换成二维表的列数;
3)每个明文在转换后二维表中位置作为密文,该位置是用十六进制表示的行号和列号。
程序运行的界面如下图所示:
实现上述功能的VB程序如下,请回答以下问题:
(1)若输入密钥为“AB”,则根据算法及密码本,字母“A”加密后的密文是____________。
DimMab(96)AsInteger′存储密码本中每个字符的ASCII值
Dimzm(127)AsInteger′存储ASCII值32至127的字符在密码本数组mab中的下标
PrivateSubForm_Load()
′产生密码本及96个字符在密码本中位置,代码略。
Functionp(sAsString)AsInteger
DimiAsInteger,t1AsLong
DimsumAsInteger,s1AsString
t1=0
i=1
DoWhilei<
=Len(s)
s1=Mid(s,i,1)
t1=Asc(s1)
____①____
i=i+1
p=sumMod9+7
DimiAsInteger,tAsInteger,hangAsInteger
DimsAsString,s1AsString,LieAsInteger
List1.Clear
s1=Text1.Text
t=p(s1)
Label5.Caption=”将密码本换成一张”+Str(t)+”列的二维表”
=96
s=s+Chr(Mab(i))+” ”
IfiModt=0Ori=96Then
List1.AddItems
wz=”123456789ABCDEF”
s=Text2.Text
Fori=1ToLen(s)
___②____
hang=(t1-1)\t+1
lie=(t1-1)Modt+1
s2=____③____
Text3.Text=s2
解析 字母AB的值分别65、66,各个数字相加为23,23Mod9+7=12,即转换成12列的矩阵,因此字母A在第2行第3列。
p函数的功能是,根据输入的密钥s,转换成p列的二维表,把密钥中每个字符的ASCII值的各个数字进行累加,将累加的和除以9取余数后加7,保证列数在[7,15]之间;
②要求的是根据明文在密码本中位置,转换成相应的行号和列号,t1就是该字母在密码表中的位置。
每个明文在转换后二维表中十六进制的行号和列号作为密文。
答案
(1)23
(2)①sum=sum+t1\10Mod10 ②t1=zm(Asc(s1)) ③s2+Mid(wz,hang,1)+Mid(wz,lie,1)
5.试场编排方法:
每试场人数30,尾数试场可能不足30,按6行5列的布局编排试场,每个试场的座位号如图a所示。
编写一个VB程序实现上述功能:
在文本框Text1中输入学生数n,在文本框Text2中输入试场号m,单击“确定”按钮Command1,在列表框中List1中输出第m试场的编排表,程序运行界面如图b所示。
第1列
第2列
第3列
第4列
第5列
第1行
1
12
13
24
25
第2行
2
11
14
23
26
第3行
3
10
15
22
27
第4行
4
9
16
21
28
第5行
5
8
17
20
29
第6行
6
7
18
19
30
图a
图b
(1)999个学生的考号依次是001,002,…,998,999。
根据上述试场编排方法,可知第3试场第2行第3列的学生考号是________。
(2)小王根据上述算法,设计了一个加密程序,其VB代码如下,请在划线处填入合适的代码。
Constk=30
Functionadj(sAsString)AsString
′功能:
在字符串s前添加若干个空格,代码略。
Functionconvert(nAsInteger)AsString
把n转字符串,不足3位则在前面补0,代码略。
Dimkh(1To999)AsString
DimnAsInteger,mAsInteger,kcsAsInteger
DimiAsInteger,jAsInteger,lineAsString
DimstartAsInteger,offset1AsInteger,offset2AsInteger
n=Val(Text1.Text)
m=Val(Text2.Text)
kh(i)=convert(i)
IfnModk=0Thenkcs=n\'
kElse____①______
Ifm>
kcsOrm<
1Then
Label3.Caption=”无该试场!
____②____
Fori=1To6
line=” ”
offset1=i
line=line+adj(kh(start+offset1))
Forj=2To5
IfjMod2=1Then
offset1=offset1+12
line=line+adj(kh(start+offset1))
Else
____③____
line=line+adj(kh(start+offset2))
EndIf
Nextj
List1.AddItemline
解析 从语句m>
kcs来看,kcs表示最大的试场号,试场号往往从1开始编起,当学生人数不是k的倍数时,是k整数倍加1。
Stat表示本试场前面已经有的学生编号,因