§5.1数组的特点一、数组的概念在实际应用中,常常需要处理相同类型的一批数据。例如,为了处理100个员工的工资,可以用S(1),S(2),…,S(100)来分别代表每个员工的工资,其中S(1)代表第一个员工的工资,S(2)代表第二个员工的工资……。数组并不是一种数据类型,而是一组相同类型数据的集合。用一个统一的名字(数组名)代表逻辑上相关的一批数据。每个元素用下标变量来区分;下标变量代表元素在数组中的位置。数组中的每一个数据称为数组元素,用数组名和该数据在数组中的序号来标识。序号又称为下标,数组元素又称为下标变量。例如,S(2)是一个数组元素,其中的S称为数组名,2是下标。在使用数组元素时,必须把下标放在一对紧跟在数组名之后的括号中。S(3)是一个数组元素,而S3是一个简单变量。如果只用一个下标就能确定某个数组元素在数组中的位置,这样的数组称为一维数组。如果用两个或多个下标才能确定某个数组元素在数组中的位置,则数组分别称为二维数组或多维数组。其表示形式:◆一维数组:S(2),S(3),S(10)◆二维数组:X(1,1),X1(1,10),X(2,10)◆多维数组:Y(0,0,0),Y(1,2,5),Y(2,3,4)二、VisualBasic中的数组,按不同的方式可分为以下几类1、按数组的大小(元素个数)是否可以改变来分为:定长数组、动态(可变长)数组。2、按元素的数据类型可分为:数值型数组、字符串数组、日期型数组、变体数组等。3、按数组的维数可分为:一维数组、二维数组、多维数组。4、对象数组:菜单对象数组、控件数组。5.2.1一维数组的声明数组应当先定义后使用,数组的定义又称为数组的声明或说明。形式:Dim数组名([下界to]上界)[As数据类型]或:Dim数组名[数据类型符]([下界to]上界)例如:与上面声明等价形式:DimA%(1to10)定义了一个一维数组,该数组的名字为A,类型为Integer,占据10个整型变量的空间。说明:◆“说明符”为保留字,可以为Dim,Public,Private,Static中的任意一个。在使用过程中可以根据实际情况进行选用。这里主要讲述用Dim声明数组。定义数组后,数值数组中的全部元素都初始化为0,字符串数组中的全部元素都初始化为空字符串。◆“数组名”的命名规则与变量的命名相同。◆“下标”的一般形式为“[下界to]上界”。下标的上界、下界为整数,不得超过Long数据类型的范围,并且下界应该小于上界。如果不指定下界,下界默认为0。◆要注意区分“可以使用的最大下标值”和“元素个数”。◆下界和上界不能使用变量,必须是常量,常量可以是直接常量、符号常量,一般是整型常量。◆“As类型”用来说明“数组元素”的类型,可以是Integer,Long,Single,Double,Currency,String(定长或变长)等基本类型或用户定义的类型,也可以是Variant类型。如果省略“As类型”,则数组为Variant类型。◆在同一个过程中,数组名不能与变量名同名,否则会出错。◆可以通过类型说明符来指定数组的类型。例如:DimA%(5),B!(3To5),C#(12)其中:%——表示为Integer数组类型!——表示为Single数组类型#——表示为Double数组类型◆数组中各元素在内存占一片连续的存储空间,一维数组在内存中存放的顺序是下标大小的顺序,如图5-1所示:A(0)A(1)A(2).....5.2.2一维数组元素的引用数组的引用通常是对数组元素的引用。一维数组元素的表示形式为:数组名(下标)其中:下标可以是整型变量、常量或表达式。一般通过循环语句及InputBox函数、文本框给数组输入数据。数组的输出一般用Print方法、标签或文本框实现。【例】设有下面的数组B(10)AsInteger则下面的语句都是正确的。A(1)=A(2)+B(1)+5'取数组元素运算A(i)=B(i)'下标使用变量B(i+1)=A(i+2)'下标使用表达式【例】编写程序,把输入的10个整数按逆序输出。PrivateSubCommand1_Click()Dima(10)AsInteger,i%Print输入的数据为Fori=1To10a(i)=InputBox(请输入一个整型数)Printa(i),NextiPrintPrint逆序输出为Fori=10To1step-1Printa(i),NextiEndSub5.2.3一维数组的基本操作一、可通过循环给数组元素的初值Fori=1To10A(i)=1'A数组的每个元素值为1Nexti二、数组的输入输入100个数,并存入到数组A中。Fori=1To100A(i)=Val(InputBox(“输入A(”&i&“)的值”))Nexti三、求数组中最大元素及所在下标DimMaxAsInteger,iMaxAsIntegerMax=A(1):iMax=1Fori=2To105.2.4一维数组的应用一、分类统计【例】从键盘上输入40人的考试成绩,输出高于平均成绩的分数。分析:该问题可分三部分处理:一是输入40个人的成绩;二是求平均分;三是把这40个分数逐一和平均成绩进行比较,若高于平均成绩,则输出。PrivateSubCommand1_Click()Dimscore(40)AsSingle,aver!,i%aver=0Fori=1To40score(i)=InputBox(请输入成绩)aver=aver+score(i)Nextiaver=aver/40Fori=1To40Ifscore(i)averThenPrintscore(i)NextiEndSub二、排序问题【例】从键盘上输入10个整数,把这些数按由小到大的顺序排序输出。分析:排序的方法很多,如选择法、冒泡法等。这里介绍最容易理解的“冒泡法”。设10个数存放在A数组中,分别为:A(1)、A(2)、A(3)、A(4)、A(5)、A(6)、A(7)、A(8)、A(9)、A(10)。第1轮:先将A(1)与A(2)比较,若A(1)>A(2),则将A(1)、A(2)的值互换,否则,不作交换;这样处理后,A(1)一定是A(1)、A(2)中的较小者。再将A(1)分别与A(3)、…、A(10)比较,并且依次作出同样的处理。最后,10个数中的最小者放入了A(1)中。第2轮:将A(2)分别与A(3)、…、A(10)比较,并依次作出同第1轮一样的处理。最后,第1轮余下的9个数中的最小者放入A(2)中,亦即A(2)是10个数中的第二小的数。照此方法,继续进行第3轮……直到第9轮后,余下的A(10)是10个数中的最大者。至此,10个数已从小到大顺序存放在A(1)~A(10)中。为简单起见,我们以7,5,3三个数为例,再做说明:第1轮:找出最小值3作为第一个数组元素。753比较7和5,7>5,需要交换,交换后的序列为573;573比较5和3,5>3,需要交换,交换后的序列为375;第2轮:找出剩下的元素中的最小值5作为第二个数组元素。375比较7和5,7>5,需要交换,交换后的序列为357。剩下的一个元素7为三个元素中的最大者,排序完成。参见动画演示PrivateSubCommand1_Click()Dimt%,i%,j%,a(10)AsIntegerFori=1To10a(i)=InputBox(输入一个整数)NextiPrint输入的10个整数为Fori=1To10Printa(i),NextiPrintFori=1To9Forj=i+1To10Ifa(i)a(j)Thent=a(i):a(i)=a(j):a(j)=tNextjNextiPrint排序后的结果为Fori=1To10Printa(i),NextIEndSub【例】随机产生10个两位整数,找出其中最大值、最小值。分析:该问题可以分为两部分处理:一是产生10个随机整数,并保存到一维数组中;二是对这10个整数求最大、最小值。PrivateSubCommand1_Click()Dimmin%,max%,i%,a(10)AsIntegerRandomizeFori=1To10a(i)=Int(Rnd*90)+10NextiPrint产生的随机数为Fori=1To10Printa(i),NextiPrintmin=a(1):max=a(1)Fori=2To10Ifa(i)maxThenmax=a(i)Ifa(i)minThenmin=a(i)NextiPrint最大值为PrintmaxPrint最小值为PrintminEndSub5.3.1二维数组的声明一、二维数组及多维数组假如有30个学生,每个学生有5门考试成绩,如何来表示这些数据呢?VB中可以用有两个下标的数组来表示,如第i个学生第j门课的成绩可以用S(i,j)表示。其中i表示学生号,称为行下标(i=1,2,…,30);j表示课程号,称为列下标(j=1,2,3,4,5)。有两个下标的数组称为二维数组。二、二维数组的声明对于固定大小的二维数组,可以用如下格式进行定义:说明符数组名([下界to]上界,[下界to]上界)[As类型]【例】DimT(2,3)AsInteger定义了一个二维数组,名字为T,类型为Integer,该数组有3行(0~2)4列(0~3),占据12(3×4)个整型变量的空间,如表5-1所示表5-1二维数组第0列第1列第2列第3列第0行T(0,0)T(0,1)T(0,2)T(0,3)第1行T(1,0)T(1,1)T(1,2)T(1,3)第2行T(2,0)T(2,1)T(2,2)T(2,3)说明:◆可以将二维数组的定义方法推广至多维数组的定义。例如:DimD(3,1To10,1To15)定义了一个3维数组,大小为4×10×15。注意在增加数组的维数时,数组所占的存储空间会大幅度增加,所以要慎用多维数组,尤其是Variant数组,因为他们需要更大的存储空间。◆在实际使用时,可能需要数组的上界值和下界值,这可以通过LBound函数和UBound函数来求得。其格式为:LBound(数组名[,维])UBound(数组名[,维])这两个函数分别返回一个数组中指定维数的下界和上界。5.3.2二维数组的引用二维数组的引用和一维数组基本相同。引用形式:数组名(下标1,下标2)【例】[zd]a(1,2)=10a(i+2,j)=a(2,3)*2对二维数组元素进行赋值或输出时,一般采用二重循环来实现。【例】打印4名同学的英语、数学、法律3门课的考试成绩,并计算出每个同学的平均成绩。分析:把4名同学的姓名及各科的考试分数分别存入一个一维字符串数组xm(4)和一个二维数值数组a(4,3)中,然后对数组(主要是二维数组)进行处理。程序如下:PrivateSubCommand1_Click()Dima(4,3)AsSingle,xm(4)AsString*10,i%,j%,aver!PrintTab(25);成绩表PrintPrint姓名;Tab(15);英语;Tab(25);数学;PrintTab(35);法律;Tab(45);平均分PrintFori=1To4aver=0xm(i)=InputBox(输入姓名)Printxm(i);Forj=1To3a(i,j)=InputBox(输入&xm(i)&的一个成绩)Nextjaver=aver/3PrintTab(15);a(i,1);Tab(25);a(i,2);PrintTab(35);a(i,3);Tab(45);averPrintNextiEndSub5.3.3二维数组的基本操作一、二维数组数据的输入ConstN=4,M=5,L=6Dima(1toN,1toM)AsInteger,iAsInteger,jAsInteger,k%二维数组a输入数据的程序段如下:Fori=1to4Forj=1to5A(i,j)=Val(InputBox(a(&I&,&j&)=?))NextjNexti二、求最大元素及其所在的行和列用变量max存放最大值,row,