一、 数组与数组元素
㈠ 引例
[例5-1]编程求出100个学生的考试总成绩、平均成绩、高于平均的人数及低于平均的人数。
要对100个学生的成绩完成四种处理操作,为便于处理通常要把100个成绩用变量保存起来,如果用一般变量来表示成绩,则需要用100个变量,如:mark1、mark2、…、mark100。如此众多的变量对程序书写和数据处理极为不便,为此我们可以借鉴数学符号xi这种用单一名称表示多个求知数的形式来表示这100个变量。这种类似于数学符号xi的变量表示形式,在计算机程序设计中称为数组。
㈡ 基本概念
数组是具有一定顺序关系的若干相同类型变量的命名集合体。组成数组的变量称为该数组的元素,数组中数组元素的个数称之为数组长度(或数组大小)。数组可以只用一个数组名代表逻辑上相关的一批数据,为程序处理数据、简化程序书写带来好处。
如[例5-1]中,100个学生的成绩可用一个包含100个元素名为mark的数组来表示。
再如,一个班有30名学生,可以用一个数组A来表示30个学生的学号,A(1)代表序号为1的学生,A(2)代表序号为2的学生,…,A(30)代表序号为30的学生。
一般情况下,数组各元素的数据类型相同,可以是前面讲过的各种基本数据类型。若数组类型被指定为变体型,它的各个元素就可以是不同的类型。
二、 数组下标和维数
类似于数学符号xi(i=1,2,…,n),数组中每个数组元素也有一个用于区分这些元素的编号,称为下标。如mark(1)、mark(2)、…、mark(100),A(1)、A(2)、…、A(30)。数组下标表示了元素在数组中的排列位置,引用数组元素时下标可以是整型的常数、变量、表达式,甚至是一个变量。
数学上不仅有数学符号xi(i=1,2,…,n),还有形如xij(i=1,2,…,n;j=1,2,…,m)的数学符号。计算机程序中也有形如a(3,2)的数组,称为二维数组;前述的mark和A则称为一维数组。此外,还有三维数组、四维数组,VB支持最多60维数组。所谓“维”是一个方向,可以在此方向上改变数组元素的规范。
图5-1到图5-3演示了一到三维数组的概念性结构。图中的每个元素都显示访问该元素的下标值。例如,指定下标 (1, 0) 可以访问二维数组第二行的第一个元素。
图5-1 一维数组的概念性结构
图5-2 二维数组的概念性结构
图5-3 三维数组的概念性结构
很多数组只有一维,如处在各个年龄的人数、全班各同学同一门课程的成绩等,这类数组只使用一个下标。某些数组有两个维,如校园内每座建筑物内每一楼层的办公室数量。元素的规范需要建筑物编号和楼层,并且每个元素都根据建筑物和楼层的组合来保存办公室的数量。因此,这类数组使用两个下标。具有三个下标的三维数组,可以表示三维空间中的值。尽管VB支持多达60维数组,但多于三维的情况并不多见。
三、 数组的声明
和简单变量一样,数组也必须先声明后使用,声明数组即是说明数组名、类型、维数和数组大小。其声明格式为:
Dim 数组名([[下标1下界TO]下标1上界,[下标2下界TO]下标2上界,…])[As类型名]
说明:
(1)数组名的命名与简单变量相同,可以是任意合法的变量名。
(2)所谓下界和上界,就是数组下标的最小值和最大值。缺省下界时,VB默认为0。
(3)下标个数决定数组的维数,最多60维。每一维的大小=上界-下界+1;数组的大小=每一维大小的乘积。
(4)下标必须为常数,不可以为表达式或变量。下标下界最小为-32768,上界最大为32767。
(5)如果省略[As类型名],则为变体型。
[例5-2] 一维数组的声明:
(1)dim a(10) as integer
(2)dim b(-3 to 5) as string*3
(3)n=10
Dim x(n) As Single
声明(1)省略了下界,声明数组a、整型、有11个元素,下标的范围是0~10。声明(2)声明数组b、字符串型、有9个元素,下标的范围是-3~5,每个元素最多存放3个字符。声明(3)是错误的声明,因为使用了变量n来说明上界。
[例5-3] dim c(-1 to 1, 4) as long
c是数组名、长整型、二维数组、第一维下标范围为-1~1,第二维下标的范围是0~4,数组大小是3×5。该数组各元素的排列如图5-4。
c(-1,0) |
c(-1,1) |
c(-1,2) |
c(-1,3) |
c(-1,4) |
c(0,0) |
c(0,1) |
c(0,2) |
c(0,3) |
c(0,4) |
c(1,0) |
c(1,1) |
c(1,2) |
c(1,3) |
c(1,4) |
图5-4 数组元素的排列
注意事项:
(1)在有些语言中,下界一般从1开始,为了便于使用,可在VB的窗体层或标准模块层用语句option base n来重新设定数组的默认下界,如option base 1。
(2) 在数组声明中的下标关系到每一维的大小,是数组说明符,而在程序其他地方出现的下标为数组元素,两者写法相同,但意义不同。
(3) 在数组声明时的下标只能是常量,而引用变量时数组元素的下标可以是变量或表达式。
(4)可以用LBound函数与 UBound 函数来确定一个数组某一维的下界和上界。如[例5-2]中LBound(b)=-3,UBound(b)=5。
四、 数组的应用
㈠ 数组的初始化
所谓数组的初始化,就是给数组中的各元素赋初值。VB中没有提供定义数组并同时初始化其内容的方法,所以大多数情况下,必须单独地设置每一个元素。一般使用循环实现对数组的初始化。
[例5-4]一维数组的初始化。定义两个整型数组A和B并初始化为0。
程序如下:
Dim i As Integer, A(100) As Integer, B(100) As Integer
For i = 0 To 100
A(i) = 0
Next i
B = A程序中语句“B=A”的作用是把数组A中各元素的值赋给B中对应的元素,该语句等价于:
For i = 0 To 100
B(i) = A(i)
Next i
[例5-5]二维数组的初始化。定义二维字符串数组strName_Sex并初始化。
与简单变量相同,字符串型变量通常赋初值为空字串。对于二维数组的初始化通常用两重循环来完成。程序如下:
Dim i As Integer, j As Integer, strName_Sex(49,1) As String
For i = 0 To 49
For j = 0 To 1
strName_Sex (i, j) = ""
Next j
Next i
㈡ 求数组中最大元素及所在下标
[例5-6]由用户输入10个任意整数,求出这10个数中的最大值及其所数组中的位置。
程序如下:
Private Sub Form_Click()
Dim Max As Integer, iMax As Integer
Dim iUserData(1 To 10) As Integer, i As Integer
For i = 1 To 10
iUserData(i) = Val(InputBox("请输入一个整数:"))
Next i
Max = iUserData(1): iMax = 1
For i = 2 To 10
If iUserData(i) > Max Then
Max = iUserData(i)
iMax = i
End If
Next i
Print "最大值是:" & Max; "其下标为:" & iMax
End Sub
程序运行结果如图5-4所示。
图5-4 求数组中最大元素及所在下标