1、第7章 数组与自定义类型7.1 7.1 数组的基本概念数组的基本概念7.2 7.2 数组的声明数组的声明7.3 7.3 数组的基本操作数组的基本操作7.4 7.4 常用算法常用算法7.5 7.5 控件数组控件数组7.6 7.6 自定义数据类型自定义数据类型第7章 数组与自定义类型引例 求某门课6个学生成绩中,高于平均分的学生人数 方法一:用6个变量分别存放6个学生的成绩。第7章 数组与自定义类型Private Sub Command2_Click()Dim x As Single,y As Single,z As Single,u As Single,v As Single,w As Sing
2、le Dim avg As Single,t As Integer x=Val(InputBox(请输入第1个学生的成绩,输入,0)y=Val(InputBox(请输入第2个学生的成绩,输入,0)z=Val(InputBox(请输入第3个学生的成绩,输入,0)u=Val(InputBox(请输入第4个学生的成绩,输入,0)v=Val(InputBox(请输入第5个学生的成绩,输入,0)w=Val(InputBox(请输入第6个学生的成绩,输入,0)Print x;y;z;u;v;w avg=(x+y+z+u+v+w)/6 If x avg Then t=t+1 If y avg Then t=
3、t+1 If z avg Then t=t+1 If u avg Then t=t+1 If v avg Then t=t+1 If w avg Then t=t+1 Print 平均成绩为:;avg Print 高于平均成绩的有&t&人End Sub第7章 数组与自定义类型引例求某门课6个学生成绩中的高于平均分的学生人数 方法一:用6个变量分别存放6个学生的成绩。缺点:如果处理的数据增多,需要定义许多变量,给程序的编写带来极大的不方便。方法二:用一个变量来接收6个学生的成绩(多次赋值)。第7章 数组与自定义类型Private Sub Command1_Click()Dim avg As Si
4、ngle,x As Single,i As Integer,sum As Single,t As Integer For i=1 To 6 x=Val(InputBox(请输入第&i&个学生的成绩,输入,0)sum=sum+x Print x;Next i avg=sum/6 For i=1 To 6 x=Val(InputBox(请输入第&i&个学生的成绩,输入,0)If x avg Then t=t+1 Next i Print Print 平均成绩为:&avg Print 高于平均成绩的有:&t&人End Sub第7章 数组与自定义类型引例求某门课6个学生成绩中的高于平均分的学生人数方法
5、一:用6个变量分别存放6个学生的成绩。缺点:如果处理的数据增多,需要定义许多变量,给程序的编写带来极大的不方便。方法二:用一个变量来接收6个学生的成绩(多次赋值)。缺点:已处理过的数值不保存,再次对数据处理时,要重新输入。第7章 数组与自定义类型7.1 数组概述1、数组的有关概念(1)数组:是一个由多个同类型变量组成的集合,简单的讲就是一组同类型的变量。(2)数组名:这组变量有统一的名称,就是数组名。(3)数组元素:构成数组的成员。每个数组元素和一个普通变量一样能存放一个数据。(4)下标:用来标识数组中的每一个元素的序号。如,有一个数组a,数组元素可分别表示为:a(1),a(2),a(3),a
6、(4)第7章 数组与自定义类型7.1 数组概述2、数组的特点(1)数组由若干个数组元素组成,数组元素的数据类型一致。(2)数组元素是有次序存放的,下标代表它在数组中的位置。(3)数组中各元素之间有内在联系,在内存中占连续的一段存储单元。第7章 数组与自定义类型7.1 数组概述3、数组的分类(1)按照定义时数组元素个数确定与否,数组可分为:n静态数组:定义时数组元素的个数就已经确定n动态数组:定义时数组元素的个数不确定,在程序运行时根据需要才确定数组元素的多少(2)按照数组元素下标的个数,数组可分为:n一维数组:数组元素有一个下标n二维数组:数组元素有两个下标n多维数组:数组元素有多个下标第7章
7、 数组与自定义类型7.2 一维静态数组1、一维静态数组的定义:Dim 数组名(下界 To 上界)As 其中:(1)数组名:数组的名称,命名要符合变量命名规则(2)下界 To 上界:维说明,确定数组元素下标的取值范围及数组元素的个数(上界-下界+1)。(3)As:用来指明数组元素的类型,默认为变体类型。第7章 数组与自定义类型7.2 一维静态数组举例:定义一个用来存放10个整数的数组。Dim a(1 To 10)As Integer 说明 (1)定义一个数组,数组名为a (2)数组中有10个数组元素,数组元素分别表示为:a(1),a(2),a(10)(3)数组元素的数据类型为整型,使用时与普通整
8、型变量的使用方法类似第7章 数组与自定义类型7.2 一维静态数组2、注意事项(1)维说明中下界和上界只能取直接常量或直接常量表达式,符号常量和符号常量表达式,不能为变量或包含变量的表达式。(2)下界维说明可以省略,默认从0开始 Dim x(6)As String*6(3)维说明中使用的常量可以为小数,系统自动四舍五入取整。Dim x(1 To 4.3+2)As Integer定义数组x是有x(0)到x(6)连续的7个数组元素,每个元素可以存储6个字符Dim n As Integern=10Dim a(1 To n)As Single Const n As Integer=6 Dim x(1 T
9、o n)As Double Dim y(1 To n+6)第7章 数组与自定义类型7.2 一维静态数组2、注意事项(4)用“Option Base 1”可设定数组元素下界为1,以改变下界默认值为0,该语句必须放在窗体或模块的通用声明段中。(5)一维静态数组在同一过程中只能声明一次(6)声明数组后,各数组元素的初值与声明普通变量相同。(7)声明数组和声明变量一样,数组也有作用范围。Dim a(1 To 6)As IntegerDim a(8)As Single第7章 数组与自定义类型7.2 一维静态数组3、使用数组编程的一般步骤:(1)定义数组(2)为数组元素赋值(3)运算处理数组中的数据(4)
10、输出结果第7章 数组与自定义类型7.2 一维静态数组例7-1 统计某门课6个学生成绩中高于平均分的学生人数。解题步骤 (1)定义一个数组用来存放6个学生的成绩 (2)给数组赋值,将6个学生的成绩存入数组 (3)求平均成绩,比较,统计出高于平均分的学生人数 (4)将结果输出:用数组求解Fibonacci数列的前20项。:用数组求某门课10个学生中的最低成绩、最高成绩和平均成绩。如果在编写程序时学生人数不确定,该如何解决?第7章 数组与自定义类型7.2 一维动态数组1、概念:动态数组是指在声明数组时不给出数组的大小,而是在程序执行到ReDim语句时才确定大小。2、定义 创建动态数组通常分为两步:第
11、一步:在标准模块、窗体的通用程序段或过程中,声明一个省略维说明的数组,格式为:Dim Dim 数组名数组名 ()As()As第二步:根据应用需要,用ReDim声明大小,格式为:ReDim Preserve ReDim Preserve 数组名数组名 (下界下界 To To 上界上界)As)As 第一步可以省略第7章 数组与自定义类型7.2 一维动态数组3、注意事项(1)Dim和ReDim语句中数组元素的数据类型必须一致(2)声明动态数组的ReDim语句可以使用变量(3)同一个动态数组可以多次重复声明,重复声明时数组元素的值均被初始化,若想保留原来的值,可以在ReDim语句中加关键字Preser
12、veDim a()As IntegerReDim a(1 To 8)As IntegerDim a()As IntegerReDim a(1 To 8)As Single Dim a()As Integer,n As Integer n=9 ReDim a(n)As Integer第7章 数组与自定义类型7.2 一维动态数组Dim a()As Integer,n As Integern=6ReDim a(1 To n)As IntegerFor i=1 To 6 a(i)=8Next i888888a(1)a(3)a(4)a(5)a(6)a(2)00000000a(1)a(3)a(4)a(5)
13、a(6)a(2)a(7)a(8)88888800a(1)a(3)a(4)a(5)a(6)a(2)a(7)a(8)ReDim a(1 To 8)As IntegerReDim Preserve a(1 To 8)As Integer第7章 数组与自定义类型7.2 一维动态数组例7-2:求某门课程n个同学的平均成绩、最高成绩和最低成绩。分析:(1)学生人数在编写程序时不能确定(2)用于存储学生成绩的数组元素的多少随学生人数的不同而异 解题步骤:(1)定义一个动态数组,用来存放n个学生的成绩 (2)给数组赋值,将学生成绩存入数组 (3)对数组中的数据进行计算、比较 (4)输出结果Private Su
14、b Command2_Click()Dim cj()As Single,n As Integer,i As Integer Dim avg As Single,max As Single,min As Single n=Val(InputBox(请输入学生人数,输入,0)ReDim cj(1 To n)As Single For i=1 To n cj(i)=Val(InputBox(请输入第&i&个学生的成绩,输入,0)Next i max=cj(1)min=cj(1)For i=1 To n avg=avg+cj(i)If cj(i)max Then max=cj(i)If cj(i)mi
15、n Then min=cj(i)Next i avg=avg/n For i=1 To n Print cj(i);Next i Print Print 平均分为:&avg Print 最高成绩为&max Print 最低成绩为&minEnd Sub第7章 数组与自定义类型7.2 一维动态数组:某门课n个学生中,将高于平均分的成绩输出。解题步骤:(1)定义一个动态数组,用来存放n个学生的成绩 (2)给数组赋值,将学生成绩存入数组 (3)求出平均分,然后比较,将高于平均分的学生成绩输出Private Sub Command2_Click()Dim cj()As Single,n As Integ
16、er,i As Integer Dim avg As Single,max As Single,min As Single n=Val(InputBox(请输入学生人数,输入,0)ReDim cj(1 To n)As Single For i=1 To n cj(i)=Val(InputBox(请输入第&i&个学生的成绩,输入,0)avg=avg+cj(i)Next i avg=avg/n For i=1 To n Print cj(i);Next i Print Print 平均分为:&avg Print 高于平均分的成绩有:For i=1 To n If cj(i)avg Then Pri
17、nt cj(i);Next iEnd Sub第7章 数组与自定义类型作业与思考题作业:作业:课本课本 p148 1p148 1、2 2、3 3 课后预习:课后预习:1 1、为数组赋值的四种方法、为数组赋值的四种方法 2 2、二维数组、二维数组第7章 数组与自定义类型7.3 一维数组的基本操作1、为数组元素提供数据(1)用循环逐一为数组元素赋值(2)使用InputBox()函数为数组元素逐一赋值 Dim a(1 to 10)as SingleFor i=1 to 10 a(i)=0 Next i Dim w(1 To 3)As SingleFor i=1 To 3 w(i)=InputBox(“
18、输入第”&i&“个的值)Next i第7章 数组与自定义类型7.3 一维数组的基本操作(3)使用Array()函数为数组元素同时赋值 对于变体类型的一维动态数组,还可采用Array()函数为数组各元素同时赋值。格式为:数组名数组名=Array=Array()其中n可以是已经声明过的变体类型的动态数组,也可以是没有声明过的数组名。n数组元素的个数由中数据个数决定,数组的下标下界可由LBound()函数得到(默认为0),下标上界可由UBound()函数得到。第7章 数组与自定义类型7.3 一维数组的基本操作注意:Array函数只能对一维动态数组赋值。若提前声明了数组,类型必须为变体类型。a=Arr
19、ay(1,3,4,5,-6)b=Array(abc,def,67,5,-6)For i=0 To UBound(a)Print a(i);Next iPrintFor i=0 To UBound(b)Print b(i);Next i第7章 数组与自定义类型7.3 一维数组的基本操作(4)用Split()函数为数组元素同时赋值 Split()函数为数组元素赋值的基本方法是:将要赋值的数据以字符串的形式用固定的分隔符分隔开(如“,”),再通过Split()函数将其分离成一个一个的数据后,存放到数组各元素中,格式为:=Split=Split(,分隔符,分隔符)其中:n是一组将要为数组赋值的数据,这
20、些数据之间有固定的分隔符。n该方法通常和文本框配合使用解决大量数据处理问题。注意:Split()函数要求所赋值的数组必须是动态数组,可以不提前声明,如果提前声明则必须声明为字符型。第7章 数组与自定义类型7.3 一维数组的基本操作例7-3 使用文本框录入大量的数据,将它们保存在一维数组中,并打印输出(每行显示8个数据)。第7章 数组与自定义类型7.3 一维数组的基本操作(5)Split函数和Array函数使用时注意的问题 Split函数只能给字符型数组赋值;而Array函数只能给变体类型数组赋值。这两个函数只能给一维数组赋值,如果要为二维数组赋值,必须先将数据放入一维数组,再通过程序的方法转入
21、二维数组。用Array函数赋值的数组元素的最小下标受Option Base 语句影响,当“Option Base 0”或默认情况下,被赋值数组的最小下标为0;当“Option Base 1”时,被赋值数组的最小下标为1;用Split函数赋值的数组的最小下标与Option Base 语句无关,不管Option Base 语句设置为0还是1,数组元素的最小下标均从0开始。第7章 数组与自定义类型7.3 一维数组的基本操作2、数组输出 数组元素可通过For循环或For循环嵌套,使用Print方法实现输出到窗体或图片框中。第7章 数组与自定义类型7.4 常用算法举例1、简单统计例例7-4 7-4 已知
22、10名学生的学号和一门课程的考试成绩,如下:把高于平均分的学生学号和成绩显示出来。学号001002003004005006007008009010成绩84967059428883907864第7章 数组与自定义类型7.4 常用算法举例例例7-5 7-5 输入多名学生的一门课程的考试成绩,统计各分数段学生人数。例例7-6 7-6 输入一串字符,统计各字母出现的次数(不区分大小写),并输出统计结果。用随机函数产生10个两位数的整数放入数组中,求最大值及其位置。第7章 数组与自定义类型7.4 常用算法举例 用随机函数产生10个整数放入数组中,找出其中的最小数并放入数组的第一个元素中。2、排序 排序是
23、将一组数按递增或递减的次序排列。常用排序的有选择法、冒泡法、插入法、希尔法等。例7-7 用选择排序法,将10个整数(随机函数产生)按照由小到大的顺序递增排列。选择排序法算法步骤如下:(1)从n个数中找出最小数的下标,并将最小数与第一个数交换位置,这样就可将n个数中的最小数放在数组中的第一个数位置上。(2)对其余n-1个数再按步骤(1)选出次小的数,与第2个数交换位置。重复步骤(1)共n-1次,最后数组元素就是按递增顺序排列的。第7章 数组与自定义类型7.4 常用算法举例3、查找 查找是在数组中根据指定内容,找出与其相同的元素。常用的方法有顺序查找和二分法查找。例例7-8 7-8 给定一组数15
24、、8、4、13、6、10、17、1,从键盘输入一个数,用顺序查找法找出该数在数组中的位置。第7章 数组与自定义类型7.4 常用算法举例4、插入或删除数组元素 在数组中插入元素的过程是:(1)输入插入的位置及要插入的数;(2)增加数组元素个数;(3)将待插入位置以后的数逐一后移一位,腾出插入位置;(4)在插入位置上插入数。例7-9 已知一组数15,8,4,13,6,10,17,1,插入一个数到数组指定位置。第7章 数组与自定义类型7.4 常用算法举例已知一组数15,8,4,13,6,10,17,1,从数组中删除指定的数。(1)输入要删除的数;(2)在数组中找到要删除的数的位置k,如果数组中没有要
25、删除的数,输出提示信息;(3)将k以后的每一个元素前移一位,覆盖要删除的数;(4)减少数组元素的个数,完成删除。第7章 数组与自定义类型7.5 二维静态数组1、格式:Dim 数组名(下界1 To 上界1,下界2 To 上界2)As n作用:声明(上界1下限1)*(上界2下限2)个连续的存储单元。例如:Dim a(1 to 5,1 to 4)as long 声明了一个长整型的二维数组a,第1维下标范围为15,第2维下标范围为14,元素个数为5*4个,每个元素占据4个字节的存储空间 第7章 数组与自定义类型7.5 二维静态数组a(1,1)a(1,2)a(1,3)a(1,4)a(2,1)a(2,2)
26、a(2,3)a(2,4)a(3,1)a(3,2)a(3,3)a(3,4)a(4,1)a(4,2)a(4,3)a(4,4)a(5,1)a(5,2)a(5,3)a(5,4)第7章 数组与自定义类型7.5 二维静态数组2、为二维静态数组元素赋值3、二维静态数组输出4、二维静态数组应用例7-7 有一个5行5列的二维数组,元素值随机产生,求所有元素的和。求一个5行5列的二维数组,元素值随机产生,求两个对角线各元素的和。例7-8 有一个5行5列的二维数组,元素值随机产生,请将其转置(行变列,列变行)后输出。第7章 数组与自定义类型7.6 控件数组1、基本概念 控件数组由一组同类控件组成,它们共用一个控件名
27、,具有相同的属性,系统给每个控件数组元素赋予惟一的一个索引号(类似于数组元素的下标),第1个控件数组元素的索引号为0,第2个控件数组元素的索引号为1,依次类推。控件数组中的元素具有共同的事件过程。例如:若控件数组Command1有4个命令按钮元素,不管单击哪个命令按钮,都会调用同一个单击事件过程,格式如下:Private Sub Command1_Click(Index As Integer)End Sub 第7章 数组与自定义类型7.6 控件数组2、建立控件数组的方法(1)设计时建立 (2)在程序运行时建立3、应用举例 例7-14 输入两个数,根据不同的运算符计算相应的运算结果。第7章 数组
28、与自定义类型7.7自定义数据类型 在VB中,利用系统提供的标准数据类型定义变量,可以存储那些相互独立、没有内在联系的数据,借助数组能存储一组性质相同的数据。但实际应用中,对事物的描述往往需要两个或两个以上的基本数据项 学号学号姓名姓名性别性别出生日期出生日期语文语文数学数学总分总分99310李小华男1985年2月859518099311张红玉女1984年12月73587160599312田 宝男1986年1月8279161学生成绩登记表第7章 数组与自定义类型7.7自定义数据类型 若采用数组存储,则需要3个字符型数组分别存储学号、姓名和性别,1个日期型数组存储出生日期,1个二维数组存储成绩,这
29、种方法尽管解决了数据的存储问题,但处理起来将会非常麻烦。学号学号姓名姓名性别性别出生日期出生日期语文语文数学数学总分总分99310李小华男1985年2月859518099311张红玉女1984年12月73587160599312田 宝男1986年1月8279161字段纪录字段名第7章 数组与自定义类型7.7自定义数据类型1、自定义数据类型的定义格式:Type 自定义类型名 字段1 as 类型名1 字段2 as 类型名2 字段n as 类型名n End Type其中:自定义类型名是用户欲定义的数据类型名(注意,它不是变量名),其命名规则与变量名命名规则相同;字段是组成自定义数据类型的元素,其命名
30、规则也与变量名命名规则相同;类型名可以是任何基本数据类型,也可以是用户定义数据类型。第7章 数组与自定义类型7.7自定义数据类型如:Type studtype xh as string*5 xm as string*8 xb as string*2 csrq as date yw as single sx as single zf as single End Type在使用Type语句时,应注意以下两点:(1)自定义类型一般放在标准模块中,默认为Public;(2)自定义类型中的字符型字段必须设置成定长字符串。第7章 数组与自定义类型7.7自定义数据类型2、使用自定义数据类型声明变量 完成自定义数据类型定义后,自定义数据类型就自动保存在“列出成员”中。就可以象使用标准数据类型一样定义变量类型,格式如下:Dim 变量名 as 自定义类型名3、为自定义数据类型的变量赋值 当变量被声明成自定义数据类型后,它就具有这种数据类型的各个字段(或称域),为各字段赋值的格式如下:变量名.字段名=表达式