第七章 数 组
§ 7.1 数组的基本概念
§ 7.2 静态数组与动态数组
§ 7.4 控件数组
§ 7.3 数组的基本操作
§ 7.5 数组的应用
设想,
( 1)设置两个简单的数值型变量 EnglishS,MathsS
来分别存储学生的英语、数学成绩,利用循环便可实现所
有成绩的输出。
【 引例 】 备份并输出某班所有学生(共 30人)的英语、数
学考试成绩。
然而,这里要求成绩备份,即所有成绩仍然保存。显然,上面
的两个变量在每次循环执行完毕值都发生了改变,无法满足要求。
虽然能够实现程序功能,但显然存在了 30× 2 个变量,输出与操
作都显得不便。 ( English_1,English_2,…, English_30 和
Maths_1,Maths_2,…, Maths_30)
( 2)对于每个学生的英语、数学成绩都设置数值型变
量 English,Maths,用下划线加数字 1,2,…29, 30 来
区别,然后逐个存储和输出。
实际应用中,常常遇到类似处理 相同类型的大量 相关数据的情况。
对这些数据,若使用 相同的名称、辅以序号 (数值变量)来区分代替,
处理将变得清晰简便得多。
? 注意,
( 1)数组是由一定数目的同类元素按一定顺序排列而
成的结构类型数据;
( 2)同其他变量一样,要求先定义再使用,以便在内
存中得到数据存储区域,这个区域就是“数组名”,各个
不同数据单元用“下标”加以区别;
( 3)使用不同的关键字进行数组定义,将使得其使用
范围不相同。
? 数组, 一组具有同一名字、不同下标的数据元素。
§ 7.1 数组的基本概念
? 类型, 按长度可分成固定大小的数组和动态数组;
按维数可分成一维数组和多维数组。
§ 7.1.1 数组的定义
? 一维数组的定义格式,
Dim 数组名 ( [下标下界 To] 下标上界 ) As 类型名称
格式说明,
( 1)数组名命名规则与简单变量相同;
( 2)类型名称为标准或用户定义的数据类型;
( 3)下标为整型常数或常量表达式,其下界的默认值是 0;
( 4)使用 Dim 语句定义数组,数组元素初始化为, 0” (数
值数组)或,空字符串”(字符串数组 )。
( 5)下标的范围可以是 -32768~32767。
【 例 】 定义一个一维数组用来存储一个 35人的班级的同学的名字 。
Dim Student (34) As String
Student(0) Student(1) ………… Student(33) Student(34)
数组名称 下标上界
Student(1) =”李琼,
Student(33) =”张三,




? 二维数组的定义格式,
Dim 数组名 ( [第一维下标下界 To] 第一维下标上界,_
[第二维下标下界 To] 第二维下标上界 ) _
As 类型名称
前面我们学习了一维数组,这种数组适用于存放一系列没有层次
关系的一维数据,如姓名,单据等记录,但如果数据中有层次关系,
例如要记录一个学校所有班级的学生记录,该怎么办呢?
张伟 刘伟 孙权 ……0
齐秦 非儿 孔明 ……1
王真 孙楠 关羽 ……2
……0 ……1 ……2 ……
班级 1
班级 2
班级 3


