《VB程序设计 第八章 过程.ppt》由会员分享,可在线阅读,更多相关《VB程序设计 第八章 过程.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Visual Basic程序设计教程程序设计教程内蒙古科技大学实践训练中心内蒙古科技大学实践训练中心第八章第八章 过程过程8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程的定义与调用过程的定义与调用 VBVB的过程:的过程:系统提供的内部函数过程,其中,事件是构成VBVB应用程序的主体,应 用设计基本上是对事件过程进行设计;用户根据应用的需要而设计的过程;VB VB的过程分类:的过程分类:以”SubSub”保留字开始的子过程;以“FunctionFunction”保留字开始的函数过程;以“PropertyProperty”保留字开始的属性过程;以“EventEvent”保留
2、字开始的事件过程;8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程的定义与调用过程的定义与调用8.1.1 Sub8.1.1 Sub过程的定义与调用过程的定义与调用 用户自定义子过程通常来完成一个特定的功能,其名字可由用户根据自己的习惯而定义。VB的事件过程只在用户触发该事件后启动,而用户自定义的子过程只有在被其他过程调用时才启动。1 1、用户自定义子过程的一般格式、用户自定义子过程的一般格式 Static Private|Public Sub Static Private|Public Sub 子过程名子过程名 (参数列表参数列表)语句块语句块 Exit SubExit S
3、ub 语句块语句块 End SubEnd Sub 说明:格式中“Sub Sub 子过程名子过程名”和”End SubEnd Sub“不可缺;子过程名的命名规则与 变量命名规则相同;8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程的定义与调用过程的定义与调用8.1.1 Sub8.1.1 Sub过程的定义与调用过程的定义与调用 S Statictatic:在过程名之前使用Static,表示过程中的局部变量都是静态变 量。当程序退出该程序时,局部变量的值仍然保留作为下次调用的初 值。StaticStatic对数组变量也有效,但对动态变量则无法转换为静态变量;PrivatePriv
4、ate:表示该过程为私有过程,只有本模块中的其他过程访问,不能 被其他模块中的模块访问;PublicPublic:表示该过程为公有过程,即可以被程序中所有模块调用。本窗 体和其他模块均可调用,但过程名必须是唯一的,否则在过程名前加上 该过程所在的窗体名或模块名。参数列表:其他过程与本过程进行参数传递和交换的形式参数,当参数 个数大于等于2时,参数之间用”,”隔开;Exit SubExit Sub:在过程任意位置终止过程的运行而退出过程而使用的语句;End SubEnd Sub:过程结束标识,用来正常终止过程;8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程的定义与调用过程的
5、定义与调用8.1.1 Sub8.1.1 Sub过程的定义与调用过程的定义与调用 过程参数的传递默认方式为引用(地址)传递(ByRefByRef),若只传参数(实参)的值则必须将形式参数说明为ByvalByval,格式如下:ByvalByval 变量名或数组名变量名或数组名()As()As 数据类型数据类型 过程内部不能再定义其他过程,可以调用其他合法的过程,事件过程中 也不允许定义子过程。sub command_click()call test()end substatic sub test()dim a(2)as integer a(0)=a)(0)+1 a(1)=a(1)+1 print
6、a(0);a(1)end sub 8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程的定义与调用过程的定义与调用8.1.1 Sub8.1.1 Sub过程的定义与调用过程的定义与调用 定义过程的方式:定义过程的方式:手工方式:在过程、事件代码窗口中,编写事件程序:subsub 过程名(参数列表)End SubEnd Sub 系统方式 进入模块代码窗口:系统菜单”工程“”添加”“新建”,则新建一 个模块,在标准模块中填写子过程代码;系统菜单”工具“”添加过程“,确定子过程的名称以及类型后,即回 到模块的代码窗口;8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程
7、的定义与调用过程的定义与调用8.1.1 Sub8.1.1 Sub过程的定义与调用过程的定义与调用 2 2、子过程调用、子过程调用 Call Call 过程名过程名(实参列表实参列表);如:call text(12,call text(12,”abcabc”)过程名过程名 实参列表实参列表;如:test 12,test 12,”abcabc”例例8-18-1求求n!n!解题思路解题思路:在标准模块中定义一个子过程n,用于实现求任意正整数的阶乘。Public Sub n(a As Integer)Dim i As Integer Dim f As Double f=1 For i=1 To a f
8、=f*i Next Form1.Label1.Caption=Str(a)&!的阶乘的值为:&Str(f)End Sub Call n(Val(Text1.Text)8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程的定义与调用过程的定义与调用8.1.1 Sub8.1.1 Sub过程的定义与调用过程的定义与调用 2 2、子过程调用、子过程调用 Call Call 过程名过程名(实参列表实参列表);如:call text(12,call text(12,”abcabc”)过程名过程名 实参列表实参列表;如:test 12,test 12,”abcabc”例例8-28-2给出矩形
9、的长和宽,求矩形的面积。给出矩形的长和宽,求矩形的面积。解题思路解题思路:定义一个过程area,计算矩形的面积。Private Sub area(a As Single,b As Single)Dim sum As Double sum=a*b Form1.Label3.Caption=矩形面积为:&Str(sum)End SubCall area(Val(Text1.Text),Val(Text2.Text)8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程的定义与调用过程的定义与调用8.1.2 Function8.1.2 Function过程的定义与调用过程的定义与调用
10、函数过程(Function)Function)与子过程一样,可将一组完成特定功能的程序代码组织起来,作为一个相对独立的过程使用;但子过程没有值的返回,函数过程有值的返回。1 1、函数过程的定义、函数过程的定义 Static Public Private Function Static Public Private Function 函数过程名函数过程名(参数列表参数列表)As)As 类型类型 语句块语句块 Exit Function Exit Function 语句块语句块 给函数名赋返回值给函数名赋返回值 End End FuntionFuntion 8.1 8.1 8.1 8.1 过程的定
11、义与调用过程的定义与调用过程的定义与调用过程的定义与调用8.1.2 Function8.1.2 Function过程的定义与调用过程的定义与调用 说明:格式中的StaticStatic、PublicPublic、PrivatePrivate的含义与作用以及参数列表的格式 和使用方法,ByvalByval传值的作用等均与子过程的定义相同;Exit FunctionExit Function的作用与Exit SubExit Sub相同;AsAs类型,指定该函数的返回值的类型;语句块为符合VBVB语法的一条语句或多条语句;给函数名赋值:一般情况下,定义一个函数过程,就是能返回一个值 给调用程序,故函
12、数过程应有一条语句给函数名赋值函数名赋值即调用后的返回 值;若不赋值,则默认返回值为0 0(数值型函数),或空值(可变类 型函数)。与SubSub定义一样,函数过程定义的函数体内不允许定义其他的函数过 程和子过程。8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程的定义与调用过程的定义与调用8.1.2 Function8.1.2 Function过程的定义与调用过程的定义与调用 2 2、函数过程的定义方法、函数过程的定义方法 在代码窗口中手工输入函数过程的框架;在代码窗口中手工输入函数过程的框架;如:如:Static Private Function Static Priva
13、te Function AreturnAreturn(a as integer,b as integer)(a as integer,b as integer)as Integer as Integer End Function End Function 系统菜单“工具”“添加过程”,选择相应的类型和范围属性;3 3、函数过程的调用、函数过程的调用 函数过程的调用如同调用VB的系统内部函数一样;程序中。函数过程的 调用一般放在表达式中赋值号”“的右边,将它看成某种类型的值而参加 表达式的组成。8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程的定义与调用过程的定义与调用8.1
14、.2 Function8.1.2 Function过程的定义与调用过程的定义与调用3 3、函数过程的调用、函数过程的调用 例例8-38-3函数过程的定义与调用:判断某个成绩函数过程的定义与调用:判断某个成绩(百分制百分制)的等级的等级.解题思路:定义一个函数过程,用于判断分数的等级,判断后的结果返回为 字符串:优、良、中、及格或不及格。Private Function afirm(cj As Integer)As String Select Case cj Case Is 90 afirm=优 End SelectEnd functionText2.Text=afirm(Val(Text1.T
15、ext)8.1 8.1 8.1 8.1 过程的定义与调用过程的定义与调用过程的定义与调用过程的定义与调用8.1.2 Function8.1.2 Function过程的定义与调用过程的定义与调用 例例8-4 8-4 编写求任意给定两个自然数的最大公约数的程序编写求任意给定两个自然数的最大公约数的程序。解题思路:对于已知两个数m m、n n,使得mnmn;m m除以n n得余数 r r;若r r0 0,则n n为所求的最大公约数,算法结束,否则执行(1);n nmm,r rnn,再重复步骤(2);步骤mnr=(m mod n)说明第一次36148第二次1486第三次862第四次620最大公约数为2
16、8.2 8.2 8.2 8.2 函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递 参数传递参数传递:在调用过程时,过程参数使用的是实际参数,它要与定义过程时的形式参数一一对应,并以适当的形式将实参传给行参,供过程使用。参数传递的方式:传值;传址;8.2.1 8.2.1 传值传值 形参形参:指在定义过程时出现在参数列表中的变量名,这些变量名的使用只 能在过程内部。实参实参:是在调用该过程时调用过程中已组织好的准备传给形参的常量、变 量、表达式或数组控件对象等,它是在调用过程(主程序或父过程)中 组织好的数据,实参若是常量,则传递就相当于将该常量的值赋给 形参。实参
17、若为一个简单变量的表达式,也是与常量一样将该表达 式的值赋给对应的形式参数。传递参数时,形参和实参的个数一定相同,传递时要一一对应;参数之间要用“,”隔开;每个实参的类型必须与相对应的行参类型相同;8.2 8.2 8.2 8.2 函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递8.2.1 8.2.1 传值传值 Sub Sub tempSub(atempSub(a as integer as integer,b as single b as single,c as string)c as string)End Sub End Sub可采用调用方式:call cal
18、l tempsub(atempsub(a%,b!b!,”commcomm”)”)过程调用Call tempsub(a%,b!,“comm”)过程定义Sub tempsub(a as integer,b as single,c as string)过程定义中默认的参数传递是地址传递,但在定义过程中,若某个参数用ByvalByval来说明。则该参数便是传值。传值的一个特点是将实参的值复制一份给形式参数所代表的临时内存单元,将实参的值复制一份给形式参数所代表的临时内存单元,此后实参与形参之间再无任何联系,形式参数的任何变化均不会对实参产生任此后实参与形参之间再无任何联系,形式参数的任何变化均不会对实
19、参产生任何影响。何影响。8.2 8.2 8.2 8.2 函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递8.2.1 8.2.1 传值传值 例例【8-58-5】传值调用传值调用 Private sub command1_click()Private sub command1_click()dim x as integer,y as integer dim x as integer,y as integer x=10 x=10:y=20y=20 print“x=“;print“x=“;x;”yx;”y=“;y;=“;y;call call temp(x,ytemp(
20、x,y)print“x=“;print“x=“;x;”yx;”y=“;y;=“;y;End Sub End Sub Sub Sub temp(Byvaltemp(Byval x as x as integer,Byvalinteger,Byval y as integer)y as integer)x=x+100 x=x+100:y=x*60y=x*60 print“x=“;print“x=“;x,”yx,”y=“,y;=“,y;End Sub End Sub 运行结果:x=10 y=20 x=10 y=20 调用前的实参调用前的实参 x=110 y=6600 tempx=110 y=6600
21、 temp中的行参中的行参 x=10 y=20 x=10 y=20 调用后的实参调用后的实参 8.2 8.2 8.2 8.2 函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递8.2.1 8.2.1 传值传值 例例8-68-6求幂级数求幂级数 解题思路:定义temptemp函数用于计算x的幂,需要用到2个参数,x x和y y,x x用于传递某个数,y y用于传递幂的次方数。y y是传值参数,因此,函数中y y值的改变不会影响它相应的实际参数。Dim i As Integer,r As Single For i=1 To 5 r=temp(5,i)Print r N
22、extFunction temp(x As Integer,ByVal y As Integer)As Single Dim p As Single p=1 Do While y 0 p=p*x y=y-1 Loop temp=p End Function8.2 8.2 8.2 8.2 函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递8.2.2 8.2.2 传址传址 在过程调用过程中,参数传递的默认方式是按地址传递,故不加任何关键字就是传址调用。传址的特点是形参与对应实参用相同的内存地址,形参的改变将影响实参的形参的改变将影响实参的改变改变,实际上,形参也是实参
23、的别名。通常情况下,形式参数为传值形式,则形式参数可认为是一个局部变量;但若为传址方式,则由形参与实参连系起来,使形参为非局部变量,因为形参的改变结果直接传给了实参。例例【8-78-7】对于例8-5中的过程temp将其定义为:sub sub temp(xtemp(x as as integer,yinteger,y as integer)as integer)End Sub End Sub 则Call Call temp(x,ytemp(x,y)变为了传址调用,故形参的改变会引起实参x x、y y的值改变。8.2 8.2 8.2 8.2 函数和过程的参数传递函数和过程的参数传递函数和过程的参数
24、传递函数和过程的参数传递8.2.2 8.2.2 传址传址 例例8-88-8传值与传址两种方式下,形参与实参的改变。传值与传址两种方式下,形参与实参的改变。8.2 8.2 8.2 8.2 函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递8.2.3 8.2.3 数组及对象作为过程的参数数组及对象作为过程的参数 1 1、数组作为参数、数组作为参数 用数组名作为形参或实参;用数组元素作为实参进行传递;注意:第中方法相当于传址方式,即将数组的起始地址传给形参,但在使 用时应注意以下几点:用数组名进行地址传递时,在参数列表中说明数组,不需要说明其维用数组名进行地址传递时,在
25、参数列表中说明数组,不需要说明其维 数的定义,但圆括号不可省略;数的定义,但圆括号不可省略;在过程定义体内如需要知道参数的上、下界,可用在过程定义体内如需要知道参数的上、下界,可用UBoundUBound和和 LBoundLBound 确定参数组的上、下界;确定参数组的上、下界;形参数组和实参数组的类型必须一致;形参数组和实参数组的类型必须一致;例8-9求一个nn方阵所有元素之和;8.2 8.2 8.2 8.2 函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递8.2.3 8.2.3 数组及对象作为过程的参数数组及对象作为过程的参数 1 1、数组作为参数、数组作为
26、参数 例例8-98-9求一个求一个n nn n方阵所有元素之和;方阵所有元素之和;解题思路解题思路:利用随机函数产生一个6阶方阵a,并保存在二维数组中,将此数组作为参数传给函数suma,在函数suma中计算方阵的元素之和;在函数过程内部使用Ubound(a,1)确定数组a的第一维上界。8.2 8.2 8.2 8.2 函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递函数和过程的参数传递8.2.3 8.2.3 数组及对象作为过程的参数数组及对象作为过程的参数 2 2、对象参数、对象参数 对于过程中的参数,可以用对象参数进行传递,如窗体、控件等。经 过传递后,可以使用对象的有关属性以及方
27、法。在使用控件作为参数时,必须考虑到作为实参的控件是否具有通过过 程中所列的控件的属性,因此必须先判断控件是哪一类控件。判断格式为:If/If/ElseifElseif TypeofTypeof 控件名称 is is 控件类型 其中:控件类型指各种不同的控件的关键字,如文本框的关键字为 TextBoxTextBox等。If If typeoftypeof TestctrTestctr is textbox then is textbox then testctr.texttestctr.text=“Ms”=“Ms”End if End if 8.3 8.3 8.3 8.3 变量、过程的作用域变
28、量、过程的作用域变量、过程的作用域变量、过程的作用域 在VB程序中我们定义的变量、过程、函数均有其作用范围,在VB系统内,该范围称为其作用域。作用域分为三个层次:过程、模块过程、模块(文件文件)、全局、全局(工程工程););过程的作用域最小,仅局限于过程内部(针对局部变量);模块(文件)次之,仅在某个模块或文件内;全局(工程)范围最大,在整个应用工程范围内。8.3.1 8.3.1 过程的作用域过程的作用域 过程的作用域:模块级(文件级)和全局级;一个工程应用程序一般由三类模块构成:窗体模块窗体模块(*.(*.frmfrm):通常有:事件过程、自定义子过程和自定义函数过程 标准模块文件标准模块文
29、件(*.bas)(*.bas):由若干个VB子过程和函数组成,通常为应用程序 提供可调用的标准程序单元;类模块文件类模块文件(*.(*.clscls):包括自定义的类、为相应类设计的属性过程、自定 义方法过程、自定义事件过程等;8.3 8.3 8.3 8.3 变量、过程的作用域变量、过程的作用域变量、过程的作用域变量、过程的作用域8.3.1 8.3.1 过程的作用域过程的作用域应用程序应用程序(.vbp文件文件)至少一个或多个窗体模块(*.frm)文件事件过程(sub)、自定义过程(Sub)自定义函数(Function)一个或多个标准模块(.bas)文件自定义过程(Sub)自定义函数(Func
30、tion)一个或多个类模块(.cls)文件自定义属性过程(Property)自定义方法过程(Sub 或Function)自定义事件过程(Event)8.3 8.3 8.3 8.3 变量、过程的作用域变量、过程的作用域变量、过程的作用域变量、过程的作用域8.3.1 8.3.1 过程的作用域过程的作用域 1、模块级(文件级)过程 指只能在本文件或模块中被调用,此类过程(或函数)定义时在SubSub或 FunctionFunction前加“PrivatePrivate”关键字;2、全局级过程 指能在整个应用程序中被调用的过程,此类过程与模块级过程的定义过 程完全相同,只是在定义前不加关键字“Priv
31、atePrivate”,或加关键字“PublicPublic”。调用方式通常为:标准模块名标准模块名(或窗体名或窗体名).).子过程或函数名子过程或函数名(参数参数)。8.3 8.3 8.3 8.3 变量、过程的作用域变量、过程的作用域变量、过程的作用域变量、过程的作用域8.3.1 8.3.1 过程的作用域过程的作用域 作用范围模块级全局级窗体标准模块窗体标准模块定义方式过程名前加Private,如:private Sub mysub1(形参表)过程名前加Public或缺省如:Public Sub my2(形参表)能否被本模块其他过程调用能能能能能否被本应用程序其他模块调用不能不能能,在过程名
32、前加窗体名,如:Call 窗体名.my2(实参表)能,过程名必须唯一,否则要加标准模块名,如:Call 标准模块名.my2(实参表)8.3 8.3 8.3 8.3 变量、过程的作用域变量、过程的作用域变量、过程的作用域变量、过程的作用域8.3.2 8.3.2 变量的作用域变量的作用域 变量的作用域分为三级:局部局部(过程过程)级、模块级级、模块级(文件文件)、全局、全局(工程工程)级级;1、局部变量(过程级)局部变量(过程级):指在过程内部定义、只能在过程内使用的变量,别的过程不能使用;定义方式:DimDim、StaticStatic;局部变量随过程的调用而产生,也随着过程调用的结束而结束(D
33、imDim声 明的变量将被释放内存,而用StaticStatic声明的变量,变量没有被释放,但已 变得不可访问,下次发问时,其值仍存在);2、窗体模块级变量窗体模块级变量:指在窗体(模块)文件内,但在所有过程之外定义的 变量,即在窗体文件中的“通用声明”段里用DimDim或PrivatePrivate语句声明的变 量,该变量可被窗体文件中的任何过程访问,但不能被其他模块文件中 的过程访问。此类变量随窗体的产生而产生,也随着窗体的结束而结束。3、全局变量(工程级变量)全局变量(工程级变量):指窗体或任一模块中定义,但不在任一过程 内定义的变量,此类变量的声明必须用PublicPublic语句完成
34、,次变量在整个 工程文件中存在,在工程应用结束时才会被释放。8.3 8.3 8.3 8.3 变量、过程的作用域变量、过程的作用域变量、过程的作用域变量、过程的作用域8.3.2 8.3.2 变量的作用域变量的作用域 作用范围局部变量窗体/模块级变量全局变量窗体标准模块声明方式Dim,StaticDim,PrivatePublic声明位置在过程中窗体/模块的“通用声明”段里窗体/模块的“通用声明”段里能否被本模块的其他过程存取不能能能能否被其他模块存取不能不能能,必须在变量前加窗体名能8.3 8.3 8.3 8.3 变量、过程的作用域变量、过程的作用域变量、过程的作用域变量、过程的作用域文件1(*
35、.Bas)(模块文件 Module1.Bas)public a as integer private b as integer 模块级变量 sub f1()dim c as integer 局部变量 print form1.c;c;b end sub 文件2(*.frm)(窗体模块:Form1.frm)public c as single 全局变量 public a as integer 全局变量 sub command1_click()dim c as integer 局部变量 print module1.a;c;form1.c;a end sub注释:上面Form1.frmForm1.fr
36、m文件printprint语句中,“Module1.aModule1.a”是指“Module1.BasModule1.Bas”文件中定义的全局变量a a;”Form1.cForm1.c“是指Form1.frmForm1.frm中定义的全局变量c c;”c c“是指command1_clickcommand1_click中定义的局部变量c c;“a a”是指在Form1.frmForm1.frm中定义的全局变量a a;8.3 8.3 8.3 8.3 变量、过程的作用域变量、过程的作用域变量、过程的作用域变量、过程的作用域 说明:说明:在同一模块不同过程中定义的变量可以同名;在同一模块不同级别中定
37、义的变量可以同名;在不同模块中定义的全局变量可以同名;在过程中直接引用的变量总是同名变量中作用域最小的那个变量;在其他模块(定义全局变量所在模块)中引用全局变量时,必须在该变 量前加上模块名;8.3 8.3 8.3 8.3 变量、过程的作用域变量、过程的作用域变量、过程的作用域变量、过程的作用域8.3.3 8.3.3 静态变量静态变量 局部变量除了用DimDim语句声明外,还可以用StaticStatic语句将变量声明为静态变量,它在程序运行中保留变量的值。即每次调用过程,用StaticStatic说明的变量保持原来的值;而用DimDim说明的变量,每次调用过程时,重新初始化。形式:Stati
38、c Static 变量名变量名 As As 类型类型 Static Function Static Function 函数名函数名 (参数列表参数列表)As)As 类型类型 Static Sub Static Sub 过程名过程名(参数列表参数列表)若函数名、过程名前加”StaticStatic“,表示该函数、过程内的局部变量都是静态 变量。8.3 8.3 8.3 8.3 变量、过程的作用域变量、过程的作用域变量、过程的作用域变量、过程的作用域8.3.3 8.3.3 静态变量静态变量例例8-10 8-10 一个窗体单击事件过程一个窗体单击事件过程(Form_clickForm_click()(
39、)和一个求和函数和一个求和函数(sum()(sum()组成组成的应用程序,在的应用程序,在Form_clickForm_click()()过程中过程中5 5次调用函数次调用函数sum()sum()Dim i As Integer,isum As Integer For i=1 To 5 isum=sum(i)Print isum=;isum;NextPrivate Function sum(n As Integer)Static j As Integer Dim j As Integer j=j+n sum=jEnd Function8.4 8.4 8.4 8.4 递归递归递归递归 递归是指一
40、个自己调用自己的过程。递归是指一个自己调用自己的过程。VB允许定义一个自定义过程或函数在过程内部自己调用自己,这样的子过程或函数叫做递归子过程或递归函数。例例8-11 8-11 求求n n!的函数!的函数。解题思路:递归就是一个自己不断调用自己的过程,直到达到递归结束条件,而后逐级返回到上一次调用过程。每一次调用自己,先把形参、局部变量、调用结束时的返回地址压栈,直到递归结束,这个过程叫做递归过程;然后一级一级从堆栈弹出参数,直到栈空,这个过程叫做回归。定义阶乘运算如下:n!=n(n1)!(n1)!=(n1)(n2)!若用fn(n)表示n!,则由有:8.4 8.4 8.4 8.4 递归递归递归
41、递归求求n!n!的函数定义如下:的函数定义如下:public function public function fn(nfn(n as integer)as integer as integer)as integer if n=1 then if n=1 then fn=1 fn=1 else else fn=n*fn(n-1)fn=n*fn(n-1)endifendif end function end function 假设n n3 3,则上诉函数的步骤如下:fn(3)=3*fn(2)fn(3)=3*fn(2),n n3 3时调用fn(2)fn(2);fn(2)=2*fn(1)fn(2)=
42、2*fn(1),n n2 2时调用fn(1)fn(1);fn(1)=1fn(1)=1,n n1 1时求得fn(1)fn(1)的值;fn(2)=2*1fn(2)=2*1,返回fn(2)fn(2)的值;fn(3)=3*fn(2)=3*2fn(3)=3*fn(2)=3*2,返回fn(3)fn(3)的值;设计一个递归过程或函数应具备的条件:具备递归条件及递归的条件;递归调用递归结束的条件发展;8.4 8.4 8.4 8.4 递归递归递归递归例例8-128-12在一个三角形中,取三边的中点构成一个三角形,然后在所画的三角在一个三角形中,取三边的中点构成一个三角形,然后在所画的三角形的边与相邻的三角形的角
43、构成的三角形内又画一个三角形,如此循环下去直形的边与相邻的三角形的角构成的三角形内又画一个三角形,如此循环下去直到满足给定层次为止到满足给定层次为止。解题思路:本题中的递归子过程为triangle(x1,x2,x3,y1,y2,k)triangle(x1,x2,x3,y1,y2,k),k k的初值为三角形的层次,递归结束条件为k k1 1,在递归子过程中,每调用一次,k k的值就减1 1。(x1,y1)(x2,y2)(x3,y1)(u1,v1)(x2,y1)(u2,v1)8.5 8.5 8.5 8.5 常用算法与数据结构三常用算法与数据结构三常用算法与数据结构三常用算法与数据结构三8.5.1
44、8.5.1 素数问题素数问题 求素数的方法:对于一个自然数N,用大于1小于N的各个自然数都去除N,若都除不尽,则N为素数;否则为合数。例例8-13 8-13 编写程序,求编写程序,求500,1999500,1999十位数字为十位数字为7 7的素数的个数的素数的个数 解题思路:定义一个函数isprime(kisprime(k as integer as integer)来判断一个数是否素数,再判断这个数的十位数是否为7。8.5 8.5 8.5 8.5 常用算法与数据结构三常用算法与数据结构三常用算法与数据结构三常用算法与数据结构三8.5.2 8.5.2 加密和解密加密和解密 例例8-14 8-1
45、4 编写一个加密和解密程序,将输入的一行字符串中的所有字母加密编写一个加密和解密程序,将输入的一行字符串中的所有字母加密 解题思路:加密方法为将每一个字母加一序数,例如,加序数3,这时”A“变换为”D“,”B“变换为”E“,“a”变换为“d”,“Y”变换为“B”,“Z”变换为”C“。在本题中,用字母的ASCII码值加序数3进行加密,若大写的字母加密后超过Z或小写字母超过z,则将字母的ASCII码值26。8.5 8.5 8.5 8.5 常用算法与数据结构三常用算法与数据结构三常用算法与数据结构三常用算法与数据结构三8.5.3 8.5.3 数据检索数据检索 数据检索 就是从一组数据中找出具有某种特
46、征的数据项。最常用的一种检索方式是顺序检索,是指对所存储的数据从第一项开始,依次与所要检索的数据进行比较,直到找到该数据,或将全部元素都找完还没有找到该数据为止。例例8-15 8-15 在线性表在线性表(数组数组)中根据给定的关键值,找出与其值相同的元素中根据给定的关键值,找出与其值相同的元素 解题思路解题思路:本题采用顺序查找,即根据关键值与数组中的元素逐一比较,若相同,查找成功,若找不到,则查找成功。8.5 8.5 8.5 8.5 常用算法与数据结构三常用算法与数据结构三常用算法与数据结构三常用算法与数据结构三8.5.3 8.5.3 数据检索数据检索 例例8-16 8-16 采用二分法在线性表采用二分法在线性表(数组数组)中查找元素中查找元素 5 11 23 27 29 32 38 43 58 77 89 lowhighmid初始:5 11 23 27 29 32 38 43 58 77 89 lowhighmid缩小一半5 11 23 27 29 32 38 43 58 77 89 low mid high 缩小一半