1、7.1 通用过程通用过程7.2 常用算法举例常用算法举例第七章 过程7.1 通用过程通用过程 7.1.1 通用过程概念通用过程概念 7.1.2 参数传递参数传递 7.1.3 过程的嵌套与递归调用过程的嵌套与递归调用 7.1.4 变量、过程的作用域变量、过程的作用域第七章 过程 引例:已知多边形的各条边的长度,要计算多边形的面积。a ab bd df fg ge ec cs3s3s2s2s1s1求三角形面积的代码重复使用了三次第七章 过程 解决办法:对于重复使用的程序段,可以自解决办法:对于重复使用的程序段,可以自定义一个定义一个函数函数过程过程,供多次调用,供多次调用第七章 过程 7.1.1
2、通用过程概念及分类通用过程概念及分类Function过程(函数过程)。第七章 过程Sub过程(子过程)7.1.1.1 Function过程过程1.Function过程的定义过程的定义第七章 过程利用代码窗口直接定义通用过程利用代码窗口直接定义通用过程 Public|PrivateStatic Function 函数名函数名(形参表形参表)As 数据类型数据类型 语句组语句组 函数名函数名=表达式表达式 Exit Function 语句组语句组 函数名函数名=表达式表达式 End Function利用“工具”菜单下的“添加过程”命令定义过程第七章 过程2.Function过程的调用过程的调用 格
3、式二(独立作为语句)格式二(独立作为语句)Function过程名过程名(参数列表参数列表)第七章 过程 格式一(作为语句的一部分):格式一(作为语句的一部分):a=Function过程名过程名(参数列表参数列表)引例:已知多边形的各条边的长度,要计算多 边形的面积。a ab bd df fg ge ec cs3s3s2s2s1s1第七章 过程例例:编写函数过程求编写函数过程求s=3!+5!+11!。第七章 过程7.1.1.2 Sub过程过程1.Sub过程的定义过程的定义第七章 过程利用代码窗口直接定义通用过程其格式为:Private|Public Static Sub 过程名(参数表)语句组
4、Exit Sub 语句组 End Sub2.Sub过程的调用过程的调用 直接使用过程名调用直接使用过程名调用Sub过程,即把过程过程,即把过程名作为一个语句来使用,格式如下:名作为一个语句来使用,格式如下:过程名过程名 参数列表参数列表 使用使用Call语句调用语句调用Sub过程。格式如下过程。格式如下 Call 过程名过程名(参数列表参数列表)第七章 过程7.1.2 参数传递参数传递第七章 过程7.1.2.1 形式参数与实际参数的概念形式参数与实际参数的概念 形式参数第七章 过程 (简称形参)是指在定义过程时,在过程头(指Sub或Fuction语句行)的参数列表中出现的变量名和数组名,在过程
5、体中被引用。实际参数第七章 过程(简称实参)是调用过程时,在过程名后的参数列表中出现的变量名、数组名、常量或表达式。7.1.2.2 参数按地址传递和按值传递参数按地址传递和按值传递第七章 过程2.按值传递参数按值传递参数1.按地址传递参数按地址传递参数判断参数传递方式的原则:原则一:定义通用过程时的形参前是否有关键字ByVal或ByRef,若为ByVal 按值传递 若为ByRef 按地址传递 原则二:事件过程中调用通用过程时实参的形式 常量、表达式常量、表达式 按值传递按值传递 变量、数组变量、数组 按地址传递按地址传递第七章 过程1.按地址传递参数按地址传递参数 让过程根据变量的内存地址去访
6、问实际变量的内容,即形式参数与实际参数使用相同的内存地址单元,这样通过子过程就可以改变变量本身的值。第七章 过程Private Sub Swap(x As Integer,y As Integer)Dim tmp As Integer tmp=x:x=y:y=tmpEnd Sub第七章 过程Private Sub Form_Click()Dim a As Integer,b As Integer a=10:b=15 Print 调用交换函数过程前:a=;a,b=;b Swap a,b Print 调用交换函数过程后:a=;a,b=;bEnd Sub事件过程:通用过程:ab1015xy按地址传递
7、按地址传递按地址传递按地址传递tmp101510第七章 过程例:例:Public Sub Mysub3(ByVal x As Integer,y As Integer)x=y+x y=x Mod yEnd SubPrivate Sub Form_Click()Dim a As Integer,b As Integer a=11:b=22 Call Mysub3(a,b)Print a;bEnd Sub A.33 11 B.11 11 C.11 22 D.22 112.按值传递参数 传递的只是变量的副本,如果过程改变了这个值,则所做的变动只影响副本而不会影响变量本身。第七章 过程Private
8、Sub Swap(ByVal x As Integer,ByVal y As Integer)Dim tmp As Integer tmp=x:x=y:y=tmpEnd Sub第七章 过程Private Sub Form_Click()Dim a As Integer,b As Integer a=10:b=15 Print 调用交换函数过程前:a=;a,b=;b Swap a,b 按值传递参数 Print 调用交换函数过程后:a=;a,b=;bEnd Sub1510事件过程:通用过程:ab1015xy按按值值传递传递按按值值传递传递tmp101510例:例:Public Sub Mysub4
9、(x As Integer)x=3*x-1 If x 0)n!(n0)。分析:自然数分析:自然数n n的阶乘可以递归定义为:的阶乘可以递归定义为:0)!1(1,01!nnnnn第六章 过程通用过程(过程的嵌套与递归调用)递归调用的执行过程分两部分进行:Fact(4)=4Fact(4)=4*fact(3)fact(3)Fact(3)=3Fact(3)=3*fact(2)fact(2)Fact(2)=2Fact(2)=2*fact(1)fact(1)Fact(1)=1Fact(1)=1*fact(0)fact(0)Fact(0)=1Fact(0)=1Fact(4)=4Fact(4)=4*6 6Fa
10、ct(3)=3Fact(3)=3*2 2Fact(2)=2Fact(2)=2*1 1Fact(1)=1Fact(1)=1*1 1边界条件边界条件第六章 过程通用过程(过程的嵌套与递归调用)例:P186(2)例:用递归调用方法求两个正整数n和m的最大公约数。(上机操作)分析:通过辗转相除求两个整数最大化的方法,也可以采用递归调用方法来求解,递归终止的条件是余数为0。第六章 过程通用过程(过程的嵌套与递归调用)7.1.4 变量、过程的作用域变量、过程的作用域第六章 过程通用过程(变量、过程的作用域)7.1.4.1 代码模块的概念代码模块的概念第六章 过程通用过程(变量、过程的作用域)1 1窗体模块
11、窗体模块 2 2标准模块标准模块 3 3类模块类模块VB应用程序.VBP窗体模块.Frm类模块.Cls标准模块.Bas函数过程(Function)Sub过程事件过程函数过程(Function)Sub过程第六章 过程通用过程(变量、过程的作用域)7.1.4.2 变量的作用域变量的作用域 1过程级变量过程级变量 2模块级变量模块级变量7.1.4.3 变量的生成期变量的生成期 1.动态变量动态变量 2.静态变量(静态变量(Static)第六章 过程通用过程(变量、过程的作用域)例:运行下列程序段后,单击窗体,显示结果是 ,再次单击窗体时,显示结果是。去掉Static Temp语句后,单击窗体,显示结
12、果是,再次单击窗体时,显示结果是。Private Function Fn2(t As Integer)Static Temp Temp=Temp+t Fn2=TempEnd FunctionPrivate Sub Form_Click()s=Fn2(1)+Fn2(2)+Fn2(3)Print sEnd Sub第六章 过程通用过程(变量、过程的作用域)7.1.4.4 过程的作用域过程的作用域 1模块级过程模块级过程 2全局过程全局过程 3调用其他模块中的过程调用其他模块中的过程习题习题7第六章 过程通用过程(习题)一单选题一单选题1假设已通过下列假设已通过下列Sub语句定义了语句定义了Mysub
13、过程。过程。若要调用该过程,可以采用若要调用该过程,可以采用 语句。语句。Sub Mysub(x As Integer)A.s=Mysub(2)B.Mysub(32000)C.Print Mysub(120)D.Call ysub(40000)2要使过程调用后返回两个参数s和t,下列的过程定义语句中,正确的是 。A.Sub MySub1(ByRef s,ByVal t)B.Sub MySub1(ByVal s,ByVal t)C.Sub MySub1(ByRef s,ByRef t)D.Sub MySub1(ByVal s,ByRef t)第六章 过程通用过程(习题)3以下程序段运行后,单击窗
14、体显示的结果是以下程序段运行后,单击窗体显示的结果是 。Private Sub Form_Click()Dim b As Integer,y As Integer Call Mysub2(3,b)y=b Call Mysub2(4,b)Print y+bEnd SubPublic Sub Mysub2(x,t)t=0 For k=1 To x t=t+k NextEnd Sub A.13 B.16 C.19 D.214.下列程序段运行后,单击窗体时显示的结果是下列程序段运行后,单击窗体时显示的结果是 。Public Sub Mysub3(ByVal x As Integer,y As Inte
15、ger)x=y+x y=x Mod yEnd SubPrivate Sub Form_Click()Dim a As Integer,b As Integer a=11:b=22 Call Mysub3(a,b)Print a;bEnd Sub A.33 11 B.11 11 C.11 22 D.22 115 5下列程序运行后,单击窗体时显示的结果下列程序运行后,单击窗体时显示的结果是是 。Public Sub Mysub4(x As Integer)Public Sub Mysub4(x As Integer)x=3 x=3*x-1 x-1 If x 5 Then x=x+9 If x 5
16、Then x=x+9 Print x;Print x;End SubEnd SubPrivate Sub Form_Click()Private Sub Form_Click()x=1 x=1 Mysub4 3+x Mysub4 3+x Print x Print xEnd SubEnd Sub A.20 1 B.20 14 A.20 1 B.20 14 C.11 1 D.11 14 C.11 1 D.11 146 6在窗体模块的通用段中声明变量时,不能在窗体模块的通用段中声明变量时,不能使用使用 关键字。关键字。A.Dim A.Dim B.Public B.Public C.Private
17、C.Private D.Static D.Static第六章 过程通用过程(习题)7.7.使用使用Public ConstPublic Const语句声明一个全局的符语句声明一个全局的符号常量时,该语句应在号常量时,该语句应在 。A.A.事件过程中事件过程中 B.B.窗体模块的通用段中窗体模块的通用段中 C.C.标准模块的通用段中标准模块的通用段中 D.D.通用过程中通用过程中第六章 过程通用过程(习题)8.下列论述中,正确的是 。A.用户可以定义通用过程的过程名,也可以定义事件过程的过程名。B.一个工程中只能有一个Sub Main过程 C.窗体的Hide方法和Unload方法的作用完全相同。
18、D.在一个窗体文件中用Private定义的通用过程,可以被其他窗体调用第六章 过程通用过程(习题)二填空题1下列程序段运行后,单击窗体时显示的结果是 。Public Function Fn1(x)As String k=Len(x)Fn1=Mid(x,2,k-2)End FunctionPrivate Sub Form_Click()Dim a As String,b As String,s As String a=ABCDEFG:b=12345 s=Fn1(a)+Fn1(b)Print Fn1(Fn1(Fn1(s)End Sub2在窗体上已经建立了在窗体上已经建立了3个文本框个文本框(Tex
19、t1,Text2及及Text3)和一和一个命令按钮个命令按钮(Command1),运行程序后单击命令按钮,则在文,运行程序后单击命令按钮,则在文本框本框Text1中显示的内容是中显示的内容是 ,在文本框,在文本框Text2中显示的中显示的内容是内容是 ,在文本框,在文本框Text3中显示的内容是中显示的内容是 。Public Sub MySub5(x,ByVal y)a=x+y x=a+y y=2*xEnd SubPrivate Sub Command1_Click()Dim b As Integer,c As Integer b=1:Call MySub5(b,c)c=a+b:Call My
20、Sub5(c,b)a=a+c Text1.Text=a Text2.Text=b Text3.Text=cEnd Sub3运行下列程序段后,单击窗体,显示结果是运行下列程序段后,单击窗体,显示结果是 ,再次单击窗体时,显示结果是,再次单击窗体时,显示结果是。去掉。去掉Static Temp语句后,单击窗体,显示结果语句后,单击窗体,显示结果是是,再次单击窗体时,显示结果,再次单击窗体时,显示结果是是。Private Function Fn2(t As Integer)Static Temp Temp=Temp+t Fn2=TempEnd FunctionPrivate Sub Form_Cli
21、ck()s=Fn2(1)+Fn2(2)+Fn2(3)Print sEnd Sub4 4设在窗体设在窗体(启动窗体启动窗体)上有一个命令按钮上有一个命令按钮Command1Command1,在该按钮的,在该按钮的ClickClick事件过程中已经事件过程中已经写了一些代码,完成一定的功能,现要使程序写了一些代码,完成一定的功能,现要使程序运行时自动执行该按钮的功能,请在空白处填运行时自动执行该按钮的功能,请在空白处填入合适的语句。入合适的语句。Private Sub Form_Load()Private Sub Form_Load()End SubEnd Sub5从键盘输入一个十进制正整数从键盘
22、输入一个十进制正整数(小于小于32767),利用过程,利用过程To_hex的递归调用将该数转换为十六进制数。完善下列程序,的递归调用将该数转换为十六进制数。完善下列程序,使之求出正确结果。使之求出正确结果。Public Sub To_hex(n As Integer)Dim r As Integer,ch As String ch=0123456789ABCDEF r=n Mod 16:n=n 16 If Then To_hex()End If Print Mid();End SubPrivate Sub Form_Load()Dim n As Integer Show n=Val(Input
23、Box()To_hex(n)End Sub上机编程练习61设计一个能检查字符串是否为数字字符串的通用过程,调用该过程检验3个框中输入的字符是否都是数字。如果都是数字,求这3个数字之和并把结果显示在第4个文本框中。2编写一个标准模块,该模块包含一个能比较3个数大小和送回大数的Sub过程。调用该过程来求6个数的最大数。利用文本框控件数组和文本框来分别输入数据和输出最大数。3窗体上含有两个文本框窗体上含有两个文本框(Textl及及Text2)、一个列表框一个列表框(Listl)和一个命令按钮和一个命令按钮(Commandl)。程序运行后,用户在文本。程序运行后,用户在文本框框Textl中输入一个字符
24、串,其中包含若中输入一个字符串,其中包含若干个英文单词,单词之间用空格分隔。干个英文单词,单词之间用空格分隔。单击命令按钮后,分解出这些单词,并单击命令按钮后,分解出这些单词,并依次显示在列表框依次显示在列表框Listl中,单词个数显中,单词个数显示在文本框示在文本框Text2。完善下列程序代码。完善下列程序代码。Private Sub Command1_Click()Dim s As String s=Trim(Text1.Text)List1.Clear n=Getword(s)Text2.Text=nEnd SubPublic Function Getword(s As String)A
25、s Integer n=0 Do While n=Len(s)p=InStr(s,Space(1)n=n+1 If p=0 Then List1.AddItem s s=Else List1.AddItem Left(s,p-1)s=Mid(s,p+1)End If Loop Getword=nEnd Function4用递归方法编写计算用递归方法编写计算xn的过程的过程(n为正为正整数整数),精确到小数点后,精确到小数点后2位。位。5创建一个工程,由创建一个工程,由3个窗体个窗体Forml,Form2和和Form3组成。组成。Forml用于输入用户名和密码用于输入用户名和密码(假设用假设用户
26、名和密码分别为户名和密码分别为“username”和和“password”),输,输入正确时显示入正确时显示Form2,连续三次输入错误时显示,连续三次输入错误时显示Form3。在。在Forml中单击中单击“结束结束”按钮时结束程序运按钮时结束程序运行。行。Form2中用文本框显示中用文本框显示“欢迎你使用本系统欢迎你使用本系统”,单击单击“返回返回”按钮回到按钮回到Forml;Form3中用文本框显中用文本框显示示“对不起,请向管理员查询对不起,请向管理员查询”,单击,单击“退出退出”按按钮结束程序运行。钮结束程序运行。6创建一个工程,由两个窗体创建一个工程,由两个窗体Forml和和Form
27、2组成,用户界面如图组成,用户界面如图7-36所示。添加一所示。添加一个标准模块,在标准模块中定义两个通用过程:个标准模块,在标准模块中定义两个通用过程:一个是一个是Function过程过程Max,用于求数组,用于求数组a中中10个数的最大值;另一个是个数的最大值;另一个是Sub过程过程Sort,用于,用于对数组对数组a中中10个数按从小到大顺序排序。个数按从小到大顺序排序。要求:要求:(1)窗体窗体Forml为主窗体,当单击为主窗体,当单击“生成随机数生成随机数”按钮时,生按钮时,生成成10个个11,100区间内的随机整数,将这区间内的随机整数,将这10个随机整数存入数个随机整数存入数组组a
28、,同时显示在,同时显示在“随机数随机数”文本框中。单击文本框中。单击“求最大数求最大数”按按钮时,调用标准模块中的钮时,调用标准模块中的Function过程过程Max,求这,求这10个数的个数的最大数并显示在最大数并显示在“最大值最大值”文本框中。文本框中。当单击当单击“打开排序窗口打开排序窗口”按钮时,打开窗体按钮时,打开窗体Form2。(2)在窗体在窗体Form2中,当单击中,当单击“排序排序”按钮时,调用标准模块按钮时,调用标准模块中的中的Sub过程过程Sort,对数组,对数组a中的中的10个数按从小到大的顺序排个数按从小到大的顺序排序,并将排序后的结果显示在序,并将排序后的结果显示在“
29、排序结果排序结果”文本框中。文本框中。单击单击“返回返回”按钮返回到窗体按钮返回到窗体Forml。7编写判断素数的编写判断素数的Function过程,验证过程,验证哥德巴赫猜想:一个大于等于哥德巴赫猜想:一个大于等于6的偶数可的偶数可以表示为两个素数之和,即以表示为两个素数之和,即“1+1”问题。问题。例如,例如,6=3+3,8=3+5,10=3+7等。等。要求程序运行的界面如图要求程序运行的界面如图7-37所示:用所示:用户在左边的文本框输入一个户在左边的文本框输入一个6以上的偶数,以上的偶数,单击命令按钮单击命令按钮“=”,即可在右边的文本,即可在右边的文本框观察到该数为两个素数的和。框观察到该数为两个素数的和。