《数组与自定义数类型》由会员分享,可在线阅读,更多相关《数组与自定义数类型(42页珍藏版)》请在金锄头文库上搜索。
1、第第5章章 数组与自定义数据类型数组与自定义数据类型 前前面面章章节节中中所所用用的的数数值值型型、字字符符型型、布布尔尔类类型型等等数数据据类类型型称称为为VBVB的的标标准准数数据据类类型型,通通过过一一个个变变量量存存取取一一个个数数据据,该该类类变变量量称称为为简简单单变变量量。例例如如求求3 3名名同同学学的的平平均均身身高高时时,就就可可定定义义同同类类型型的的变变量量a1a1、a2a2和和a3a3表表示示3 3名名同同学学的的身身高高,但但如如果果要要求求100100名名同同学学的的平平均均身身高高,采采用用100100个个简简单单变变量量表表示示100100名名同同学学的的身身
2、高高,在在数数据据存存储储与与处处理理时时就就比比较较繁繁琐琐。又又如如, , 在在描描述述一一个个人人的的基基本本情情况况时时,可可能能会会涉涉及及到到“姓姓名名、性性别别、出出生生日日期期、电电话话号号码码、身身高高、婚婚姻姻状状况况”等等数数据据,这这些些数数据据类类型型不不同同,但但却却相相互互关关联联,如如果果使使用用不不同同类类型型的的简简单单变变量量,在在数数据据存存储储和和处处理理时时也也会会带带来来诸诸多多的的不不便便。通通常常,简简单单变变量量用用于于解解决决一一些些数数据据量量小小且且处处理理简简单单的的问问题题,对对于于那那些些描描述述具具有有某某种种关关联联的的批批量
3、量数数据据时时,应应采采用用VBVB提提供的数组和用户自定义数据类型两种数据结构。供的数组和用户自定义数据类型两种数据结构。 5.1 5.1 数组数组 1 1 数组的基本概念数组的基本概念 数组是数组是VBVB提供的一种数据结构。用统一的名称来代表具有提供的一种数据结构。用统一的名称来代表具有相同性质的一组数,该名称为数组名。数组中的每一个元素称相同性质的一组数,该名称为数组名。数组中的每一个元素称为数组元素。为了区分数组中的每一个元素,需要用一个索引为数组元素。为了区分数组中的每一个元素,需要用一个索引号区别,该索引号称为下标。数组中的每一个元素可以用数组号区别,该索引号称为下标。数组中的每
4、一个元素可以用数组名和下标惟一表示。每个数组元素和一个普通变量一样能存放名和下标惟一表示。每个数组元素和一个普通变量一样能存放一个数据。一个数据。5.1 5.1 数组数组 1 1 数组的基本概念数组的基本概念数组的特点:数组的特点:(1) (1) 数组由若干个数组元素组成。数组元素的表示方法为:数数组由若干个数组元素组成。数组元素的表示方法为:数 组名后跟圆括号和下标组名后跟圆括号和下标, , 如如a(3)a(3)就表示数组就表示数组a a的元素。的元素。(2) (2) 数组元素在内存中有次序存放,下标代表它在数组中的位数组元素在内存中有次序存放,下标代表它在数组中的位 置。如数组元素置。如数
5、组元素a(3)a(3)表示数组表示数组a a中的第中的第3 3个元素(若下标从个元素(若下标从 0 0开始则为第开始则为第4 4个元素,下同),而数组元素个元素,下同),而数组元素b(3,4)b(3,4)则表示则表示 数组数组b b的第的第3 3行第行第4 4列的那个元素。列的那个元素。(3) (3) 数组元素数据类型相同,在内存中存储是有规律的,占连数组元素数据类型相同,在内存中存储是有规律的,占连 续的一段存储单元。例如一个整型数组续的一段存储单元。例如一个整型数组a a,有,有3 3个元素个元素 a(1)a(1)、a(2)a(2)和和a(3)a(3),那么,那么a(1)a(1)、a(2)
6、a(2)和和a(3)a(3)的数据类型均的数据类型均 为整型,若已知为整型,若已知a(1)a(1)在内存中的存储单元地址编号为在内存中的存储单元地址编号为 3001H3001H, a(2)a(2)在内存中的存储单元地址必然为在内存中的存储单元地址必然为3003H3003H(因(因 为一个整型数据占两个字节),为一个整型数据占两个字节),a(3)a(3)在内存中的存储单元在内存中的存储单元 地址为地址为3005H3005H。5.1 5.1 数组数组 1 1 数组的基本概念数组的基本概念在表示数组元素时,应注意以下几点:在表示数组元素时,应注意以下几点:(1) (1) 用圆括号把下标括起来,不能使
7、用中括号或大括号代替,用圆括号把下标括起来,不能使用中括号或大括号代替, 圆括号也不能省略。圆括号也不能省略。(2) (2) 下标可以是常量、变量或表达式,其值为整数,如常量、下标可以是常量、变量或表达式,其值为整数,如常量、 变量或表达式的值为小数时,将自动变量或表达式的值为小数时,将自动“四舍五入四舍五入”。(3) (3) 下标的最小取值称为下界,下标的最大取值称为上界。在下标的最小取值称为下界,下标的最大取值称为上界。在 不加任何说明的情况下,数组元素下标的下界默认为不加任何说明的情况下,数组元素下标的下界默认为0 0。 5.1 5.1 数组数组 2 2 数组的声明数组的声明 在在VBV
8、B中,使用数组前要先进行声明,以使中,使用数组前要先进行声明,以使VBVB在遇到某个标在遇到某个标识符时,能将其当作数组来处理。识符时,能将其当作数组来处理。“先声明后使用,下标不能先声明后使用,下标不能越界越界”是数组使用的基本原则。在用是数组使用的基本原则。在用DimDim语句声明时就确定了大语句声明时就确定了大小的数组,称为静态数组,静态数组在程序编译时分配存储空小的数组,称为静态数组,静态数组在程序编译时分配存储空间,一旦分配,数组的大小就不能再改变了。间,一旦分配,数组的大小就不能再改变了。 5.1 5.1 数组数组 2 2 数组的声明数组的声明1 1)一维静态数组)一维静态数组格式
9、:格式:Dim Dim 数组名(下界数组名(下界 To To 上界)上界)As As 作用:声明数组具有作用:声明数组具有“上界下限上界下限”个数组元素,这些元个数组元素,这些元素素 按照下标由小到大的顺序连续存储在内存中。其中:按照下标由小到大的顺序连续存储在内存中。其中: 数组名数组名 命名要符合变量命名规则。命名要符合变量命名规则。 下界下界 To To 上界上界 称为维说明,确定数组元素下标的取值范围称为维说明,确定数组元素下标的取值范围(下标下界最小为(下标下界最小为-32768-32768,上界最大值为,上界最大值为3276732767)。下界默认值)。下界默认值为为0 0。下界和
10、上界只能取直接常量或直接常量表达式、符号常量。下界和上界只能取直接常量或直接常量表达式、符号常量或符号常量表达式,不能为变量或包含变量的表达式。或符号常量表达式,不能为变量或包含变量的表达式。 As As 指明数组元素的类型,默认为变体数据指明数组元素的类型,默认为变体数据类型。类型。 5.1 5.1 数组数组 2 2 数组的声明数组的声明2 2)二维静态数组)二维静态数组格式:格式:Dim Dim 数组名数组名( (下界下界1 To 1 To 上界上界1,1,下界下界2 To 2 To 上界上界2 2As As 作用:作用:声明声明( (上界上界1 1下限下限1 1)*()*(上界上界2 2
11、下限下限2 2) )个连续的单元。个连续的单元。例如:例如:Dim Larray(0 to 3Dim Larray(0 to 3,0 to 4) As Long0 to 4) As Long或或 Dim Dim LarrayLarray( 3( 3,4) As Long4) As Long 声明了长整型的二维数组声明了长整型的二维数组LarrayLarray,第,第1 1维下标范围为维下标范围为0 03 3,第第2 2维下标范围为维下标范围为0 04 4,数组元素个数为,数组元素个数为4*54*5个,每个元素占个,每个元素占4 4个个字节的存储空间,元素排列如表所示。字节的存储空间,元素排列如
12、表所示。 5.1 5.1 数组数组 2 2 数组的声明数组的声明静态数组声明的注意事项:静态数组声明的注意事项:(1) (1) 用用“Option Base 1”Option Base 1”可设定数组元素下标下界值为可设定数组元素下标下界值为1 1,以改变下界默认值为以改变下界默认值为0 0。该语句必须放在窗体或模块的通用声明。该语句必须放在窗体或模块的通用声明段中,否则会出现段中,否则会出现“无效内部过程无效内部过程”的错误。的错误。 例如:例如:Option Base 1Option Base 1 Dim x(4) Dim x(4) 声明数组声明数组x x下标下界为下标下界为1 1,因此,
13、因此x x具有具有x(1)x(1)、x(2)x(2)、x(3)x(3)、x(4) 4x(4) 4个数组元素,数组元素为变体类型数据。个数组元素,数组元素为变体类型数据。5.1 5.1 数组数组 2 2 数组的声明数组的声明静态数组声明的注意事项:静态数组声明的注意事项:(2) (2) 静态数组在同一个过程只能声明一次,否则会出现静态数组在同一个过程只能声明一次,否则会出现“当前当前范围内声明重复范围内声明重复”的提示信息。的提示信息。例如:例如:Private Sub Private Sub Form_ClickForm_Click()() Dim x(5) As Integer Dim x(
14、5) As Integer Dim x(5) As Single Dim x(5) As Single End Sub End Sub在该过程中两次声明了静态数组在该过程中两次声明了静态数组x x。5.1 5.1 数组数组 2 2 数组的声明数组的声明静态数组声明的注意事项:静态数组声明的注意事项:(3) (3) 声明数组和声明变量一样,数组也有作用范围。如建立公声明数组和声明变量一样,数组也有作用范围。如建立公用数组,在标准模块的通用声明段用用数组,在标准模块的通用声明段用PublicPublic语句声明;建立模语句声明;建立模块级数组,在窗体的声明段用块级数组,在窗体的声明段用Privat
15、ePrivate或或DimDim语句声明;建立过语句声明;建立过程级数组,在过程中用程级数组,在过程中用DimDim或或StaticStatic声明。详细内容请看第声明。详细内容请看第8 8章章变量的作用域。变量的作用域。(4) (4) 声明数组后,各数组元素的初值与声明普通变量相同。声明数组后,各数组元素的初值与声明普通变量相同。 5.1 5.1 数组数组 2 2 数组的声明数组的声明3 3)动态数组声明)动态数组声明 动态数组是指在程序执行过程中,数组元素的个数可以改动态数组是指在程序执行过程中,数组元素的个数可以改变的数组。和静态数组类似,也分为一维动态数组、二维动态变的数组。和静态数组
16、类似,也分为一维动态数组、二维动态数组和三维动态数组。数组和三维动态数组。 动态数组在用动态数组在用DimDim语句声明数组时不给出数组的大小,程序语句声明数组时不给出数组的大小,程序执行到执行到ReDimReDim语句时才确定大小。创建动态数组通常分两步:语句时才确定大小。创建动态数组通常分两步:5.1 5.1 数组数组 2 2 数组的声明数组的声明3 3)动态数组声明)动态数组声明 第第1 1步,在标准模块、窗体的通用程序段或过程,声明一个步,在标准模块、窗体的通用程序段或过程,声明一个省略维说明的数组,格式为:省略维说明的数组,格式为:Dim Dim 数组名()数组名()As As 第第
17、2 2步,根据应用需要,用步,根据应用需要,用ReDimReDim重新确定数组元素的个数,格重新确定数组元素的个数,格式为:式为:ReDimReDim Preserve Preserve 数组名(维说明)数组名(维说明)As As 5.1 5.1 数组数组 2 2 数组的声明数组的声明3 3)动态数组声明)动态数组声明 说明:说明:(1) (1) 维说明维说明 通常包含变量或表达式,但其中的变量或表达式通常包含变量或表达式,但其中的变量或表达式 应有明确的值。应有明确的值。(2) (2) 关键字关键字Preserve Preserve 如果省略,重定义前数组元素的值全部如果省略,重定义前数组元
18、素的值全部 丢失,丢失,VBVB系统重新对数组元素进行初始化;如果使用了系统重新对数组元素进行初始化;如果使用了 PreservePreserve,重定义前数组元素的值不丢失,重定义前数组元素的值不丢失,VBVB系统保留原系统保留原 数组元素的值。数组元素的值。在使用在使用RedimRedim语句时请注意:语句时请注意: RedimRedim语句只能改变数组的大小,不允许改变数组的数据类语句只能改变数组的大小,不允许改变数组的数据类型。型。 5.1 5.1 数组数组 例例5-2 5-2 输入某门课输入某门课n n个同学的成绩,输出高于平均分的成绩。个同学的成绩,输出高于平均分的成绩。 Dim
19、aver!, i%, x!() Dim aver!, i%, x!() 这里先声明一个空数组这里先声明一个空数组 n = n = Val(InputBoxVal(InputBox(请输入统计人数请输入统计人数, , 输入框输入框, 1) , 1) ReDimReDim x(1 to n) x(1 to n) 根据实际人数声明数组大小根据实际人数声明数组大小 aver = 0aver = 0 For i = 1 To n For i = 1 To n x(ix(i) = ) = InputBoxInputBox(请输入第请输入第 & i & & i & 个学生成绩个学生成绩, , 录入窗口录入窗
20、口, 0), 0) Print Print 第第 & i & & i & 个学生成绩为:个学生成绩为: & & x(ix(i) ) aver = aver = averaver + + x(ix(i) ) Next i Next i aver = aver = averaver / n / n Print Print 平均分为:平均分为: & aver & aver Print = Print =以下成绩高于平均分以下成绩高于平均分= For i = 1 To n For i = 1 To n If If x(ix(i) aver Then) aver Then Print Print 第第
21、& i & & i & 个学生成绩为:个学生成绩为: & & x(ix(i) ) End If End If Next i Next i 5.1 5.1 数组数组 3 3 数组的赋值数组的赋值1 1)静态数组元素赋值)静态数组元素赋值 对于静态数组,不能将数组名作为被赋值对象,而只能将对于静态数组,不能将数组名作为被赋值对象,而只能将数组元素作为赋值对象,利用数组元素是有序存储和静态数组数组元素作为赋值对象,利用数组元素是有序存储和静态数组元素个数在声明时已经确定的特点,采用循环结构,逐一为数元素个数在声明时已经确定的特点,采用循环结构,逐一为数组元素赋值。通常,采用循环次数固定的组元素赋值。
22、通常,采用循环次数固定的ForNextForNext结构。一维结构。一维数组可通过单循环实现,二维数组可通过双层循环实现。数组可通过单循环实现,二维数组可通过双层循环实现。 Dim a(1 to 10) as SingleDim a(1 to 10) as Single For i=1 to 10 For i=1 to 10 a(ia(i)=0 )=0 Next i Next i 5.1 5.1 数组数组 3 3 数组的赋值数组的赋值1 1)静态数组元素赋值)静态数组元素赋值 对于静态数组,不能将数组名作为被赋值对象,而只能将对于静态数组,不能将数组名作为被赋值对象,而只能将数组元素作为赋值对
23、象,利用数组元素是有序存储和静态数组数组元素作为赋值对象,利用数组元素是有序存储和静态数组元素个数在声明时已经确定的特点,采用循环结构,逐一为数元素个数在声明时已经确定的特点,采用循环结构,逐一为数组元素赋值。通常,采用循环次数固定的组元素赋值。通常,采用循环次数固定的ForNextForNext结构。一维结构。一维数组可通过单循环实现,二维数组可通过双层循环实现。数组可通过单循环实现,二维数组可通过双层循环实现。 Dim a(1 to 10) as SingleDim a(1 to 10) as Single For i=1 to 10 For i=1 to 10 a(ia(i)=0 )=0
24、 Next i Next i 5.1 5.1 数组数组 3 3 数组的赋值数组的赋值2 2)动态数组赋值)动态数组赋值 动态数组赋值时,既可以将数组元素做为被赋值的对象,动态数组赋值时,既可以将数组元素做为被赋值的对象,也可以将数组名作为被赋值的对象。这是因为:也可以将数组名作为被赋值的对象。这是因为: 尽管动态数组在执行声明(尽管动态数组在执行声明(DimDim语句)时,数组大小没有确语句)时,数组大小没有确定,但是当执行定,但是当执行ReDimReDim语句后,动态数组元素个数和下标的上下语句后,动态数组元素个数和下标的上下限也就确定了,即数组元素下标的下界可由限也就确定了,即数组元素下标
25、的下界可由LBoundLBound( (数组名数组名) )函函数得到(默认为数得到(默认为0 0),下标上界可由),下标上界可由UBoundUBound(数组名)函数得到,(数组名)函数得到,元素的个数可由表达式元素的个数可由表达式UBoundUBound(数组名)(数组名)LBoundLBound( (数组名数组名) )1 1得到,因此,所有对静态数组元素的赋值方法同样适合于动态得到,因此,所有对静态数组元素的赋值方法同样适合于动态数组元素。数组元素。 5.1 5.1 数组数组 3 3 数组的赋值数组的赋值2 2)动态数组赋值)动态数组赋值 使用使用Array()Array()函数为动态数组
26、赋值函数为动态数组赋值对于变体类型的一维动态数组,还可采用对于变体类型的一维动态数组,还可采用Array()Array()函数为数组各函数为数组各元素赋值。格式为:元素赋值。格式为: 数组名数组名=Array=Array( )其中:其中: 可以是已经声明过的变体类型的动态数组,也可以是已经声明过的变体类型的动态数组,也可以是未声明过的数组。数组元素的个数由可以是未声明过的数组。数组元素的个数由 中中数据个数决定,数组元素下标的下界可由数据个数决定,数组元素下标的下界可由LBoundLBound( (数组名数组名) )函数函数得到(默认为得到(默认为0 0),下标上界可由),下标上界可由UBou
27、ndUBound(数组名)函数得到。(数组名)函数得到。例如,以下程序段可以自动定义两个动态数组例如,以下程序段可以自动定义两个动态数组a a和和b b,并为各数,并为各数组元素赋值。组元素赋值。 5.1 5.1 数组数组 使用使用Array()Array()函数为动态数组赋值举例函数为动态数组赋值举例 a = Array(1,3,4,5,-6) a = Array(1,3,4,5,-6) b = Array(abc,def,67,5,-6) b = Array(abc,def,67,5,-6) For i = 0 To For i = 0 To UBound(aUBound(a) ) Pri
28、nt Print a(ia(i); ;); ; Next i Next i Print Print For i = 0 To For i = 0 To UBound(bUBound(b) ) Print Print b(ib(i); ;); ; Next i Next i注意:注意:ArrayArray函数只能对一维动态数组赋值。若提前声明了数函数只能对一维动态数组赋值。若提前声明了数 组,类型必须为变体类型。组,类型必须为变体类型。 5.1 5.1 数组数组 3 3 数组的赋值数组的赋值2 2)动态数组赋值)动态数组赋值 使用使用Split()Split()函数为动态数组赋值函数为动态数组赋
29、值 Split() Split()函数为数组元素赋值的基本方法是:将要赋值的数函数为数组元素赋值的基本方法是:将要赋值的数据组成字符串,且数据之间用固定的分隔符(如据组成字符串,且数据之间用固定的分隔符(如“,”)分隔;)分隔;再通过再通过Split()Split()函数将其分离成逐个的数据后,赋给数组各元素,函数将其分离成逐个的数据后,赋给数组各元素,SplitSplit()()函数格式为:函数格式为: =Split=Split( ,分隔符,分隔符 )其中:其中: 是一组为数组赋值的数据,数据之间用是一组为数组赋值的数据,数据之间用固定的分隔符分隔固定的分隔符分隔, ,默认为默认为“ ”“
30、”(一个空格字符)。(一个空格字符)。5.1 5.1 数组数组 3 3 数组的赋值数组的赋值2 2)动态数组赋值)动态数组赋值 使用使用Split()Split()函数为动态数组赋值函数为动态数组赋值注意:注意: Split()Split()函数要求所赋值的数组必须是动态数组,可以不提函数要求所赋值的数组必须是动态数组,可以不提前声明,如果提前声明则必须声明为字符型。该方法通常和文前声明,如果提前声明则必须声明为字符型。该方法通常和文本框配合使用解决大量数据处理问题。本框配合使用解决大量数据处理问题。5.1 5.1 数组数组 3 3 数组的赋值数组的赋值2 2)动态数组赋值)动态数组赋值 使用
31、使用Split()Split()函数为动态数组赋值函数为动态数组赋值SplitSplit函数和函数和ArrayArray函数使用时应注意的问题:函数使用时应注意的问题: Split Split函数只能给字符型数组赋值;而函数只能给字符型数组赋值;而ArrayArray函数只能给变函数只能给变 体类型数组赋值。体类型数组赋值。 Split Split和和ArrayArray函数均只能为一维数组赋值,如果要为二维函数均只能为一维数组赋值,如果要为二维 数组赋值,需要先将数据存储在一维数组中,再通过程序数组赋值,需要先将数据存储在一维数组中,再通过程序 的方法将一维数组的值赋值给二维数组。的方法将一
32、维数组的值赋值给二维数组。 用用ArrayArray函数赋值时,数组元素的最小下标受函数赋值时,数组元素的最小下标受Option Base Option Base 语句影响,当语句影响,当“Option Base 0”Option Base 0”或默认情况下,数组元素或默认情况下,数组元素 下标最小值为下标最小值为0 0;当;当“Option Base 1”Option Base 1”时,数组元素下标时,数组元素下标最最 小值为小值为1 1;用;用SplitSplit函数为数组赋值时,数组元素的最小下函数为数组赋值时,数组元素的最小下 标与标与Option Base Option Base 语
33、句无关,不管语句无关,不管Option Base Option Base 语句设置语句设置 为为0 0还是还是1 1,数组元素的最小下标均从,数组元素的最小下标均从0 0开始。开始。 5.1 5.1 数组数组 例例5-3 5-3 使用文本框录入大量的数据,将它们保存在一维数组中,使用文本框录入大量的数据,将它们保存在一维数组中,并打印输出(每行显示并打印输出(每行显示1010个数据)。个数据)。5.1 5.1 数组数组 例例5-3 5-3 使用文本框录入大量的数据,将它们保存在一维数组中,使用文本框录入大量的数据,将它们保存在一维数组中,并打印输出(每行显示并打印输出(每行显示1010个数据)
34、。个数据)。Private Sub Command1_Click()Private Sub Command1_Click() Dim a$() Dim a$() a = Split(Text1.Text, a = Split(Text1.Text, ,) ,) For i = 0 To For i = 0 To UBound(aUBound(a) ) Picture1.Print Tab(6 * (i Mod 10) + 1); Picture1.Print Tab(6 * (i Mod 10) + 1); a(ia(i);); Next i Next iEnd Sub End Sub 5.1
35、 5.1 数组数组 4 4 数组的输出数组的输出 在上面的例子中已经看到,数组输出就是分别输出数组中在上面的例子中已经看到,数组输出就是分别输出数组中的各元素,采用循环或循环嵌套将数组中各元素逐一输出。的各元素,采用循环或循环嵌套将数组中各元素逐一输出。 通常利用通常利用ForFor循环或循环或ForFor循环嵌套,调用循环嵌套,调用PrintPrint方法实现将数方法实现将数组元素值输出到窗体或图片框中。输出时可采用组元素值输出到窗体或图片框中。输出时可采用Tab()Tab()函数控制函数控制输出格式,使输出的数据清晰。以下程序是把随机函数产生的输出格式,使输出的数据清晰。以下程序是把随机函
36、数产生的00,9999之间的随机整数,存入到二维数组中并输出。之间的随机整数,存入到二维数组中并输出。 5.1 5.1 数组数组 4 4 数组的输出数组的输出数组输出时的注意事项:数组输出时的注意事项:(1) (1) 采用循环控制结构输出数组中各元素中的值时,输出方法采用循环控制结构输出数组中各元素中的值时,输出方法在循环结构的位置要合理,避免下标超限现象。在循环结构的位置要合理,避免下标超限现象。5.1 5.1 数组数组 4 4 数组的输出数组的输出数组输出时的注意事项:数组输出时的注意事项:(2)(2)可以根据需要单个输出数组元素的值,但下标不能超限。如:可以根据需要单个输出数组元素的值,
37、但下标不能超限。如:输出上例二维数组输出上例二维数组a a前三个元素,可使用语句:前三个元素,可使用语句:Print a(1, 1) ; a(1, 2) ; a(1, 2)Print a(1, 1) ; a(1, 2) ; a(1, 2)5.1 5.1 数组数组 4 4 数组的输出数组的输出数组输出时的注意事项:数组输出时的注意事项:(3)(3)不能通过数组名来输出数组中各元素的值。不能通过数组名来输出数组中各元素的值。如上述程序改为:如上述程序改为:Private Sub Private Sub Form_ClickForm_Click()() Dim a(5, 5) As Integer
38、Dim a(5, 5) As Integer For i = 0 To 5 For i = 0 To 5 For j = 0 To 5 For j = 0 To 5 a(ia(i, j) = , j) = Int(RndInt(Rnd * 100) * 100) Next j Next j Next i Next i Print Print Tab(jTab(j * 8 + 1); a; * 8 + 1); a;End SubEnd Sub想通过数组名想通过数组名a a输出二维数组中的每一个元素,则是错误码的。输出二维数组中的每一个元素,则是错误码的。5.1 5.1 数组数组 4 4 数组的输
39、出数组的输出数组输出时的注意事项:数组输出时的注意事项:(4 4)要注意用)要注意用Tab()Tab()函数控制输出格式函数控制输出格式为了使数组输出层次清晰,要注意使用为了使数组输出层次清晰,要注意使用Tab()Tab()函数或使用其他方函数或使用其他方法控制输出格式,实现行定位输出和换行输出。法控制输出格式,实现行定位输出和换行输出。5.1 5.1 数组数组 5 5 数组的应用举例数组的应用举例例例5-4 5-4 输入多名学生的一门课程的考试成绩(假设为整数),输入多名学生的一门课程的考试成绩(假设为整数),统计各分数段学生人数。统计各分数段学生人数。5.1 5.1 数组数组 Privat
40、e Sub Command1_Click()Private Sub Command1_Click() Dim a$() Dim a$() Dim x(0 To 10) As Integer Dim x(0 To 10) As Integer 用于保存统计结果用于保存统计结果 a = Split(Text1, ,)a = Split(Text1, ,) For i = 0 To For i = 0 To UBound(aUBound(a) ) If ( If (a(ia(i) = 100 And ) 0) Then) 0) Then k = k = a(ia(i) 10) 10 x(kx(k)
41、= ) = x(kx(k) + 1) + 1 End If End If Next i Next i Print Print 统计结果如下:统计结果如下: Print 100Print 100分的有:分的有: & x(10) & & x(10) & 人人 For i = 9 To 0 Step -1For i = 9 To 0 Step -1 Print i * 10 & Print i * 10 & 分分 - ; i * 10 + 9 & - ; i * 10 + 9 & 分有:分有: & & x(ix(i) & ) & 人人 Next iNext iEnd SubEnd SubPrivat
42、e Sub Command2_Click()Private Sub Command2_Click()EndEndEnd SubEnd Sub 5.1 5.1 数组数组 5 5 数组的应用举例数组的应用举例例例5-5 5-5 输入一串字符,统计各字母出现的次数(不区分大小写)输入一串字符,统计各字母出现的次数(不区分大小写),并输出统计结果,并输出统计结果Private Sub Command1_Click()Private Sub Command1_Click() Dim a%(65 To 90), c As String * 1 Dim a%(65 To 90), c As String *
43、 1 le = Len(Text1)le = Len(Text1) For i = 1 To le For i = 1 To le c = UCase(Mid(Text1, i, 1) c = UCase(Mid(Text1, i, 1) If c = A And c = A And c 0 Then Picture1.Print ; ) 0 Then Picture1.Print ; Chr(jChr(j); =; ); =; a(ja(j); ; ); ; Next jNext jEnd SubEnd Sub 5.2 5.2 数组控件数组控件 在应用程序开发中,往往要使用一些类型相同、功能
44、相似在应用程序开发中,往往要使用一些类型相同、功能相似的控件,这些控件需要执行基本相同的操作,如果把事件代码的控件,这些控件需要执行基本相同的操作,如果把事件代码分别写在不同对象的事件过程中,会造成代码重复,给程序维分别写在不同对象的事件过程中,会造成代码重复,给程序维护带来了困难,而应用控件数组则能避免上述问题。护带来了困难,而应用控件数组则能避免上述问题。 5.2 5.2 控件数组控件数组1 1 控件数组的基本概念控件数组的基本概念 控件数组由一组同类控件组成,它们共用一个控件,控件控件数组由一组同类控件组成,它们共用一个控件,控件各数组元素有不同的索引号(类似于数组元素的下标),该索各数
45、组元素有不同的索引号(类似于数组元素的下标),该索引由控件引由控件IndexIndex属性决定,最大索引值为属性决定,最大索引值为3276732767。 控件数组中的各控件元素可以具有不同的属性值,但具有控件数组中的各控件元素可以具有不同的属性值,但具有相同的事件过程。例如:若相同的事件过程。例如:若CmdNameCmdName是具有是具有4 4个元素的命令按钮个元素的命令按钮控件数组,不管单击哪个命令按钮,都会调用同一个单击事件控件数组,不管单击哪个命令按钮,都会调用同一个单击事件过程,格式如下:过程,格式如下: Private Sub Private Sub CmdName_Click(I
46、ndexCmdName_Click(Index As Integer) As Integer) End Sub End Sub 5.2 5.2 数组控件数组控件 2 2 建立控件数组的方法建立控件数组的方法 1 1)设计时建立)设计时建立步骤如下:步骤如下:(1) (1) 在窗体上添加第一个控件,设置好名称和其它属性;在窗体上添加第一个控件,设置好名称和其它属性;(2) (2) 选中该控件,进行复制和粘贴操作,系统会出现以下提示选中该控件,进行复制和粘贴操作,系统会出现以下提示信息:信息:单击单击“是是”按钮,建立一个控件数组。通过若干次粘贴操作,按钮,建立一个控件数组。通过若干次粘贴操作,便
47、可建立所需要的控件数组。便可建立所需要的控件数组。 5.2 5.2 数组控件数组控件 2 2 建立控件数组的方法建立控件数组的方法 2 2)在程序运行时建立)在程序运行时建立 步骤如下:步骤如下:(1) (1) 先建立第先建立第1 1个控件数组元素:在窗体中添加第个控件数组元素:在窗体中添加第1 1个控件,设个控件,设 置其置其IndexIndex属性为属性为0 0;(2) (2) 在程序中用在程序中用LoadLoad方法添加其余的若干个元素,用方法添加其余的若干个元素,用UnloadUnload方方 法删除某个元素;法删除某个元素;(3) (3) 新添的控件数组元素通过新添的控件数组元素通过
48、LeftLeft和和TopTop属性值,确定它在窗属性值,确定它在窗 体上的具体位置。体上的具体位置。(4) (4) 设置其设置其VisibleVisible属性为属性为TrueTrue,使其显示出来。,使其显示出来。 5.3 5.3 自定义数据类型自定义数据类型 在应用程序开发中,往往要使用一些类型相同、功能相似在应用程序开发中,往往要使用一些类型相同、功能相似的控件,这些控件需要执行基本相同的操作,如果把事件代码的控件,这些控件需要执行基本相同的操作,如果把事件代码分别写在不同对象的事件过程中,会造成代码重复,给程序维分别写在不同对象的事件过程中,会造成代码重复,给程序维护带来了困难,而应
49、用控件数组则能避免上述问题。护带来了困难,而应用控件数组则能避免上述问题。 1 1 特点:特点:用于存贮不同数据类型的一组数据用于存贮不同数据类型的一组数据学学号号 姓名姓名 性别性别 出生日期出生日期 年龄年龄 籍贯籍贯0931 0931 王王 强强 男男 1984-10-25 20 1984-10-25 20 陕西西安陕西西安0931 0931 李小琴李小琴 女女 1985-03-08 19 1985-03-08 19 山东潍坊山东潍坊0932 0932 田田 苗苗 女女 1984-06-22 20 1984-06-22 20 西藏拉萨西藏拉萨5.3 5.3 自定义数据类型自定义数据类型
50、2 2 定义:定义:Type Type As As As As As As End TypeEnd Type5.3 5.3 自定义数据类型自定义数据类型 注意:自定义数据类型一般放在标准模块中,若放在窗体的注意:自定义数据类型一般放在标准模块中,若放在窗体的通用声明段中时,要在通用声明段中时,要在TypeType前须加上前须加上PrivatePrivate关键词。关键词。 Type Type As As As As As As End TypeEnd Type举例:举例:Type Students Num As Integer Name As String * 20 Sex As String
51、 * 1 Birth As Data Age As Integer Jiguan As String * 50End Type注意:自定义类型一般应放在标准模块中,注意:自定义类型一般应放在标准模块中, 其默认型为其默认型为PublicPublic5.3 5.3 自定义数据类型自定义数据类型 2 2 定义:定义:3 3 自定义类型的引用:自定义类型的引用:自定义类型必须先说明变量,再引用自定义类型必须先说明变量,再引用Type Students Num As Integer Name As String * 20 Sex As String * 1 Birth As Data Age As I
52、nteger Jiguan As String * 50End TypeDim Stud(50) As Students在标准模在标准模块定义块定义5.3 5.3 自定义数据类型自定义数据类型 4 4 用户自定义数据类型数组用户自定义数据类型数组 用户自定义数据类型数组就是数组中的每个元素数据类型用户自定义数据类型数组就是数组中的每个元素数据类型均为用户自定义数据类型。用户自定义数据类型数组的步骤如均为用户自定义数据类型。用户自定义数据类型数组的步骤如下:下:(1) (1) 使用使用TypeType语句定义自定义数据类型;语句定义自定义数据类型;(2) (2) 使用数组定义语句定义自定义数据类型数组;使用数组定义语句定义自定义数据类型数组; 5.3 5.3 自定义数据类型自定义数据类型