已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主讲:冯 元,Visual Basic 程序设计,2,第七章 数组与自定义数据类型,7.1 数组概述 7.2 常规数组 7.3 动态数组 7.4 数组函数与语句 7.5 数组作参数与返回值 7.6 自定义数据类型,3,7.1 数组概述,本节知识点: 数组 与数组相关的概念,4,7.1 数组概述,什么是数组:在实际应用中,常常需要处理同一类型的成批数据。例如,为了处理一个班学生的某门课程的考试成绩,可以用变量S1, S2, S3, S4, , 分别代表每个学生的分数,其中S1代表第一个学生的分数,S2代表第二个学生的分数 。 在VB中,把一组相关的同类型数据放在一起并用一个统一的名字作为标识,这就是数组。 问题:如何区分具有统一名称的一组数据?,5,7.1 数组概述,与数组相关的几个概念: 数组名:代表整个数组,命名规则与变量相同。 数组元素:一个数组元素相当于一个变量,数组是元素的有序集合。 数组下标(Index):数组中各元素的序号,连续的整数。通过数组名和下标可以访问指定的数组元素。 数组维数:指定数组中一个元素所需下标的个数,可以是一维、二维、三维、四维等。 下标的上界和下界:数组某维下标的最小值和最大值,可用来确定数组中元素的个数。,6,7.1 数组概述,与变量相比,数组有以下优点: 数组能够保存多个值; 数组可与循环语句配合实现复杂算法; 数组可作通用过程的参数,传递大量的值; 数组可作函数过程的返回值,可返回大量的值; 数组常用来表示与一维、二维、三维空间分布相关的数据,非常直观; 动态数组可根据需要开辟内存空间,优化程序、提高效率。,7,7.1 数组概述,数组必须先定义才能使用。定义时要指定数组的数组名、数据类型、作用域。 如果定义数组时指定了下标的上下界,则称为固定数组(又称为常规数组)。常规数组在程序运行过程中元素个数保持不变。 如果定义数组时未指定下标的上下界,则称为动态数组。程序运行时,可以通过重定义来改变下标的上下界,从而改变元素个数和维数。,8,7.2 常规数组,本节知识点: 定义数组 一维数组 二维数组 多维数组,9,7.2 常规数组,1、定义数组 定义常规数组的语法格式: 注意:全局数组必须在标准模块中定义,不能在窗体模块中定义。,Public|Private|Dim|Static 数组名(维数与下标界限) As (数据类型名),10,7.2 常规数组,2、一维数组 只需一个下标就可以唯一确定一个元素的数组。 使用关键词To指定下标的上下界: Dim Myarray(m To n) As Integer m为下标下界,n为下标上界,m和n必须为整数常量,并要求m=n。,11,7.2 常规数组,仅指定下标上界,由Option Base语句指定下标下界 Dim Myarray(n) As Integer 在代码窗口的通用声明段中使用如下语句定义下标下界。 Option Base 0|1 如果没有使用Option Base语句,默认为0。 Option Base语句不影响以To关键词定义的下标上下界。,12,7.2 常规数组,一维数组元素的个数: 数组元素个数 = 下标上界 - 下标下界 +1 Dim a(0 To 5) As Integer Public b(-5 To 5) As Double Dim c(10) As Boolean 下面的定义方式是允许的: Dim j(4+5) As Integer Dim k(4.5) As Integer,13,7.2 常规数组,下面是定义定义数组时可能出现的错误: Dim d(n) As Integer Dim e(4 To 1) As Integer Dim f(-5) As Integer,14,7.2 常规数组,访问数组元素: 常规数组定义后,便可通过数组名和下标访问指定的元素: 数组名(下标) 访问数组元素时的“下标”可以是整型(或长整型)常量、变量或表达式。下标值不能超越数组下标的上下界,否则会引发“下标越界”错误。 数组元素可以像普通变量一样被赋值、参与表达式计算、作为实参调用通用过程,可使用循环语句对多个元素进行“批量”操作。,15,7.2 常规数组,例子: Dim a(0 To 5) As Integer 为数组元素赋值: a(0) = 1: a(1) = 3: a(2) = 5: a(3) = 7: a(4) = 9: a(5) = 11,a(0) a(1) a(2) a(3) a(4) a(5),16,7.2 常规数组,使用循环语句为数组元素赋值: For i = 0 To 5 a(i) = 2 * i +1 Next,a(0) a(1) a(2) a(3) a(4) a(5),17,7.2 常规数组,例7.2 找出数组元素中的最大值、最小值并计算平均值。 Option Base 1 Private Sub Command1_Click() Const N As Integer = 10 定义常量 Dim a(N) As Integer 定义数组 Dim i As Integer, sum As Integer, max As Integer, min As Integer For i = 1 To N a(i) = Rnd * 100 为数组元素赋随机值 Print a(i) Next max = a(1) : min = a(1) : sum = a(1) For i = 2 To N If max a(i) Then min = a(i) sum = sum + a(i) Next Text1.Text = max Text2.Text = min Text3.Text = sum / N End Sub,18,7.2 常规数组,3、二维数组 二维数组是指有两个下标的数组,每个下标对应一“维”。定义二维数组的语法格式为: 二维数组中每一维下标的定义方式与一维数组相同. 例子:Dim a(4 , 5) As Integer Public b(-5 To 5 , 10) As Double Private c(1 To 10 , 2 To 5) As Boolean,Dim 数组名(第一维下标界限 , 第二维下标界限) As 数据类型名,19,7.2 常规数组,二维数组的元素个数是各维下标取值个数之积。 二维数组可以被理解为二维表格。如图,是一个记录学习成绩的表格,由行和列组成。,20,7.2 常规数组,通常,二维数组的第一维代表行,第二维代表列。 可以使用如下语句为二维数组中的元素赋值: a(i , j) = k 可以使用循环语句来操作二维数组: sum = 0 For i= 1 To 4 sum = sum +a(1, i) Next Print sum/4,21,7.2 常规数组,sum = 0 For i = 1 To 3 For j = 1 To 4 sum = sum +a(i, j) Next Next Print sum/12,22,7.2 常规数组,4、多维数组 多维数组:是指三维或三维以上的数组,是在一维和二维概念上的扩展。多维数组的定义、元素的访问方式与一维和二维数组类似。 例子: Dim a(3, 3, 4) As Integer Dim b(1 To 10,-4 To 5, 10, 20) As Single 三维以上的数组使用较少。,23,7.2 常规数组,三维数组的含义:立体表格。,24,7.2 常规数组,三维数组的含义:立体表格。,25,7.3 动态数组,本节知识点: 动态数组的概念 定义动态数组 重定义动态数组 Preserve关键字,26,7.3 动态数组,在编程过程中,当无法事先确定应为数组定义多少元素时,可使用VB提供的动态数组。 动态数组的维数和下标上下界可在程序运行过程中进行改变。,27,7.3 动态数组,1、定义动态数组 定义动态数组的的语法结构与定义常规数组相似,只是括号是空的: Public|Private|Dim|Static 数组名( ) As 数据类型名 定义语句确定了动态数组的名称、作用域和数据类型。在使用ReDim语句重新定义之前,动态数组没有元素,不能使用。,28,7.3 动态数组,2、重定义动态数组 重定义是指定动态数组的维数和下标界限: ReDim 动态数组名(m1 To n1, m2 To n2, ) ReDim语句指定动态数组维数和下标界限的方法与Dim定义常规数组相同。 对于同一个动态数组,重定义ReDim语句可反复使用,即可以多次改变该动态数组的维数和下标界限.,29,7.3 动态数组,例子:,30,7.3 动态数组,3、Preserve关键字 ReDim语句会清除重定义之前动态数组所有元素中的数据,使用默认值来填充。 如果希望重新定义之后,保留那些原来就有的数组元素值,则必须使用Preserve关键字。,31,7.3 动态数组,注意:使用Preserve关键字时,只允许ReDim语句改变数组的最后一维的上界,如果改变了其他维的上下界、最后一维的下界或者维数,都会出错。 【例7.3】矩阵的转置。矩阵是由N行M列数值组成的特殊数据形式,本例涉及的是方阵(即N=M,N称为阶数)。矩阵的转置是指行列数据交换(即沿对角线反转,如图)。,32,7.3 动态数组,3、Preserve关键字 ReDim语句会清除重定义之前动态数组所有元素中的数据,使用默认值来填充。 如果希望重新定义之后,保留那些原来就有的数组元素值,则必须使用Preserve关键字。,Private Sub Command1_Click() Dim n As Integer, i As Integer, j As Integer, t As Integer Dim a() As Integer 动态数组 n = Text1.Text 矩阵阶数 ReDim a(n, n) 重定义动态数组 Print “原矩阵“ For i = 1 To n For j = 1 To n a(i, j) = (i - 1) * n + j 生成矩阵元素 Print a(i, j), 显示矩阵元素 Next Print 换行 Next For i = 1 To n For j = 1 To i - 1 注意循环的终止值 t = a(i, j) 交换元素的值 a(i, j) = a(j, i) a(j, i) = t Next Next Print “转换后“ For i = 1 To n For j = 1 To n Print a(i, j), 显示矩阵元素 Next Print 换行 Next End Sub,33,7.4 数组函数与语句,本节知识点: LBound函数、UBound函数 Erase语句,34,7.4 数组函数与语句,为了方便数组的处理,VB提供了一些与数组操作有关的内部函数和语句。 LBound函数、UBound函数 LBound( ArrayName , Dimension) UBound( ArrayName , Dimension) 参数ArrayName指定数组名,参数Dimension指定第几维,函数LBound返回指定数组指定维下标下界,函数UBound返回指定数组指定维下标上界。 如省Dimension参数,则返回第一维下界或上界。,35,7.4 数组函数与语句,例子: Print “第一维下标下界为:”, LBound(a) Print “第二维下标上界为:”, UBound(a, 2) Erase语句 Erase 数组名1 , 数组名2, Erase语句对数组进行初始化操作。对常规数组,初始化为数据类型的默认值。对动态数组,则释放动态数组的存储空间,要继续使用该动态数组,必须使用ReDim语句重新定义。,36,7.5 数组作参数与返回值,本节知识点: 数组做参数 函数返回数组,37,7.5 数组作参数与返回值,1、数组作参数 在编写通用过程时,允许定义数组参数,这样便可以使用一个参数传递大量的值。 数组形参的定义: 过程名 (ByRef 数组形参名() As 数据类型名, ),38,7.5 数组作参数与返回值,说明: 数组形参名后必须加空括号,并且不能使用ByVal关键字修饰,因为数组参数必须按地址传递。 调用时,相应的实参必须是与形参相同类型的数组,可以带空括号。 一个通用过程可以定义多个数组参数。 形参数组可以是任意维的,由实参数组决定。,39,7.5 数组作参数与返回值,因为是按地址传递,在通用过程中修改形参数组的元素值可以改变父过程中实参数组的元素值。如果实参是动态数组,则相应的形参也可以被看作为动态数组,在子过程中可以使用ReDim语句重新定义,改变数组维数、下标上下界以及元素值,同时也改变了父过程的数组。,40,7.5 数组作参数与返回值,例子7.6 使用数组参数编写求和函数sum。 Option Explicit Option Base 1 Private Function sum(b() As Integer) As Long Dim i As Integer For i = LBound(b) To UBound(b) sum = sum + b(i) Next End Function Private Sub Command1_Click() Dim i As Integer Dim a(10) As Integer 定义整型数组 For i = 1 To 10 为数组元素赋值 a(i) = 2 * i - 1 Next Print sum(a) 数组作参数,计算数组元素之和 End Sub,41,7.5 数组作参数与返回值,2、函数返回数组 将函数的返回值定义为数组可以返回大量的值。 在定义函数过程时,返回值类型后加上空的小括号,表示此函数过程的返回值是一个数组。 Function 函数名(形参列表) As 数据类型名(),42,7.5 数组作参数与返回值,指定函数的返回值:首先在函数体中定义一个与返回值类型相同的数组,把要返回的值赋给数组的各个元素。在返回之前,把这个数组名赋值给函数名,则这个数组会作为返回值返回。 调用返回数组的函数:调用返回数组的函数之前,先定义一个与函数返回值类型相同的动态数组(不必重定义);调用函数时,把返回值赋给定义好的动态数组名。通过动态数组即可访问返回数组中的元素。例子7.10。,43,7.6 自定义数据类型,本节知识点: 自定义数据类型概念 定义自定义数据类型 自定义类型的变量和数组 自定义类型参数 函数返回自定义类型值,44,7.6 自定义数据类型,问题:无论是常规数组还是动态数组都只能存放同一种类型的数据,是否存在一种数据结构,可同时存放不同类型的数据? 例如:一个学生的数据包括: 姓名(String) 年龄(Integer) 性别(Boolean) 出生日期(Date) ,45,7.6 自定义数据类型,1、定义自定义数据类型 自定义数据类型由已存在的数据类型组合而成,可使用Type关键字来定义自定义数据类型。定义自定义数据类型,必须要在模块的声明段中进行。 Public|Private Type 自定义数据类型名 成员名1 As 已有数据类型名 成员名2 As 已有数据类型名 成员名3 As 已有数据类型名 End Type,46,7.6 自定义数据类型,使用Private关键字定义的模块级自定义数据类型,只能在本模块中使用。 使用Public关键字定义的全局自定义数据类型,可在程序的所有模块中使用。无Public和Private关键字,默认为全局自定义数据类型。 必须在标准模块的声明段中定义全局自定义数据类型,不能在窗体模块中定义全局自定义数据类型。,47,7.6 自定义数据类型,例子:定义一个名为Student的模块级自定义数据类型,包含5个成员。 Private Type Student StrName As String * 4 DatBirthday As Date BlnSex As Boolean IntMark(2) As Integer StrHobby() As String End Type,48,7.6 自定义数据类型,2、自定义类型变量和数组 可以使用与基本数据类型一样的语法格式来定义自定义类型的变量和数组。例如: Dim s1 As Student, s2 As Student Dim students(1 To 50) As Student Dim mystudents() As Student Redim mystudents(50),49,7.6 自定义数据类型,访问自定义类型变量或数组元素的成员:为自定义类型变量、数组元素赋值,或使用其值,应使用以下格式: 自定义类型变量名 . 成员名 自定义类型数组(下标) . 成员名 例子: s1.StrName = “张三” s1.IntMark(0) = 85 students(2).DatBirthday = #1988-03-24#,50,7.6 自定义数据类型,为自定义类型变量赋值:为自定义类型变量赋值有两种方法:(1)逐一给各个成员赋值;(2)使用同类型的变量或数组元素为整个变量赋值,被赋值变量的每个成员的值与赋值变量每个成员的值相同。 例子: s1.StrName = “张三” s1.IntMark(0) = 85 s2 = s1 students(2) = s1,51,7.6 自定义数据类型,3、自定义数据类型参数 如果通用过程的形式参数被定义为自定义数据类型,则可以给该通用过程传递自定义类型的值。 若父过程与被调用的子过程不在同一个模块中,必须在标准模块中定义全局的自定义类型。 自定义类型参数必须按地址传递,不能使用ByVal关键字修饰。,52,7.6 自定义数据类型,例7.11 定义一个计算两点间距离的函数过程Distance,该函数的两个形参为Point自定义数据类型。按钮的单击事件过程调用Distance函数计算坐标系中两点间的距离并在文本框中显示结果。 Private Type Point 自定义数据类型,表示点的坐标 x As Single 点的横坐标 y As Single 点的纵坐标 End Type 计算两点距离的函数过程 Private Function Distance (p1 As Point, p2 As Point) As Single Distance = (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y) Distance = Distance 0.5 End Function Private Sub Command1_Click() 计算(-1, -1)和(1, 1)之间的距离 Dim p1 As Point, p2 As Point p1.x = -1: p1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论