第五章数组5.1概述数组的概念:数组并不是一种数据类型,而是一组相同类型数据的集合。用一个统一的名字(数组名)代表逻辑上相关的一批数据,每个元素用下标变量来区分;下标变量代表元素在数组中的位置。其表示形式:A(1),A(10)X(1,1),X1(1,10),X(2,10)Y(0,0,0),Y(1,2,5)VisualBasic中的数组,按不同的方式可分为以下几类:按数组的大小(元素个数)是否可以改变来分为:定长数组、动态(可变长)数组。按元素的数据类型可分为:数值型数组、字符串数组、日期型数组、变体数组等。按数组的维数可分为:一维数组、二维数组、多维数组。对象数组:菜单对象数组、控件数组。5.2一维数组5.2.1一维数组的声明形式:Dim数组名([下界to]上界)[As数据类型]或:Dim数组名[数据类型符]([下界to]上界)例:Dima(1to10)AsInteger‘声明了a数组有10个元素与上面声明等价形式:Dima%(1to10)1是下标的下界10是下标的上界数组元数的数据类型说明:1.数组名的命名规则与变量的命名相同。2.数组的元素个数:上界-下界+1。3.缺省下界为0,若希望下标从1开始,可在模块的通用部分使用OptionBase语句将设为1。其使用格式是:OptionBase0|1'后面的参数只能取0或1例如:OptionBase1'将数组声明中缺省下界下标设为14.下界和上界不能使用变量,必须是常量,常量可以是直接常量、符号常量,一般是整型常量。5.如果省略As子句,则数组的类型为变体类型。6.数组中各元素在内存占一片连续的存储空间,一维数组在内存中存放的顺序是下标大小的顺序,如图5-1所示:5.2.2一维数组元素的引用使用形式:数组名(下标)其中:下标可以是整型变量、常量或表达式。例如:设有下面的数组B(10)AsInteger则下面的语句都是正确的。A(1)=A(2)+B(1)+5'取数组元素运算A(i)=B(i)'下标使用变量B(i+1)=A(i+2)'下标使用表达式5.2.3一维数组的基本操作1.可通过循环给数组元素的初值Fori=1To10'A数组的每个元素值为1A(i)=1Nexti2.数组的输入Fori=1To4Forj=1To5sc(i,j)=InputBox(输入sc(&i&,&j&)的值)NextjNextI3.数组的输出输出如下图所示的下三角数据Dimsc(5,5)AsInteger,i%,j%Fori=1To5Forj=1Toisc(i,j)=i*5+jPrintsc(i,j);;NextjPrint'换行NextI4.求数组中最大元素及所在下标DimMaxAsInteger,iMaxAsIntegerMax=A(1):iMax=1Fori=2To10IfA(i)MaxThenMax=A(i)iMax=iEndIfNextI5.将数组元素倒置Fori=1To10\2t=A(i)A(i)=A(10-i+1)A(10-i+1)=tNextI例5.15.2.4一维数组的应用一、分类统计例5.2在例5.1中如果还要统计0~9,10~19,20~20,….80~89,90~99分数段及100分的学生人。则可另用数组bn来存各分数段的人数,并用bn(0)存0~9分的人数,bn(1)存10~19分的人数,…bn(9)存90~99分的人数,bn(10)存100分的人数。二、排序问题1.选择法排序算法思想:1)对有n个数的序列(存放在数组a(n)中),从中选出最小(升序)或最大(降序)的数,与第1个数交换位置;2)除第1个数外,其余n-1个数中选最小或最大的数,与第2个数交换位置;3)依次类推,选择了n-1次后,这个数列已按升序排列。原始数据869327第1趟交换后269387第2趟交换后239687第3趟交换后236987第4趟交换后236789第5趟无交换236789图1-3-27交换过程1.选择法排序算法思想:1)对有n个数的序列(存放在数组a(n)中),从中选出最小(升序)或最大(降序)的数,与第1个数交换位置;2)除第1个数外,其余n-1个数中选最小或最大的数,与第2个数交换位置;3)依次类推,选择了n-1次后,这个数列已按升序排列。Fori=1Ton-1p=iForj=i+1TonIfa(p)a(j)Thenp=jNextjtemp=a(i)a(i)=a(p)a(p)=tempNexti选择法排序(升序)的VB程序:2.冒泡法排序(递增)算法思想:(将相邻两个数比较,小的调到前头)1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。Fori=1Ton-1Forj=1Ton-iIfa(j)a(j+1)Thentemp=a(j)a(j)=a(j+1)a(j+1)=tempEndifNextjNexti冒泡法排序(升序)的VB程序:例5.3用随机函数产生50个[10,100)的随机整数,并按照由小到大的顺序打印出来。程序界面如下:5.3二维数组及多维数组5.3.1二维数组的声明声明格式如下:Dim数组名([下界]to上界,[下界to]上界)[As数据类型]其中的参数与一维数组完全相同。例如:Dima(2,3)AsSingle二维数组在内存的存放顺序是“先行后列”。例如数组a的各元素在内存中的存放顺序是:a(0,0)→a(0,1)→a(0,2)→a(0,3)→a(1,0)→a(1,1)→a(1,2)→a(1,3)→a(2,0)→(2,1)→a(2,2)→a(2,3)5.3.2二维数组的引用引用形式:数组名(下标1,下标2)例如:a(1,2)=10a(i+2,j)=a(2,3)*2在程序中常常通过二重循环来操作使用二维数组元素。5.3.3二维数组的基本操作1.二维数组数据的输入2.求最大元素及其所在的行和列3.计算两矩阵相乘4.矩阵的转置例5.4设某一个班共有60个学生,期末考试5门课程,请编一程序评定学生的奖学金,要求打印输出一、二等奖学金学生的学号和各门课成绩。(奖学金评定标准是:总成绩超过全班总平成绩20%发给一个奖学金,超过全班总平成绩10%发给二个奖学金。)5.3.5多维数组的声明和引用定义多维数组的格式如下:Dim数组名([下界]to上界,[下界to]上界,……)[As数据类型]例如:Dima(5,5,5)AsInteger声明a是三维数组Dimb(2,6,10,5)AsInteger'声明b是四维数组5.4动态数组动态数组:在声明时未给出数组的大小。定长数组是在程序编译时分配存储空间,而动态数组是在程序执行时分配存储空间。5.4.1动态数组的建立及使用建立动态数组包括声明和大小说明两步:1.在使用Dim、Private或Public语句声明括号内为空的数组。格式:Dim|Private|Public数组名()As数据类型例:Dima()AsInteger2.在过程中用ReDim语句指明该数组的大小。格式:ReDim[Preserve]数组名(下标1[,下标2…])Preserve参数:保留数组中原来的数据例:RedimA(10)RedimPreserveA(20)说明:(1)ReDim语句是一个可执行语句,只能出现在过程中,并且可以多次使用,改变数组的维数和大小。(2)定长数组声时中的下标只能是常量,而动态数组ReDim语句中的下标是常量,也可以是有了确定值的变量。例:PrivateSubForm_Click()DimNAsIntegerN=Val(InputBox(“输入N=?”))Dima(N)AsInteger…….Endsub×(3)在过程中可以多次使用ReDim来改变数组的大小,也可改变数组的维数。例:ReDimx(10)ReDimx(20)x(20)=30Printx(20)ReDimx(20,5)x(20,5)=10Printx(20,5)(4)每次使用ReDim语句都会使原来数组中值丢失,可以在ReDim后加Preserve参数来保留数组中的数据。但此时只能改变最后一维的大小。例5.55.4.2与数组操作有关的几个函数1.Aarry函数Aarry函数可方便地对数组整体赋值,但它只能给声明Variant的变量或仅由括号括起的动态数组赋值。赋值后的数组大小由赋值的个数决定。例如,要将1,2,3,4,5,6,7这些值赋值给数组a,可使用下面的方法赋值。Dima()A=array(1,2,3,4,5,6,7)DimaA=array(1,2,3,4,5,6,7)2求数组的上界Ubound()函数、下界Lbound()函数Ubound()函数和Lbound()函数分别用来确定数组某一维的上界和下界值。使用形式如下:UBound(数组名[,N])LBound(数组名[,N])其中:数组名:必需的。数组变量的名称,遵循标准变量命名约定。N:可选的;一般是整型常量或变量。指定返回哪一维的上界。1表示第一维,2表示第二维,如此等等。如果省略默认是1。3.Split函数使用格式:Split(字符串表达式[,分隔符])说明:使用Split函数可从一个字符串中,以某个指定符号为分隔符,分离若干个子字符串,建立一个下标从零开始的一维数组。补充例:使用文件框,通过编程实现大量数据的输入输入一系列的数据,存放在数组中。对输入的数据允许修改和自动识别非数字数据。分析:利用文本框实现大量数字串的输入和编辑的功能;通过编程将输入的数字串以逗号为分界符分离出各项数据;对非数字输入的判断能力。5.5控件数组5.5.1控件数组的概念一组相同类型的控件组成。它们共用一个控件名,具有相同的属性,建立时系统给每个元素赋一个唯一的索引号(Index)。控件数组共享同样的事件过程,通过返回的下标值区分控件数组中的各个元素。例:PrivateSubcmdName_Click(IndexAsInteger)…IfIndex=3then‘处理第四个命令按钮的操作EndIf…EndSub5.5.2控件数组的建立一、在设计时建立控件数组的步骤:1.窗体上画出控件,进行属性设置,这是建立的第一个元素;2.选中该控件,进行“Copy”操作若干次和“Paste”操作若干次建立了所需个数的控件数组元素。3.进行事件过程的编程。二、运行时添加控件数组的步骤如下:1.在窗体上画出某控件,设置该控件的Index值为0,表示该控件为数组,这是建立的第一个元素,并可对一些取值相同的属性进行设置,如所有文本框的字体都取一样大小。2.在编程时通过Load方法添加其余的若干个元素,也可以通过Unload方法删除某个添加的元素。Load方法和Unload方法的使用格式:Load控件数组名(表达式)Unload控件数组名(表达式)其中,表达式为整型数据。表示控件数组的某个元素。3.通过Left和Top属性确定每个新添加的控件数组元素在窗体的位置,并将Visible属性设置为True。通过例5.6来说明数组控件的使用:例5.6为例5.4的学生成绩处理设计如下图成绩输入界面