第6章数组16.1数组的基本概念6.2数组的定义6.3数组的基本操作6.4数组基本操作示例6.5控件数组6.1数组的基本概念通常使用一个变量只能存储一个数据,对于只处理少量数据的问题,使用若干变量就可以很方便地处理这些数据。在实际问题中往往会有大量的、性质相同的、有序的数据需要处理。使用数组,结合循环,在多数场合下可以很方便地表示和处理这种数据。26.1数组的基本概念6.1.1数组与数组元素数组名:数组用于表示一组类型相同的有序的数,这一组数用一个统一的名称来表示,称为数组名。例如,100个学生的英语成绩,可以统一取名为Eng。数组元素:数组中的每一个元素称为数组元素。表示成:数组名(下标)。例如,用Eng(1)表示第一个学生的英语成绩(下标为1),用Eng(100)表示第100个学生的英语成绩(下标为100)。3下标变量:每个数组元素用来保存一个数据,其使用与简单变量类似,在简单变量允许出现的多数地方也允许出现数组元素。例如,可以通过X=90给简单变量X赋值,同样也可以通过Eng(1)=90给数组元素Eng(1)赋值,所以,数组元素也称为下标变量。4注意:(1)要用圆括号把下标括起来。例如,将X(8)表示成:X[8]、X{8}、或X8都是错误的。(2)下标可以是常量、变量或表达式,其值必须是整数,否则将被自动四舍五入为整数。(3)下标的最小取值称为下界,下标的最大取值称为上界,下界和上界的大小在定义数组时确定。引用数组元素时,下标必须在其下界和上界之间。(4)数组名的命名规则与简单变量的命名规则相同。56.1.2数组的类型VB中数据类型较多,相应的数组类型也有多种,可以声明任何基本数据类型的数组,包括用户自己定义类型和对象变量,但是一个数组中的所有元素应该具有相同的数据类型。特殊情况:当数据类型为variant时,各个元素能够包含不同类型的数据。66.1.3数组的形式VB中支持两种数组:静态数组和动态数组。前者指的是数组元素个数固定不变,而后者的大小在运行时可变。76.1.4数组的维数数组中的元素可以用一个下标来定位,也可以用多个下标来定位。数组的维数:下标个数一维数组:由一个下标组成。如A(2),C(6)二维数组:由两个下标组成。如B(2,3)三维数组:由三个下标组成。如G(3,4,23)三维以上的数组称为多维数组,最多60维8一维数组示例:例如:一班40名学生的英语成绩可以表示成Eng(1)、Eng(2)、Eng(3)、…、Eng(40),用Eng(1)表示1号学生的成绩,用Eng(2)表示2号学生的成绩……,这样处理起来很直观,需要引用第I个学生的成绩时,直接使用Eng(I)即可。9二维数组示例:设有一个3行3列的矩阵:333231232221131211aaaaaaaaa10用二维数组A表示该矩阵的所有元素,用第1个下标表示元素所在的行号,用第2个下标表示元素所在的列号,则A(I,J)表示第I行第J列的元素A。a(1,1)a(1,2)a(1,3)a(2,1)a(2,2)a(2,3)a(3,1)a(3,2)a(3,3)6.2数组的定义数组在使用之前必须先定义(声明),定义数组的主要目的是为数组分配存储空间。数组名:存储空间的名称;数组元素:存储空间的每一个单元。每个单元的大小与数组的类型有关。按数组占用存储空间的方式不同,VisualBasic有两种数组:静态数组动态数组两种数组的定义方法不同,使用方法也略有不同。116.2.1静态数组的定义静态数组是指数组元素的个数在程序的执行期间不能改变的数组。12Public|Private|Dim数组名(维数定义)[As类型],…功能:声明数组,包括确定数组的名称、维数、每一维的大小和数组元素的类型,并为数组分配存储空间。格式:说明:13(1)数组的作用域在模块通用声明段使用Public语句建立一个全局级数组(注意,不能在窗体模块使用Public定义数组);在模块通用声明段中使用Private语句或Dim语句建立一个模块级数组在过程中用Dim/static语句建立一个过程级数组。(2)“数组名”必须符合标识符的命名规则。(3)“维数定义”形式为:[下界1To]上界1,[下界2To]上界2,…VB默认下界值为0,可以使用OptionBase语句将默认下界修改为114OptionBase{0|1}(4)“类型”:Integer、Long、Single、Double、Boolean、String、String*n、Currency、Byte、Date、……在编译时为静态数组分配固定大小的存储空间,在运行期间静态数组的大小不能改变。例1:要存储100个学生的英语成绩,可以定义一维数组Eng如下:DimEng(1to100)AsInteger或:OptionBase1DimEng(100)AsInteger例2:存储一个3行3列的矩阵,定义二维数组A如下:DimA(1To3,1To3)AsSingle15数组元素的个数:16数组元素的个数等于每一维的大小之积,即n维数组元素个数为:(上界1-下界1+1)×(上界2-下界2+1)×…×(上界n-下界n+1)6.2.2动态数组的定义动态数组是指在程序执行过程中数组元素的个数可以改变的数组。使用动态数组就可以在任何时候改变其大小,并且可以在不需要时清除动态数组所占的存储空间。17181.在模块级或过程级定义一个无下标的数组:Public|Private|Dim数组名()[As类型],…2.在过程级定义数组的实际大小。ReDim[Preserve]数组名(维数定义)[As类型],…定义动态数组需要分两步完成:ReDim语句只能出现在过程中。“维数定义”通常包含变量或表达式,但其中的变量或表达式应有明确的值。例如,定义一个动态数组Eng,用来保存学生的英语成绩。19DimEng()AsIntegerPrivateSubCommand1_Click()N=Val(InputBox(请指定学生人数))ReDimEng(1ToN)……EndSub可以用ReDim语句多次改变数组元素的数目及维数的数目。在定义动态数组的两个步骤中,如果用步骤1定义了数组的类型,则不允许用步骤2改变类型。每次执行ReDim语句时,如果不使用Preserve,则数组中的值全部被重新初始化;如果使用Preserve,则保留数组中原有的元素值。使用Preserve关键字的Redim语句只能改变多维数组中最后一维的上界,且不能改变维数的数目。20说明:【例】DimA()AsIntegerPrivateSubCommand1_Click()N=4ReDimA(N)ForI=0ToNA(I)=1:PrintA(I);NextIPrintN=8ReDimA(N)ForI=0ToNPrintA(I);NextIEndSub21运行时输出结果为:11111000000000改为:DimA()AsIntegerPrivateSubCommand1_Click()N=4ReDimA(N)ForI=0ToNA(I)=1:PrintA(I);NextIPrintN=8ReDimPreserveA(N)ForI=0ToNPrintA(I);NextIEndSub22运行时输出结果为:111111111100006.2.3用户自定义类型的数组用户自定义类型的数组:指数组中的每个元素的类型都是用户自定义类型。学号姓名数学英语01张三899002李四7893…………23例如:学生成绩表(1)可以定义数据类型StudScore:TypeStudScoreStudNumberAsString*2StudNameAsString*10MathAsIntegerEnglishAsIntegerEndType24(2)定义一个具有StudScore类型的数组:DimScore(1To40)AsStudScore25(3)引用第i个学生的信息:Score(1).StudNumber=01Score(1).StudName=张三Score(1).Math=89Score(1).English=90WithScore(1).StudNumber=01.StudName=张三.Math=89.English=90EndWith或写成:6.3数组的基本操作定义数组之后,就可以对数组进行各种操作了,如输入数组元素的值,对数组元素进行各种处理,输出数组元素的值等。对数组的处理通常要结合循环进行,用循环变量控制数组元素的下标,以便能够按一定次序、有选择、快速地处理数组。266.3.1数组的输入和输出输入:输入数组元素值可以有多种方法。例如,可以使用赋值语句、文本框、InputBox函数、Array函数等,可以对数组的个别元素输入数据,也可以对整个数组输入数据。输出:数组元素的值,可以使用Print方法输出数组元素,也可以使用控件输出数组元素,如使用标签、文本框等。27【例6-1】随机产生10个两位整数,放入数组a中。考虑到要在不同的过程中使用数组,所以首先在模块的通用段声明数组:Dima(1To10)AsInteger随机整数的生成由窗体的Load事件代码完成:PrivateSubForm_Load()RandomizeFori=1To10a(i)=Int(Rnd*90)+10NextEndSub28多维数组元素的输入通过多重循环来实现。由于VB中的数组是按行存储的,因此一般把控制数组第1维的循环变量放在最外层的循环中。【例6-2】设有一个5×5的方阵,其中的元素是由计算机随机生成的小于100的整数。考虑到要在不同的过程中使用数组,所以首先在模块的通用段声明数组:Dima(5,5)AsInteger29方阵的生成由窗体的Load事件代码完成:PrivateSubForm_Load()RandomizeFori=1To5Forj=1To5a(i,j)=Int(Rnd*99)+1NextNextEndSub30【例6-3】将例6-1中的数组在窗体按3行3列输出。PrivateSubForm_Activate()ClsPrintFori=1To9IfiMod3=0ThenPrinta(i)ElsePrinta(i);;EndIfNextEndSub31【例6-4】将例6-2中的数组在窗体中按5行5列输出。PrivateSubForm_Activate()ClsFori=1To5Forj=1To5Printa(i,j);NextPrintNextEndSub326.3.2数组的删除格式:33Erase数组名对静态数组使用Erase语句:数值型数组元素值置为0;可变长度字符串类型数组元素值置为零长度字符串。Erase语句不能释放静态数组所占的存储空间。对动态数组使用Erase语句:将释放动态数组所占的存储空间;在下次引用该动态数组之前,必须使用ReDim语句来重新定义该数组。6.3.3数组的初始化VB提供了array函数,用于在程序中利用代码对数组初始化,所谓初始化指的是给数组中各个元素赋初值。格式:数组变量名=array(数值表)说明:1.数值表中的值就是数组元素的值,用逗号分隔;若无参数,则创建长度为0的数组。342.下界默认为0,上界由数值个数确定;3.“数组变量名”是已经声明的变量的名称,作为数组使用,必须为可变类型。数组类型由array中数值表的数值类型确定。如:DimAA=array(”abc”,2,3)4.Array只能给一维数组赋值。35【例6-5】编写代码实现运行时单击命令按钮Command1,Array函数实现学生成绩输入,标签Label1实现成绩输出。PrivateSubCommand1_Click()Dimscore'定义score为可变类型的变量score=Array(80,78,90,85,73,89,97)Fori=LBound(score)ToUBound(score)Label1.Caption=Label1.Caption&Str(