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