VB数组与记录

上传人:xx****x 文档编号:243397456 上传时间:2024-09-22 格式:PPT 页数:49 大小:160KB
返回 下载 相关 举报
VB数组与记录_第1页
第1页 / 共49页
VB数组与记录_第2页
第2页 / 共49页
VB数组与记录_第3页
第3页 / 共49页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第七章 数组与记录,数组,1 一维数组,2 二维数组,3 数组的其它形式,可调数组、静态数组、 数组刷新语句、可变类型数组,控件数组,记录类型,概念、定义的方法、访问方法,1,数组的概念,譬如我们在程序中有20个数,代表20个圆的半径,我们通常会用变量r1、r2r20来表示,如果我们将r1到r20这些变量名分离开来,即用r(1)、r(2)r(20),这样我们就称r(1)、r(2)r(20)为一数组,其中r称为数组的变量名,,而1到20称为,数组的下标,。,如果r(1)到r(20)表示的是数值型的数,则称其为数值型数组,而如果r(1)到r(20)表示的是字符串,则称其为字符串型数组。数组中的每一项都称为是数组的元素,。,2,一维数组,数组是一组数据,它们有相同的数据类型与特点,为提高程序效率,可用一个名字表示这一组数据,这个名字称为数组名,数组中的每个数据称为一个数组元素,数组元素之间用下标来区别。数组元素的个数称为数组的大小或长度。根据数组下标的个数,可把数组分成一维、二维和多维数组。和变量一样,数组也要先定义,后使用。,一维数组的定义一般形式为:,Dim 数组名(n) As 类型名 自动数组,Static 数组名(n) As 类型名 静态数组,n为正的长整常数,用于指定数组大小(即数组元素个数)。一维数组在内存中按数组元素顺序依次连续存放。,3,有关数组的说明,1 数组的下标默认从0开始,顺序增加至n,故数组的大小应为n+1。,例:Dim intM(5) As Integer,定义了一个整型数组,它有6个元素,在内存中分配空间如下:,intM(0) intM(1) intM(2) intM(3) intM(4) intM(5),2,可以更改下标下界默认值,从1开始。,方法为:在模块开头模块的声明段中加入语句:,Option Base 1,即指定数组下标从1开始,这时上例数组的元素个数为5。,3 可以任意指定数组下标的上下界。定义形式为:,Dim 数组名(m To n) As 类型名,此时数组元素个数为:m-n+1。,例:Dim sngArray(-10 To 2) As Single,Dim DblArray(-5 To 5) As double,4,4,数组的引用,一般是通过使用数组元素来引用数组的。数组元素的下标可以使用整型常量或变量,甚至可使用表达式。数组元素在程序中的地位相当于变量,用法也与变量相似。,例:x = intM(2) * 5 b,5,数组的输入输出,(1)直接赋值,例:给上例定义的数组可如下赋值:,intM(0)=80: intM(1)=83: intM(2)=70,intM(3)=68: intM(4)=90: intM(5)=86,数组在内存中存放如下:,intM(0) intM(1) intM(2) intM(3) intM(4) intM(5),8083 70 68 90 86,(2)用循环语句,例:Dim i As Integer , Score(6) As Integer,For i = 1 To 6,score(i) = InputBox(请输入第 & i & 个数组元素),Next i,5,一维数组使用实例,1,找出某门课中最高分数,算法:,设第一个人成绩最高,然后所有成绩依次与之比较,比他大时用新的最高分代替原来的最高分,6,Option Explicit,Option Base 1,Private Sub Command1_click(),Randomize,Dim i As Integer,Dim Score(10) As Integer, max As Integer,For i = 1 To 10,Score(i) = Int(40 * Rnd + 60),生成60到100之间的随机数,Print Score(i);,Next i,max = Score(1),For i = 2 To 10,If max a(2),,则,a(1),和,a(2),交换,然后比较,a(2),和,a(3),,依次类推,直到,a(n-1),和,a(n),比较为止,此时将最大的值置于最低端,然后再进行第二趟比较,即比较,a(1),到,a(n-1),,将其中最大值置于低端.。对于冒泡法而言,只要某趟排序数组元素没有进行过交换,则说明排序已经完成,就无需进行下面的比较了。,8,Const n = 15,Dim a(1 To n) As Integer, work As Boolean,Dim i As Integer, j As Integer, x As Integer,Randomize,For i = 1 To n,a(i) = Int(90 * Rnd) + 10,Print a(i);,Next i,Print,For i = n To 2 Step -1,work = True,For j = 1 To i - 1,If (a(j) a(j + 1) Then,x = a(j),a(j) = a(j + 1),a(j + 1) = x,work = False,End If,Next j,If work Then Exit For,Next i,For i = 1 To n,Print a(i);,Next i,9,二维数组(有两个下标的数组),二维数组用于处理象表格这样的数据。,例如:全班各门课成绩表:,姓名,数学物理计算机 英语,李翰,87.589.0 91.5 88.5,韩旭,83.576.0 65.5 90.0,白洁,56.064.0 87.5 78.0,汪洋,84.055.0 88.0 65.5,对于这类表格形式的数据,我们可以用行和列来指定其中的某个元素,如第一行第二列的元素值为89.0,如果用数组的有两个下标就可以这些存储起来。,10,二维数组定义,二维数组定义方法如下:,Dim 数组名(m,n) As 类型名,其中m为第一维大小(表示行),n为第二维大小(表示列),均为正整数。,例: Dim intN(2,3) As Integer,定义了一个3行4列的二维数组intN,在内存中存放如下:,由上例可以看出,二维数组,intN,的元素个数为:34=12,和一维数组一样,也可用,Option Base 1,语句,让下标从1开始,则上例数组元素个数即为:236。,二维数组也可任意指定上下界,格式与一维数组类似。,例:,Dim intN(-2 To 1 , 3 To 6) As Integer,定义了一个有(1-(-2)+1) (6-3+1)=16个元素的二维数组。,11,二维数组使用实例,例1:上例成绩求出各同学总分,姓名,数学物理计算机 英语,李翰,87.589.0 91.5 88.5,韩旭,83.576.0 65.5 90.0,白洁,56.064.0 87.5 78.0,汪洋,84.055.0 88.0 65.5,分析:本题我们可以定义一个二维数组,Score(4,5),下标从1开始,其中前一下标表示人名,而后一下标表示科目,后一下标为5记录总成绩。,12,源代码,:,Option Base 1,Dim score(4, 5) As Single, i As Integer, j As Integer,score(1, 1) = 87.5: score(1, 2) = 89,score(1, 3) = 91.5: score(1, 4) = 88.5,score(4, 1) = 84: score(4, 2) = 55,score(4, 3) = 88: score(4, 4) = 65.5,Print 数学, 物理, 计算机, 外语, 总分,For i = 1 To 4,score(i, 5) = 0,For j = 1 To 4,score(i, 5) = score(i, 5) + score(i, j) 计算总分,Print score(i, j),Next j,Print score(i, 5),Next i,End Sub,初始化,13,二维数组使用实例,例2:求矩阵相乘C = A B,A、B、C分别为mp,pn,mn的矩阵,分析:每个矩阵都可用一个二维数组来表示,如果矩阵A和B是给定的,我们就要用赋值语句对其初始化。而在此例中我们利用随机函数给出A和B,而根据矩阵的乘法,C应为,14,源代码:,Dim a(2, 4) As Integer, b(4, 3) As Integer, c(2, 3) As Integer,Dim i As Integer, j As Integer, k As Integer,Randomize,Print a:,For i = 1 To 2,For j = 1 To 4,a(i, j) = Int(10 * Rnd) + 1,Print a(i, j);,Next j,Print ,Next i,Print b:,For i = 1 To 4,For j = 1 To 3,b(i, j)=Int(10 * Rnd) + 1,Print b(i, j);,Next j,Print ,Next i,上面两段用来对矩阵,A,和,B,赋值,15,Print c:,For i = 1 To 2,For j = 1 To 3,For k = 1 To 4,c(i, j) = c(i, j) + a(i, k) * b(k, j),Next k,Print c(i, j);,Next j,Print ,Next i,通过累加计算,C,中的每个元素。,16,多维数组,二维以上的数组统称为多维数组。一般情况下,数组下标有几个就称为几维数组。但三维以上的数组很少使用。多维数组的定义方式与二维数组相似,一般形式如下:,Dim|Static 数组名(m1 To n1,m2 to n2,) As 类型名,如:Dim AB(4,5,6),定义了一个三维数组,其元素的总数为5*6*7=210,17,数组的其他定义形式,一、,可调数组,以上介绍的数组,大小是固定的,定义时上下标都是常数,称为常规数组。对事先无法确定数组大小的情况,VB还提供了可调数组,即数组说明后还可改变大小和维数的数组。,18,可调数组的创建:,1.,可调数组的定义,可调数组的定义形式如下:,Dim 可调数组名( ) As 类型名,2.可调数组的重定义,和常规数组不同的是:可调数组定义后还不能立即使用,必须根据当前具体要求使用ReDim语句来重定义可调数组的维数、元素个数和下标上下界。语法为:,ReDim 可调数组名(m1 To n1,m2 to n2,),例:Dim intN( ) As Integer 定义数组intN为可调数组,ReDim intN(8) 重定义intN为一维数组,大小为9,ReDim intN(2 , 3 To 5) 重定义intN为二维数组,大小为3(5-3+1)=9,19,3. 保留可调数组以前的值,一般情况下可调数组重新定义后会删除数组中原有的数据,若希望在重新说明后保留以前数组中的值,要在ReDim语句中使用关键字Preserve。,例:ReDim Preserve intN(2 , 3 To 5),注意:,1),使用Preserve关键字后,只允许改变可调数组的最后一维下标的上界。,2) 使用语句重新定义可调数组时下标的值可以使用变量。,20,可调数组的实例,用折半查找法在一组已数列中找出所要的数。,设要找的数为,59,10 top,1,17,20,22,31,35,44 mid1 top,2,51 mid,3,top,4,59 mid,4,68 mid,2,bot,3,73,89,95 bot1,21,源代码:,Dim i As Integer, j As Integer, t As Integer, c As Integer,Dim score() As Integer, num As Integer,Dim top As Integer, bot As Integer, mid As Integer,Dim loca As Integer,Randomize,num = InputBox(数列项数),ReDim score(num) 重定义数组,For i = 1 To num,score(i) = Int(30 * Rnd) + 1,Next i,For j = 1 To num - 1,For i = 1 To num - j,If score(i) score(i + 1) Then,t = score(i): score(i) = score(i + 1): score(i + 1) = t,End If,Next i,Next j,Print 排好序的数列:,For i = 1 To num : Print score(i); : Next i,Print,初始化数组并排序,22,C = InputBox(“输入要查找的数:”),loca = 0: top = 1: bot = num,Do While loca = 0 And top = bot,mid = (top + bot) 2,If score(mid) = c Then,loca = mid,ElseIf score(mid) 7 Then Exit Sub 控件数组最多只能有8个,Load Opt(maxidx) 添加一个单选按钮,Opt(maxidx).Top = Opt(maxidx - 1).Top + 360 设置位置,Opt(maxidx).Visible = True 使添加的按钮可见,End Sub,Private Sub Command2_Click(),Static idx,If idx = 0 Then idx = 8 从第8个按钮开始删除,idx = idx - 1,If idx 2 Then Exit Sub 保留最初的两个单选按钮,Unload Opt(idx) 删除一个按钮,End Sub,32,图像框控件数组的应用,利用图像框数组和计时器控件可方便地产生动画效果。如,我们有8幅月亮的阴晴圆缺的图像和5幅人脸喜怒哀乐的图像就可以用计时器加以控制,制作“阴晴圆缺”、“悲欢离合”的动画。在本例中我们用了两个计时器来分别控制图像框(imagebox)和标签(label)。,人月交辉,33,控制图像框的计时器事件过程:,Private Sub Timer1_Timer(),Static i As Integer, i1 As Integer,Dim j As Integer, k As Integer, j1 As Integer, k1 As Integer,j = i Mod 8,For k = 0 To 7,If k = j Then,Image1(k).Visible = True,Else,Image1(k).Visible = False,End If,Next k,i = i + 1,j1 = i1 Mod 5,For k1 = 0 To 4,If k1 = j1 Then,Image2(k1).Visible = True,Else,Image2(k1).Visible = False,End If,Next k1,i1 = i1 + 1,End Sub,34,控制标签的计时器事件过程:,Private Sub Timer2_Timer(),Static i As Integer,Dim j As Integer, k As Integer,j = i Mod 4,Select Case j,Case 0,ption = 月有阴晴圆缺,Case 1,ption = ,Case 2,ption = 人有悲欢离合,Case Else,ption = ,End Select,i = i + 1,End Sub,35,记录类型,记录类型又称之为自定义型数据,它是一种组合数据类型,即和数组一样由多个数据组成,但和常规数组不同的是自定义型数据中的元素类型可以不一致。,如自定义型数据可以用来处理这样的表格:,自定义类型由于内部组成千变万化,所以只能由用户自己来定义这种数据的内部结构。,36,1.,定义语法,定义语法如下:,Public|Private Type 自定义类型数据名,元素名1 As 类型名,元素名2 As 类型名,End Type,说明:,1,)自定义类型中的元素可以是变量或数组或另一个已定义的自定义类型数据。定义后,可以用来定义变量或数组。,2)自定义类型数据只能是全局级或模块级,默认为全局级,因此只能在模块说明段定义。,37,如上表格例:,Private Type Student,name As String*4,gender As Boolean,birthday As Date,score(4) As Integer,End Type,注意:定义了一个自定义数据类型只是给计算机指定了一种数据类型的内存分配方案,并没有真正定义变量,要想使用自定义类型变量,必须用类型名Student来定义变量或数组。,例:Dim First As Student,定义了一个Student自定义型变量First,在内存中占用4+2+8+4*2=22字节,38,记录类型定义方法,由于记录类型是全局型的或模块型的,因而只能在标准模块或窗体模块中定义,1 在窗体模块中定义,记录类型在窗体模块中定义时,必须是私有的,因而需加上Private。在窗体中定义的记录类型只适用于该窗体的通用部分以及窗体上控件的事件过程。,39,2 在标准模块中定义:,标准模块又称全局模块,在其中定义的常量、变量和记录类型等可供整个工程调用。,可通过VB的工程菜单中的“添加模块”命令来添加一个标准模块,并编写相应的代码,定义记录类型。,注意:标准模块保存在以.,bas,为后缀的文件中,可通过工程管理窗口查看,40,记录类型的引用,由于一个自定义类型变量中有多个元素,所以和数组名一样,不能直接引用变量名,只能引用其中的元素。,1.,引用方法,引用方法为: 变量名.元素名,例: 引用自定义型变量First的第一个元素字符串name,41,上例表格处理:,Private Sub Command1_Click(),Dim First As Student,= 王小平,First.gender = True,First.birthday = #9/20/1984#,First.score(1) = 98,First.score(2) = 90,First.score(3) = 80,First.score(4) = First.score(1) + First.score(2) + First.score(3),Prin, First.gender, First.birthday, First.score(1); _,First.score(2); First.score(3); First.score(4),End Sub,记录类型用法,42,With语句,当连续的若干条语句都在引用同一个记录类型变量时,使用,With,结构,可以省略变量名。,With,语句格式为:,With,记录类型变量名,语句块,End With,43,Private Sub Command1_Click(),Dim First As Student,With First,.name = 王小平,.gender = True,.birthday = #9/20/1984#,.score(1) = 98,.score(2) = 90,.score(3) = 80,.score(4) = .score(1) + .score(2) + .score(3),Print .name,.gender,.birthday,.score(1);.score(2); .score(3); .score(4),End With,End Sub,With,语句的用法,44,另外:也可利用With语句在连续给某个对象属性赋值时,省略对象名。,例:用with语句改变图像框的属性,With Picture1,.Height = 350 * n,.Width = 350 * n,.Top = (Frame1.Height - .Height) / 2,.Left = (Frame1.Left - .Width) / 2,End With,45,记录类型的嵌套,记录类型允许嵌套,即某个记录类型中的元素的类型允许为其它的记录类型。如:我们首先定义一个日期记录类型:,Type Dat,year As Integer,month As Integer,day As Integer,End Type,然后,我们可以再定义一个student记录类型:,Private Type Student,name As String*4,gender As Boolean,birthday As Dat,score(4) As Integer,End Type,此时,,birthday,这个元素的类型就变成了,Dat,型,而它本身就是一个记录类型,46,嵌套记录变量的引用,如果要引用嵌套的记录变量,可通过以下语句实现。如在某过程中,我们首先定义了一个student类型的变量first:,dim first as Student,first.birthday.year=1984,first.birthday.month=9,first.birthday.day=20,如上例我们要通过嵌套的记录变量来实现,可通过以下代码:,47,Dim First As Student,Dim tem As String,= 王小平,First.gender = True,First.birthday.year = 1984,First.birthday.month = 9,First.birthday.day = 20,First.score(1) = 98,First.score(2) = 90,First.score(3) = 80,tem = Str(First.birthday.year) + - + Str(First.birthday.month) _,+ - + Str(First.birthday.day),First.score(4) = First.score(1) + First.score(2) + First.score(3),Prin, First.gender, tem, First.score(1); _,First.score(2); First.score(3); First.score(4),嵌套的引用,48,Dim First As Student,Dim tem As String,With First,.name = 王小平,.gender = True,With .birthday,.year = 1984: .month = 9:.day = 20,End With,.score(1) = 98,.score(2) = 90,.score(3) = 80,tem = Str(.birthday.year) + - + Str(.birthday.month) _,+ - + Str(.birthday.day),.score(4) = .score(1) + .score(2) + .score(3),Print .name, .gender, tem, .score(1); .score(2); .score(3); .score(4),End With,内层的嵌套,With,语句的嵌套,49,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!