Student(2,1)
【 例 1】 分别定义一个一维数组和一个二维数组 。
Dim EnglishS(29) As Integer
数组名称 下标上界 数据元素的类型
EnglishS(1) = 85,EnglishS(28) = 63
数组中的一
个数据元素
数据元素的下标值
EnglishS(0) EnglishS(1) ………… EnglishS(28) EnglishS(29)
85 63
Dim StuScore(1 To 30,1 To 2) As Integer
数组名称 第 1维下
标上界
第 1维下
标下界
第 2维下
标下界
第 2维下
标上界
StuScore(1,1) StuScore(1,2)
StuScore(2,1) StuScore(2,2)
…… ……
StuScore(29,1) StuScore(29,2)
StuScore(30,1) StuScore(30,2)
行下标 列下标
Private Sub Command1_Click( )
Dim I,n As Integer
Dim EnglishS(1 To 30) As Integer
For I = 1 To 30
EnglishS(I) = Val(InputBox("请输入学生成绩 "))
Next I
For I = 1 To 30
Print "学号为 "; I; " 的学生英语成绩是 "; EnglishS(I)
Next I
End Sub
对数组进行定义了以后,就可使用了,如,
定义数组时应该注意的问题,
? 在同一个过程中,数组名不能与变量同名
? 在定义数组时,下标可以是常数,也可以是变量或表达式,
但变量的值必须在执行数组定义语句之前给出
– n=inputbox(“输入 n的值, )
– Dim array1(10),array2(n),array3(n+5)
? 下界必须小于上界
重命名的错误
下标界应该
小于上标界
越界错误,超
出了 a(5)的范围
【 例 2】 如何利用数组确定学校的某个学生在校中的哪个班?
Private Sub Command1_Click( )
Dim i As Integer,j As Integer
Dim Class(4) As String
Dim Student(4,35) As String
Class(0)=“工管一班”,Class(1)=“工管二班” ‘给班级赋值
Class(2)=“法学一班”,Class(3)=“法学二班” ‘给班级赋值
Student(0,0)=“李琼”,Student(0,2)=”张三” ‘给学生姓名
赋值
For i = 0 To 4
For j=0 To 35
If Student(i,j)=“张三” Then
Msgbox,张三在” +Class(i)
End If
Next j
Next i
End Sub
§ 7.1.2 多维数组和数组下标界值
在数组中,需要通过两个或两个以上的下标,才能确
定数组元素在数组中的位置,这种数组称为 多维数组 。
? 多维数组的定义格式,
Dim 数组名 ( [第一维下标下界 To] 第一维下标上界,_
[第二维下标下界 To] 第二维下标上界,_
[第三维下标下界 To] 第三维下标上界,…) _
As 类型名称
? 对于数组,VB 提供了两个常用函数,
Lbound(数组 [,维 ]) → 求数组中某指定维的下界值
Ubound(数组 [,维 ]) → 求数组中某指定维的上界值
【 例 】 Dim A (- 3 To 4,1 To 2,3 To 5,-1 To 6) As Integer
LBound(A,1) 测试 A 第 1 维的下界值为 -3
LBound(A,2) 测试 A 第 2 维的下界值为 1
UBound(A,1) 测试 A 第 1 维的上界值为 4
UBound(A,3) 测试 A 第 3 维的上界值为 5
定义一维数组和多维数组的区别,
? 一维数组,只用一个下标就能确定一个数组元素在数组
中的位置,也可以说,由具有一个下标的下标变量所组
成的数组称为一维数组 S(1)
? 二维数组或多维数组, 由具有两个或多个下标的下标变
量所组成的数组 ; S(1,2)
§ 7.1.3 默认数组与嵌套数组
若采用前述格式定义数组,则数组中各数据元素具有
相同的数据类型;有时,期望数组中各元素是不同类型的
数据,那么可通过定义默认数组的方法实现。
Dim/Static 数组名(下标)
【 例 1】 Dim A (1 To 50) As Integer
Dim C (1 To 50)
Static B (1 To 50) As Variant
B(1)= 100
B(2)=” Good Morning”
B(3)= Now
数值型数组
变体型
数组
数值型元素
字符型数组
日期型数组
【 例 2】
未定义的变
体类型
在某些应用中,需将诸如数组或用户定义类型的值赋
给数组元素;这样以数组作为元素的数组就是嵌套数组。
其中, 嵌套数组 必须是 Variant 类型;
被嵌套的数组 必须是基本类型数组。
嵌套数组中的数据元素赋值使用方法,
B( i )= A( )
嵌套数组 被嵌套数组
把数组 A的值赋
给默认数组 B的
第 i 个元素
Dim a(4) As Integer,Dim b(3),Dim i As Integer
For i= 0 To 4
a(i)= i*i
Next i
b(1)= "Good morning",b(2)= Now
b(3)= &HFFFF, b(0)= a( )
For i= 0 To 4
Print b(0)(i);
Next i
Print
For i= 1 To 3
Print b(i)
Next i
给整型数组 a 赋值
把数组 a 的值赋给嵌套
数组 b 的第 i 个元素
输出嵌套数组 b 的值
§ 7.1.4 一维数组的初始化
许多时候,对数组元素进行初始化是必要的;通常,
使用 Array 函数,
数组变量名= Array(数组元素初始值)
注意,
( 1)数组元素初始值之间用“,”隔开,其值分别与数
组元素在内存中的排列顺序一一对应;
( 2)使用此函数初始化的数组只能是 Variant 型,且
定义时数组变量名之后不能有括号;
( 3)这种方法 只能 用于初始化一维数组。
Dim A As Variant
Dim N1 As String,N2 As String
Dim i As Integer
Number= Array(”One”,” Two”,” Three”)
N1= Number(0)
N2= Number(1)
A= Array(1,2,3)
For i= 0 To 2
Print,A(”; i;”) =”; A(i)
Next i
Print N1
Print N2
未定义而直接
使用数组变量
§ 7.2 静态数组与动态数组
§ 7.2.1 静态数组
静态数组,是指那些在编译阶段就分配了内存空间,并
在程序运行结束后不释放内存空间的数组。
( 1)程序再次运行时,静态数组将上次运行的结果作为
其此次的初始值;
( 2)静态数组在定义时,要求其元素个数已知;
( 3)在程序的不同作用范围内,静态数组通过不同的语
句来定义。
在 VB中,静态数组的定义方式有下面三种,
( 1)在表格或模块级使用 Dim 定义;
( 2)在过程中用 Static 语句定义,或用 Static 定义过
程,再于过程中使用 Dim 语句定义数组;
( 3)在全局模块中使用 Global 语句定义。
Dim b(4) As Integer
Private Sub Command1_Click( )
Static a(4) As Integer, Static start As Integer
If start= 0 Then
Print, 静态数组:,,"非静态数组,"
End If
For i = 0 To 4
b(i)= b(i)+ i
Next i
For i = 0 To 4
a(i)= a(i)+ i
Next i
For i= 0 To 4
Print a(i);
Next i
Print,
For i= 0 To 4
Print b(i);
Next i
Print, Start= 1
End Sub
不释放内存空间
给数组元素
逐一赋值
输出数组中所有的
数组元素值
Private Sub Command1_Click( )
Static a(4) As Integer, Static start As Integer
Dim b(4) AS Integer
If start= 0 Then
Print, 静态数组:,,“非静态数组:”
End If
For i = 0 To 4
b(i)= b(i)+ i
Next i
For i = 0 To 4
a(i)= a(i)+ i
Next i
For i= 0 To 4
Print a(i);
Next i
Print,
For i= 0 To 4
Print b(i);
Next i
Print, Start= 1
End Sub
§ 7.2.2 动态数组
动态数组 是指在程序运行阶段才开辟内存空间、并在运
行结束后将其 释放 的数组。
注意,程序再次运行时,动态数组不保留上次程序运行
后的结果。
? 动态数组的定义通常分两步,
( 1)在窗体层、标准模块或过程中用 Dim 或 Public 声明一个没有下
标的数组,括号不能省略;
( 2)在其后的过程中,使用 Redim 语句定义带下标的数组。
? 动态数组的定义格式,
Dim 数组名() As 类型 ‘ 定义数组名
Redim [ Preserve ] 变量名 (下标 ) ?重定义数组大小,
但不能重定义类型
? 注意,
( 1) Preserve 是 可选的关键字,使用它时,
a,不能改变原先定义的数组的维数;
b.可以保持数组中原来的数据。
( 2)在同一过程中,可多次使用 Redim 语句定义同一个数组,
用以改变该数组的元素个数。
?Preserve参数的作用
Sub Command1_Click( )
Redim a(4)
a(2)=5
Redim a(6)
Print "a(2)=";a(2)
a(2)=5
Redim Preserve a(6)
Print "a(2)=" ;a(2)
End Sub
Dim test( ) As String
Sub Command1_Click( )
Redim test(4)
test(3)=” MicroSoft VB”
Redim test(4) As Integer
End Sub
【 例 1】 在窗体上显示杨辉三角形。
Dim triang()
Dim i As Integer,j As Integer,n As
Integer
n = InputBox("请输入杨辉三角形的行数,")
ReDim triang(n)
triang(1) = 1,Print triang(1)
For i = 2 To n
triang(i) = 1
For j = i - 1 To 1 Step -1
triang(j) = triang(j - 1) + triang(j)
Next j
For j = 1 To i
Print triang(j);
Next j
print
Next i
静态数组 动态数组
要在编译时开辟内存区 在运行时开辟内存区,
当程序没有运行时,
动态数组不占据内存
用数值常数或符号常
量作为下标定维
用变量作为下标定维
? 数组和数组元素的赋值
§ 7.3 数组的基本操作
Private sub Form_Click()
Dim a(5) As Integer,Temp As Integer
a(2) = 100
a(3)=2
a(4)=8
temp = a(2)
print,a(2)=“;a(2);”temp=“;temp
a(2) = a(4) * a(3) + a(1)
print, a(2)=“;a(2)
End Sub
?注意,
a:使用数组元素时要注意下标不能出界
Dim A(5) As string
A(1)=“大笨笨”
A(2)=“小傻蛋”
A(6)=“出错了哦”
Print,A(1)=“;A(1)
Print,A(2)=“;A(2)
Print,A(6)=“;A(6)
b,Variant 类型的数组可以整体赋值
Dim a( ),b( )
a = array(1,2,3,4)
Redim b(Ubound(a))
b = a
‘给一维数组 a( )赋初值
‘重定义动态数组 b( )
‘a( )和 b( )中的值完全相同
? 数组的输出, 输出数组就是输出数组中的元素,用 Print方法来实现。
Private Sub Form_Click()
Dim a(1 to 5) As Integer
Dim I As Integer
For I = 1 To 5
a( I ) = I
Print tab(8); "a(" & I & ")=";a(I)
Next I
End Sub
【 例 1】 定义一个一维数组 a(1 to 5),把数值 1,2,3,4,5依次赋给数组中的
元素并输出该数组各元素的值。
Private Sub Form_Click()
Dim Sc(5,5) As Integer
Dim I%,J%
For I = 0 To 5
For J=0 To 5
Sc( I,J ) = I*J
Next J
Next I
For I = 0 To 5
For J=0 To I
Print Sc(I,J);,,;
Next J
Print
Next I
End Sub
【 例 2】 输出方阵中的下三角元素,如下图。
0 1 2 3 4 5
0
1
2
3
4
5
行标数字
决定此行
元素个数
? For Each …Next 语句,类似于 For…Next 语句,两者都用来执行指定重
复次数的一种操作,但 For Each … Next 语句专
门用于数组或对象“集合”。这对不知道数组元

