第11章 过程与函数_第1页
第11章 过程与函数_第2页
第11章 过程与函数_第3页
第11章 过程与函数_第4页
第11章 过程与函数_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.掌握数据库及数据库管理系统的概念

2.掌握关系型数据库模型的关系(表),记录、字段、关键字、索引概念等。

3.学会使用可视化数据管理器建立的数据库是Access数据库(类型名为.mdb)

4.了解数据库控件的常用属性及与相关控件的绑定

5.了解结构化查询语言SQL对数据库中的数据进行操作本章要求:第11章

过程与函数本章重点:数据库的建立与使用在设计一个规模较大、复杂程度较高的程序时,往往根据需要按功能将程序分解成若干个相对独立的部分,然后对每个部分分别编写一段程序,这些程序段称为过程。

过程是构成程序逻辑部件的基本单位,将程序分割成较小的逻辑部件可以简化程序设计任务,结构化设计就是建立在这个思路之上。

每个过程完成一个具有特定目的的任务。过程的定义:过程的分类

事件过程

VB中有两类过程:Sub过程通用过程

Function过程事件过程——是对发生的事件进行处理的代码通用过程——是由用户根据自己的需要定义和编写的、可供事件过程多次调用的程序段。二者的区别是:

通用过程是由程序中的语句调用。

事件过程往往是由用户事件触发。建立函数(过程)的办法是:进入代码窗口后,在对象框选择“通用”,在过程框选择“声名”,然后敲入Function和函数名(Sub和过程名)进入代码窗口后,选择主窗口菜单条的“工具”菜单,选择“添加过程”项,在“类型”框中选择“函数”(子程序)11.1Sub过程(子程序过程)Sub过程是指以规定语法结构组织的、可以被重复调用的、具有特定功能的、相对独立的语句块。1、

声明Sub过程声明Sub过程就是在窗体或标准模块的代码窗口编写一个能实现预期功能的语句块。声明Sub过程的语法格式为:

[Private|Public][Static]Sub

过程名([<形参列表>])[<语句块1>][ExitSub]过程体

[<语句块2>]

EndSub注意:

Sub过程名无值,无类型。说明:(1)每个通用过程都有一个过程名(由用户自己指定,规定同变量名),同一模块中过程名不得重复。(2)过程前加上Public关键字或缺省,则该过程为全局级过程,可以被应用程序的所有窗体模块或标准模块中的过程调用(在窗体中定义,调用时应加窗体名)。(3)过程前加上Private关键字,则该过程为模块级过程,只有在声明它的模块中才可以调用此过程。(4)在过程名前加上Static关键字,表明该过程的变量都是静态变量。(5)形参列表是传递到过程中的变量名(多个时用“,”分隔),它指明了调用时传递给过程的参数的类型和个数,格式为:变量名[AS数据类型](过程级变量)如:SubTryout(xasinteger,yasinteger)x=x+100y=y*6Printx,yEndSub(6)注意:过程可以有参数,也可以不带任何参数。通用过程可以在标准模块中建立,也可以在窗体模块中建立。(7)建立通用过程可以使用以下两种方法:

①“工程”——”添加模块”,添加一标准模块;“工具”——”添加过程”②在标准模块或窗体模块中,直接输入通用过程的代码。2、调用Sub过程

在其他过程中执行已声明的Sub过程被称为对Sub过程的调用。(1)使用Call语句调用Sub过程

格式:Call过程名[(实参列表)](2)将过程名作为语句使用格式:过程名<实参列表>特点:

Sub过程的调用是一句独立的语句。

主过程Call过程1EndSub过程1Call过程2EndSub过程2EndSub说明:(1)可以直接调用本模块中声明的过程或标准模块中声明的全局过程;(2)当定义的过程重名时,调用过程时,过程名前应加模块名修饰;(3)如果要调用窗体模块中声明的全局过程,调用时过程名前应加窗体名。(4)调用Sub过程时,若省略Call,则<实际参数列表>外面的括号也必须省略。(5)调用Sub过程时,每个实参可以加单独的括号。(6)实参数表,是往被定义过程的形参列表传递的数据;因此,其数据类型需要和形参列表保持一致。实参可以是常量、变量、数组,或复杂表达式,但无论是什么都必须有确定的值。

例1:将求三角形的面积的代码存放在过程triarea(a,b,c)中,边长从三个文本框中输入,如果符合构成三角形的条件,则调用该过程,否则调用suberr过程。程序如下:PrivateSubtriarea(areaAsDouble,xAsDouble,

yAsDouble,zAsDouble)DimsAsDoubles=(x+y+z)/2area=Sqr((s-x)*(s-y)*(s-z)*s)EndSubPrivateSubsuberr(intyrnAsInteger)intyrn=MsgBox("请检查您的数据",vbYesNo+vbInformation,"数据错误")EndSub3、使用Sub过程PrivateSubCommand1_Click()Dima#,b#,c#,s#DimintYesorNoAsIntegera=Val(Text1.Text)b=Val(Text2.Text)c=Val(Text3.Text)Ifa+b>cAndb+c>aAndc+a>bThen

