资源简介 (共34张PPT)专题26 矩 阵1.矩阵中所有数据均存储在一个数组中,从第1列开始先存储一行,接着再存储下一行。2.一个m行n列的数组,在列表框中输出时,用一个字符串变量表示一行,共循环m次。他是一张二维表。一般来说,用i表示某个元素所处的行,用j表示某个元素所处列。3.矩阵的问题就是研究存储数组元素下标与他所在行和列的关系。A B C DE F G HI J K LM N O PQ R S T5行4列矩阵实际存储的变量列 行 第1列 第2列 第3列 第4列第1行 a(1) a(2) a(3) a(4)第2行 a(5) a(6) a(7) a(8)第3行 a(9) a(10) a(11) a(12)第4行 a(13) a(14) a(15) a(16)第5行 a(17) a(18) a(19) a(20)4.矩阵中某个元素的位置跟他前面有完整行数及所在列数有关,若矩阵的大小为m行n列,矩阵问题就是研究矩阵元素位置(i,j)和数组下标pa对应关系,pa=(i-1)*n+j,表达的含义是该元素处在第i行,说明他前面有i-1个完整行,该元素处在第j列,说明除了完整的行,还有j列是零头。5.通常用双重循环来遍历整个m行n列矩阵,变量i和j表示行和列,也可以用一重循环输出,但此时循环变量表示数组下标。代码如下。For i=1 To m s=”” For j=1 To n s=s+ Str(a((i-1)*n+j)) Next j List1.AddItem s Next i For i=1 To m*ns=s+Str(a(i))If i Mod n=0 Then List1.AddItem s s=””End IfNext i6.若用一重循环来遍历m行n列矩阵,列号总是在[1,n]之间循环,可能通过对下标取余获得列号。由于pa Mod n的范围在[0,n-1],根据约瑟夫环的知识,某位置所处的列为(pa-1) Mod n+1。在每一行中,除了最后一列,其下标整除n的值均比该行前面的列整除n的值大1,例第一行,前n-1个元素的下标整除n为0,第n个元素的下标整除n为1,因此下标为pa数组元素所处行为(pa-1)\n+1。7.若用一重循环来遍历m行n列矩阵,下标为pa数组元素处在矩阵第1列的元素特征用VB表达式表示pa Mod n=1 。最后一列的特征是pa Mod n=0。考点一 根据数组元素下标,计算所处行和所处列每个元素的行号和列号总是从1开始,而下标整除n或Mod n的最小值为0。充分利用其公式来理解题目的含义。【例1】 将一组数据(个数:n^2)分成n段有序(升序)数据,例如:当n=4时,排序结果如图所示。D有如下VB程序段:For i=1 To nFor j=n*(i-1)+1 To____(1)____For k=____(2)____To ____(3)____ If a(k)>a(k+1) Then t=a(k): a(k)=a(k+1): a(k+1)=tNext kNext jNext i上述程序段划线处的表达式分别为( )A.(1)n*i-1 (2)n*(i-1)+1 (3)n*(2*i-1)-jB.(1)n*(i-1) (2)n*i-1 (3)n*i-jC.(1)n*i-1 (2)n*i+j (3)n*(2*i-1)D.(1)n*i (2)n*(i-1)+1 (3)n*i-j解析 该题主要考查了冒泡排序算法思想。结合现在比较常见的数组矩阵下标问题,考查冒泡排序的左端点和右端点的变化情况。起点是该行中的第1列,终点是该行中n-j+1列,但a(k)和a(k+1)比较,因此k的终值该列的n-j,即(i-1)*n+n-j。【变式1】 编写VB程序生成一个n行n列的数字矩阵(数组元素为1-99之间的随机整数),显示在列表框List1中。并在列表框List2中输出每行的最大值及其所在的位置。Const n=4Dim a(1 To n*n) As Integer,i As Integer,j As Integer,w As IntegerDim s As String,pos As Integer,Max As IntegerFor i=1 To nMax=0: s=””For j=1 To npos=____①____a(pos)=Int(1+Rnd*99)s=s+Str(a(pos))AIf____②____ Then Max=a(pos) w=jEnd IfNext jList1.AddItem sList2.AddItem i & ”行” &____③____& ”列最大:” & MaxNext i划线处的代码应为( )A.①(i-1)*n+j ②a(pos)>Max ③w B.①i*n+j ②a(pos)>Max ③jC.①(i-1)*n+j ②a(j)>Max ③w D.①i*n+j ②a(j)>Max ③j解析 变量i控制行,j控制列,第i行第j列存储在数组(i-1)*n+j中,这行中所有数与max比较,找出最值。考点二 利用矩阵知识解决综合问题掌握利用一维数组表示二维矩阵的综合知识。【例2】 (2017·11月浙江省选考)由数组a生成数组b的方法描述如下:1)将数组a中的n个元素依次分割出若干个数据块,每个数据块有m×m个元素,m最大值为8,最小值为2。分割时,按尽可能大的数据块进行分割;2)对每个分割出的数据块用“方阵转换法”进行转换,每次转换后得到的数据块依次存储在数据b中;3)数组a分割后的剩余元素(个数小于4),直接依序存储到数组b中。例如n=140时,可依次分割出3个数据块,元素的个数分别为64(8×8)、64(8×8)、9(3×3),剩余元素为3个。“方阵转换法”过程如下:将数据块中m×m个元素按行序排列成一个数字方阵,从该数字方阵中按列序得到转换后元素的次序。以3×3数据块为例,转换过程如下图所示:小明依据上述描述设计了如下VB程序。请回答下列问题:(1)当n=120时,分割出的第3个数据块元素个数为________。(2)请在划线处填入合适的代码。Const n=120Dim a(1 To n) As IntegerDim b(1 To n) As IntegerPrivate Sub Command1_Click()Dim m As Integer,i As IntegerDim Start As Integer ′当前未分割数据的第1个元素下标Dim Left As Integer ′当前未分割数据的个数Dim pa As Integer ′数组a的下标Dim pb As Integer ′数组b的下标′读取n个转换前的数据,依次存储到a(1)、a(2)、……a(n)中,代码略m=8Start=1Left=nDo While Left>3If Leftm=____①____Elsepa=Startpb=StartFor i=1 To m*m b(pb)=a(pa) pb=pb+1 If i Mod m=0 Then ____②____ Else pa=pa+m End IfNext i ____③____Start=Start+m*mEnd IfLoopFor i=Start To nb(i)=a(i)Next i′依次输出转换后数据b(1)、b(2)、……b(n)中,代码略End Sub答案 (1)4 (2)①m-1或int(sqr(left)) ②pa=start+i\m或pa=start+i/m或pa=pa-(m-1)*m+1或pa=start+(pa-start+1) mod m ③left=left-m*m解析 n=120 时,可依次分割出3 个数据块,元素的个数分别为64(8×8)、49(7×7)、4(2×2),剩余元素为3 个。所以第3 个数据块为4 个元素。剩余数量Left【变式2】 编写“矩形面积”程序,实现如下功能:按一定比例随机生成a(1)至a(100)数组元素的值:0或1(0多1少);将这100个数组元素,按行依次转化为10×10的二维阵列;当数组元素的值为0时显示成“□”,当数组元素的值为1时显示成“◆”,并在列表框List1 中输出。寻找阵列中,由“□”字符构造出的最大面积的矩形,在标签Label1中显示最大面积所占的单位数。程序运行界面如图所示。实现上述功能的VB代码如下:Dim a(1 To 100) As IntegerPrivate Sub Command1_Click()Dim i As Integer,s As Integer,smax As Integer′用于随机生成数据,并将阵列按规则在列表框中输出,该部分功能的代码略。smax=0For i=1 To 100If a(i)=0 Then s=search(i)If s>smax Then smax=sNext iLabel1.Caption=”最大面积的矩形,占”+Str(smax)+”个单位。”End SubFunction search(i As Integer) As IntegerDim x As Integer,x1 As Integer,xend As IntegerDim y As Integer,y1 As IntegerDim s As Integerx=(i-1) Mod 10+1 ′起始列号y=(i-1)\10+1 ′起始行号x1=x: y1=y: xend=10search=0Do While y1 <=10If a((y1-1)*10+x)=1 Then Exit Do ′判断x1=xDo While x1 <=xendIf a((y1-1)*10+x1)=1 ThenElse x1=x1+1End IfLoopy1=y1+1s=(x1-x)*(________) ′填空If s>search Then search=sLoopEnd Function请回答下列问题:(1)根据程序的运行界面,没有Caption属性的控件为________类(单选,填字母: A.窗体/ B.命令按钮/ C.列表框/ D.标签)。(2)程序代码中,去除“判断”处语句,是否会影响程序的结果________(选填:是/否)。(3)程序代码中,“改错”处的语句有误,请改正。(4)程序代码中,将“填空”处的语句补充完整。答案 (1)C (2)否 (3)x1=Xend+1 或Exit DO (4)y1-y解析 自定义函数的功能是从第i个位置开始查找最大矩形面积,x和y表示第i个元素所处的行号和列号。查找的过程是先扫描x行中所有列,找到一个不为0的就表示该行的列数,退出内循环。接着再扫描下一行,找出构成一个最大的面积。若删除划线处语句,进入内循环后,也马上退出内循环,此时的列数为0,面积也为0。1.(2020·4月嘉兴)有如下VB程序段:Const n=3Dim a(1 To n*n) As IntegerDim i As Integer,j As Integer,s As StringFor i=1 To ns=””For j=1 To na((i-1)*n+j)=Int(Rnd*i+j)s=s+Str(a((i-1)*n+j))Next jList1.AddItem sNext i执行程序后,列表框List1中输出的不可能是( )A.1 2 3 B.1 2 3 C.1 2 3 D.1 2 3 2 2 2 2 2 4 1 2 3 2 3 4 3 3 3 3 3 4 1 2 3 3 4 5解析 语句a((i-1)*n+ j)=Int(Rnd*i+j)对第i行的每一列赋值,值的范围是[j,j+i-1],因此A选项的第2行的第3列不可能出现。A2.将一组数据(共n*n个数),分别存放在a(1)…a(n*n)中,通过下面程序实现n段有序(升序),例如:当n=4时,排序结果如图所示:有如下VB程序段:For i=1 To nFor j=n*(i-1)+1 To____①____For k=____②____ To ____③____ If a(k)>a(k+1) Then t=a(k):a(k)=a(k+1):a(k+1)=t End IfNext kNext jNext i上述程序段划线处的表达式正确的是( )A.①n*i-1 ②n*(i-1)+1 ③n*(2*i-1)-jB.①n*(i-1) ②n*i-1 ③n*i-jC.①n*i-1 ②n*i+j ③n*(2*i-1)D.①n*i ②n*(i-1)+1 ③n*i-j解析 本题考查矩阵与冒泡排序相关知识。通过三重循环完成该功能。第二重For循环控制每一段需要排序的数据的起始位置和终止位置,每一行都为n个数据。故①处填n*i-1;第三重For循环控制每一段数据的比较范围,根据比较关系为a(k)与 a(k+1);从前往后比较,故②③处填n*(i-1)+1和n*(2*i-1) -j,答案选A。A3.有一个n行m列网格状临时停车场,如图a所示:在网格中随机分布若干个石头,网格中“□”表示空位,“●”表示石头。停放一辆车需要长为clen个空位、宽1个空位的空间,且车只能南北停放。编写程序,实现统计该车共有多少种停放方法。图a图b程序实现过程:生成规模为n×m的网格,在网格边界添加一圈交通锥“▲”,并将“□”、“●”、“▲”按行依次存入数组a中,在文本框Text3中输入停放该车最小长度clen值,在文本框Text4中输出共有多少种停放方法。程序运行界面如图b所示,实现上述功能的VB代码如下:Dim a(1 To 200) As StringDim n As Integer,m As IntegerPrivate Sub Command1_Click()Dim i As Integer,j As Integer,k As IntegerDim s As Stringn=Val(Text1.Text)+2m=Val(Text2.Text)+2List1.ClearFor i=1 To n*mIf i <=m Or i>m*(n-1) Or____①____Then ′在矩阵周围加上一圈边界a(i)=”▲”Elsek=Int(Rnd*2)If k=1 Then a(i)=”□” Else a(i)=”●”End IfNext i′在列表框List1中显示网格,代码略End SubPrivate Sub Command2_Click()Dim i As Integer,j As Integer,c As Integer,x As Integer,y As IntegerDim cnt As Integer,clen As IntegerDim flag As Booleanclen=Val(Text3.Text)y=1Do While y <=mFor x=1 To nIf a((x-1)*m+y)=”□” Then c=c+1Else If c>=clen Then cnt=____②____ End If ____③____End IfNext xy=y+1LoopText4.Text=Str(cnt)End Sub请回答下列问题:(1)根据图a所示,车长需3个空位的汽车共有________种不同的停法。(2)请在划线处填入合适的代码。答案 (1)4 (2)①i Mod m=0 Or i Mod m=1 ②cnt+c-clen+1 ③c=0解析 本题考核的是矩阵有关算法思想。(1)按图中所示,第2列和第5列有大于等于3个车位的空间,因此第5列只有一种停法。第2列有5个空位,停法1:第1至3个空位;停法2:第2至4个空位;停法3:第3至5个空位,共有3种停法。(2)矩阵外围的特征是第1行元素的下标小于等于m,最后一行元素的下标大于(m-1)*n。第1列特征是i Mod n=1,最后1列的特征是i Mod n=0,因此①的答案为i Mod m=0 Or i Mod m=1。在矩阵中,当前元素的位置是由它所在行和它在列来表达组成,x是他所在行的编号,y是他所在列的编号,该元素保存在数组中的下标是(x-1)*m+y。程序的功能是从第1列开始,查找每列连续的”□”的个数,把每个连续的空位保存在c中,如第2列当y=2时,x=1出现空位,且x=2时不是空位,第一个c的值是1,当x=4时,出现空位,并不断地往下找空位c。若停车需clen个空位,由(1)可知,c个空位可以停的方法是c-clen+1。计算完后,要把空位置0。 展开更多...... 收起↑ 资源预览