的数目时非常有用。
格式,
For Each 成员 In 数组
循环体
[ Exit For ]
……
Next [ 成员 ]
必需是 Variant 变量,表
示数组中某个元素的值
【 例 1】 某 For Each…Next 结构语句如下,
Dim A(1 to 5) As Integer
For Each x in A
Print x;
Next x
数组 A 中某个元素的值,x
取值的顺序与数组元素在
数组中的排列顺序一致
仅仅是个数组名,
不需要括号和上、下界
注意,
如果数组中至少有一个元素,就会进入 For Each 块执行循环。一
旦进入循环,便首先对第一个元素执行循环中所有的语句;只要数组中
还有其他元素,就会对它们 依次执行 循环体中的语句。若数组中没有其
他元素,则退出循环,执行 Next 语句之后的语句。
【 例 2】
Dim a(8) As Integer
Dim i As Integer
Dim x As Variant ?Integer
For i = 0 To 8
a(i) = i * 7
Next i
Print
j = 0
For Each x In a
Print,a(“; j;, )=“; x
j = j + 1
Next x
§ 7.4 控件数组
控件数组 是由一组 相同类型 的控件组成,这些控件具有
一个相同的名称、相同的属性名。这些控件由控件数组的下
标来区别,而下标由每个控件的唯一 标识索引号 (Index)来
标识,通过 Index 即可区别控件数组元素。
当有若干个控件执行大致相同的操作时,控件数组是很有用的,
控件数组共享同样的事件过程。例如,假定一个控件数组含有 3个命令
按钮,则不管单击哪一个按钮,都会调用同一个 Click过程 。
? 设计时建立
? 运行时建立
在窗体上画出某个控件,设置属性 Name,并将 Index
置 0,建立第一个元素。假设属性 Name 值为,Comm”,则
在适当的事件过程中编程用 Load方法添加其它若干个控件数
组元素的格式是,
Load Comm(i)
‘Comm为数组名,i变量为第 i个控件数组元素
生成完后即可对 Comm(i) 控件的相应属性值进行修改,
并可以用 Unload 方法删除某个已添加的元素。
控件数组名
称(可修改)
Text1( 0)
Index 属性
Text1( 1)
§ 7.5 数组的应用
例 7-13 选猴王
A(1)=2
A(2)=3
A(3)=4
A(4)=5
A(6)=7
A(5)=6
A(7)=8
A(8)=1
1
2
3
4 5
6
7
8
A(1)=2
A(2)=4
A(3)=4
A(4)=5
A(6)=7
A(5)=6
A(7)=8
A(8)=1
1
2
3
4 5
6
7
8
A(1)=2
A(2)=4
A(3)=4
A(4)=5
A(6)=7
A(5)=7
A(7)=8
A(8)=1
1
2
3
4 5
6
7
8
A(1)=2
A(2)=4
A(3)=4
A(4)=5
A(6)=7
A(5)=7
A(7)=8
A(8)=1
9
10
3
11 12
6
13
14
A(1)=2
A(2)=4
A(3)=4
A(4)=5
A(6)=7
A(5)=7
A(7)=8
A(8)=2
9
10
3
11 12
6
13
14
A(1)=2
A(2)=4
A(3)=4
A(4)=7
A(6)=7
A(5)=7
A(7)=8
A(8)=2
9
10
3
11 12
6
13
14
A(1)=2
A(2)=4
A(3)=4
A(4)=7
A(6)=7
A(5)=7
A(7)=8
A(8)=2
9
15
3
16 12
6
17
18
A(1)=2
A(2)=4
A(3)=4
A(4)=7
A(6)=7
A(5)=7
A(7)=8
A(8)=4
9
15
3
16 12
6
17
18
A(1)=2
A(2)=4
A(3)=4
A(4)=7
A(6)=7
A(5)=7
A(7)=4
A(8)=4
9
15
3
16 12
6
17
18
A(1)=2
A(2)=4
A(3)=4
A(4)=7
A(6)=7
A(5)=7
A(7)=4
A(8)=4
9
15
3
19 12
6
20
18
A(1)=2
A(2)=4
A(3)=4
A(4)=7
A(6)=7
A(5)=7
A(7)=4
A(8)=4
9
15
3
21 12
6
22
18
A(1)=2
A(2)=4
A(3)=4
A(4)=7
A(6)=7
A(5)=7
A(7)=7
A(8)=4
9
15
3
21 12
6
22
18