1第7章数组与记录本章要点:•数组的概念•数组的定义•数组的基本操作•数组的应用•控件数组•记录与记录数组2例如计算这100个学生成绩的平均分,如果不用数组而用简单变量,就必须用语句:s=(s1+s2+s3+s4+s5+…+s98+s99+s100)/Aver=s/100如果用数组,可以用如下循环语句:S=0Fork=0To99S=S+E(k)‘NextkAver=S/100‘求平均分这里就使用了数组E,利用数组E内所包含的数组元素(有100个下标变量),可以存放100个学生的成绩,求和后就可以算出平均分。7.1数组的概念与定义引例:37.1.1数组的概念定义:将一组排列有序、个数有限的变量作为一个整体,用一个统一的名字来表示,这些同类型的有序变量的集合称为一个数组,这个统一的名字就是数组名。student(0),student(1),student(2),student(3),student(4)数组名下标数组元素(1)数组要先声明后使用;(2)每个数组元素的使用与变量的使用相同;(3)下标可以是整型常量、已赋值的变量或表达式,需用括号括起来表示数组元素的逻辑顺序;(4)下标的最大值和最小值分别称为数组的上界和下界,下标应限定在此范围内。7.1数组的概念与定义4数组要先定义(声明)后使用。在计算机中,数组占用一块内存区域,数组名是这个区域的名称,区域的每个单元都有自己的地址,该地址用下标表示(可以计算出)。定义数组的目的就是通知计算机为其留出所需的内存空间。7.1.2数组的定义(声明)7.1数组的概念与定义5格式:Public|Private|Dim|Static数组名([数组的上下界声明])[As数据类型]1)Public:用于建立公用数组。2)Private与Dim:都可用于建立模块级数组或局部数组。3)Static:只能用于建立局部数组,在过程内部使用。4)As数据类型:说明数组元素是什么类型。如缺省AS子句,则该数组的类型为Variant。5)数组的上下界声明:决定了数组的维数和各维下标值的取值范围。如果定义数组时有数组的上下界声明部分,则定义了一个静态数组;而缺省了数组的上下界声明部分,则定义了一个动态数组。DimStudent(3To5)AsIntegerStudent(3)Student(4)Student(5)下界上界7.1.2数组的定义(声明)6DimStudent(3)AsIntegerStudent(1)Student(2)Student(3)Student(0)若是“下界nTO”省略时,系统默认“下界n”为“0”。Dima(2,2)AsLong二维数组行标列标Dimb(1To2,3To4)AsLong7Dimc(1To2,1To3,1To4)AsSingle三维数组定义了一个两层、3行、4列的三维数组c,c含有2X3X4共24个Single类型的数组元素。我们称含两对以上的上下界声明的数组为多维数组。随着维数的增加,数组所占的存储空间会急速扩大,存储空间为各维下标值返回相乘的积。因此,在定义数组时,要根据实际需要确定恰当的数组维数和大小。8静态数组是指大小固定的数组,它所包含的数组元素个数固定不变。在应用程序中,静态数组在定义时就说明了数组的维数及大小,此后不再有改变数组大小的语句。【例7.1】自动产生10个50以内的随机整数,然后输出这些数。(思考如何做?)分析:(1)需要用循环结构,循环10次(2)如何存放这些随机整数7.2静态数组和动态数组7.2.1静态数组9PrivateSubForm_Load()DimiAsInteger'i变量既控制循环体执行次数又作为数组元素的下标值Dima(1To10)AsInteger'定义a为静态数组Show'显示该窗体Fori=1To10'i从1变化到10a(i)=Int(50*Rnd)‘Rnd函数产生一个随机数存放’到数组元素a(i)中Printa(i);'输出数组元素a(i)NextiEndSub107.2.2动态数组有时在程序运行前无法确定一个数组的大小,则在一开始定义该数组时,其上下界声明处可为空,在程序运行中获得了一定的参数后,才能确定此数组的大小,再重新定义该数组,则此数组为动态数组。创建动态数组的过程如下:(1)在窗体、标准模块或过程中先声明数组(无下标值)。在VisualBasic中声明动态数组的一般格式为:Public|Private|Dim数组名()[As数据类型](2)在某过程中用ReDim再次定义已声明过的动态数组。ReDim使用的一般格式为:ReDim[Preserve]数组名([数组的上下界声明])用于保留动态数组原来的内容11说明:1)Redim:用来重新定义动态数组,按定义的上下届重新分配存储单元,可以对一个数组进行多次重定义。2)Preserve:为可选项,用于保留动态数组原来的内容。如果动态数组内已存有数据,用Redim改变数组的大小后,则数组元素中的数据会丢失。但如果在ReDim语句中使用了Preserve选项,则保留数组原来的内容,若是数组变小了,则只丢失被删除部分数组元素中的数据。例如:DimStudent()AsString……RedimStudent(2)RedimPreserveStudent(5)12【例7.2】多次使用ReDim语句OptionBase1'规定数组默认下界值为1DimsName()AsString'sName为变长字符串类型数组然后编写如下事件过程:PrivateSubForm_Click()ReDimsName(2)'第一次重定义含2个元素sName(1)=赵阳:sName(2)=张明PrintsName(1);sName(2)ReDimPreservesName(3)'第二次重定义含3个元素,使用Preserve选项sName(3)=李好PrintsName(1);sName(2);sName(3)ReDimsName(4)'第三次重定义含4个元素,不使用Preserve选项sName(4)=王华PrintsName(1);sName(2);sName(3);sName(4)EndSub137.3数组的输入输出7.3.1数组元素的输入1、用InputBox函数输入OptionBase1PrivateSubForm_Load()DimsName(3)AsStringDimiAsIntegerFori=1To3sName(i)=InputBox(输入姓名:)Nexti……'输出部分EndSub14【例题】定义一个用于存储矩阵的二维数组,并为其赋值,得到如下图所示的效果:分析:1)定义数组(维数、大小)2)为数组赋值(寻找规律、利用循环)赋值:先遍历、再赋值2、用赋值语句输入7.3.1数组元素的输入153.使用Array函数数组变量名=Array([数组元素值列表])说明:1)数组变量名:数组类型必须是Variant类型。Dima()AsVariant2)数组元素值列表:给数组元素赋初值的数据列表,数据之间用“,”分隔。数据的个数决定了数组的大小。如果无此列表,则创建了一个0长度的数组。DimstyleTV()AsVariantstyleTV=Array(长虹,松下,TCL,东芝,索尼,海信,海尔)7.3.1数组元素的输入16OptionBase1PrivateSubForm_Load()ShowDima(5,5)AsIntegerDimi,jAsInteger'先置上三角元素为1Fori=1To5'i控制行标的变化Forj=i+1To5'j控制列标的变化a(i,j)=1'上三角的每个元素其列标值都比行标值大NextjNexti'再置下三角元素为3Fori=2To5'下三角只需从第二行开始设置Forj=1Toi-1'下三角的每个元素其列标值都比行标值小a(i,j)=3NextjNexti'最后置主对角线元素为2Fori=1To5‘主对角线元素的列标值与行标值相同,用一个变量控制即可a(i,i)=2Nexti……'输出部分EndSub171、Label控件的Caption属性显示2、TextBox控件的Text属性显示3、Print方法7.3.2数组元素的输出Fori=1To3'输出数组所有元素PrintsName(i)'每输出一个数组元素换一行NextIFori=1To5'输出二维数组所有元素,外循环I控制行号变化Forj=1To5'内循环j控制列号变化Printa(i,j);NextjPrint‘内循环执行一遍后,已输出了一行5个元素,此时应输出一个换行Nexti一维数组二维数组18例如:Dima(3,3)AsInteger,b(6)AsInteger…b(1)=3:b(2)=8:b(3)=b(1)a(1,2)=b(1):a(2,3)=b(2)7.3.3数组元素的复制引用单个数组元素与引用简单变量一样,可以对其赋值,也可以把它的值赋给其他的变量或数组元素。即数组元素之间可以互相复制,无论它们是否属于同一个数组或维数是否相同,但数组类型要相容,复制整个数组要用For循环语句。19格式:Erase数组名功能:对静态数组使用Erase语句将对其中的所有元素进行初始化(清除数组中的元素值)。例如,将数值型数组元素值置为0;将可变长度字符串类型数组元素值置为零长度字符串。注意,Erase语句不能释放静态数组所占的存储空间。对动态数组使用Erase语句将释放动态数组所占的存储空间,在下次引用该动态数组之前,必须使用ReDim语句重新定义该数组。7.4数组的删除201.格式ForEach变量In数组名[语句组1][ExitFor][语句组2]Next变量7.5使用ForEach...Next循环处理数组只能是一个可变类型的变量2.功能:首先将数组中的第一个元素赋给变量,然后进入循环体中执行其中的语句。如果数组中还有其他元素,则继续将下一个元素赋值给变量后执行循环体,当针对数组中的所有元素都执行完了,便会退出循环,然后执行Next之后的语句。21用户定义类型的数组就是数组中的每个元素都是用户定义类型。例如,在学生成绩表中,每一个学生的信息可以包含学号、姓名、数学成绩和英语成绩,如下表所示。7.6用户定义类型的数组学号姓名数学英语01张三899002李四7893……………………22假设用一个一维数组来表示学生成绩表,每个元素保存一个学生的信息,即表格中的一行或一条记录。则每个数组元素应包含学号、姓名、数学和英语四个值,为此,可以先定义一个数据类型StudScore如下:TypeStudScoreStudNumberAsString*2StudNameAsString*10MathAsIntegerEnglishAsIntegerEndType接着,定义一个具有StudScore类型的数组:DimScore(1To40)AsStudScore23引用第i个学生的姓名:Score(i).StudName例如,给Score数组的第一个元素赋值:Score(1).StudNumber=01Score(1).StudName=张三Score(1).Math=89Score(1).English=90也可以使用With语句来简化书写:WithScore(1).StudNumber=01.StudName=张三.Math=89.English=90EndWith24With语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。格式:With语句:With对象名语句组EndWith例:PrivateSubCommand1_Click()WithForm1.BackColor=vbRed.FontSize=30.ForeColor=vbGreenEndWithPrint改变一个对象的多个属性EndSub257.7数组的应用【例7.3】输入10个数,用比较交换法按由大到小排序A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)A(9)A(10)32-469