Calltriarea(s,a,b,c)'使用Call关键字,实际参数用括号括起来

Print"面积=";s

Else

suberrintYesorNo

'不使用Call关键字,实际参数不用括号

EndIfEndSub

Sub过程的调用是一句独立的语句。

Function过程与Sub过程的主要区别是:

Function过程可返回一个值到调用的过程1、

声明Function过程格式:[Public|Private][Static]Function函数过程名

[(<参数列表>)][As<类型>]

[<语句块>][<函数过程名>=<表达式>]‘返回值语句

[ExitFunction]EndFunction注意:Function过程名有值,有类型。在函数体内,函数名可以当变量名使用,函数的返回值就是通过对函数名的赋值语句来实现的。即函数值通过函数名返回。

函数过程需要返回的值的类型由

As<类型>

设置。11.2Function过程(函数)函数体2、调用Function过程Function过程的调用,与标准函数(内部函数)相同。

通常用在表达式中

格式:函数名(<实参列表>)

特点:不能独立存在,必须参加表达式的运算。如:下面是已知直角三角形两直角边的值,计算斜边的函数。

functionmyfun(Aasinteger,Basinteger)asstring

myfun=sqr(A*A+B*B)

Endfunction

label1.caption=myfun(Cint(text1.text),cint(text2.text))

strX=myfun(width,height)例2:将例1中两个Sub过程改为Function过程。PrivateFunctiontriarea(xAsDouble,yAsDouble,zAsDouble)DimsAsDoubles=(x+y+z)/2triarea=Sqr((s-x)*(s-y)*(s-z)*s)EndFunctionPrivateSubCommand1_Click()

Dima#,b#,c#,s#,intYesorNo%a=Val(Text1.Text):b=Val(Text2.Text)c=Val(Text3.Text)

Ifa+b>cAndb+c>aAndc+a>bThen

Print"面积=";triarea(a,b,c)

Else

intYesorNo=suberr()‘

无参数时,括号不能省略

EndIfEndSub内部函数

1.数学函数2.字符串函数Sub过程和Function函数过程中的<参数列表>中的参数称为形式参数(形参),在程序中调用Sub过程和Function函数过程时<参数列表>中称为实际参数(实参)。在调用过程时,就是把“实参”依次按位置传递给被调用过程的“形参”,然后执行被调用过程中的语句。参数传递时相当于给变量赋初值。如:

Printgreatcd(x,y)

PublicFunctiongreatcd(mAsInteger,nAsInteger)

参数传递有两种模式:按值传递与按址传递11.3过程中参数的传送按值传递就是将实参的值传送给被调用过程中的形参。即:系统把实参复制一份传送给形参。这样,被调用的过程如果改变了形参的值,也不会改变实参的值。在VB中,传值方式的标志为:在形参前加上ByVal。这种传递方式是一种单向的数据传递,即调用时只能由实参的值传递给形参,调用结束不能

由形参将操作结果返回给实参。实参可以是常数、变量或表达式。1、按值传递例:写出下列程序的运行结果Subtryout(ByValxasinteger,ByValyasinteger)x=x+100y=y*6print“x=“;x.”y=“;yEndSubSubForm_click()Dima%,b%a=10:b=20tryouta,bPrint“a=“;a,”b=“;bEndSub传值:X=110y=120a=10b=20传址:X=110y=120a=110b=1202、按址传递——变量的引用传址方式是将实参在内存的地址传递给形参,也就是实参、形参公用内存的“地址”。在VB中,按址传递数据是在形参前加上ByDef(默认方式)。这种传递方式是一种双向的数据传递,即调用时实参将值传递给形参;调用结束由形参将操作结果返回给实参。当用传址方式时,实参只能是变量、数组名,不能是常数、表达式。修改前例题

ByValByDef再写其运行结果例5:下面的程序求解S1=nS2=n+nSn=n+n+…+n(n个n累加)并输出S1到Sn。n为自然数,从文本框值输入。函数过程(注意传值与传址的区别):ByDefPublicFunctionsum(mAsInteger,ByVal

nAsInteger)sum=mDoWhilen>1sum=sum+mn=n-1LoopEndFunction事件过程:PrivateSubCommand1_Click()Dimi%,s(),a%,k%Clsa=Val(Text1.Text)ReDims(1Toa)Fori=1Toa按值传送

