版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1数 组本章要点:数组的基本概念数组的定义数组的操作(输入、输出、删除等)数组应用举例控件数组第7章 27.1 数组的基本概念 前面的各种问题中,一般只涉及少量的数据,这些数据使用简单变量就可以很方便地进行存取或处理。但是,在实际问题中往往会有大量相关的数据需要处理。例如,要处理全校3000个学生的数学成绩,如果使用简单变量,就要引入3000个不同的变量来存储这些数据。这样显然太繁琐,如果数据量再大,采用这种处理几乎是难以做到的。另外,这种数据除了量比较大以外,各数据在整组数中的位置是明确的,即数据是有序的。这种顺序使用简单变量难以体现,而使用本章要介绍的数组,在多数场合可以很方便地处理这种大
2、量的性质相同的有序数。37.1.1 数组与数组元素定义: 一组性质相同的有序的数 例如, 全班40名同学的英语成绩: G(1) G(2) G(3) G(40)所有班级(如6个班,每班40人)同学的英语成绩: 表示1: G(1) G(2) G(3) G(240) 表示2: G(1,1) G(1,2) G(1,40) G(2,1) G(2,2) G(2,40) G(6,1) G(6,2) G(6,40)4例: 矩阵矩阵中各元素b11-b33可表示成: B(1,1) B(1,2) B(1,3) B(2,1) B(2,2) B(2,3) B(3,1) B(3,2) B(3,3)5数组名:一组数用一个统
3、一的名称表示。数组元素(下标变量): 数组中的每一个元素 表示成: 数组名(下标) 下标的取值可以是常量、变量、表达式 如: G(8) B(I) C(3+K) 下标还可以是下标变量 如: A(A(5) 令A(5)=4 则 A(A(5)=A(4)每个数组元素用来保存一个数据,其使用与简单变量类似。 例如,G(8)=87 表示给数组元素G(8)赋值。6注意:要用圆括号把下标括起来 例如,将X(8)表示成: X8、X8、或X8都是错误的。下标必须是整数,否则将被自动四舍五入为整数。下标的最小取值称为下界,下标的最大取值称为上界。数组元素的下标必须在其下界和上界之间,否则将会出错。77.1.2 数组的
4、维数数组的维数:下标个数 一维数组: 由一个下标组成。 如 A(2),C(6) 二维数组: 由两个下标组成。 如 B(2,3) 三维数组: 由三个下标组成。 如 G(3,4,23) 三维以上的数组称为多维数组,最多60维通常也将二维数组的第一个下标叫行下标,第二个下标叫列下标。87.2 数组的定义数组在使用之前必须先定义(声明)。定义数组的目的是为数组分配存储空间,数组名即为这个存储空间的名称,而数组元素即为存储空间的每一个单元。每个单元的大小与数组的类型有关。 例如,定义某数组X为整型(Integer)数组,共有10个元素,则每个元素占2个字节,则所有数组元素占20个字节。按数组占用存储空间
5、的方式不同,分为两种数组:静态数组和动态数组。两种数组的定义方法不同,使用方法也略有不同。97.2.1 静态数组的定义1. 格式 Public|Private|Dim 数组名(维数定义) As 类型,2. 功能 声明数组名称、维数、维大小、类型。 为数组分配存储空间。例:定义数组G保存全班40名同学的英语成绩 Dim G( 1 To 40) As Integer例:定义数组B,保存3行3列的矩阵的各元素 Dim B(1 To 3, 1 To 3)103. 说明1) Public|Private|Dim:在标准模块的通用声明段使用Public语句建立一个全局级数组;在模块的通用声明段使用Priv
6、ate语句或Dim语句建立一个模块级数组; 在过程中用Dim语句建立一个过程级数组。2)数组名:需遵循变量命名约定。3)“维数定义”: 下界1 To 上界1,下界2 To 上界2,11如果下界省略,则使用默认下界定义默认下界: Option Base 0|1不加任何定义时,默认下界为0数组元素个数: (上界1-下界1+1)*(上界2-下界2+1)*4): Integer Long Single Double Boolean String String*n Curency Byte Date Variant Object 用户定义类型125)数组在定义后自动被初始化 例如: 将数值型数组元素值置
7、为0; 将字符串类型数组元素值置为零长度字符串6)静态数组被定义后,VB为其分配固定大小的存储空间,在运行期大小不能改变。13例: Dim C(9) As Integer 一维整型数组;下界0,上界为9 元素:C(0) C(1) C(2) C(9) 例: Dim A(-4 TO 10) As Integer 一维整型数组;下界 -4,上界 10 元素 A(-4) A(-3) . A(0) A(1) . A(10)例: DIM M(-3 TO 10) 一维可变类型数组 例: CONST Y1=10 CONST Y2=50 DIM ABC(Y1 TO Y2) AS INTEGER14例: Dim
8、B(-1 to 7,0 to 3) As String DIM B(-1 To 7,3) As String 二维字符串类型数组 第一维:下界-1,上界 7; 第二维: 下界0,上界 3 元素: B(-1,0) B(-1,1) B(-1,2) B(-1,3) B(0,0) B(0,1) B(0,2) B(0,3) . B(7,0) B(7,1) B(7,2) B(7,3)15 在预先不知道要处理的数据量有多大时,如果使用静态数组,就需要在声明数组时使数组的大小尽可能达到最大,以适应不同的数据量。因为静态数组在整个程序的执行过程中一直占用存储空间,因此会浪费一定的内存空间,过度使用静态数组会影响
9、整个系统的性能。 在解决实际问题时,所需要的数组到底应该有多大才合适,有时可能不得而知,所以希望能够在运行时改变数组的大小。使用动态数组就可以在任何时候改变其大小,并且可以在不需要时清除动态数组所占的存储空间。因此,使用动态数组更加灵活、方便,并有助于高效管理内存。161. 定义动态数组分以下两步进行: 1) 在模块级或过程级定义一个没有下标的数组 : Public|Private|Dim 数组名()As 类型, 例:Dim G() As Integer2) 在过程级使用ReDim语句定义数组的实际大小 ReDim Preserve 数组名(维数定义) As 类型,例: ReDim G(1 T
10、o 100) As Integer ReDim Preserve G(1 To 100) As Integer7.2.2 动态数组的定义172. 说明ReDim语句只能出现在过程中。维数定义:常包含具有明确值的变量或表达式。可以用ReDim反复改变数组元素及维数的数目。若用步骤1定义了类型,则不许用步骤2改变类型。18每次执行ReDim语句时,如果不使用Preserve关键字,当前存储在数组中的值会全部丢失。Visual Basic重新对数组元素进行初始化,如将数值型数组元素值置为0,将可变长度字符串类型数组元素值置为零长度字符串。Preserve为可选的关键字。有时,希望改变数组的大小又不丢
11、失数组中原有的数据,使用带Preserve关键字的ReDim语句就可以做到这一点。使用Preserve关键字的Redim语句只能改变多维数组中最后一维的上界,且不能改变维数的数目。如果改变了其他维或最后一维的下界,那么运行时就会出错。19例: Dim A() As Integer Private Sub Command1_Click() N = 4 ReDim A(N) For I = 0 To N A(I) = 1: Print A(I); Next I Print N = 8 ReDim A(N) For I = 0 To N Print A(I); Next I End Sub运行时输出
12、结果为:1 1 1 1 10 0 0 0 0 0 0 020例: Dim A() As Integer Private Sub Command1_Click() N = 4 ReDim A(N) For I = 0 To N A(I) = 1: Print A(I); Next I Print N = 8 ReDim Preserve A(N) For I = 0 To N Print A(I); Next I End Sub运行时输出结果为:1 1 1 1 1 1 1 1 1 1 0 0 0 0217.3 数组的输入输出 数组在声明之后,VB对其进行了初始化,但在实际应用中,往往要给数组元素
13、赋一定的初始值。例如,在处理学生成绩时,首先需要向数组中输入所有的成绩,在使用二维数组表示矩阵时,要向数组中输入矩阵中各元素的值。对数组元素的输入可以有多种方法。例如:赋值语句;文本框;InputBox函数;Array函数等,可以对数组的个别元素输入数据,也可以对整个数组输入数据。 数组元素经过处理后,常需要将结果显示给用户,即输出数组元素的值。输出方法如:Print方法;标签;文本框等。22例:用输入框输入10个学生的成绩并存放到数组A中,然后将这些成绩显示在文本框中。 Dim A(1 To 10) As Integer 输入: For i = 1 To 10 A(i) = Val(Inpu
14、tBox(请输入第 & Str(i) & 个学生的成绩) Next i 输出: For i = 1 To 10 Text1.Text = Text1.Text & Str(A(i) Next i23使用文本框显示多个数据时,常需要给文本框设置滚动条,依据滚动条的方向,要注意每显示一个或多个数据后是否要在文本框中加上回车换行符号。24例:假设用二维数组B来表示一个6行6列的矩阵,以下代码生成包含1,10之间的随机整数的矩阵,并以6行6列的形式将该矩阵打印在窗体上。 Dim B(1 To 6, 1 To 6) As Integer 输入: For I = 1 To 6 For J = 1 To 6
15、 B(I, J) = Int(Rnd * 10 + 1) Next J Next I25 输出:For I = 1 To 6 For J = 1 To 6 Print Format(B(I, J), ); Next J Print Next I261. 格式 Erase 数组名2. 功能删除静态数组将对其中的所有元素进行初始化。例如,将数值型数组元素值置为0;将可变长度字符串类型数组元素值置为零长度字符串。注意,Erase语句不能释放静态数组所占的存储空间。删除动态数组将释放动态数组所占的存储空间,在下次引用该动态数组之前,必须使用ReDim语句重新定义该数组。7.4 数组的删除271. 格式
16、 For Each 变量 In 数组名 语句组1 Exit For 语句组2 Next 变量 7.5 使用For Each.Next循环处理数组只能是一个可变类型的变量2. 功能: 首先将数组中的第一个元素赋给”变量”,然后进入循环体中执行其中的语句。如果数组中还有其他元素,则继续将下一个元素赋值给”变量”后执行循环体,当针对数组中的所有元素都执行完了,便会退出循环,执行Next之后的语句。28例: 以下程序段使用For Each.Next语句打印一维数组X中的所有元素。 Dim X(15) For Each A In X Print A; Next A比较:For I= 0 To 10 Fo
17、r J=0 To10 Sum=Sum+ Y(I,J) Next JNext I比较:For I= 0 To 15 Print X(i);Next i例: 求二维数组Y的所有元素之和。 Dim Y(10, 10) For Each A In Y Sum = Sum + A Next A Print Sum 297.6 数组操作函数1LBound和UBound函数格式:LBound(数组名,N)UBound(数组名,N)功能:LBound函数返回“数组名”指定的数组的第N维的下界;UBound函数返回“数组名”指定的数组的第N维的上界。说明:N为1表示第一维,N为2表示第二维,等等。如果省略N,则
18、默认为1。30例:要打印一维数组A的各个值,可以通过下面的代码实现: For I = LBound(A) To UBound(A) Print A(I); Next I例:要打印二维数组B的各个值,可以通过下面的代码实现: For I = LBound(B, 1) To UBound(B, 1) For J = LBound(B, 2) To UBound(B, 2) Print B(I, J); Next J Print Next I312Array函数格式:Array(参数表)功能:返回一个数组,数组元素的值由“参数表”指定。说明:“参数表”是一系列用逗号分隔的值,这些值构成数组的各元素值
19、。Array函数只能给Variant类型的变量赋值,赋值后的数组大小由参数的个数决定,数组下标的下界由Option Base语句指定的下界决定。32例:要将1,2,3,4,5,6,7,8,9,10这些值赋给数组A,可以使用下面方法: Dim A A = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)执行以上赋值之后:A(0)=1,A(1)=2,A(2)=3,A(9)=10。333Split函数格式:Split(字符串表达式,分隔符)功能:以某个指定符号作为分隔符,将“字符串表达式”指定的字符串分离为若干个子字符串,以这些子字符串为元素构成一个下标从零开始的一维数组。说
20、明:“字符串表达式”用于指定要被分隔的字符串,“分隔符”是可选的,如果忽略,则使用空格作为分隔符。34例:执行以下代码段: Dim A A = Split(how are you, )执行以上赋值之后:A(0)=how,A(1)=are,A(2)=you。也可以用Split函数给一个动态数组赋值。例: Dim A() As String A = Split(how are you, )354Join函数格式:Join(一维数组名,分隔符)功能:将一维数组中的各元素连接成一个字符串,连接时各子字符串之间加上“分隔符”指定的字符。说明:分隔符用于指定在返回的字符串中分隔各子字符串的字符。如果忽略该
21、项,则使用空格来分隔子字符串。如果“分隔符”是零长度字符串,则将所有数组元素连接在一起,中间没有分隔符。36例:执行以下代码段: Dim a a = Array(吃葡萄, 不吐, 葡萄皮) b = Join(a, ) Print b打印“吃葡萄不吐葡萄皮”377.7 数组应用举例【例7-1】输入若干个学生的成绩,统计不及格人数和优秀人数。Text1Command1Picture1设计界面:38分析:设运行时学生成绩直接输入到文本框Text1中,各成绩之间用逗号分隔。代码首先使用Split函数将文本框Text1中输入的成绩分离开,保存到数组A中。引入计数变量设两个计数变量num1和num2,分别
22、用来保存不及格学生人数和优秀学生人数。将计数变量初始化为0,统计过程逐一取数组元素进行判断,如果数组元素的值小于60,则让num1累加1,如果数组元素的值大于或等于90,则让num2累加1。39代码设计:Private Sub Command1_Click() Dim A, N As Integer Dim num1 As Integer, num2 As Integer A = Split(Text1.Text, ,) N = UBound(A) num1 = 0: num2 = 0 For i = 0 To N Select Case Val(A(i) Case Is = 90 num2
23、= num2 + 1 End Select Next i40 显示统计结果 Picture1.Cls 定义打印位置 Picture1.CurrentX = 100 Picture1.CurrentY = 100 Picture1.Print 不及格人数:; num1; _ Tab(18); 优秀人数:; num2End Sub运行界面:41【例7-2】输入若干名学生的成绩,求平均分、最高分、最低分。设计界面:Text2Text3Text4Text142分析: 假设运行时输入到文本框Text1中的各成绩之间用逗号分隔。代码首先使用Split函数将文本框Text1中输入的成绩分离开,保存到数组A中
24、,然后进行求值。求平均分时只需先求数组所有元素之和,再除以数组元素的个数即可。求最高分、最低分的问题实际上就是求一组数据的最大值、最小值问题。43求最大值的方法:1)设一个存放最大值的变量MaxNum,其初值为数组的第一个元素,即MaxNum=A(0);2)依次将MaxNum与A(1)到A(N)的所有数据进行比较,如果数组中的某个数A(I)大于MaxNum,则用该数替换MaxNum,即MaxNumx=A(I),所有数据比较完后,MaxNum中存放的数即为整个数组的最大数。求最小值的方法与求最大值的方法类似。44“求值”按钮Command1的Click事件过程:Private Sub Comma
25、nd1_Click() Dim A, N As Integer Dim MaxNum As Integer, MinNum As _ Integer, Average As Single A = Split(Text1.Text, “,”) N = UBound(A) Total = 0 MaxNum = Val(A(0) MinNum = Val(A(0)45 通过循环依次比较,求最大值、最小值、总和 For i = 0 To N If Val(A(i) MaxNum Then _ MaxNum = Val(A(i) If Val(A(i) X(J)(J=2,3,N),则交换X(1)、X(J
26、)的内容;2) 将第2个数与第3个数到第N个数依次比较,如果X(2)X(J)(J=3,4,N),则交换X(2)、X(J)的内容;3) 重复以上方法,将第I个数与第I+1个数到第N个数依次比较,如果X(I)X(J)(J=I+1,N),则交换X(I)、X(J)的内容;共重复N-1轮。49代码设计:(1)设用数组X保存学生成绩,用变量N保存学生人数。因为数组X和变量N要在两个命令按钮的事件过程中公用,所以,在窗体模块的通用声明段定义数组X和变量N。因为学生人数可以由用户来指定,因此这里应将X定义成动态数组: Option Base 1 Dim N As Integer, X() As Integer
27、50(2) “输入成绩”按钮的Click事件过程:Private Sub Command1_Click() N = Val(InputBox(请输入总人数) ReDim X(N) Text1.Text = For I = 1 To N X(I) = Val(InputBox(请输入第 & Str(I) & 个学生的成绩, 成绩排序, ) Text1.Text = Text1.Text & Str(X(I) Next IEnd Sub51(3)“排序”按钮的Click事件过程:Private Sub Command2_Click() 用比较交换法进行排序 For I = 1 To N - 1 F
28、or J = I + 1 To N If X(I) X(J) Then 交换X(I)和X(J)的值 T = X(I) X(I) = X(J) X(J) = T End If Next J Next I 52 显示排序结果 Text2.Text = For I = 1 To N Text2.Text = Text2.Text & Str(X(I) Next IEnd Sub选择排序法:自学:P126冒泡排序法:自学P126P12753【例7-4】生成100个0,100之间的随机整数作为原始数据,存于数组A中,在数组A中查找指定的元素Number。设计界面:Text1Command1 Comman
29、d254分析:这是一个查找问题,查找的方法有很多种,如顺序查找、折半查找、分块查找等。不同的查找方法效率不同。1)“顺序查找”算法: 设用变量K保存查找位置,初始值为0。从数组A的第一个元素开始,按顺序依次与Number比较,如果A(I)=Number,则保存查找位置K,即让K=I,结束查找;否则,继续与下一个数比较。 结束查找后,若K仍然为0,则说明没找到,否则找到位置即为K。55Private Sub Command1_Click() Randomize For i = 1 To 100 A(i) = Int(Rnd * 101) Text1.Text = Text1.Text & Str
30、(A(i) Next iEnd Sub(1)在窗体模块的通用声明段定义数组A:Dim A(1 To 100) As Integer代码设计:(2)编写“生成随机数”按钮的Click事件过程:56(3)编写“查找”按钮Command2的Click事件过程:Private Sub Command2_Click() Number = Val(InputBox(请输入要查找的数) k = 0 用k保存查找位置 顺序查找 For I = 1 To 100 If A(I) = Number Then 如果找到 k = I 保存找到的位置 Exit For 退出循环 End If Next I 57 根据k
31、的值判断查找结果 If k 0 Then MsgBox 所找的数在第 & Str(k) & _ 个位置 Else MsgBox 没找到 End IfEnd Sub*2)折半查找算法:自学P128P12958【例7-5】生成20个0,100区间的随机整数作为原始数据,存于数组A中,然后删除数组A中指定位置的元素。设计界面:Text2Command1Text1Text359posA(Pos)=A(Pos+1)A(Pos+1)=A(Pos+2)A(N-1)=A(N)For I = Pos To N - 1 A(I) = A(I + 1)Next I 分析: 60代码设计:1)由于数组A的大小在删除元
32、素后变小,因此这里将数组A定义成动态数组。 在窗体模块的通用声明段声明: Option Base 1 Dim N As Integer, A() As Integer612)在窗体的Load事件过程中生成20个0到100之间的随机整数,显示于文本框Text1中。 Private Sub Form_Load() Text1.Text = N = 20 ReDim A(1 To N) For I = 1 To N A(I) = Int(Rnd * 101) Text1.Text = Text1.Text & Str(A(I) Next I End Sub623)编写“删除”按钮Command1的C
33、lick事件过程,实现按指定位置删除。 Private Sub Command1_Click() Pos = Val(Text2.Text) If Pos N Then MsgBox 位置越界,请重新输入 Text2.SetFocus Text2.SelStart = 0 Text2.SelLength = Len(Text2.Text) Else For I = Pos To N - 1 A(I) = A(I + 1) Next I63 N = N 1 ReDim Preserve A(1 To N) Text3.Text = For I = 1 To N Text3.Text = Text
34、3.Text & Str(A(I) Next I End If End Sub64【例7-6】将数Num插在数组A中指定的Pos位置 。 如果Pos0,则将Num插在第1个位置 如果PosN,则将Num插在最后一个位置设计界面:Text3Text2Command165posNum1) 对数组中原Pos位置的元素到最后一个元素全部向后移动一个位置: A(N+1)=A(N)A(N)=A(N-1)A(Pos+1)=A(Pos)2) 插入:A(Pos)=NumFor I=N+1 To Pos+1 Step -1 A(I) = A(I - 1)Next I分析:661) 在“通用”位置声明: Optio
35、n Base 1 Dim N As Integer, A() As Integer2) 在窗体的Load事件过程中生成20个0,100之间的随机整数,显示于文本框Text1中: Private Sub Form_Load() Text1.Text = N = 20 : ReDim A(N) For I = 1 To N A(I) = Int(Rnd * 101) Text1.Text = Text1.Text & Str(A(I) Next I End Sub673) “插入”按钮的Click事件过程:Private Sub Command1_Click() 插入 Text4.Text = N
36、um = Val(Text2.Text) Pos = Val(Text3.Text) N = N + 1 ReDim Preserve A(N) Select Case Pos Case Is = N 插在第N个位置,即pos=N A(N) = Num Case Else For I = N To Pos + 1 Step -1 A(I) = A(I - 1) Next I A(Pos) = Num End Select 显示插入后的结果 For I = 1 To N Text4.Text = Text4.Text & Str(A(I) Next IEnd Sub69 【例7-7】在窗体上输出
37、一个N行、N列、主对角线和次对角线元素为1,其余元素均为零的矩阵。N由用户指定。 分析:矩阵中的每个数据在矩阵中所处的位置由行号和列号决定,可以使用二维数组直观地表示矩阵中的每一个元素。例如,用二维数组A表示矩阵,第一个下标表示矩阵中数据的行号,第二个下标表示列号,因此矩阵中第I行第J列元素表示为A(I,J)。而N行N列矩阵的主对角线元素指数组中行下标与列下标相同的元素,次对角线元素的行下标与列下标之和为N+1。70Private Sub Form_Click() Dim A() As Integer Dim N As Integer, I As Integer, _ J As Integer
38、 Cls N = Val(InputBox(请输入N值, 生成矩阵, 4) ReDim A(1 To N, 1 To N) As Integer代码设计:71 生成矩阵 For I = 1 To N For J = 1 To N If I = J Then A(I, J) = 1 主对角线元素置1 ElseIf I + J = N + 1 Then A(I, J) = 1 次对角线元素置1 Else A(I, J) = 0 其他元素置0 End If Next J, I72 按N行N列的格式显示矩阵 For I = 1 To N CurrentY = I * 300 For J = 1 To
39、N CurrentX = J * 300 Print A(I, J); Next J Next IEnd Sub73 【例7-8】求两个矩阵的和。 分析: M行N列的矩阵A与M行N列的矩阵B的和,结果为一个M行N列的矩阵C,C矩阵中第I行第J列的元素,等于A矩阵中第I行第J列的元素与B矩阵中第I行第J列的元素相加。即: C(I,J)=A(I,J)+B(I,J) 配合循环变量控制下标取所有可能的值:For I = 1 To M For J = 1 To N C(I, J) = A(I, J) + B(I, J) Next JNext I74Text1Text2Text3Command1Comma
40、nd2运行界面:751) 在代码窗口的通用声明段声明: Dim M As Integer, N As Integer, _ A() As Integer, B() As Integer, _ C() As Integer2) 在窗体的Load事件过程中用输入框输入M和N的值,再根据该值定义动态数组A、B和C的大小。生成矩阵中的数据、保存在数组A和B中,同时显示在文本框Text1和Text2中:代码设计:76Private Sub Form_Load() M = Val(InputBox(请输入行数, 矩阵相加, ) N = Val(InputBox(请输入列数, 矩阵相加, ) ReDim A
41、(1 To M, 1 To N), B(1 To M, 1 To N), C(1 To M, 1 To N) Randomize 77 在文本框Text1中生成矩阵A Text1.Text = For I = 1 To M S1 = S1用于保存矩阵的第I行 For J = 1 To N A(I, J) = Int(Rnd * 11) S1 = S1 & Format(A(I, J), !) Next J Text1.Text = Text1.Text & S1 & vbCrLf Next I78 在文本框Text2中生成矩阵B Text2.Text = For I = 1 To M S1 =
42、 S1用于保存矩阵的第I行 For J = 1 To N B(I, J) = Int(Rnd * 11) S1 = S1 & Format(B(I, J), !) Next J Text2.Text = Text2.Text & S1 & vbCrLf Next IEnd Sub793)“求和”按钮的Click事件过程如下:Private Sub Command1_Click() 求A矩阵与B矩阵的和C矩阵,显示在Text3中 Text3.Text = For I = 1 To M s1 = For J = 1 To N C(I, J) = A(I, J) + B(I, J) s1 = s1
43、& Format(C(I, J), !) Next J Text3.Text = Text3.Text & s1 & vbCrLf Next IEnd Sub80*【例7-9】将上例改成求两个矩阵的积。 分析:M行N列的矩阵A与N行M列的矩阵B相乘,结果为一个M行M列的矩阵C,C矩阵中第I行第J列的元素,等于A矩阵中第I行的元素与B矩阵中第J列的元素分别相乘后再相加。即:81运行界面如下:Command1Text1Text2Text3Command282代码如下: Dim M As Integer, N As Integer, _ A() As Integer, B() As Integer,
44、 C() As IntegerPrivate Sub Form_Load() M=InputBox(请输入A矩阵行数, _ 矩阵相乘, ) N = InputBox(请输入A矩阵列数, _ 矩阵相乘, ) ReDim A(1 To M, 1 To N), _ B(1 To N, 1 To M), C(1 To M, 1 To M) Randomize83 在文本框Text1中生成矩阵A Text1.Text = For I = 1 To M S1 = For J = 1 To N A(I, J) = Int(Rnd * 11) S1 = S1 & Format(A(I, J), !) Next
45、 J Text1.Text = Text1.Text & S1 & vbCrLf Next I84 在文本框Text2中生成矩阵B Text2.Text = For I = 1 To N S1 = For J = 1 To M B(I, J) = Int(Rnd * 11) S1 = S1 & Format(B(I, J), !) Next J Text2.Text = Text2.Text & S1 & vbCrLf Next IEnd Sub85 Private Sub Command1_Click() 求积C Text3.Text = For I = 1 To M S1 = For J
46、= 1 To M C(I, J) = 0 For K = 1 To N C(I, J) = C(I, J) + A(I, K) * B(K, J) Next K S1 = S1 & Format(C(I, J), !) Next J Text3.Text = Text3.Text & S1 & vbCrLf Next IEnd Sub86【例7-10】求矩阵每行元素的和,每列元素的和。分析:用二维数组X来表示矩阵,X有M行N列,行元素的和共有M个,可以设置一个有M个元素的一维数组A来存放,同样,可设置一个有N个元素的一维数组B来存放:自学:P135137程序X(1,1) X(1,2) X(1,
47、N)X(2,1) X(2,2) X(2,N) .X(M,1) X(M,2) X(M,N)A(1)A(2)A(M)B(1) B(2) B(N)行的和列的和877.8 控件数组在应用程序中,往往要使用一些类型相同、功能相似的控件,可以将这种同一类型的控件定义成一个控件数组。例如,可以将一批文本框定义成一个控件数组,也可以将一批命令按钮定义成一个控件数组。同一个控件数组中的控件具有相同的名称。控件数组中的每个控件是该控件数组的一个元素,表示为: 控件数组名(索引) 例如:Text1(0) Text1(1) Text1(2)88各控件(数组元素)的索引(下标)不同,该索引由控件的Index属性决定。使
48、用控件数组消耗的资源少。当希望若干控件共享代码时,控件数组也很有用,因为同一个控件数组中的不同控件共享相同的事件过程。例如,设已经创建了一个控件数组Command1,包含10个命令按钮,则它们的Click事件过程如下:Private Sub Command1_Click(Index As Integer) End Sub897.8.1 创建控件数组1. 在设计阶段创建控件数组的方法 1) 将多个控件取相同的名称 2) 复制、粘贴现有的控件 3) 给控件设置一个Index属性值2. 在运行时创建控件数组的方法 1) 通常在设计时首先创建一个Index属性为0的控件 2) 在运行时使用Load语句
49、添加控件: Load 控件数组名(索引) 903)新添加的控件是不可见的,必须编写代码将其Visible属性设置为True,通常还要调整其位置,才可以在界面上显示出来例: 设已经在设计时建立了一个控件Text1(0),在运行时可以用以下语句加载该数组的一个新的控件: Load Text1(1) Text1(1).Visible = True Text1(1).Left = 1000 视具体情况而定913. 删除控件数组中的控件: Unload 控件数组名(索引)例如, 删除以上创建的Text1(1)控件: Unload Text1(1)注意:Unload语句无法删除设计时创建的控件92示例:控
50、件数组的添加与删除93代码如下:Dim i As IntegerPrivate Sub Command1_Click() i = i + 1 Load Image1(i) Image1(i).ZOrder 0 将控件置前 Image1(i).Visible = True Image1(i).Left = Image1(i - 1).Left + 500 Image1(i).Top = Image1(i - 1).Top + 500End Sub94Private Sub Command2_Click() If i 0 Then Unload Image1(i) i = i - 1 Else M
51、sgBox 不能再收牌 End IfEnd Sub 以下代码实现在单击控件时将其置前Private Sub Image1_Click(Index As Integer) Image1(Index).ZOrder 0 End Sub957.8.2 控件数组的使用 同一个控件数组的所有控件共享相同的事件过程。控件数组的事件过程会返回一个参数Index,以表示当前是在控件数组的哪一个控件上发生了该事件。例如, 命令按钮数组Command1的单击事件过程为: Private Sub Command1_Click(Index As _ Integer) 在此过程中可以根据Index的值决定 当前按下哪个
52、按钮,以便做相应的处理 End Sub96【例7-11】设计如下图所示的界面,创建一个单选按钮控件数组Option1(0)Option1(5),包含6个单选按钮。运行时,当按下某一单选按钮时,对图形设置相应的形状。Option1Shape1界面设计:97代码设计: 由于6个单选按钮为一个控件数组,因此共享同一个Click事件过程,在单选按钮数组的Click事件过程中可以根据Index参数值判断在哪一个单选按钮上发生了单击事件,以决定对图形设置相应的形状。图形的形状可以通过设置Shape1控件的Shape属性实现。Shape属性的取值与对应的形状见P139表7-1Private Sub Option1_Click(Index As Integer) Shape1.Shape = IndexEnd Sub98【例7-12】使用控件数组创建电影胶片播放特效。Piture1(0)Piture1(1)Piture1(2)Piture1(3)Timer1使用复制粘贴的方法创建控件数组Piture1。设置Timer1的Interval属性值为10界面设计:991)在窗体的Load事件过程中调整好各图片的初始位置:Private Sub Form_Load() Form1.Width = 3 * Picture1(0).Width Pict
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城市高架桥桥墩防车撞设施安装工程环境影响评价报告
- 护理评估工具的质量控制
- 床上洗头护理的操作流程
- 2025年废电池回收处理设备工艺优化
- 临时场地看管协议范本二篇
- 家庭除虫服务行业市场发展分析及前景趋势与投资战略研究报告
- (2026年)脑卒中后吞咽障碍患者进食护理课件
- 造纸行业废水处理与碱回收利用方案
- 医疗风险管理方案
- 转动惯量的题目及答案
- 小升初综合试题及答案
- 2026年湖北省中考英语真题含解析
- GB/T 47720-2026起重机械远程控制系统通用技术规范
- 2026继续教育一级消防工程师试题题(答案附后)
- 盾构渣土处理及再利用技术规程
- 2026年全国一卷高考英语读后续写深度解读及范文
- 学法减分考试常考题目题库(80题)
- 电力建设“五新”推广应用信息目录(试行)
- 临时用地复垦方案96962
- 安徽凌玮新材料科技有限公司年产2万吨超细二氧化硅气凝胶系列产品项目环境影响报告书
- 机电常用材料进场验收要点
评论
0/150
提交评论