1 / 44

第 7 章 数组与自定义类型

第 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

binh
Download Presentation

第 7 章 数组与自定义类型

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第7章 数组与自定义类型 7.1 数组的基本概念 7.2 数组的声明 7.3 数组的基本操作 7.4 常用算法 7.5 控件数组 7.6 自定义数据类型

  2. 引例 求某门课6个学生成绩中,高于平均分的学生人数 方法一:用6个变量分别存放6个学生的成绩。

  3. 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

  4. 引例 求某门课6个学生成绩中的高于平均分的学生人数 方法一:用6个变量分别存放6个学生的成绩。 缺点:如果处理的数据增多,需要定义许多变量,给程序的编写带来极大的不方便。 方法二:用一个变量来接收6个学生的成绩(多次赋值)。

  5. 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个学生的成绩。 缺点:如果处理的数据增多,需要定义许多变量,给程序的编写带来极大的不方便。 方法二:用一个变量来接收6个学生的成绩(多次赋值)。 缺点:已处理过的数值不保存,再次对数据处理时,要重新输入。

  7. 7.1 数组概述 1、数组的有关概念 (1)数组:是一个由多个同类型变量组成的集合,简单的讲就是一组同类型的变量。 (2)数组名:这组变量有统一的名称,就是数组名。 (3)数组元素:构成数组的成员。每个数组元素和一个普通变量一样能存放一个数据。 (4)下标:用来标识数组中的每一个元素的序号。 如,有一个数组a,数组元素可分别表示为: ……a(1), a(2), a(3), a(4)……

  8. 7.1 数组概述 2、数组的特点 (1)数组由若干个数组元素组成,数组元素的数据类型一致。 (2)数组元素是有次序存放的,下标代表它在数组中的位置。 (3)数组中各元素之间有内在联系,在内存中占连续的一段存储单元。

  9. 7.1 数组概述 3、数组的分类 (1)按照定义时数组元素个数确定与否,数组可分为: • 静态数组:定义时数组元素的个数就已经确定 • 动态数组:定义时数组元素的个数不确定,在程序运行时根据需要才确定数组元素的多少 (2)按照数组元素下标的个数,数组可分为: • 一维数组:数组元素有一个下标 • 二维数组:数组元素有两个下标 • 多维数组:数组元素有多个下标

  10. 7.2 一维静态数组 1、一维静态数组的定义: Dim 数组名(下界 To 上界)[As <数据类型>] 其中: (1)数组名:数组的名称,命名要符合变量命名规则 (2)下界 To 上界:维说明,确定数组元素下标的取值范围及数组元素的个数(上界-下界+1)。 (3)[As <数据类型>]:用来指明数组元素的类型,默认为变体类型。

  11. 7.2 一维静态数组 举例:定义一个用来存放10个整数的数组。 Dim a(1 To 10) As Integer 说明 (1)定义一个数组,数组名为a (2)数组中有10个数组元素,数组元素分别表示为:a(1), a(2),…… a(10) (3)数组元素的数据类型为整型,使用时与普通整型变量的使用方法类似

  12. 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个字符

  13. 7.2 一维静态数组 2、注意事项 (4)用“Option Base 1”可设定数组元素下界为1,以改变下界默认值为0,该语句必须放在窗体或模块的通用声明段中。 (5)一维静态数组在同一过程中只能声明一次 (6)声明数组后,各数组元素的初值与声明普通变量相同。 (7)声明数组和声明变量一样,数组也有作用范围。 Dim a(1 To 6) As Integer Dim a(8) As Single

  14. 7.2 一维静态数组 3、使用数组编程的一般步骤: (1)定义数组 (2)为数组元素赋值 (3)运算处理数组中的数据 (4)输出结果

  15. 7.2 一维静态数组 例7-1 统计某门课6个学生成绩中高于平均分的学生人数。 解题步骤 (1)定义一个数组用来存放6个学生的成绩 (2)给数组赋值,将6个学生的成绩存入数组 (3)求平均成绩,比较,统计出高于平均分的学生人数 (4)将结果输出 <课堂练习>:用数组求解Fibonacci数列的前20项。 <课堂练习>:用数组求某门课10个学生中的最低成绩、最高成绩和平均成绩。 如果在编写程序时学生人数不确定,该如何解决?

  16. 7.2 一维动态数组 1、概念:动态数组是指在声明数组时不给出数组的大小,而是在程序执行到ReDim语句时才确定大小。 2、定义 创建动态数组通常分为两步: 第一步:在标准模块、窗体的通用程序段或过程中,声明一个省略维说明的数组,格式为: Dim 数组名 () [As<数据类型>] 第二步:根据应用需要,用ReDim声明大小,格式为: ReDim [Preserve] 数组名 (下界 To 上界) [As <数据类型>] 第一步可以省略

  17. 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

  18. 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

  19. 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)输出结果

  20. 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)求出平均分,然后比较,将高于平均分的学生成绩输出

  21. 作业与思考题 作业: 课本 p148 1、2、3 课后预习: 1、为数组赋值的四种方法 2、二维数组

  22. 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

  23. 7.3 一维数组的基本操作 (3)使用Array()函数为数组元素同时赋值 对于变体类型的一维动态数组,还可采用Array()函数为数组各元素同时赋值。格式为: 数组名=Array(<数组元素值表>) 其中 • <数组名>可以是已经声明过的变体类型的动态数组,也可以是没有声明过的数组名。 • 数组元素的个数由<数组元素值表>中数据个数决定,数组的下标下界可由LBound()函数得到(默认为0),下标上界可由UBound()函数得到。

  24. 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

  25. 7.3 一维数组的基本操作 (4)用Split( )函数为数组元素同时赋值 Split( )函数为数组元素赋值的基本方法是:将要赋值的数据以字符串的形式用固定的分隔符分隔开(如“,”),再通过Split()函数将其分离成一个一个的数据后,存放到数组各元素中,格式为: <数组名>=Split(<字符串表达式>,分隔符) 其中: • <字符串表达式>是一组将要为数组赋值的数据,这些数据之间有固定的分隔符。 • 该方法通常和文本框配合使用解决大量数据处理问题。 注意:Split()函数要求所赋值的数组必须是动态数组,可以不提前声明,如果提前声明则必须声明为字符型。

  26. 7.3 一维数组的基本操作 例7-3 使用文本框录入大量的数据,将它们保存在一维数组中,并打印输出(每行显示8个数据)。

  27. 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开始。

  28. 7.3 一维数组的基本操作 2、数组输出 数组元素可通过For循环或For循环嵌套,使用Print方法实现输出到窗体或图片框中。

  29. 7.4 常用算法举例 1、简单统计 例7-4 已知10名学生的学号和一门课程的考试成绩,如下: 把高于平均分的学生学号和成绩显示出来。

  30. 7.4 常用算法举例 例7-5 输入多名学生的一门课程的考试成绩,统计各分数段学生人数。 例7-6 输入一串字符,统计各字母出现的次数(不区分大小写),并输出统计结果。 <课堂练习>用随机函数产生10个两位数的整数放入数组中,求最大值及其位置。

  31. 7.4 常用算法举例 <课堂练习>用随机函数产生10个整数放入数组中,找出其中的最小数并放入数组的第一个元素中。 2、排序 排序是将一组数按递增或递减的次序排列。常用排序的有选择法、冒泡法、插入法、希尔法等。 例7-7 用选择排序法,将10个整数(随机函数产生)按照由小到大的顺序递增排列。 选择排序法算法步骤如下: (1) 从n个数中找出最小数的下标,并将最小数与第一个数交换位置,这样就可将n个数中的最小数放在数组中的第一个数位置上。 (2) 对其余n-1个数再按步骤(1)选出次小的数,与第2个数交换位置。重复步骤(1)共n-1次,最后数组元素就是按递增顺序排列的。

  32. 7.4 常用算法举例 3、查找 查找是在数组中根据指定内容,找出与其相同的元素。常用的方法有顺序查找和二分法查找。 例7-8 给定一组数15、8、4 、13、6、10、17、1,从键盘输入一个数,用顺序查找法找出该数在数组中的位置。

  33. 7.4 常用算法举例 4、插入或删除数组元素 在数组中插入元素的过程是: (1) 输入插入的位置及要插入的数; (2) 增加数组元素个数; (3) 将待插入位置以后的数逐一后移一位,腾出插入位置; (4) 在插入位置上插入数。 例7-9 已知一组数15,8,4,13,6,10,17,1,插入一个数到数组指定位置。

  34. 7.4 常用算法举例 <课堂练习>已知一组数15,8,4,13,6,10,17,1, 从数组中删除指定的数。 (1) 输入要删除的数; (2) 在数组中找到要删除的数的位置k,如果数组中没有要删除的数,输出提示信息; (3) 将k以后的每一个元素前移一位,覆盖要删除的数; (4) 减少数组元素的个数,完成删除。

  35. 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个字节的存储空间

  36. 7.5 二维静态数组

  37. 7.5 二维静态数组 2、为二维静态数组元素赋值 3、二维静态数组输出 4、二维静态数组应用 例7-7 有一个5行5列的二维数组,元素值随机产生,求所有元素的和。 <课堂练习> 求一个5行5列的二维数组,元素值随机产生,求两个对角线各元素的和。 例7-8 有一个5行5列的二维数组,元素值随机产生,请将其转置(行变列,列变行)后输出。

  38. 7.6 控件数组 1、基本概念 控件数组由一组同类控件组成,它们共用一个控件名,具有相同的属性,系统给每个控件数组元素赋予惟一的一个索引号(类似于数组元素的下标),第1个控件数组元素的索引号为0,第2个控件数组元素的索引号为1,依次类推。 控件数组中的元素具有共同的事件过程。 例如:若控件数组Command1有4个命令按钮元素,不管单击哪个命令按钮,都会调用同一个单击事件过程,格式如下: Private Sub Command1_Click(Index As Integer) …… End Sub

  39. 7.6 控件数组 2、建立控件数组的方法 (1)设计时建立 (2)在程序运行时建立 3、应用举例 例7-14 输入两个数,根据不同的运算符计算相应的运算结果。

  40. 7.7自定义数据类型 在VB中,利用系统提供的标准数据类型定义变量,可以存储那些相互独立、没有内在联系的数据,借助数组能存储一组性质相同的数据。 但实际应用中,对事物的描述往往需要两个或两个以上的基本数据项 学生成绩登记表

  41. 7.7自定义数据类型 若采用数组存储,则需要3个字符型数组分别存储学号、姓名和性别,1个日期型数组存储出生日期,1个二维数组存储成绩,这种方法尽管解决了数据的存储问题,但处理起来将会非常麻烦。 字段名 纪录 字段

  42. 7.7自定义数据类型 1、自定义数据类型的定义 格式:Type 〈自定义类型名〉 〈字段1〉 as 〈类型名1〉 〈字段2〉 as 〈类型名2〉 …… 〈字段n〉 as 〈类型名n〉 End Type 其中:〈自定义类型名〉是用户欲定义的数据类型名(注意,它不是变量名),其命名规则与变量名命名规则相同;〈字段〉是组成自定义数据类型的元素,其命名规则也与变量名命名规则相同;〈类型名〉可以是任何基本数据类型,也可以是用户定义数据类型。

  43. 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) 自定义类型中的字符型字段必须设置成定长字符串。

  44. 7.7自定义数据类型 2、使用自定义数据类型声明变量 完成自定义数据类型定义后,自定义数据类型就自动保存在“列出成员”中。就可以象使用标准数据类型一样定义变量类型,格式如下: Dim 变量名 as 自定义类型名 3、为自定义数据类型的变量赋值 当变量被声明成自定义数据类型后,它就具有这种数据类型的各个字段(或称域),为各字段赋值的格式如下: 变量名.字段名=表达式

More Related