【文摘】 第5章 数组在编程时常常遇到需要对一系列同类型的数据进行处理的问题,如果使用前面所介绍的简单变量来处理这类问题会有很大困难。因为简单变量之间是相互独立、没有内在联系的,这就需要为不同的数据定义名称不同的变量,当数据量较大时,变量的定义和处理过程将会非常的复杂而繁琐。如果能够给一个数据集合中的数据起一个共同的名字,用一组连续的编号来区分集合中的不同数据,那么就可以通过数据集合的名字和编号来表示其中的每个数据。采用这样的方式表示数据将使得对大量数据的处理变得很方便。这样的一种具有共同名称、以编号来区别不同数据的数据集合就称为数组。5.1数 组 概 述数组是具有相同类型的有序变量的集合。这些变量按照一定的规则排列,占据着一段连续的存储单元。5.1.1数组的概念数组名的命名规则与简单变量命名规则一样。数组名不是代表一个变量,而是代表有内在联系的一组变量,数组名中实际存放的内容是这组数据在内存中存放的首地址。数组内的每个成员称为数组元素,数组元素就是一个个简单变量,数组元素的类型也就是数组的类型。为了标识数组中的不同元素,每个数组元素都有各自的编号即下标,下标确定了数组元素在数组中的位置,可以用数组名和下标唯一地标识数组中的某个元素。数组元素的一般表示形式如下: 数组名(下标1\[,下标2,…\])其中,下标可以是常量、变量或算术表达式。当下标的值为非整数时,会自动进行四舍五入处理。如果只需一个下标就可以确定一个数组元素在数组中的位置,则该数组称为一维数组。如果需要两个下标才能确定一个数组元素在数组中的位置,则该数组称为二维数组。以此类推,必须由N个下标才能确定一个数组元素在数组中的位置,则该数组称为N维数组。因此,确定数组元素在数组中位置的下标个数就是数组的维数。通常把二维以上的数组称为多维数组,Visual Basic规定数组的维数不得超过60。5.1.2数组的定义Visual Basic规定在使用一个数组之前必须对数组进行定义,确定数组的名称和它的数据类型,指明数组的维数和每一维的上、下界的取值范围,这样系统就可以为数组分配一块连续的内存区域,存放数组的所有元素。数组的每个元素在这个连续的内存区域内都占据各自特定的单元。Visual Basic程序设计第5章数组在Visual Basic中有两种类型的数组: 固定大小数组和动态数组。在定义数组时就确定了数组的大小,并且在程序运行过程中不能改变其大小的数组称为固定大小数组。在定义数组时不指明数组的大小,在程序运行时才根据需要确定其大小,即在程序运行中可以改变大小的数组称为动态数组。1. 数组定义语句数组定义语句的一般形式如下: Public | Private | Static | Dim(\[\])\[As\]说明: (1) Public、Private、Static、Dim是作用域关键字,数组作用域的含义与变量作用域的含义类似(作用域的概念将在第6章中重点介绍),不同关键字的含义如表5\|1所示。表5\|1数组作用域说明关键字适 用 范 围Public用于标准模块的声明段,定义全局数组Private和Dim用于模块的声明段,定义模块级数组Dim用于过程中,定义局部数组Static用于过程中,定义静态数组(2) “维界定义”的格式如下: \[To\] 上界1 \[\[,To\] 上界2…\]格式中的下界1、上界1表示数组第*维下标的下界和上界,下界2和上界2表示数组第二维下标的下界和上界,以此类推。“下界”和关键字“To”可以缺省,缺省情况下数组元素下标的取值是从0开始,等价于“0 To上界”。如果代码中有Option Basic 1声明语句,则缺省的下界是从1开始,等价于“1 To上界”。例如,在窗体模块的“通用”部分有下列数组说明语句: Dim a(3) As Integer,b(1 To 2,2) As SinglePrivate c(-6 To -2) As String6第*条语句等价于: Dim a(0 To 3) As Integer,b(1 To 2,0 To 2) As Single它定义了一个模块级的一维整型数组a以及二维单精度型数组b。一维数组a共有4个数组元素,分别是a(0)、a(1)、a(2)、a(3)。二维数组b共有6个元素,分别是b(1,0)、b(1,1)、b(1,2),b(2,0)、b(2,1)、b(2,2)。第二条语句定义了一个模块级的一维定长字符串型数组c,数组的维下界是-6,维上界是-2,共有5个元素,分别是c(-6)、c(-5)、c(-4)、c(-3)、c(-2)。每个元素都是一个6字符的定长字符串,占6个字节的内存空间,因此整个数组占30字节的内存空间。2. 数组的上、下界某维的下界和上界分别表示该维下标的*小值和*大值。维界的取值范围不得超过长整型(Long)数据表示的范围(-2 147 483 648~2 147 483 647),且下界必须小于等于上界。在定义固定大小数组时,只能用常量或常量表达式进行维界说明。如果数组定义语句中的维界不是整数,将自动按照CInt函数的方法对其进行四舍五入取整。例如: Dim x As IntegerConst N As Integer=10Dim a(5.5) As Integer'正确,该语句等同于Dim a(1 To 6) As IntegerDim b(1 To 35) As Integer'正确,该语句等同于Dim b(1 To 15) As IntegerDim c(N) As Integer '正确,该语句等同于Dim c(10) As IntegerDim d(0 To x) As Integer '错误,不允许使用变量做数组的维界说明注意: 若用符号常量说明数组的维界,那么该符号常量在说明语句之前必须已定义过。3. 数组的类型数组定义语句中“As 数据类型”用来声明数组的类型,数据的类型即数组中元素的数据类型。数组的类型可以是Integer、Long、Single、Double、Date、Boolean、String(变长字符串)、Stringlength(定长字符串)、Object、Currency、Variant和自定义类型。若缺省As短语,则表示该数组是变体(Variant)类型。4. 数组的大小用数组说明语句定义数组,指定了各维的上、下界取值范围,也就确定了数组的大小。所谓数组的大小就是这个数组所包含的元素的个数。数组的大小有时也称为数组的长度,可用下面的公式计算得到: 数组的大小=第*维大小×第二维大小×…×第N维大小各维的大小=维上界—维下界 1例如,程序有下面的语句:Option Base 1Dim a(10) As IntegerDim b(5,-3 To -1) As String说明: Option Base 1语句只能位于模块的通用部分,用以说明缺省下界的数组的元素下标默认是从1开始的。因此: 一维数组a的大小为10-1 1=10个数组元素。二维数组b的大小为(5-1 1)×\[-1-(-3) 1\]=5×3=15个数组元素。5. 数组元素的初始值数组说明语句不仅定义了数组的作用域,分配了存储空间,而且还对数组元素的值进行了初始化。数组元素的初始值与变量的初始值相同,与元素的类型有关。即数值型数组元素的初始值为零,变长字符型数组元素的初始值为空字符串,定长字符型数组元素的初始值为指定长度个数的空格,布尔型数组元素的初始值为“False”,变体型数组元素的初始值是“Empty”。5.1.3数组的结构数组是具有相同数据类型的多个变量的集合,数组中的所有元素按一定顺序存储在连续的内存单元中。下面分别讨论一维/二维/三维数组的结构。1. 一维数组的结构 一维数组的逻辑结构为一个线性队列。假设有如下语句: Dim a(8) As Integer则数组a的逻辑结构为: a(0),a(1),a(2),…,a(6),a(7),a(8)由于内存也是线性结构,因此,一维数组的逻辑结构与其在内存中存放的次序是一致的。a(0) a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8)2. 二维数组的结构二维数组的逻辑结构为一张由行和列组成的二维表,与数学中的矩阵相同。二维数组的数组元素需要用两个下标来标识,即要指明数组元素的行号和列号。假设有如下语句: Option Base 1Dim t(3,4) As Integer定义了一个二维数组t,其中行列下标的下界都是从1开始,行下标的上界为3,列下标的上界为4,因此这是一个3行4列的二维数组。该二维数组的逻辑结构示意如下: 第1列第2列第3列第4列第1行t(1,1)t(1,2)t(1,3)t(1,4)第2行t(2,1)t(2,2)t(2,3)t(2,4)第3行t(3,1)t(3,2)t(3,3)t(3,4)二维数组在内存中是“按列存放”在线性结构的内存中的。即先存放第*列的所有元素: t(1,1) t(2,1) t(3,1),接着存放第二列所有元素: t(1,2) t(2,2) t(3,2) ……直到存完*后一列的所有元素。二维数组t的元素在内存中的具体存放次序如下: t(1,1) t(2,1) t(3,1) t(1,2) t(2,2) t(3,2) t(1,3) t(2,3) t(3,3) t(1,4) t(2,4) t(3,4)3. 三维数组的结构三维数组是由行、列和页组成的三维表。三维数组也可理解为几页的二维表,即每页由一张二维表组成。三维数组的元素是由行号、列号和页号共同来标识的。假设有如下语句: Option Base 1Dim p(2,3,2) As Integer定义了一个三维数组p,其中第*个数2标识了数组的行下标上界为2,第二个数3标识了列下标上界为3,第三个数2标识了页下标上界为2。因此,这个三维数组有2页、2行、3列共12个元素。三维数组p的逻辑结构示意如下: 第1页p(1,1,1)p(1,2,1)p(1,3,1)p(2,1,1)p(2,2,1)p(2,3,1)第2页p(1,1,2)p(1,2,2)p(1,3,2)p(2,1,2)p(2,2,2)p(2,3,2)三维数组在内存中是按“逐页逐列”的规则存放的。即先对数组的第*页中的所有元素按列的顺序分配存储单元,然后再对第二页中的所有元素按列的顺序分配存储单元……直到数组的每一个元素都分配了存储单元。三维数组p的元素在内存中的具体存放次序如下:p(1,1,1) p(2,1,1) p(1,2,1) p(2,2,1) p(1,3,1) p(2,3,1) p(1,1,2) p(2,1,2) p(1,2,2) p(2,2,2) p(1,3,2) p(2,3,2)5.2数组的基本操作由于数组元素的本质仍是变量,只不过是带有下标的变量而已,所以对数组元素的输入输出操作可以与变量相同。但与普通变量不同的是,数组元素的下标是有序排列的,可以通过循环变量表示下标访问不同的数组元素。因此在需要对整个数组或数组中连续的元素进行处理时,利用循环结构是*有效的方法。5.2.1数组元素的赋值〖*4/5〗1. 用赋值语句给数组元素赋值单个数组元素的赋值可以通过赋值语句来实现。例如: Dim a(3) As Integer,b(1 To 2,2) As Singlea(0)=10b(1,0)=1b(2,2)=52. 通过循环逐一给数组元素赋值若在一个For循环中用循环控制变量作为数组元素的下标,就可依次访问一维数组的每一个元素。同样使用双重的For循环,用外层、内层循环的循环控制变量分别作为第*维、图5\|1数组赋值输出第二维的下标就可依次访问二维数组的所有元素。以此类推,数组有N维就可以采用N重循环给数组的所有元素一一赋值。例如,下面程序的功能是: 在窗体输出一个两位随机数构成的一维数组;在图片框上输出一个三位随机数构成的二维数组。请注意代码中循环控制变量作为数组元素下标的使用方法。程序的运行结果如图5\|1所示。Option ExplicitOption Base 1Private Sub Form_Click()Dim a(10) As Integer,b(3,4) As IntegerDim i As Integer,j As IntegerPrint "一维数组: "For i=1 To 10 '使用循环给一维数组赋值并输出a(i)=Int(90Rnd) 10Print a(i); '分号用于在一行上连续输出数组元素Next iPrint'在窗体上换行Picture1.Print "二维数组: "F