1、第第6章章 数组和用户自定义类型数组和用户自定义类型6.1数组的概念数组的概念6.2定长数组和动态数组的定义定长数组和动态数组的定义6.3 数组的基本操作数组的基本操作6.4控件数组控件数组6.5滚动条控件滚动条控件(ScrollBar)6.6用户自定义类型和用户自定义用户自定义类型和用户自定义 类型数组类型数组6.7 实例分析实例分析6.1数组的概念数组的概念两种两种数据数据类型:基本数据类型和构造数据类型。到目前为止,类型:基本数据类型和构造数据类型。到目前为止,我们使用的数据都属于基本数据类型,如数值型、逻辑型、我们使用的数据都属于基本数据类型,如数值型、逻辑型、字符型等。该类数据具有一
2、个共同的特点:在程序运行的字符型等。该类数据具有一个共同的特点:在程序运行的任一时刻,每个变量名代表一个确定的数据,用户可以通任一时刻,每个变量名代表一个确定的数据,用户可以通过变量名访问该变量的值。本章我们学习构造数据类型数过变量名访问该变量的值。本章我们学习构造数据类型数据据数组和用户自定义类型的数据。数组是一组相同类数组和用户自定义类型的数据。数组是一组相同类型的数据的有序集合;而用户自定义类型数据由若干基本型的数据的有序集合;而用户自定义类型数据由若干基本数据类型可不同的元素组成。数据类型可不同的元素组成。数组是用统一的名字,不同下标、顺序排列的一组变量。数组是用统一的名字,不同下标、
3、顺序排列的一组变量。数组中的成员(每个变量)称为数组元素。数组元素通过数组中的成员(每个变量)称为数组元素。数组元素通过不同的下标来加以区分。因此数组元素又称为下标变量。不同的下标来加以区分。因此数组元素又称为下标变量。可以用数组名和下标来唯一地识别一个数组中的某个具体可以用数组名和下标来唯一地识别一个数组中的某个具体元素。元素。例如例如a(5)表示名称为表示名称为a的数组中的序号为的数组中的序号为5的那个元素。的那个元素。6.1数组的概念数组的概念需要说明的是:需要说明的是:(1)数组的命名和简单变量的命名规则相同。)数组的命名和简单变量的命名规则相同。(2)数组元素的下标必须用括号括起来。
4、不能把)数组元素的下标必须用括号括起来。不能把a(5)写成写成a5,a5会被认为是一个简单变量。会被认为是一个简单变量。(3)数组元素的下标必须是常量,常量可以是直接常量、)数组元素的下标必须是常量,常量可以是直接常量、符号常量或常量表达式,一般是整型常量。符号常量或常量表达式,一般是整型常量。(4)数组元素的下标必须是整数,如果是小数,系统会自)数组元素的下标必须是整数,如果是小数,系统会自动按四舍五入取整。如动按四舍五入取整。如a(4.6)将被视为将被视为a(5)。6.1数组的概念数组的概念数组下标的最小值称为数组的下界;数组下标的最小值称为数组的下界;数组下标的最大值称为数组的上界。数组
5、下标的最大值称为数组的上界。6.1数组的概念数组的概念 Visual Basic中的数据有多种类型,数组也有相应的类型。中的数据有多种类型,数组也有相应的类型。除了可以声明任何基本类型的数组,还可以声明用户自定除了可以声明任何基本类型的数组,还可以声明用户自定义类型和对象数组(如控件数组)。除了数据类型为义类型和对象数组(如控件数组)。除了数据类型为Variant的数组元素可以是不同类型的数据,一般一个数组的数组元素可以是不同类型的数据,一般一个数组的所有元素应是具有相同的数据类型。的所有元素应是具有相同的数据类型。6.1数组的概念数组的概念在一个数组中,如果用一个下标就能确定一个元素在数组在
6、一个数组中,如果用一个下标就能确定一个元素在数组中的具体位置,则该数组就是一维数组;具有两个或多个中的具体位置,则该数组就是一维数组;具有两个或多个下标的数组就是二维或多维数组。数组下标的个数就是数下标的数组就是二维或多维数组。数组下标的个数就是数组的维数。组的维数。6.1数组的概念数组的概念在在Visual Basic中有两种形式的数组:定长数组和动态数组。中有两种形式的数组:定长数组和动态数组。一旦定义后,其中的数组元素个数在程序运行过一旦定义后,其中的数组元素个数在程序运行过程中不再会发生变化;程中不再会发生变化;而而中的元素个数是可变的。中的元素个数是可变的。6.1数组的概念数组的概念
7、 在定义数组时,已确定数组元素个数的数组都是定长数组。在定义数组时,已确定数组元素个数的数组都是定长数组。定长数组的定长数组的如下:如下:Public|Static|Dim()As,6.2定长数组和动态数组的定义定长数组和动态数组的定义下面以下面以Dim语句为例加以说明。语句为例加以说明。Dim a(6)As Integer,b(3,2)As Integer(1)下标下界默认方式)下标下界默认方式在定义数组时,下标下界省略,则默认下标下界为在定义数组时,下标下界省略,则默认下标下界为0。例如例如:Dim a(6)As Integer,b(3,2)As Integer定义一维数组定义一维数组a有
8、有7个元素,下标从个元素,下标从0到到6。定义二维数组。定义二维数组b有有12个元素,第一维下标从个元素,第一维下标从0到到3,第二维下标从,第二维下标从0到到2。如果不希望数组下标从如果不希望数组下标从0开始,可用开始,可用Option Base 1语句使默语句使默认下标下界为认下标下界为1。Option Base 语句的参数只能是语句的参数只能是0或或1。它必须放在数组定义。它必须放在数组定义语句之前,且一个模块只能出现一次该语句。语句之前,且一个模块只能出现一次该语句。6.2定长数组和动态数组的定义定长数组和动态数组的定义(2)下标下界确定方式)下标下界确定方式“维数定义维数定义”格式:
9、下界格式:下界1 To 上界上界1,下界,下界2 To 上界上界2,下界下界n To 上界上界n此时此时Option Base 语句不起作用。语句不起作用。例如:例如:Dim a(-2 To 3),b(1 To 3,-2 To2)6.2定长数组和动态数组的定义定长数组和动态数组的定义数组的数据类型是指数组存放什么类型的数据。通常数组的数组的数据类型是指数组存放什么类型的数据。通常数组的数据类型定义采用以下两种方式。数据类型定义采用以下两种方式。(1)As 方式方式数据类型可以是:数据类型可以是:Integer,Long,Single,Double,String,String*n,Currenc
10、y,Boolean,Variant,还,还可以是用户自定义类型和对象(如控件)类型。可以是用户自定义类型和对象(如控件)类型。说明:说明:As 缺省,默认为缺省,默认为Variant类型。类型。(2)数组名后加类型符方式)数组名后加类型符方式类型符可以是:类型符可以是:%,&,!,#,$,等。例如:等。例如:Dim a%(5),b$(6)。6.2定长数组和动态数组的定义定长数组和动态数组的定义建立动态数组一般包括声明和大小确定两步:建立动态数组一般包括声明和大小确定两步:(1)用)用Public、Static或或Dim语句声明括号内为空的数组。语句声明括号内为空的数组。格式:格式:Dim 数组
11、名()数组名()As(2)在过程中用)在过程中用Redim语句指明该数组的大小。语句指明该数组的大小。格式:格式:Redim Preserve 数组名(数组名(维数定义维数定义数据类型数据类型)6.2定长数组和动态数组的定义定长数组和动态数组的定义例例【7-1】动态数组举例。动态数组举例。Dim a()As IntegerPrivate Sub Form_Click()Dim n As Integern=5ReDim a(n)a(1)=5:a(5)=4Print a(1);a(5);ReDim a(2,2)a(2,1)=3Print a(2,1);ReDim Preserve a(2,3)Pr
12、int a(2,1)End Sub 6.2定长数组和动态数组的定义定长数组和动态数组的定义 数组一经定义后,即可引用。引用数组元素的方法是在数组数组一经定义后,即可引用。引用数组元素的方法是在数组名后的圆括号内指定其下标。名后的圆括号内指定其下标。例如:例如:Dim arr(5)As Integer 定义数组定义数组 arr(4)=9 给数组元素给数组元素arr(4)赋值赋值 6.3 数组的基本操作数组的基本操作 数组的输入、输出操作是通过对数组中的元素逐个地输入、数组的输入、输出操作是通过对数组中的元素逐个地输入、输出操作实现的。对一维数组的操作通常采用一重循环实现;输出操作实现的。对一维数
13、组的操作通常采用一重循环实现;对二维数组的操作通常采用二重循环,是用外循环控制行标对二维数组的操作通常采用二重循环,是用外循环控制行标(或列标),内循环控制列标(或行标)。(或列标),内循环控制列标(或行标)。6.3 数组的基本操作数组的基本操作 6.3 数组的基本操作数组的基本操作例例【7-2】编一窗体单击事件过程。向一维数组输入编一窗体单击事件过程。向一维数组输入10个随个随机数(机数(1099之间的整数),并在窗体上输出这个数组中的之间的整数),并在窗体上输出这个数组中的10个数。个数。Private Sub Form_Click()Dim a(1 To 10)As IntegerFor
14、 i=1 To 10a(i)=Int(Rnd()*90+10)NextFor i=1 To 10Print a(i);NextEnd Sub 6.3 数组的基本操作数组的基本操作数组的初始化就是给数组元素赋初值。在数组的初始化就是给数组元素赋初值。在Visual Basic中,可中,可以用以用Array函数实现数组的初始化,但函数实现数组的初始化,但Array函数只能用于一维函数只能用于一维数组。数组。格式:格式:=Array()需要说明的是:需要说明的是:用用Array函数给数组元素赋初值,数组必须是函数给数组元素赋初值,数组必须是Variant。另外,。另外,数组的下标下界默认为数组的下标
15、下界默认为0,也可以通过,也可以通过Option Base 语句决定;语句决定;上界由上界由Array函数括号内参数个数决定,也可以通过函数括号内参数个数决定,也可以通过UBound函数获得。函数获得。例如:例如:a=Array(1,2,3,4,5)6.3 数组的基本操作数组的基本操作格式:格式:For Each In 数组数组Next需要说明的是:需要说明的是:(1)成员:是一个)成员:是一个Variant变量变量,是为循环提供的用于依次代表是为循环提供的用于依次代表数组中每一个元素。数组中每一个元素。(2)数组:是一个已定义的数组名,没有括号和下标。)数组:是一个已定义的数组名,没有括号和
16、下标。(3)功能:根据数组元素的个数,将数组中的每一个元素依)功能:根据数组元素的个数,将数组中的每一个元素依次赋给成员,重复执行循环体内的语句序列。次赋给成员,重复执行循环体内的语句序列。6.3 数组的基本操作数组的基本操作例例【7-3】For EachNext语句应用举例。求数组所有元素语句应用举例。求数组所有元素的和。的和。Private Sub Form_Click()Dim s As Integera=Array(9,8,7,6,5)s=0For Each x In as=s+xNextPrint sEnd Sub6.3 数组的基本操作数组的基本操作单个的数组元素可以像简单变量那样从
17、一个数组复制到另一单个的数组元素可以像简单变量那样从一个数组复制到另一个数组,而要复制整个数组则仍要使用个数组,而要复制整个数组则仍要使用For循环语句。循环语句。6.3 数组的基本操作数组的基本操作UBound 函数和函数和LBound函数分别返回数组的上界和下界函数分别返回数组的上界和下界格式:格式:UBound(arrayname,n)LBound(arrayname,n)其中:其中:arrayname 是数组名;是数组名;n表示数组的第几维,若省略,表示数组的第几维,若省略,就认为是就认为是1。例如:例如:Dim A(1 To 9,3 To 8,4 To 12)Dim B(10)U1=
18、UBound(A,1)返回返回9U2=UBound(A,3)返回返回12U3=UBound(B)返回返回10L1=LBound(A,1)返回返回1L2=LBound(A,3)返回返回4 6.3 数组的基本操作数组的基本操作数组一经定义便在内存中占据连续的存储空间。如果数组不数组一经定义便在内存中占据连续的存储空间。如果数组不再使用,就需要将该数组删除,以便释放数组所占的存储空再使用,就需要将该数组删除,以便释放数组所占的存储空间。如果数组挪做它用,就需要将该数组的数据清除。这可间。如果数组挪做它用,就需要将该数组的数据清除。这可以用以用Erase语句来实现。语句来实现。Erase语句格式如下:
19、语句格式如下:Erase 数组名数组名,数组名数组名2,说明说明:(1)Erase语句用于定长数组时,数组仍然存在,只是数组中的语句用于定长数组时,数组仍然存在,只是数组中的内容被清空。对于数值数组,则把数组中的所有元素置为内容被清空。对于数值数组,则把数组中的所有元素置为0;对于字符串数组则把数组中的所有元素置为空串;对于变体数对于字符串数组则把数组中的所有元素置为空串;对于变体数组,则把数组中的所有元素置为组,则把数组中的所有元素置为Empty。(2)Erase语句用于动态数组时将删除该数组的结构,并释放出语句用于动态数组时将删除该数组的结构,并释放出所占用的存储空间。如果下次再引用该数组
20、,则必须用所占用的存储空间。如果下次再引用该数组,则必须用Redim语句重新定义数组的大小和维数。语句重新定义数组的大小和维数。6.3 数组的基本操作数组的基本操作例例【7-4】定长数组的清除。观察运行后的结果,如图定长数组的清除。观察运行后的结果,如图7-1所示。所示。Option Base 1Private Sub Form_Click()Dim k As Integer,a(5)As IntegerFor k=1 To 5 a(k)=kNextPrintPrint 打印原数组:打印原数组:For k=1 To 5Print a(k);NextErase aPrintPrint 打印清除后
21、数组:打印清除后数组:For k=1 To 5Print a(k);NextEnd Sub6.3 数组的基本操作数组的基本操作冒泡法排序是一种简单的排序法。在每一轮排序中将相邻的数冒泡法排序是一种简单的排序法。在每一轮排序中将相邻的数比较,当次序不对就交换,出了内循环最大(或最小)数就已比较,当次序不对就交换,出了内循环最大(或最小)数就已冒出。冒出。假设有假设有N个数在个数在a数组(下标从数组(下标从1开始)中,冒泡法升序排序的开始)中,冒泡法升序排序的思路是:思路是:(1)将)将a(1)与)与a(2)相比较,若)相比较,若a(1)a(2),则交换则交换a(1)与)与a(2),然后比较然后比
22、较a(2)与)与a(3),依次类推,直到),依次类推,直到a(N-1)与)与a(N)比较完。这个过程称为一次冒泡,其结果是)比较完。这个过程称为一次冒泡,其结果是最大数在数组的最大数在数组的a(N)中。)中。(2)然后对数组)然后对数组a的前的前N-1个数进行第个数进行第2轮同样的操作,其结果轮同样的操作,其结果是次大数在是次大数在a(N-1)中。)中。(3)依次类推,)依次类推,N个数排序需排个数排序需排N-1轮。轮。6.3 数组的基本操作数组的基本操作 6.3 数组的基本操作数组的基本操作假设数组假设数组a中存在中存在6个数,分别为个数,分别为9,8,12,4,7,10。要求。要求用冒泡法
23、排序输出。用冒泡法排序输出。Const N=6Option Base 1Private Sub Form_Click()Dim i As Integer,j As Integer,temp As Integera=Array(9,8,12,4,7,10)输出原数组中的数Print 原数组中的数:“For i=1 To 6Print a(i);Next数组中的数用冒泡法升序排序For i=1 To N-1 For j=1 To N i If a(j)a(j+1)Then temp=a(j)a(j)=a(j+1)a(j+1)=temp End If Next jNext iPrintPrint 排
24、序后数组中的数:For i=1 To 6Print a(i);NextEnd Sub6.4 控件数组控件数组如果在应用程序中用到一些类型相同且功能类似的控件,就可如果在应用程序中用到一些类型相同且功能类似的控件,就可以将这些相同的控件定义为一个数组来使用,这种数组就是控以将这些相同的控件定义为一个数组来使用,这种数组就是控件数组。控件数组的使用方法与数组变量相似,也具备以下特件数组。控件数组的使用方法与数组变量相似,也具备以下特点:点:(1)相同的名称()相同的名称(Name)(2)以下标索引值()以下标索引值(Index)来识别各个控件)来识别各个控件6.4 控件数组控件数组控件数组是通过设
25、置对象的控件数组是通过设置对象的Index属性来创建的属性来创建的 1在设计时建立控件数组在设计时建立控件数组可以通过以下步骤建立一个控件数组:可以通过以下步骤建立一个控件数组:(1)在窗体上添加一个控件,然后进行该控件的属性设)在窗体上添加一个控件,然后进行该控件的属性设置;置;(2)选中该控件,进行)选中该控件,进行“复制复制”和和“粘贴粘贴”操作,系统操作,系统就会弹出一个提示对话框,要求确认是否要创建控件数组。就会弹出一个提示对话框,要求确认是否要创建控件数组。单击单击“是是”按钮,就建立了一个控件数组。此时,系统自按钮,就建立了一个控件数组。此时,系统自动将第一个控件元素的动将第一个
26、控件元素的Index属性设置为属性设置为0,而将复制的第,而将复制的第二个控件元素的二个控件元素的Index属性设置为属性设置为1,如此继续下去,经过,如此继续下去,经过若干次的若干次的“粘贴粘贴”操作,就建立了所需的控件数组了。操作,就建立了所需的控件数组了。6.4 控件数组控件数组例例【6-6】设计一个简单的能进行和、差、积三种算术运算程设计一个简单的能进行和、差、积三种算术运算程序。序。6.4 控件数组控件数组例例【6-6】设计一个简单的能进行和、差、积三种算术运算程设计一个简单的能进行和、差、积三种算术运算程序。序。创建步骤:创建步骤:(1)在窗体上添加)在窗体上添加3个文本框个文本框
27、(名称为名称为Text1、Text2和和Text3,设置它们的设置它们的Text属性为空属性为空)、2个标签(名称为个标签(名称为Label1和和Label2),一个包含),一个包含3个命令按钮的控件数组(名称为个命令按钮的控件数组(名称为Command1,Index属性分别为属性分别为0、1、2)6.4 控件数组控件数组例例【6-6】设计一个简单的能进行和、设计一个简单的能进行和、差、积三种算术运算程序。差、积三种算术运算程序。(2)添加代码如下)添加代码如下Private Sub Command1_Click(Index As Integer)Label2.Caption=Select C
28、ase IndexCase 0Label1.Caption=+Text3.Text=Val(Text1.Text)+Val(Text2.Text)Case 1Label1.Caption=-Text3.Text=Val(Text1.Text)-Val(Text2.Text)Case 2Label1.Caption=*Text3.Text=Val(Text1.Text)*Val(Text2.Text)End SelectEnd Sub6.4 控件数组控件数组2在运行时添加或删除控件数组在运行时添加或删除控件数组在程序设计阶段建立控件数组元素后,有时还需要在程序在程序设计阶段建立控件数组元素后,有
29、时还需要在程序运行时添加(载入)或删除(卸载)数组元素。可以用运行时添加(载入)或删除(卸载)数组元素。可以用Load语句实现添加操作,用语句实现添加操作,用Unload语句实现删除操作。语句实现删除操作。其格式分别如下:其格式分别如下:Load 控件名(下标)控件名(下标)Unload 控件名(下标)控件名(下标)需要说明的是,使用需要说明的是,使用Load语句实现添加数组元素,在默语句实现添加数组元素,在默认情况下是不可见的。因此在添加后需要在程序中将其认情况下是不可见的。因此在添加后需要在程序中将其Visible属性设置为属性设置为True。6.4 控件数组控件数组2在运行时添加或删除控
30、件数组在运行时添加或删除控件数组例例【7-7】设计一个与例设计一个与例【7-6】一样功能一样功能(计算和、差、积计算和、差、积)的程序。但程序的设计界面如图。在程序运行后添加后的程序。但程序的设计界面如图。在程序运行后添加后2个命令按钮控件数组元素。个命令按钮控件数组元素。6.4 控件数组控件数组创建步骤:创建步骤:1)在窗体上添加在窗体上添加3个文本框,个文本框,2个标签,一个含一个命令按个标签,一个含一个命令按钮控件数组,并按图设计它们的属性。钮控件数组,并按图设计它们的属性。2)添加如下代码:添加如下代码:Private Sub Form_Load()Dim cmdarrwidth As
31、 Single,cmdarrtop As SingleDim i As Integercmdarrwidth=Command1(0).Widthcmdarrtop=Command1(0).TopFor i=1 To 2Load Command1(i)Command1(i).Left=Command1(i-1).Left+cmdarrwidth+100Command1(i).Top=cmdarrtopCommand1(i).Caption=IIf(i=1,计算差计算差,计算积计算积)Command1(i).Visible=TrueNextEnd Sub6.4 控件数组控件数组Private Su
32、b Command1_Click(Index As Integer)Label2.Caption=Select Case IndexCase 0Label1.Caption=+Text3.Text=Val(Text1.Text)+Val(Text2.Text)Case 1Label1.Caption=-Text3.Text=Val(Text1.Text)-Val(Text2.Text)Case 2Label1.Caption=*Text3.Text=Val(Text1.Text)*Val(Text2.Text)End SelectEnd Sub 6.5 滚动条控件滚动条控件(ScrollBar
33、)1Value属性属性返回或设置滚动条的当前位置,其返回值始终介于返回或设置滚动条的当前位置,其返回值始终介于Max和和 Min属性值之间的整数。属性值之间的整数。2Max、Min属性属性返回或设置滚动条所能代表的最小、最大值,其取值范围返回或设置滚动条所能代表的最小、最大值,其取值范围为为-3276832767。Min属性的默认值为属性的默认值为0,Max属性的属性的默认值为默认值为32767。3LargeChange、SmallChange属性属性LargeChange属性返回和设置当用户单击滚动条和滚动属性返回和设置当用户单击滚动条和滚动箭头之间的区域时,滚动控件箭头之间的区域时,滚动控
34、件Value属性值的改变量。属性值的改变量。SmallChange属性返回和设置当用户单击滚动箭头时,属性返回和设置当用户单击滚动箭头时,滚动控件滚动控件Value属性值的改变量。属性值的改变量。LargeChange和和 SmallChange属性的取值范围是属性的取值范围是132767之间的整数,之间的整数,包括包括1和和32767,默认设置值都为,默认设置值都为1。6.5 滚动条控件滚动条控件(ScrollBar)4Change 事件和事件和Scroll事件事件在程序运行过程中,每当滚动条的在程序运行过程中,每当滚动条的Value属性发生变化时,属性发生变化时,就发生就发生Change
35、事件。而每当用户用鼠标单击滚动箭头,事件。而每当用户用鼠标单击滚动箭头,单击滚动框与滚动箭头之间的区域或沿着滚动条拖动滚单击滚动框与滚动箭头之间的区域或沿着滚动条拖动滚动框的动作结束时,滚动条的动框的动作结束时,滚动条的Value属性值就发生变化。属性值就发生变化。尽管拖动滚动框会引起尽管拖动滚动框会引起Value属性值发生变化,但在滚动属性值发生变化,但在滚动条内拖动滚动框的过程中,并不发生条内拖动滚动框的过程中,并不发生Change 事件。此事件。此时将触发滚动条的时将触发滚动条的Scroll事件,当然滚动框的位置改变事件,当然滚动框的位置改变后,又将触发后,又将触发Change 事件。事
36、件。在实际编程中,常用在实际编程中,常用Scroll事件过程来跟踪滚动条在拖动事件过程来跟踪滚动条在拖动时数值的动态变化;常利用时数值的动态变化;常利用Change 事件来获得滚动条事件来获得滚动条变化后变化后Value属性的最终值。属性的最终值。6.5 滚动条控件滚动条控件(ScrollBar)当项目列表很长或者信息量很大时,可以使用滚动条来模当项目列表很长或者信息量很大时,可以使用滚动条来模拟当前处理所在的位置。拟当前处理所在的位置。例例【7-8】随机产生随机产生10000个两位整数每次产生一个放在个两位整数每次产生一个放在数组中,然后判断这个数是否是数组中,然后判断这个数是否是3的倍数,
37、若是,则将的倍数,若是,则将数组中的这个数显示到列表框中,并且前面给出它是第数组中的这个数显示到列表框中,并且前面给出它是第几个能被几个能被3整除的数,直到整除的数,直到10000个数值全部处理完毕。个数值全部处理完毕。用水平滚动条模拟进行的进度。用水平滚动条模拟进行的进度。6.5 滚动条控件滚动条控件(ScrollBar)6.5 滚动条控件滚动条控件(ScrollBar)创建过程:创建过程:(1)在窗体上添加一个列表框控件)在窗体上添加一个列表框控件(List1),一个命令按钮),一个命令按钮(Command1)和一个水平滚动条)和一个水平滚动条(HScroll1),设置水平滚动条),设置水
38、平滚动条(HScroll1)的属性)的属性Max为为10000,Min为为0。(2)添加如下代码:)添加如下代码:Private Sub Form_Load()RandomizeEnd SubPrivate Sub Command1_Click()Dim a(1 To 10000)As Integer,i As Integer,j as Integer,k As IntegerFor i=1 To 10000a(i)=Int(Rnd()*90+10)利用循环增加一个延迟利用循环增加一个延迟For j=1 To 100000NextIf a(i)Mod 3=0 Thenk=k+1List1.Ad
39、dItem(k&a(i)List1.Refresh 强制重强制重画画List1 End IfHScroll1.Value=iNextEnd Sub6.6用户自定义类型和用户自定义类型数组用户自定义类型和用户自定义类型数组 用用Type语句来创建用户自定义类型。其语句来创建用户自定义类型。其语法格式是:语法格式是:Private|Public Type As As As End Type说明:说明:Type语句只能在模块级使用,不能在过语句只能在模块级使用,不能在过程内使用。缺省设置是公用的;在对象程内使用。缺省设置是公用的;在对象模块中,只能使用模块中,只能使用Private限定词;在标限定词
40、;在标准模块中,准模块中,Private和和Public皆可。皆可。例如,以下例如,以下Type语句定语句定义了一个有关学生信息义了一个有关学生信息的自定义类型,名字是的自定义类型,名字是Student。Private Type Student学号学号 As String*10 姓名姓名 As String*8数学数学 As Integer英语英语 As Integer计算机计算机 As IntegerEnd Type 6.6用户自定义类型和用户自定义类型数组用户自定义类型和用户自定义类型数组 自定义类型一旦定义后,就可以在变量自定义类型一旦定义后,就可以在变量的声明时使用该类型,语法格式是:
41、的声明时使用该类型,语法格式是:Dim 变量名变量名 As 自定义类型名自定义类型名使用语法格式:变量名使用语法格式:变量名.元素名元素名 6.6用户自定义类型和用户自定义类型数组用户自定义类型和用户自定义类型数组 例例【7-9】编写程序显示学生的基本信息。编写程序显示学生的基本信息。创建一个工程,首先在窗体的通用段中创建自定义类型创建一个工程,首先在窗体的通用段中创建自定义类型Student。然后编写如下代码然后编写如下代码.Dim stud As StudentPrivate sub Form_Load()Stud.学号学号=10001Stud.姓名姓名=”张三张三”Stud.数学数学=6
42、7Stud.英语英语=80Stud.计算机计算机=90End SubPrivate sub Form_Click()Print“学号学号”,”姓名姓名”,”数学数学”,”英语英语”,”计算机计算机”Print Stud.学号学号,Stud.姓名姓名,Stud.数学数学,Stud.英语英语,Stud.计算计算机机End Sub6.6用户自定义类型和用户自定义类型数组用户自定义类型和用户自定义类型数组 用户自定义类型数组是指数组的每个元素都是用户自定义用户自定义类型数组是指数组的每个元素都是用户自定义类型。自定义类型数组能够描述更为复杂的数据。类型。自定义类型数组能够描述更为复杂的数据。例如要描述
43、例如要描述100个学生的信息。如前面声明一个用户自定个学生的信息。如前面声明一个用户自定义学生类型,再定义一个存放义学生类型,再定义一个存放100个学生记录的数组个学生记录的数组stud:Dim stud(1 to 100)As StudentStud就描述了就描述了100个学生的信息。个学生的信息。6.6用户自定义类型和用户自定义类型数组用户自定义类型和用户自定义类型数组 例例【6-10】向自向自定义类型数组输定义类型数组输入任意个学生的入任意个学生的学号、姓名和成学号、姓名和成绩,并在窗体上绩,并在窗体上显示所有学生的显示所有学生的信息和最高分学信息和最高分学生的信息。生的信息。6.6用户
44、自定义类型和用户自定义类型数组用户自定义类型和用户自定义类型数组 Private Type Student学号 As String*10 姓名 As String*8成绩 As IntegerEnd TypeOption Base 1Dim stu()As Student,MaxStu As StudentDim i As Integer,n As IntegerPrivate Sub Command1_Click()n=Val(InputBox(输入学生个数)ReDim stu(1 To n)Print 学号,姓名,成绩For i=1 To nstu(i).学号=InputBox(输入第&i
45、&学生学号)6.6用户自定义类型和用户自定义类型数组用户自定义类型和用户自定义类型数组 stu(i).姓名=InputBox(输入第&i&学生姓名)stu(i).成绩=InputBox(输入第&i&学生成绩)Print stu(i).学号,stu(i).姓名,stu(i).成绩NextMaxStu.成绩=0Print 最高分学生的信息:For i=1 To nIf MaxStu.成绩 stu(i).成绩 Then MaxStu.成绩=stu(i).成绩:MaxStu.学号=stu(i).学号:MaxStu.姓名=stu(i).姓名EndIfNextPrint MaxStu.学号,MaxStu.
46、姓名,MaxStu.成绩End Sub6.7本章小结本章小结本章学习了有关数组及应用的知识,包括数组的概念、数本章学习了有关数组及应用的知识,包括数组的概念、数组的基本操作、定长数组、动态数组、控件数组、滚动条组的基本操作、定长数组、动态数组、控件数组、滚动条控件、用户自定义类型以及用户自定义类型数组。控件、用户自定义类型以及用户自定义类型数组。数组可以被看作一组带下标的变量集合数组可以被看作一组带下标的变量集合,系统分配一块连续系统分配一块连续的内存来存放数组中的元素的内存来存放数组中的元素,数组通常是存放具有相同性质数组通常是存放具有相同性质的一组数据。当所需处理的数据个数确定时,通常使用
47、定的一组数据。当所需处理的数据个数确定时,通常使用定长数组,否则应该考虑使用动态数组。控件数组数组是特长数组,否则应该考虑使用动态数组。控件数组数组是特殊的数组,它通常存放一组同类型的控件。在数组方面也殊的数组,它通常存放一组同类型的控件。在数组方面也可以应用滚动条控件显示进行数组元素处理的进度。用户可以应用滚动条控件显示进行数组元素处理的进度。用户自定义类型变量通常是存放具有不同性质的一组数据,可自定义类型变量通常是存放具有不同性质的一组数据,可以用用户自定义类型和用户自定义类型数组处理更为复杂以用用户自定义类型和用户自定义类型数组处理更为复杂的数据,解决更为复杂的问题。的数据,解决更为复杂的问题。