第五章 数 组
5.1 概 述数组的概念,数组并不是一种数据类型,而是 一组相同类型数据 的集合。用一个统一的名字
( 数组名) 代表逻辑上相关的一批数据,每个元素用 下标变量 来区分;下标变量代表元素在数组中的位置。
其表示形式:
A(1),A(10)
X(1,1),X1(1,10),X(2,10)
Y(0,0,0),Y(1,2,5)
Visual Basic中的数组,按不同的方式可分为以下几类:
按数组的大小 ( 元素个数 ) 是否可以改变来分为:定长数组,动态 ( 可变长 ) 数组 。
按元素的数据类型可分为:数值型数组,字符串数组,日期型数组,变体数组等 。
按数组的维数可分为:一维数组,二维数组,
多维数组 。
对象数组:菜单对象数组,控件数组 。
5.2 一维数组
5.2.1 一维数组的声明形式,
Dim 数组名 ([<下界 >to]<上界 >)[As <数据类型 >]
或,Dim 数组名 [<数据类型符 >]([<下界 >to]<上界 >)
例,Dim a(1 to 10) As Integer ‘ 声明了 a数组有 10个元素与上面声明等价形式,Dim a%(1 to 10)
1是下标的下界 10是下标的上界数组元数的数据类型说明:
1,数组名的命名规则与变量的命名相同 。
2,数组的元素个数,上界 -下界 +1。
3,缺省 <下界 >为 0,若希望下标从 1开始,可在模块的通用部分使用 Option Base语句将设为 1。 其使用格式是:
Option Base 0|1 ' 后面的参数只能取 0或 1
例如:
Option Base 1 ' 将数组声明中缺省 <下界 >下标设为 1
4,<下界 >和 <上界 >不能使用变量,必须是常量,常量可以是直接常量、符号常量,一般是整型常量。
5,如果省略 As子句,则数组的类型为变体类型 。
6,数组中各元素在内存占一片连续的存储空间,
一维数组在内存中存放的顺序是下标大小的顺序,
如图 5-1所示:
5.2.2 一维数组元素的引用使用形式,数组名 (下标 )
其中:下标可以是整型变量,常量或表达式 。
例如,设有下面的数组 B(10) As Integer
则下面的语句都是正确的 。
A(1)=A(2)+B(1)+5 ' 取数组元素运算
A(i)=B(i) ' 下标使用变量
B(i+1)=A(i+2) ' 下标使用表达式
5.2.3 一维数组的基本操作
1,可通过循环给数组元素的初值
For i = 1 To 10 'A数组的每个元素值为 1
A(i)=1
Next i
2,数组的输入
For i = 1 To 4
For j = 1 To 5
sc(i,j) = InputBox("输入 sc(" &i & "," & j & ") 的值 ")
Next j
Next I
3,数组的输出输出如下图所示的下三角数据
Dim sc(5,5) As Integer,i%,j%
For i = 1 To 5
For j = 1 To i
sc(i,j) = i * 5 + j
Print sc(i,j); " ";
Next j
Print ' 换行
Next I
4,求数组中最大元素及所在下标
Dim Max As Integer,iMax As Integer
Max=A(1),iMax=1
For i = 2 To 10
If A(i)>Max Then
Max=A(i)
iMax=i
End If
Next I
5,将数组元素倒置
For i =1 To 10\2
t=A(i)
A(i)=A(10-i+1)
A(10-i+1)=t
Next I 例 5.1
5.2.4 一维数组的应用一、分类统计例 5.2
在例 5.1中如果还要统计 0~9,10~19,20~20,…,80~89,
90~99分数段及 100分的学生人 。
则可另用数组 bn来存各分数段的人数,并用 bn(0)存
0~9分的人数,bn(1)存 10~19分的人数,…bn(9) 存 90~99分的人数,bn(10)存 100分的人数。
二,排序问题
1,选择法排序算法思想:
1) 对有 n个数的序列 ( 存放在数组 a(n)中 ),从中选出最小
( 升序 ) 或最大 ( 降序 ) 的数,
与第 1个数交换位置;
2) 除第 1 个数外,其余 n-1个数中选最小或最大的数,与第 2
个数交换位置;
3) 依次类推,选择了 n-1次后,
这个数列已按升序排列 。
原始数据 8 6 9 3 2 7
第 1 趟交换后 2 6 9 3 8 7
第 2 趟交换后 2 3 9 6 8 7
第 3 趟交换后 2 3 6 9 8 7
第 4 趟交换后 2 3 6 7 8 9
第 5 趟无交换 2 3 6 7 8 9
图 1 - 3 - 2 7 交换过程
1.选择法排序算法思想:
1) 对有 n个数的序列 ( 存放在数组 a(n)中 ),从中选出最小 ( 升序 ) 或最大 ( 降序 ) 的数,与第 1个数交换位置;
2) 除第 1 个数外,其余 n-
1个数中选最小或最大的数,
与第 2个数交换位置;
3) 依次类推,选择了 n-1
次后,这个数列已按升序排列 。
For i = 1 To n - 1
p = i
For j = i + 1 To n
If a(p) > a(j) Then p = j
Next j
temp = a(i)
a(i) = a(p)
a(p) = temp
Next i
选择法排序(升序)的 VB程序,
2,冒泡法排序 ( 递增 )
算法思想,(将相邻两个数比较,小的调到前头 )
1) 有 n个数 ( 存放在数组 a(n)中 ),第一趟将每相邻两个数比较,小的调到前头,经 n-1次两两相邻比较后,最大的数已,沉底,,放在最后一个位置,小数上升,浮起,;
2) 第二趟对余下的 n-1个数 ( 最大的数已,沉底,) 按上法比较,经 n-2次两两相邻比较后得次大的数;
3) 依次类推,n个数共进行 n-1趟比较,在第 j
趟中要进行 n-j次两两比较 。
For i = 1 To n - 1
For j = 1 To n-i
If a(j) > a(j+1) Then
temp=a(j)
a(j)=a(j+1)
a(j+1)=temp
End if
Next j
Next i
冒泡法排序(升序)的 VB程序,
例 5.3 用随机函数产生 50个 [10,100 ) 的随机整数,并按照由小到大的顺序打印出来 。
程序界面如下:
5.3 二维数组及多维数组
5.3.1 二维数组的声明声明格式如下:
Dim数组名 ([<下界 >] to <上界 >,[<下界 > to ]<上界 >) [As <数据类型 >]
其中的参数与一维数组完全相同。
例如,Dim a(2,3) As Single
二维数组在内存的存放顺序是,先行后列,。 例如数组 a
的各元素在内存中的存放顺序是:
a(0,0)→a(0,1)→a(0,2)→a(0,3)→a(1,0)→a(1,1)→a(1,2)→
a(1,3)→a(2,0)→(2,1)→a(2,2)→a(2,3)
5.3.2 二维数组的引用引用形式,数组名 (下标 1,下标 2)
例如,a(1,2)=10
a(i+2,j)= a(2,3)*2
在程序中常常通过二重循环来操作使用二维数组元素 。
5.3.3 二维数组的基本操作
1,二维数组数据的输入
2,求最大元素及其所在的行和列
3,计算两矩阵相乘
4,矩阵的转置例 5.4 设某一个班共有 60个学生,期末考试 5门课程,请编一程序评定学生的奖学金,
要求打印输出一、二等奖学金学生的学号和各门课成绩。(奖学金评定标准是:总成绩超过全班总平成绩 20%发给一个奖学金,超过全班总平成绩 10%发给二个奖学金。)
5.3.5 多维数组的声明和引用定义多维数组的格式如下:
Dim 数组名 ([<下界 >] to <上界 >,[<下界 > to ]<上界 >,…… )
[As <数据类型 >]
例如:
Dim a(5,5,5) As Integer 声明 a是三维数组
Dim b(2,6,10,5) As Integer ' 声明 b是四维数组
5.4 动态数组动态数组:在声明时未给出数组的大小 。 定长数组是在程序编译时分配存储空间,而动态数组是在程序执行时分配存储空间 。
5.4.1 动态数组的建立及使用建立动态数组包括声明和大小说明两步:
1,在使用 Dim,Private或 Public语句声明括号内为空的数组 。
格式,Dim | Private|Public 数组名 ( ) As数据类型例,Dim a() As Integer
2,在过程中用 ReDim语句指明该数组的大小 。
格式,ReDim [Preserve] 数组名 ( 下标 1[,下标 2… ])
Preserve参数:保留数组中原来的数据例,Redim A(10)
Redim Preserve A(20)
说明:
( 1) ReDim语句是一个可执行语句,只能出现在过程中,并且可以多次使用,改变数组的维数和大小 。
( 2)定长数组声时中的下标只能是常量,而动态数组
ReDim 语句中的下标是常量,也可以是有了确定值的变量。
例:
Private Sub Form_Click()
Dim N As Integer
N=Val(InputBox(“输入 N=?” ))
Dim a(N) As Integer
…….
End sub
×
( 3)在过程中可以多次使用 ReDim来改变数组的大小,
也可 改变数组的维数。
例,ReDim x(10)
ReDim x(20)
x(20) = 30
Print x(20)
ReDim x(20,5)
x(20,5) = 10
Print x(20,5)
( 4)每次使用 ReDim语句都会使原来数组中值丢失,可以在 ReDim后加 Preserve 参数来保留数组中的数据。但此时只能改变最后一维的大小。
例 5.5
5.4.2 与数组操作有关的几个函数
1,Aarry函数
Aarry函数可方便地对数组整体赋值,但它只能给声明
Variant的变量或仅由括号括起的动态数组赋值。赋值后的数组大小由赋值的个数决定。
例如,要将 1,2,3,4,5,6,7 这些值赋值给数组 a,可使用下面的方法赋值。
Dim a()
A=array(1,2,3,4,5,6,7)
Dim a
A=array(1,2,3,4,5,6,7)
2 求数组的上界 Ubound( )函数,下界 Lbound( )函数
Ubound( )函数和 Lbound( )函数分别用来确定数组某一维的上界和下界值 。
使用形式如下:
UBound(<数组名 >[,<N>])
LBound(<数组名 > [,<N>])
其中:
<数组名 >,必需的 。 数组变量的名称,遵循标准变量命名约定 。
<N>,可选的;一般是整型常量或变量 。 指定返回哪一维的上界 。 1 表示第一维,2 表示第二维,如此等等 。 如果省略默认是 1。
3,Split函数使用格式:
Split(<字符串表达式 > [,<分隔符 >])
说明:
使用 Split函数可从一个字符串中,以某个指定符号为分隔符,分离若干个子字符串,建立一个下标从零开始的一维 数组 。
补充例,使用文件框,通过编程实现大量数据的输入输入一系列的数据,存放在数组中。对输入的数据允许修改和自动识别非数字数据。 分析:
利用文本框实现大量数字串的输入和编辑的功能;
通过编程将输入的数字串以逗号为分界符分离出各项数据;
对非数字输入的判断能力。
5.5 控件数组
5.5.1 控件数组的概念一组相同类型的控件组成。 它们共用一个控件名,具有相同的属性,建立时系统给每个元素赋一个唯一的索引号
(Index)。 控件数组共享同样的事件过程,通过返回的下标值区分控件数组中的各个元素。
例,Private Sub cmdName _Click(Index As Integer)
…
If Index=3 then
‘ 处理第四个命令按钮的操作
End If
…
End Sub
5.5.2 控件数组的建立一,在设计时建立控件数组的步骤:
1,窗体上画出控件,进行属性设置,这是建立的第一个元素;
2,选中该控件,进行,Copy”操作若干次和,Paste”操作若干次建立了所需个数的控件数组元素 。
3,进行事件过程的编程 。
二、运行时添加控件数组的步骤如下,
1,在窗体上画出某控件,设置该控件的 Index值为 0,表示该控件为数组,这是建立的第一个元素,并可对一些取值相同的属性进行设置,如所有文本框的字体都取一样大小 。
2,在编程时通过 Load方法添加其余的若干个元素,也可以通过 Unload方法删除某个添加的元素 。
Load方法和 Unload方法的使用格式:
Load 控件数组名 (<表达式 >)
Unload 控件数组名 (<表达式 >)
其中,<表达式 >为整型数据 。 表示控件数组的某个元素 。
3.通过 Left和 Top属性确定每个新添加的控件数组元素在窗体的位置,并将 Visible 属性设置为 True。
通过例 5.6来说明数组控件的使用:
例 5.6 为例 5.4的学生成绩处理设计如下图成绩输入界面
5.1 概 述数组的概念,数组并不是一种数据类型,而是 一组相同类型数据 的集合。用一个统一的名字
( 数组名) 代表逻辑上相关的一批数据,每个元素用 下标变量 来区分;下标变量代表元素在数组中的位置。
其表示形式:
A(1),A(10)
X(1,1),X1(1,10),X(2,10)
Y(0,0,0),Y(1,2,5)
Visual Basic中的数组,按不同的方式可分为以下几类:
按数组的大小 ( 元素个数 ) 是否可以改变来分为:定长数组,动态 ( 可变长 ) 数组 。
按元素的数据类型可分为:数值型数组,字符串数组,日期型数组,变体数组等 。
按数组的维数可分为:一维数组,二维数组,
多维数组 。
对象数组:菜单对象数组,控件数组 。
5.2 一维数组
5.2.1 一维数组的声明形式,
Dim 数组名 ([<下界 >to]<上界 >)[As <数据类型 >]
或,Dim 数组名 [<数据类型符 >]([<下界 >to]<上界 >)
例,Dim a(1 to 10) As Integer ‘ 声明了 a数组有 10个元素与上面声明等价形式,Dim a%(1 to 10)
1是下标的下界 10是下标的上界数组元数的数据类型说明:
1,数组名的命名规则与变量的命名相同 。
2,数组的元素个数,上界 -下界 +1。
3,缺省 <下界 >为 0,若希望下标从 1开始,可在模块的通用部分使用 Option Base语句将设为 1。 其使用格式是:
Option Base 0|1 ' 后面的参数只能取 0或 1
例如:
Option Base 1 ' 将数组声明中缺省 <下界 >下标设为 1
4,<下界 >和 <上界 >不能使用变量,必须是常量,常量可以是直接常量、符号常量,一般是整型常量。
5,如果省略 As子句,则数组的类型为变体类型 。
6,数组中各元素在内存占一片连续的存储空间,
一维数组在内存中存放的顺序是下标大小的顺序,
如图 5-1所示:
5.2.2 一维数组元素的引用使用形式,数组名 (下标 )
其中:下标可以是整型变量,常量或表达式 。
例如,设有下面的数组 B(10) As Integer
则下面的语句都是正确的 。
A(1)=A(2)+B(1)+5 ' 取数组元素运算
A(i)=B(i) ' 下标使用变量
B(i+1)=A(i+2) ' 下标使用表达式
5.2.3 一维数组的基本操作
1,可通过循环给数组元素的初值
For i = 1 To 10 'A数组的每个元素值为 1
A(i)=1
Next i
2,数组的输入
For i = 1 To 4
For j = 1 To 5
sc(i,j) = InputBox("输入 sc(" &i & "," & j & ") 的值 ")
Next j
Next I
3,数组的输出输出如下图所示的下三角数据
Dim sc(5,5) As Integer,i%,j%
For i = 1 To 5
For j = 1 To i
sc(i,j) = i * 5 + j
Print sc(i,j); " ";
Next j
Print ' 换行
Next I
4,求数组中最大元素及所在下标
Dim Max As Integer,iMax As Integer
Max=A(1),iMax=1
For i = 2 To 10
If A(i)>Max Then
Max=A(i)
iMax=i
End If
Next I
5,将数组元素倒置
For i =1 To 10\2
t=A(i)
A(i)=A(10-i+1)
A(10-i+1)=t
Next I 例 5.1
5.2.4 一维数组的应用一、分类统计例 5.2
在例 5.1中如果还要统计 0~9,10~19,20~20,…,80~89,
90~99分数段及 100分的学生人 。
则可另用数组 bn来存各分数段的人数,并用 bn(0)存
0~9分的人数,bn(1)存 10~19分的人数,…bn(9) 存 90~99分的人数,bn(10)存 100分的人数。
二,排序问题
1,选择法排序算法思想:
1) 对有 n个数的序列 ( 存放在数组 a(n)中 ),从中选出最小
( 升序 ) 或最大 ( 降序 ) 的数,
与第 1个数交换位置;
2) 除第 1 个数外,其余 n-1个数中选最小或最大的数,与第 2
个数交换位置;
3) 依次类推,选择了 n-1次后,
这个数列已按升序排列 。
原始数据 8 6 9 3 2 7
第 1 趟交换后 2 6 9 3 8 7
第 2 趟交换后 2 3 9 6 8 7
第 3 趟交换后 2 3 6 9 8 7
第 4 趟交换后 2 3 6 7 8 9
第 5 趟无交换 2 3 6 7 8 9
图 1 - 3 - 2 7 交换过程
1.选择法排序算法思想:
1) 对有 n个数的序列 ( 存放在数组 a(n)中 ),从中选出最小 ( 升序 ) 或最大 ( 降序 ) 的数,与第 1个数交换位置;
2) 除第 1 个数外,其余 n-
1个数中选最小或最大的数,
与第 2个数交换位置;
3) 依次类推,选择了 n-1
次后,这个数列已按升序排列 。
For i = 1 To n - 1
p = i
For j = i + 1 To n
If a(p) > a(j) Then p = j
Next j
temp = a(i)
a(i) = a(p)
a(p) = temp
Next i
选择法排序(升序)的 VB程序,
2,冒泡法排序 ( 递增 )
算法思想,(将相邻两个数比较,小的调到前头 )
1) 有 n个数 ( 存放在数组 a(n)中 ),第一趟将每相邻两个数比较,小的调到前头,经 n-1次两两相邻比较后,最大的数已,沉底,,放在最后一个位置,小数上升,浮起,;
2) 第二趟对余下的 n-1个数 ( 最大的数已,沉底,) 按上法比较,经 n-2次两两相邻比较后得次大的数;
3) 依次类推,n个数共进行 n-1趟比较,在第 j
趟中要进行 n-j次两两比较 。
For i = 1 To n - 1
For j = 1 To n-i
If a(j) > a(j+1) Then
temp=a(j)
a(j)=a(j+1)
a(j+1)=temp
End if
Next j
Next i
冒泡法排序(升序)的 VB程序,
例 5.3 用随机函数产生 50个 [10,100 ) 的随机整数,并按照由小到大的顺序打印出来 。
程序界面如下:
5.3 二维数组及多维数组
5.3.1 二维数组的声明声明格式如下:
Dim数组名 ([<下界 >] to <上界 >,[<下界 > to ]<上界 >) [As <数据类型 >]
其中的参数与一维数组完全相同。
例如,Dim a(2,3) As Single
二维数组在内存的存放顺序是,先行后列,。 例如数组 a
的各元素在内存中的存放顺序是:
a(0,0)→a(0,1)→a(0,2)→a(0,3)→a(1,0)→a(1,1)→a(1,2)→
a(1,3)→a(2,0)→(2,1)→a(2,2)→a(2,3)
5.3.2 二维数组的引用引用形式,数组名 (下标 1,下标 2)
例如,a(1,2)=10
a(i+2,j)= a(2,3)*2
在程序中常常通过二重循环来操作使用二维数组元素 。
5.3.3 二维数组的基本操作
1,二维数组数据的输入
2,求最大元素及其所在的行和列
3,计算两矩阵相乘
4,矩阵的转置例 5.4 设某一个班共有 60个学生,期末考试 5门课程,请编一程序评定学生的奖学金,
要求打印输出一、二等奖学金学生的学号和各门课成绩。(奖学金评定标准是:总成绩超过全班总平成绩 20%发给一个奖学金,超过全班总平成绩 10%发给二个奖学金。)
5.3.5 多维数组的声明和引用定义多维数组的格式如下:
Dim 数组名 ([<下界 >] to <上界 >,[<下界 > to ]<上界 >,…… )
[As <数据类型 >]
例如:
Dim a(5,5,5) As Integer 声明 a是三维数组
Dim b(2,6,10,5) As Integer ' 声明 b是四维数组
5.4 动态数组动态数组:在声明时未给出数组的大小 。 定长数组是在程序编译时分配存储空间,而动态数组是在程序执行时分配存储空间 。
5.4.1 动态数组的建立及使用建立动态数组包括声明和大小说明两步:
1,在使用 Dim,Private或 Public语句声明括号内为空的数组 。
格式,Dim | Private|Public 数组名 ( ) As数据类型例,Dim a() As Integer
2,在过程中用 ReDim语句指明该数组的大小 。
格式,ReDim [Preserve] 数组名 ( 下标 1[,下标 2… ])
Preserve参数:保留数组中原来的数据例,Redim A(10)
Redim Preserve A(20)
说明:
( 1) ReDim语句是一个可执行语句,只能出现在过程中,并且可以多次使用,改变数组的维数和大小 。
( 2)定长数组声时中的下标只能是常量,而动态数组
ReDim 语句中的下标是常量,也可以是有了确定值的变量。
例:
Private Sub Form_Click()
Dim N As Integer
N=Val(InputBox(“输入 N=?” ))
Dim a(N) As Integer
…….
End sub
×
( 3)在过程中可以多次使用 ReDim来改变数组的大小,
也可 改变数组的维数。
例,ReDim x(10)
ReDim x(20)
x(20) = 30
Print x(20)
ReDim x(20,5)
x(20,5) = 10
Print x(20,5)
( 4)每次使用 ReDim语句都会使原来数组中值丢失,可以在 ReDim后加 Preserve 参数来保留数组中的数据。但此时只能改变最后一维的大小。
例 5.5
5.4.2 与数组操作有关的几个函数
1,Aarry函数
Aarry函数可方便地对数组整体赋值,但它只能给声明
Variant的变量或仅由括号括起的动态数组赋值。赋值后的数组大小由赋值的个数决定。
例如,要将 1,2,3,4,5,6,7 这些值赋值给数组 a,可使用下面的方法赋值。
Dim a()
A=array(1,2,3,4,5,6,7)
Dim a
A=array(1,2,3,4,5,6,7)
2 求数组的上界 Ubound( )函数,下界 Lbound( )函数
Ubound( )函数和 Lbound( )函数分别用来确定数组某一维的上界和下界值 。
使用形式如下:
UBound(<数组名 >[,<N>])
LBound(<数组名 > [,<N>])
其中:
<数组名 >,必需的 。 数组变量的名称,遵循标准变量命名约定 。
<N>,可选的;一般是整型常量或变量 。 指定返回哪一维的上界 。 1 表示第一维,2 表示第二维,如此等等 。 如果省略默认是 1。
3,Split函数使用格式:
Split(<字符串表达式 > [,<分隔符 >])
说明:
使用 Split函数可从一个字符串中,以某个指定符号为分隔符,分离若干个子字符串,建立一个下标从零开始的一维 数组 。
补充例,使用文件框,通过编程实现大量数据的输入输入一系列的数据,存放在数组中。对输入的数据允许修改和自动识别非数字数据。 分析:
利用文本框实现大量数字串的输入和编辑的功能;
通过编程将输入的数字串以逗号为分界符分离出各项数据;
对非数字输入的判断能力。
5.5 控件数组
5.5.1 控件数组的概念一组相同类型的控件组成。 它们共用一个控件名,具有相同的属性,建立时系统给每个元素赋一个唯一的索引号
(Index)。 控件数组共享同样的事件过程,通过返回的下标值区分控件数组中的各个元素。
例,Private Sub cmdName _Click(Index As Integer)
…
If Index=3 then
‘ 处理第四个命令按钮的操作
End If
…
End Sub
5.5.2 控件数组的建立一,在设计时建立控件数组的步骤:
1,窗体上画出控件,进行属性设置,这是建立的第一个元素;
2,选中该控件,进行,Copy”操作若干次和,Paste”操作若干次建立了所需个数的控件数组元素 。
3,进行事件过程的编程 。
二、运行时添加控件数组的步骤如下,
1,在窗体上画出某控件,设置该控件的 Index值为 0,表示该控件为数组,这是建立的第一个元素,并可对一些取值相同的属性进行设置,如所有文本框的字体都取一样大小 。
2,在编程时通过 Load方法添加其余的若干个元素,也可以通过 Unload方法删除某个添加的元素 。
Load方法和 Unload方法的使用格式:
Load 控件数组名 (<表达式 >)
Unload 控件数组名 (<表达式 >)
其中,<表达式 >为整型数据 。 表示控件数组的某个元素 。
3.通过 Left和 Top属性确定每个新添加的控件数组元素在窗体的位置,并将 Visible 属性设置为 True。
通过例 5.6来说明数组控件的使用:
例 5.6 为例 5.4的学生成绩处理设计如下图成绩输入界面