5.1.数组的概念
1.引例
求100个学生的平均成绩及超过平均成绩的人数。
如果用一般变量来表示成绩,需要用100个变量,如:mark1、mary2、……mark100。若用数组,可以只用一个来表示mark(1To 100)。
2.基本概念
数组:是同类型变量的一个有序的集合。
如:A(1To100),表示一个包含100个数组元素的名为A的数组。
数组元素:即数组中的变量。用下标表示数组中的各个元素。
表示方法:数组名(P1,P2,……)
其中P1、P2表示元素在数组中的排列位置,称为“下标”。
如:A(3,2)代表二维数组A中第3行第2列上的那个元素。
数组维数:.由数组元素中下标的个数决定,一个下标表示一维数组,二个下标表示二维数组。
VB中有一维数组、二维数组、……最多60维数组。
下标:下标表示顺序号,每个数组有一个唯一的顺序号,下标不能超过数组声明时的上、下界范围。下标可以是整型的常数、变量、表达式,甚至又是一个数组元素。
下标的取值范围是:下界To上界,缺省下界时,系统默认取0。
3.数组声明
数组必须先声明后使用。声明数组就是让系统在内存中分配一个连续的区域,用来存储数组元素。
声明内容:数组名、类型、维数、数组大小。
一般情况下,数组中各元素类型必须相同,但若数组为Variant时,可包含不同类型的数据。
静态数组:声明时确定了大小的数组。
动态数组:声明时没有给定数组大小(省略了括号中的下标),使用时需要用ReDim语句重新指出其大小。
使用动态数组的优点是根据用户需要,有效地利用存储空间,它是在程序执行到ReDim语句时才分配存储单元,而静态数组是在程序编译时分配存储单元。
5.3动态数组及声明
1.动态数组的建立与声明
建立动态数组的方法是:利用Dim、Private、Public语句声明括号内为空的数组,然后在过程中用ReDim语句指明该数组的大小。语法是:
ReDim.数组名(下标1[,下标2…])[As.类型]
其中下标可以是常量,也可以是有了确定值的变量,类型可以省略,若不省略,必须与Dim中的声明语句保持一致。
例:DimD()AsSingle
SubForm_Load()
……
ReDimD(4,6)
……
EndSub
2.注意事项
(1)在动态数组ReDim语句中的下标可以是常量,也可以是有了确定值的变量。
(2)在过程中可以多次使用ReDim来改变数组的大小,也可改变数组的维数。
(3)每次使用ReDim语句都会使原来数组中的值丢失,可以在ReDim语句后加Preserve参数来保留数组中的数据,但使用Preserve只能改变最后一维的大小,前面几维大小不能改变。
1.给数组元素赋初值
(1)利用循环结构
例:Dim.iA(1To10)AsInteger
Fori=1To10
A(i)=0
Nexti
(2)利用Array函数
例:Dim.aAsVariant,bAsVariant,i%
a=Array(1,2,3,4,5)
b=Array("abc","def","67")
Fori=0ToUbound(a)
Picture1.printa(i);"";
Nexti
Fori=0ToUbound(b)
Picture1.printb(i);"";
Nexti
2.数组的输入
(1)通过InputBox函数输入适合输入少量数据。
例:Dim.sB(3,4)Assinger
Fori=0To3
Forj=0To4
SB(i,j)=InputBox("输入"&i&j&"的值")
Nextj
Nexti
(2)通过文本框控件输入
对大批量的数据输入,采用文本框和函数split()join()进行处理,效率更高。
3.数组的赋值
在VB6.0中可以直接将一个数组的值赋值给另一个数组:
Dima(3)asinteger,b()asinteger
A(0)=2:A(1)=5:A(2)=-2:A(3)=2
b=a
在早期的VB中,这需要用循环语句才可以实现:
ReDimb(UBound(a))
ForI=0toUBound(a)
b(I)=a(I)
Nexti
注意:(1)赋值号两边的数据类型必须一致;
(2)如果赋值号左边的是一个动态数组,则赋值时系统自动将动态数组ReDim成右边相同大小的数组;
(3)如果赋值号左边的是一个大小固定的数组,则数组赋值出错。
4.数组的输出
用For……Next循环语句输出。
5.求数组中最大元素和所在下标及各元素之和
求数组中最大元素及下标,一般假设第一个元素及下标为最大,然后将该数与数组中的其他元素逐一比较,若有比其大的就替换,同时替换下标。
6.交换数组中各元素
交换的要求是将数组第一个元素与最后一个交换,第二个与倒数第二个交换,依次类推。
5.5控件数组
1.控件数组的概念
控件数组是由一组相同类型的控件组成的,它们共用一个控件名,具有相同的数组。控件数组适用于若干个控件执行的操作相似的场合,控件组共享同样的事件过程。控件数组通过索引号(属性中的Index)来标识各控件,第一个下标是0。如:Text1(0)、Text1(1)、Text1(2)、Text1(3)……
2.控件数组的建立
(1)在设计时建立
步骤:1)在窗体上画出某控件,并进行属性设置。
2)选中该控件进行“复制”和“粘贴”操作,系统提示“是否建立控件数组”,选择是即可。多次粘贴就可以创建多个控件元素。
3)进行事件过程的编程。
(2)运行时添加控件数组
方法:1)在窗体上画出某控件,设置该控件的Index值为0,表示该控件为数组。
2)在编程时通过Load方法添加其余若干个元素,也可以通过Unload删除某个添加的元素。
3)每个添加的控件数组通过Left和Top属性,确定其在窗体上的位置,并将Visible设置为True。
使用示例:建立一个类似国际象棋的棋盘,要求黑白交替,运行时单击某个棋格,会改变颜色并显示其序号。
5.6自定义数据类型
1.自定义数据类型的定义
是指由若干标准数据类型组成的一种复合类型,也称为记录类型。
(1)定义方式:
Type自定义类型名
元素名[(下标)].As类型名
……
元素名[(下标)].As类型名
EndType
元素名:表示自定义类型中的一个成员
下标(可选):表示是数组
类型名:为标准类型
例:定义一个学生信息的自定义类型:
Typestudtype.
NoAs.Integer...’定义学号
Name.As.String10.’定义姓名
Sex.As.String2..’定义性别
Mark(1TO4)AsSingle’定义4门课程的成绩
TotalAsSingle....’定义总分
EndType
(2)注意事项
1)自定义类型一般在标准模块(.bas)中定义,默认是Public
2)自定义类型中的元素可以是字符串,但应是定长字符串
3).不可把自定义类型名与该类型的变量名混淆
4)注意自定义类型变量与数组的差别:它们都由若干元素组成,前者的元素代表不同性质、不同类型的数据,以元素名表示不同的元素;后者存放的是同种性质、同种类型的数据,以下标表示不同元素。
2.自定义型变量的声明和使用
使用形式:Dim变量名.As.自定义类型名
例如:Dim.studentAsstudtype,.mystud.Asstudtype
自定义类型中元素的表示方法是:变量名.元素名.如:student.name.student.mark(4)
为了简单起见,可以用With……EndWith语句进行简化。例:
With.student
.no=99001
.name=""
.sex=""
.total=0
forI=1to4
.mark(I)=int(rnd101).’随机产生0-100之间的分数.
.total=.total+.may(I)
nextI
EndWith
Mystud=student..’同种自定义类型变量可以直接赋值
3.自定义类型数组的使用
自定义类型数组就是数组中的每个元素都是自定义类型。
例如:自定义一个由学生姓名、成绩组成的学生记录类型,用来存放100个学生的记录。