s(i)=sum(a,i)k=k+1Print"i=";i,"k=";k,"s"&i&"=";s(i)Ifk>aThenExitForNextiEndSub按址传送3、数组作过程的参数VisualBasic允许把数组作为实参传送到过程中。数组作参数是通过传地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:(1)为了把一个数组的全部元素传送给一个过程,应将数组名分别写入形参表中,并略去数组的上下界,但括号不能省略。PrivateSubSort(a()Assingle)

……EndSub其中形参“a()”即为数组。

(2)被调过程可通过Lbound和Ubound函数确定实参数组的上、下界。(3)当用数组作形参时,对应的实参必须也是数组,且类型一致。(4)实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。例如:定义了实参数组b(1to8),给它们赋了值,调用Sort()函数过程的形式如下:

Sortb()或

CallSort(b())

实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。3、数组作过程的参数

调用时形参数组a和实参数组b虚实结合,共用一段内存单元。因此在Sort()过程中改变数组a的各元素值,也就相当于改变了实参数组b中对应的元素的值,当调用结束时,形参数组a成为无定义。

b(1)b(2)b(3)b(4)b(5)b(6)b(7)b(8)

a(1) a(2)a(3)a(4)a(5)a(6)a(7)a(8)参数为数组时虚实结合示意图

3、数组作过程的参数11.4可选参数和可变参数1、可选参数

在过程的形参列表中加入Optional关键字,就可以指定过程的参数为可选的。如果指定了可选参数,则参数表中此参数后面的其它参数也必是可选的,并且要用Optional关键字来声明。

例6:求两个数的和的函数过程。

lt6.vbp函数过程:PublicFunctionmysum(firstAsInteger,secondAsLong,Optionalthird)mysum=first+second

IfNotIsMissing(third)Thenmysum=mysum+thirdEndFunction事件过程:PrivateSubCommand1_Click()DimaAsInteger,bAsLong,cAsDoubleDimsumAsIntegera=10:b=20Sum=mysum(a,b)Print"sum=";Suma=10:b=20:c=30Sum=mysum(a,b,c)Print"sum=";SumEndSubIsMissing()——检测可选参数是否被省略2、不定数量的参数(可变参数)

一般说来,过程调用中的参数个数应等于过程说明的参数个数。在传递参数时,如果要求参数的数目可以变化,则在函数过程或Sub过程的形参前可加ParamArray关键字(不能与ByValByDef…连用)指明。格式如下:Sub过程名([其他参数,]ParamArray<数组名>())

PrivateSubCommand1_Click()Dims(),a%,bAsLong,cAsVariant,dAsDoubles=Array(1,2,3,4,5)Print"sum=";multisum(s(0),s(2),s(4))a=1000:b=10000:c=100:d=10Print"sum=";multisum(a,b,c,d)EndSub

PublicFunctionmultisum(ParamArrayp())Dimint1%,sumasvariantForint1=LBound(p)ToUBound(p)sum=sum+p(int1)Nextmultisum=sumEndSub11.5过程的嵌套和递归1、过程的嵌套

在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为过程的嵌套。过程的嵌套调用执行过程如下图:2、过程的递归调用用自身的结构来描述自身,称递归。例如,对阶乘的定义:VisualBasic允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。PrivateFunctionfac(nAsInteger)AsIntegerIfn=1Then fac=1Else fac=n*fac(n-1)EndIfEndFunctionPrivateSubForm_Click() Print“fac(4)=”;fac(4)EndSub程序的递归过程:说明:递归处理分递推和回归两个过程,如上图所示。使用递归算法必须要满足以下的递归条件:

(1)存在递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。根据过程的作用域,过程分为窗体/模块级和全局级。11.6变量与过程的作用范围不同作用范围的二种过程定义及调用规则能但过程名必须唯一,否则要加标准模块名能但必须在过程名前加窗体名不能不能能否被本应用程序其他模块调用能能能能能否被本模块其他过程调用Public缺省Private定义方式标准模块窗体标准模块窗体全局级模块级作用范围变量的作用域VB应用程序窗体文件模块文件声名部分事件过程通用过程全局声名部分模块层声名部分通用过程变量的作用域根据变量的作用域,变量分为局部(过程级)变量、窗体/模块变量和全局变量局部变量在过程中用Dim语句定义,只存在于过程中窗体/模块变量Dim语句或Private语句定义,模块中的所有过程都可使用全局变量Public语句定义,可以在所有模块中使用1.局部变量

在一个过程内部(例如Command1_Click)定义的变量称为局部变量。PrivateSubForm1_click()

DimCountAsInteger……EndSub

PrivateSubCommand1_click()

DimCountAsInteger

StaticSumAsSingl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论