《VB数组与过程.ppt》由会员分享,可在线阅读,更多相关《VB数组与过程.ppt(56页珍藏版)》请在三一办公上搜索。
1、第4章 数组与过程,学习目标:掌握数组和过程的概念 掌握数组的定义和应用 掌握Sub过程和Function过程的应用 掌握过程的参数传递与过程的作用域 了解Shell函数,第4章 数组与过程,教学内容:4.1 数组 4.2 过程 4.3 Shell函数,4.1 数组数组的概念,数组用于保存大量的、逻辑上有联系的数据数组的特点:数据中的元素在类型上是一致的 数组元素在内存空间上是连续存放的 数组元素的引用可通过下标进行 数组在使用前必须要定义(声明),返回目录,4.1 数组一维数组的定义和使用,1.数组的定义(声明)Dim 数组名(下界 To 上界)As 数据类型 例如:Dim Data(1 T
2、o 40)As Integer定义数组可以使用类型符 例,Dim Data%(1 To 40)下界的默认值为0 例,Dim Salary(1000)As Currency 通过数组名和下标可引用数组中的元素 例,Data(25)=95 Form1.Print Data(25),返回目录,4.1 数组一维数组的定义和使用,说明-1:数组定义后的初值:数值型数组各元素为0,逻辑型数组各元素为False,字符串数组各元素为空串()。可同时声明几个数组,用逗号分隔,例如 Dim A%(10 To 100),B(800)As Long 定义数组时,下标的下界和上界值只能是常数或常数表达式。下例的定义是错
3、误的 N=100:Dim Data(N)As Integer 定义时,数组的上界值不得超出长整型范围,且数组的上界值不得小于下界值。,返回目录,4.1 数组一维数组的定义和使用,说明-2:数组的元素个数称为数组长度。Lbound()、Ubound()函数可测定数组的下界与上界值例如:Private Sub Form_Click()Dim A%(12 To 24)Print LBound(A),UBound(A)End Sub用Option Base n可设定数组的默认下界n的取值只能是0或1设定方法:在代码窗口的通用声明段中输入 Option Base 0 或 Option Base 1,返回
4、目录,4.1 数组一维数组的定义和使用,2.数组元素的使用 通过数组名和下标例4.1 Private Sub Command1_Click()Dim Data(5)As Integer Dim Sum,I As Integer For I=1 To 5 输入5个数据到数组中 Data(I)=InputBox(输入第&I&个数据)Next I For I=1 To 5 完成5个数组元素的相加 Sum=Sum+Data(I)Next I Print SumEnd Sub,返回目录,For I=1 To 5 Data(I)=InputBox(输入第&I&个数据)Sum=Sum+Data(I)Next
5、 I,4.1 数组一维数组的定义和使用,说明:数组实际上是用一个变量名字代表一组数,这组数是连续排列的,用顺序号作为下标区分各个数。数组下标是一个整型量,如果有小数则自动按四舍五入取整。例如,Data(3.4)=3,而Data(3.5)=2。数组常见的错误:下标出界,返回目录,Test(1)=4Test(2)=3Test(3)=2Test(4)超出定义,4.1 数组一维数组应用例题,例4.3 输出斐波那契级数的前20项 Private Sub Form_Click()Dim F(20)As Integer,I As Integer F(1)=1:F(2)=1 第一、第二项为1 For I=3
6、To 20 第三项起每项为前二项之和 F(I)=F(I-2)+F(I-1)Next I For I=1 To 20 在窗体上输出 Print F(I);If I Mod 5=0 Then Print Next IEnd Sub,返回目录,4.1 数组一维数组应用例题,例4.4 输入一组不重复的数据,找出最大值及其位置Private Sub Form_Click()Const Length=5 定义常量Length作为数组最大下标 Dim Test%(Length),I%,Max%,L%For I=1 To Length 通过键盘输入给数组赋值 Test(I)=InputBox(输入第&I&个数
7、据)Next I Max=Test(1):L=1 设数组第一个元素为最大值 For I=2 To Length If Max Test(I)Then 找到新的最大值,记录其值和位置 Max=Test(I)L=I End If Next I MsgBox 最大值x=&Max&,位置是&LEnd Sub,返回目录,4.1 数组一维数组应用例题,例4.5 产生10个整数到数组中,将其顺序颠倒后输出Private Sub Form_Click()Const Length=10:Dim D(Length)As Integer,I%,Temp%For I=1 To Length 给数组赋值并输出 D(I)
8、=14+I:Print D(I);Next I Print:Print 换行 For I=1 To Length/2 交换 Temp=D(I)D(I)=D(Length-I+1)D(Length-I+1)=Temp Next I For I=1 To Length 交换后输出 Print D(I);Next IEnd Sub,返回目录,D(1)与D(10)交换 D(2)与D(9)交换 D(I)与D(10-I+1),4.1 数组一维数组应用例题,例4.8 产生100个不重复的3位随机整数,并按每行7列的格式输出Private Sub Form_Click()Dim Data(100)As Int
9、eger,I%,J%Randomize Timer 设置随机化种子,保证每组数据不重复 For I=1 To 100 循环产生100个数据 Data(I)=Int(Rnd()*900)+100 For J=1 To I 1 与已经产生的数据比较 If Data(I)=Data(J)Then 数据已存在则舍弃,重新产生 I=I-1 Exit For 提前退出数据比较的循环 End If Next J Next I,返回目录,转下页,4.1 数组一维数组应用例题,I=1:J=1 Do While I 100 Then Exit For Print Data(I);I=I+1 Next J Prin
10、t 打印换行 LoopEnd Sub,返回目录,接上页,For I=1 To 100 Print Data(I);If I Mod 7=0 Then PrintNext I,4.1 数组一维数组应用例题,例4.10 统计成绩分布 Private Sub Form_Click()Dim N(10)As Integer,I As Integer,X As Integer Const m=10 For I=1 To m X=InputBox(请输入+Str(I)+个学生的成绩)X=Int(X/10)也可写成X=X10 N(X)=N(X)+1 Next I Print 100;-;100;N(10)F
11、or I=9 To 0 Step-1 Print 10*I;-;10*I+9;N(I)Next I End Sub,返回目录,4.1 数组排序问题,1.选择法排序(N个数据升序)先假设第1个数据最小,依次同第2、第3、第N个数据进行比较,一旦第1个数据大于其它值则交换。这样,第1轮比较完毕,找出了最小数据作为第1个数据。以第2个数据为最小数据,依次同第3、第4、第N个数据进行比较,若第2个数据大于其它值则交换。这样,第2轮交换完毕,则找出第二小的数据作为第2个数据。依此类推,第N-1轮比较将找出第N-1小的数据,剩下的一个数据就是最大数,排列在最后。以6个数据为例:,返回目录,原始序列:30,
12、20,10,90,50,60第1轮比较结果:10|30,20,90,50,60第2轮比较结果:10,20|30,90,50,60第3轮比较结果:10,20,30|90,50,60第4轮比较结果:10,20,30,50|90,60 第5轮比较结果:10,20,30,50,60|90,4.1 数组排序问题,例4.11 用选择法完成10个随机数据的升序排序。Const N=10:Dim D(N)As Integer,I%,J%,T%Randomize Timer For I=1 To N D(I)=Rnd*100:Print D(I);排序前的数据序列 Next I Print:Print For
13、I=1 To N-1 挑出前N-1个小的数 For J=I+1 To N If D(I)D(J)Then 数据元素交换 T=D(I):D(I)=D(J):D(J)=T End If Next J Next I For I=1 To N 输出排序结果 Print D(I);Next I,返回目录,找最小数据作为第1个数据:I=1For J=2 To N 这里2等价I+1 If D(1)D(J)Then T=D(1):D(1)=D(J):D(J)=T End IfNext J,4.1 数组排序问题,2.冒泡法排序(N个数据升序)第1轮比较:从第1个元素开始,两两相邻比较到N-1,值大的放在后面。比
14、较完毕,最大的数成为第N个元素(沉底)。第2轮比较:从第1个元素开始,两两相邻比较到N-2,值大的放在后面。比较完毕,最大的数成为第N-1个元素。依此类推,直至最后一次比较。,返回目录,4.1 数组排序问题,例4.12 用冒泡法完成10个随机数的升序排序 Const N=10:Dim D(N)As Integer,I%,J%,T%Randomize Timer For I=1 To N D(I)=Rnd*100:Print D(I);Next I Print:Print For I=N-1 To 1 Step-1 大数逐个沉底 For J=1 To I If D(J)D(J+1)Then T=
15、D(J):D(J)=D(J+1):D(J+1)=T End If Next J Next I For I=1 To N 输出排序结果 Print D(I);Next I,返回目录,4.1 数组排序问题,例4.13Private Sub Form_Click()Dim S_Name(7)As String,S_Age(7)As Integer Dim I%,J%,N%N=7 S_Name(1)=李大明:S_Age(1)=18 S_Name(2)=王超:S_Age(2)=21 S_Name(3)=张弓:S_Age(3)=20 S_Name(4)=陈卫国:S_Age(4)=24 S_Name(5)=
16、马太原:S_Age(5)=25 S_Name(6)=吴济贫:S_Age(6)=19 S_Name(7)=戴天:S_Age(7)=18,返回目录,对字符串数组S_Name和S_Age赋值,转下页,4.1 数组排序问题,For I=1 To N-1 用选择法排序 For J=I+1 To N If S_Age(I)S_Age(J)Then S_Age(0)=S_Age(I)S_Age(I)=S_Age(J)S_Age(J)=S_Age(0)S_Name(0)=S_Name(I)S_Name(I)=S_Name(J)S_Name(J)=S_Name(0)End If Next J Next I Fo
17、r I=1 To N Print LeftB(S_Name(I),2);S_Age(I);Next IEnd Sub,返回目录,接上页,在交换年龄值的同时,也要交换姓名,以保持姓名和年龄下标的一致。,函数LeftB()表示按字节取出指定数量的字符。一个汉字占两个字节。,4.1 数组动态数组与静态数组,1.动态数组的声明与使用 声明:说明数组的名称和类型(不说明下标范围)使用前用ReDim语句定义不需要动态数组时,可用Erase语句将其删除 例,统计输入的任意个数之和。Dim N As Integer,A()As Single,i As Integer,s As Single N=InputBo
18、x(输入几个数?)ReDim A(1 To N)For i=1 To N A(i)=InputBox(输入第+Str(i)+个数)s=s+A(i)Next i Print N;个数之和为;s,返回目录,4.1 数组动态数组与静态数组,2.静态数组的声明与使用 用Static声明,元素的值保留到程序运行结束。例如,Private Sub Form_Click()Dim Test(10)As Integer,I As Integer For I=1 To 10 Test(I)=Test(I)+I Next I For I=1 To 10 Print Test(I);Next I Print End
19、 Sub,返回目录,4.1 数组二维数组,1.二维数组的定义(声明)二维数组由行和列组成,有两个下标定义格式:Dim 数组名(下界 To 上界,下界 To 上界)As 数据类型 例如,Dim Data(1 To 5,3 To 9)As Integer下界默认为0 例如,Dim Salary(30,10)As Currency 31行11列二维数组有行、列两维,通常需使用二重循环引用,返回目录,4.1 数组二维数组,二维数组中的数据按行存储,其引用与一维数组相似。Private Sub Form_Click()Dim A(2,3)As Integer,I%,J%,C%For I=0 To 2 F
20、or J=0 To 3 数组赋值 A(I,J)=C:C=C+1 Next J Next I For I=0 To 2 输出数组 For J=0 To 3 Print A(I,J);Next J Print 另起一行打印 Next I End Sub,返回目录,4.1 数组二维数组,2.二维数组应用举例 例4.15,返回目录,4.1 数组二维数组,例4.16 Private Sub Command1_Click()(1)变量、数组定义(2)数组Sell、Price赋值:销售情况、单价(3)计算各连锁店各类食品的销售金额(4)计算总计数据(5)输出 End Sub,返回目录,4.1 数组二维数组,
21、(1)变量、数组定义 Dim Sell(3,4)Dim Money(3,4)As Single Dim Price(4)As Single Dim I%,J%(2)数组Sell、Price赋值:销售情况、单价 Sell(1,1)=120:Sell(1,2)=90:Sell(1,3)=20:Sell(1,4)=44 Sell(2,1)=115:Sell(2,2)=88:Sell(2,3)=22:Sell(2,4)=49 Sell(3,1)=139:Sell(3,2)=98:Sell(3,3)=28:Sell(3,4)=56 Price(1)=18.5:Price(2)=22.4 Price(3)
22、=15.8:Price(4)=6.5,返回目录,4行5列,4.1 数组二维数组,(3)计算各连锁店各类食品的销售金额 For I=1 To 3 For J=1 To 4 Money(I,J)=Sell(I,J)*Price(J)Next J Next I(4)计算总计数据 For I=1 To 3 For J=1 To 4 Money(I,0)=Money(I,0)+Money(I,J)Money(0,J)=Money(0,J)+Money(I,J)Money(0,0)=Money(0,0)+Money(I,J)Next J Next I,返回目录,4.1 数组二维数组,(5)输出 Print
23、 销售总额;Tab(12);咖啡;Tab(24);奶粉;Print Tab(36);茶叶;Tab(48);饼干 For I=0 To 3 For J=0 To 4 Print Tab(12*J);Format(Money(I,J),#.00);Next J Print Next I,返回目录,用Format()函数使输出项保留两位小数,4.1 数组二维数组,例4.17 Private Sub Form_Click()(1)常量、变量、数组定义(2)产生学号(从1001开始)(3)产生课程名称A、B、C、(4)产生M个学生N门课程的成 绩(全部60分以上)(5)求每个学生的总分,放在第N+1列中
24、(6)输出每个学生的总分和 N门课程成绩(7)按总分降序排序(选择法排序)(8)输出排序后的每个学生的N门课程成绩和总分 End Sub,返回目录,4.1 数组二维数组,(1)常量、变量、数组定义、随机数初始化 Const M=10,N=6 Dim Data(M,N+1)As Integer,I%,J%,K%,Temp%Randomize Timer(2)产生学号(从1001开始)For I=1 To M Data(I,0)=1000+I Next I(3)产生课程名称A、B、C、For I=1 To N Data(0,I)=I+Asc(A)-1 Next I,返回目录,M名学生N门课程,N+
25、1列是该生的总分,第0列是学号,第0行是课程名称,4.1 数组二维数组,(4)产生M个学生N门课程的成绩(全部60分以上)For I=1 To M For J=1 To N Data(I,J)=60+40*Rnd Next J Next I(5)求每个学生的总分,放在N+1列 For I=1 To M For J=1 To N Data(I,N+1)=Data(I,N+1)+Data(I,J)Next J Next I,返回目录,4.1 数组二维数组,(6)输出每个学生的总分和N门课程成绩 For I=1 To N 输出课程名称 Print Tab(8*I+2);Chr(Data(0,I);N
26、ext I Print 换行 For I=1 To M For J=0 To N+1 Print Tab(8*J);Data(I,J);Next J Print Next I Print,返回目录,4.1 数组二维数组,(7)按总分降序排序(选择法排序)For I=1 To M-1 For J=I+1 To M If Data(I,N+1)Data(J,N+1)Then For K=0 To N+1 Temp=Data(I,K)Data(I,K)=Data(J,K)Data(J,K)=Temp Next K End If Next J Next I,返回目录,4.1 数组二维数组,(8)输出排
27、序后的每个学生的N门课程成绩和总分 For I=1 To N 输出课程名称 Print Tab(8*I+2);Chr(Data(0,I);Next I Print For I=1 To M For J=0 To N+1 Print Tab(8*J);Data(I,J);Next J Print Next I,返回目录,4.2 过程,过程是一段程序代码,是相对独立的逻辑模块。一个完整的VB应用程序由若干过程和模块组成。常用的VB过程有:Sub过程和Function过程。Sub过程(子过程):完成一定的操作和功能,无返回值,通过程序调用和事件触发而执行,分为事件过程和通用过程。Function过程
28、(函数过程):相当于用户自定义的函数,通过程序调用才能被执行,并且可将数据处理的结果返回。一个过程的代码长度不要超过64K。,返回目录,4.2 过程Sub过程,过程定义格式:Private|PublicStaticSub 过程名(参数表)语 句 End SubPrivate表示模块级子过程,Public表示全局级子过程(缺省值)。Static表示过程内部定义的变量值在整个程序运行期间被保留。过程名符合VB标识符的命名约定 参数表可以是空表,也可以放置若干个变量(形式参数)。如:Public Sub Sum(X As Integer,Y As Integer,Z As Integer)Sub过程
29、分为:事件过程和通用过程,返回目录,4.2 过程Sub过程,1.事件过程 这类过程与对象有关,对象事件触发后被调用。事件过程的过程名由系统自动指定。建立对象的事件过程:(1)进入代码窗口方法1:双击对象方法2:“视图代码窗口”(2)选择“对象”和“事件过程”,系统 自动形成该事件过程的头和尾(3)编写该事件的程序代码,返回目录,4.2 过程Sub过程,2.通用Sub过程 这类过程不与对象相关,是用户创建的一段共享代码。过程的名称由用户自己命名建立通用Sub过程:(1)建立过程框架方法1:在模块的“通用”段中输入 过程名,按回车后系统自动添加 End Sub。方法2:“工具添加过程”(2)编写该
30、过程的程序代码,返回目录,4.2 过程Sub过程,3.过程的调用方法(1)通用Sub过程的两种调用方式:Call 过程名(参数表)过程名 参数表(2)事件过程的调用 一般由事件的触发而引起(单击、窗体加载等)也可以象通用Sub过程那样调用,如:Private Sub Form_DblClick()Call Command1_Click End Sub,返回目录,4.2 过程Sub过程,例4.19 用随机函数生成表中数据,计算总分并输出。表格横线用通用过程Print_Line绘出,在主程序中多次调用 Private Sub Print_Line()Dim I As Integer Print T
31、ab(10);For I=1 To 25 Print-;Next I Print End Sub,返回目录,定长,4.2 过程Sub过程,Private Sub Command1_Click()单击“输出”定义数组和变量 For I=1 To 5 用随机函数生成表中数据 Next I Print_Line 调用画线过程 Print Tab(10);数学;Tab(20);物理;Tab(30);化学 Print_Line 调用画线过程 For I=1 To 5 打印表中数据,并统计各科总分 Next I Print_Line 调用画线过程 Print Tab(10);Math(0);Tab(20)
32、;Phy(0);Tab(30);Chem(0)Print_Line 调用画线过程End Sub,返回目录,4.2 过程Sub过程,将Print_Line过程改写如下:Private Sub Print_Line(n As Integer)Dim I As Integer Print Tab(10);For I=1 To n Print-;Next I Print End Sub,返回目录,调用语句改为:Print_Line 实参 或 Call Print_Line(实参)例如,Print_Line 30 或 Call Print_Line(30),n为形参,调用过程时,实参将值交给形参,由形参
33、带入子过程中执行。,4.2 过程Sub过程,例4.20 用不同的方式分别调用带有形式参数的求和通用 过程Add和求差通用过程Subst,返回目录,4.2 过程Function过程,Function过程的实质是一个自定义函数,定义格式:Private|PublicStaticFunction 函数过程名(参数表)类型 语句 End Function Private、Public、Static及参数的含义同Sub子过程Function过程具有函数值,类型缺省为变体型,由函数过程名返回。Function过程的建立与Sub过程的建立相似,调用方法:用Call语句 将Function返回值赋给一个变量将
34、Function过程的返回值用在表达式中,返回目录,4.2 过程Function过程,例4.21 计算 Private Sub Command1_Click()Dim I As Integer Dim e As Single,F As Long For I=0 To 10 F=Factorial(I)计算 I!e=e+1/F Next I Print e=;eEnd Sub,返回目录,4.2 过程参数传递,在调用Sub过程和Function过程时,参数的传递有两种方式:按值传递、按地址传递1.按值传递主调过程的实参与被调过程的形参各有自己的存储单元调用时:主调过程的实参值复制给被调过程的形参定
35、义被调过程时,各形参前加ByVal 2.按地址传递主调过程的实参与被调过程的形参共享同一存储单元形式参数与实际参数是同一个变量定义被调过程时,各形参前加ByRef 定义过程时,缺省的参数传递方式是按地址传递,返回目录,4.2 过程参数传递,例4.23/4.24 参数传递示例,返回目录,4.2 过程参数传递,3.数组作为参数值的传递方式 数组参数只能按地址传递在实参和形参中无需说明数组的维数数组的上界和下界可用Lbound()和Ubound()函数测出,返回目录,例4.25 将一个数值型一维数组按升序排序输出,排序在通用过程Sort中进行,采用选择法排序。,4.2 过程参数传递,Private
36、Sub Command1_Click()Dim Data(5 To 14)As Integer 定义5-14为有效的下标范围 Dim I%For I=5 To 14 数组赋值 Data(I)=30-I Next I Print 排序前:For I=5 To 14 Print Data(I);Next I Print:Print 排序后:Call Sort(Data()For I=5 To 14 Print Data(I);Next IEnd Sub,返回目录,Private Sub Sort(Element()As Integer)Dim I%,J%,T%For I=LBound(Elemen
37、t)To UBound(Element)1 For J=I+1 To UBound(Element)If Element(I)Element(J)Then T=Element(I)Element(I)=Element(J)Element(J)=T End If Next J Next IEnd Sub,4.2 过程作用域,变量的作用域指定义的变量能有效发挥其作用的范围。变量按其作用域可分为局部变量(过程级)、模块变量(模块级)和全局变量(全局级)对过程而言,也有模块级过程和全局级过程之分1.模块级过程 在一个窗体模块中以Private定义的过程为模块级过程,可为模块内的各个过程引用。2.全局级
38、过程 在一个窗体模块中以Public定义的过程为全局级过程,其他窗体可通过“窗体模块名.过程名”引用;在标准模块中定义的全局过程可直接通过过程名引用。,返回目录,4.2 过程作用域,例4.26 在标准模块中建立可将窗口居中安放的全局级过程,窗体启动时即调用该过程。(1)“工程添加模块”,添加标准模块(2)在标准模块代码窗口建立全局过程CenterOnSetupForm,返回目录,4.2 过程作用域,(3)编写Form1窗体的Load事件响应代码:一启动即调用过程。CenterOnSetupForm,返回目录,4.3 Shell函数,作用:运行一个Windows或DOS可执行程序。如果程序存在并
39、且执行成功,则返回一个标识号(ID),否则返回0。语法格式:Shell(路径名,窗口方式)例如,Private Sub Command1_Click()X=Shell(c:windowspbrush.exe,1)End Sub,返回目录,见教材表4.1,上机内容:,练习:第四章课件例题4.1 4.3 4.4 4.8 4.11 4.12 4.15 4.19 4.21 网上提交作业:1,生成并输出杨辉三角形(见下图),窗体文件保存为exer44.frm,工程文件保存为exer44.vbp(输出10行)2,修改例4.21,要求将Factorial函数过程建在标准模块中。窗体文件保存为exer45.frm,工程文件保存为exer45.vbp,1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1,上机内容:,作业:第四章课件例题4.1 4.3 4.4 4.8 4.11 4.12 4.15 4.19 4.20 4.21 4.23 4.26,