数组及应用
当需要处理的数据具有同一性质并且数据量大时,例如要记录一个班的30名同学的成绩;要做一个上千人的职工信息表;输入100个数,然后排序,等等,如果用变量存储数据会很不方便,这时用数组实现比较方便。数组是在基本数据类型的基础上扩展的数据类型,对于构思比较复杂的解题思路是非常有帮助的。数组是编程语言数据类型中重要的数据结构。数组与循环结构结合使用可以有效地处理大批量具有相同类型的数据,解决用简单变量无法(或困难)实现的问题。
5.1数组概述
1.数组的定义
数组是一组具有相同数据类型的变量的集合。每个数组都有一个名字,数组名代表逻辑上相关的一批数据,数组中元素的个数称为数组的长度(大小)。数组在内存中被分配连续的存储单元,每个存储单元代表数组中的数据,数组中的每一个数据称为数组元素,用数组名和该数据在数组中的序号来标识。序号又称为下标,数组元素又称为下标变量。数组元素由数组名、一对括号和下标来表示,数组元素可以像普通变量一样使用。利用数组可以简化程序,提高编程效率。
2.数组的特点
(1)数组能保存多个值。
(2)数组是相同数据类型的元素的集合。
(3)数组可以与循环语句配合使用,实现复杂的运算。
(4)数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,依此类推。
(5)数组常用来表示与一维、二维、三维空间分布相关的数据。一维数组相当于数学中的数列,二维数组相当于数学中的矩阵。
(6)动态数组可以根据需要开辟内存空间,优化程序,提高效率。
(7)数组还可以用作过程或函数的参数或返回值,可传递或返回大量的值。
(8)数组中的各元素是有先后顺序的。
3.数组的分类
在VisualBasic中,数组一般可以从以下几个角度进行分类。
(1)按数组所占存储空间的不同分类。
①静态数组:声明时确定了大小的数组,所占的内存空间是固定不变的。
②动态数组:声明时没有给定数组大小,所占的内存空间是可变的。
(2)按数组的维数分类。
①一维数组:数组中的元素只有一个下标。
②二维数组:数组中的元素有两个下标。
③多维数组:数组中的元素具有多个下标。
(3)按数组的元素的数据类型分类。
①数值型数组:数组元素是Integer、Long、Single等类型的变量。
②字符串数组:数组元素是String类型的变量。
③日期型数组:数组元素是Date类型的变量。
④变体数组:数组元素是Variant类型的变量。
⑤自定义数组:数组元素是自定义类型的变量。
(4)按数组的功能分类。
①变量数组:数组元素都是同类型的变量。
②控件数组:数组元素都是同类型的对象。
在VisualBasic中数组没有隐式声明,所有使用的数组必须先声明,后引用。数组的声明包括声明数组名、数组的维数及数据类型。
5.2静态数组
静态数组是指程序在运行时数组元素的个数不变,所占有的分配空间也保持不变的数组。静态数组在声明时就已确定大小。静态数组分为一维数组、二维数组和多维数组。
5.2.1一维数组
1.一维数组的声明
只有一个下标的数组称为一维数组。其声明格式如下:
Public|Private|Dim|Static数组名(<下标>)[As<类型>]
说明:
(1)Public:用于建立公用数组,在模块的声明段用Public声明数组,此类数组可在多个模块中被调用。
(2)Private与Dim:都可用于建立模块级数组或局部数组。
(3)Static:只能用于建立局部数组,在过程内部使用。
(4)数组名:与变量的命名规则相同,遵循标识符命名规则。数组的作用域和变量的作用域相同。
(5)下标:用来指定数组元素的个数(数组的长度),它是整型常量,不能是变量。
下标形式为“[下界To]上界”,当省略下界时,其默认值为0。
数组大小为“上界-下界+1”。
(6)As<类型>:指定数组(元素)类型,可以是VB语言支持的数据类型,如果省略则定义为变体类型,数组可以存储任意类型的数据。
例如:
Dima(1To3)AsInteger,b(4)AsInteger
Dimc(-2To2)
Dims(5)AsString*8
第一条语句定义了两个整型数组a和b,a数组的长度为3(含3个元素),元素为a(1)、a(2)、a(3),b数组的长度为5(含5个元素),元素为b(0)、b(1)、b(2)、b(3)、b(4),两个数组的元素均为整型。
这里以b数组为例,系统在内存中为b数组分配5个连续的存储单元,每个存储单元占两个字节,如图5.1所示。
图5.1数组b(4)的存储单元
第二条语句定义了类型为Variant的c数组,其长度为5,元素为c(-2)、c(-1)、c(0)、c(1)、c(2),数组的元素均为Variant型。
第三条语句定义了字符串类型的s数组,有6个元素,每个元素最多存放8个字符。
提示:
(1)数组下界默认为0,为了便于使用,在VB中的窗体层或标准模块层用“OptionBasen”语句指定在定义数组时下标下界省略时的默认值(不能在过程中使用)。
例如:
OptionBase1
Dimm(3)AsInteger
设定默认下界为1,数组m中的元素分别为m(1)、m(2)、m(3)。
注意:该语句只能对本模块中声明时默认下界的数组起作用,对其他模块的数组不起作用。
(2)在定义数组时可用类型符来指定数组的类型。例如:
Dima(3)AsInteger
Dima%(3)
上述两条语句定义的整型数组是等价的。类似地还有:
DimB!(3To5)、C#(12)、D$(5)
2.数组元素的引用
一维数组被定义之后便具有了内存空间,可以通过以下方式引用数组指定下标的元素。
数组名(下标值)
引用数组元素时的“下标”可以是整型(或长整型)常量、变量或表达式。下标值不能小于数组下标的下界,不能大于下标的上界。
3.数组元素的赋值
对于静态数组,数组声明后由于其个数是固定的,因此所有元素都已经在内存中分配好了空间,此时的数组元素与简单变量一样存在默认的初值,若需要给数组的元素重新赋值,可以采用直接赋值,当数组元素很多时也可以采用循环方式,使赋值简单、快捷。
1)直接赋值
直接赋值即直接将值赋给数组中的每个元素。例如,下列程序对数组元素赋值如下:
Dimstu(3)AsInteger
stu(0)=1
stu(1)=2
stu(2)=3
stu(3)=4
这就实现了对数组中的每个元素进行赋值。
2)利用循环结构赋值
当需要赋值的数组元素较多,且所赋值有一定的规律时,使用循环结构赋值是非常有效的一种方法。例如,给数组stu(1To10)中的每个元素都赋初值0,程序如下:
Dimstu(1To10)AsInteger
DimiAsInteger
Fori=1To10
stu(i)=0
Nexti
3)数组元素间互相赋值
例如将A数组的元素值赋给B数组,对应的赋值程序为:
DimA(1To100)AsInteger,iAsInteger
DimB(1To100)AsInteger
Fori=1To100
A(i)=i
PrintA(i);
Nexti
Print
Fori=1To100
B(i)=A(i)
PrintB(i);
Nexti
在VisualBasic6.0中可以直接将一个数组的值赋给另一个数组。例如:
Dimstu(3)AsInteger
Dimtea()AsInteger
tea=stu
使用这种方法赋值需要注意以下事项:
(1)赋值号两边的数组类型必须一致。
(2)如果赋值号左边是一个动态数组,则赋值时系统自动将动态数组ReDim成与右边相同大小的数组。
(3)如果赋值号左边是一个大小固定的数组,则数组赋值出错。
4)利用Array函数赋值
例如,以下程序将两组数据转化为数组中的数组元素。
DimaAsVariant,bAsVariant,i%
a=Array(1,2,3,4,5)
b=Array("abc","def","67")
注意:本函数只能给变体类型的变量或变体类型的动态数组赋值。
……