《子过程和函数过程精.ppt》由会员分享,可在线阅读,更多相关《子过程和函数过程精.ppt(86页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、子过程和函数过程1第1页,本讲稿共86页本章主要介绍:本章主要介绍:定义定义Sub过程过程定义定义Function函数过程函数过程调用调用Sub过程或过程或Function函数过程函数过程调用事件过程调用事件过程变量的存储类别和作用域。变量的存储类别和作用域。编写过程,可以实现代码重复使用。编写过程,可以实现代码重复使用。2第2页,本讲稿共86页8.1.1 什么是过程什么是过程过程是编写程序的功能模块过程是编写程序的功能模块使用过程主要有以下两方面的原因:使用过程主要有以下两方面的原因:1可以把复杂的问题简单化可以把复杂的问题简单化任务分解为子任务,子任务用过程实现任务分解为子任务,子任务用过
2、程实现使程序结构清晰、易读,也便于调试和维护。使程序结构清晰、易读,也便于调试和维护。2可以实现代码重复使用可以实现代码重复使用可以避免重复编写的烦琐可以避免重复编写的烦琐可以减少出错。可以减少出错。8.1 8.1 概述概述3第3页,本讲稿共86页8.1.2 过程分类与调用流程过程分类与调用流程VB中的过程分成两大类:中的过程分成两大类:事件过程:事件过程:由对象的某个事件驱动执行由对象的某个事件驱动执行如如Click事件过程、事件过程、Load事件过程等事件过程等通用过程通用过程由用户自已定义的完成某一功能的过程。由用户自已定义的完成某一功能的过程。通用过程不属于任一对象,不由事件驱动通用过
3、程不属于任一对象,不由事件驱动使用专用的调用语句来执行它使用专用的调用语句来执行它4第4页,本讲稿共86页通用过程又分两类:通用过程又分两类:Sub过程(子过程、子程序)过程(子过程、子程序)往往用于处理不需要有返回值的一些基本任往往用于处理不需要有返回值的一些基本任务务如显示矩阵。如显示矩阵。Function函数过程:函数过程:可作为函数使用,它一般应有一个返回值可作为函数使用,它一般应有一个返回值如求阶乘。如求阶乘。5第5页,本讲稿共86页调用流程如图:调用流程如图:VB的应用程序就是由若干个过程构成的。的应用程序就是由若干个过程构成的。6第6页,本讲稿共86页【例例8-1】设计程序,其作
4、用是根据姓名查电话号码。设计程序,其作用是根据姓名查电话号码。输入姓名后,单击输入姓名后,单击“确定确定”或按回车键,使姓名或按回车键,使姓名与内部储存的一批姓名核对,若存在,则显示与内部储存的一批姓名核对,若存在,则显示“欢迎查询欢迎查询”内并使窗体只显示标签,且文字为姓内并使窗体只显示标签,且文字为姓名和对应的电话号码。最多允许输入名和对应的电话号码。最多允许输入3遍。遍。控件:控件:1个标签、个标签、1个文本框个文本框1个个“确定确定”命令按钮命令按钮8.2 8.2 查询电话号码查询电话号码7第7页,本讲稿共86页过程:过程:Form_Load事件:储存一批姓名和电话号码事件:储存一批姓
5、名和电话号码等等Command1_Click事件:核对姓名,显示提示事件:核对姓名,显示提示Text1_KeyPress事件:核对姓名,显示提示事件:核对姓名,显示提示CheckName 函数过程:判断此人是否存在,函数过程:判断此人是否存在,得下标得下标/-1。姓名和电话号码为模块级变量、姓名和电话号码为模块级变量、N为静态变量。为静态变量。8第8页,本讲稿共86页 Dim Name1,Phone 声明声明Name1,Phone为为模块级模块级Variant类型变量类型变量Private Sub Command1_Click()核对姓名,显示提示核对姓名,显示提示 Static N As I
6、nteger 声明声明N为为静态静态整型变量整型变量 Dim T As Integer T=CheckName(Text1.Text)以姓名为参数,调用以姓名为参数,调用函数函数CheckBook If T -1 Then MsgBox 欢迎查询欢迎查询!,提示提示 Text1.Visible=False:Command1.Visible=False Label1.Caption=姓名姓名:&Text1.Text&Chr(13)&电话电话:&Phone(T)Label1.Left=(Form1.ScaleWidth-Label1.Width)/2 让标签在中间让标签在中间9第9页,本讲稿共86
7、页Else N=N+1 核对次数加核对次数加1 If N 3 Then MsgBox 你输错了你输错了,这是第这是第&N&次错次错,请重输请重输!,提示提示 Text1.Text=:Text1.SetFocus Else MsgBox 你已经输错你已经输错3次了次了!再见再见!,提示提示 End End If End IfEnd Sub10第10页,本讲稿共86页 Private Sub Form_Load()初始化数组、设置属性初始化数组、设置属性 Label1.AutoSize=True Text1.Text=:Label1.Caption=姓名姓名:Command1.Caption=确定
8、确定 Name1=Array(张小红张小红,李小芳李小芳,王小华王小华,王力王力,李季李季,黄大海黄大海)Phone=Array(8820123,8882011,7812321,2444522,1243211,3434555)End Sub11第11页,本讲稿共86页 Function CheckName(Na As String)As Integer 函数过程,返回位置函数过程,返回位置 Dim i As Integer CheckName=-1 For i=LBound(Name1)To UBound(Name1)线性查找法线性查找法 If Name1(i)=Na Then CheckNa
9、me=i:Exit For Next I End Function Private Sub Text1_KeyPress(KeyAscii As Integer)If KeyAscii=13 Then Command1_Click 遇回车时,遇回车时,调用事件过程调用事件过程 End Sub12第12页,本讲稿共86页VB中的模块属于工程资源中的模块属于工程资源它由过程或声明构成,以独立的文件管理。它由过程或声明构成,以独立的文件管理。工程中包含窗体、类和标准模块文件工程中包含窗体、类和标准模块文件本节介绍本节介绍窗体模块窗体模块标准模块。标准模块。8.3 8.3 窗体模块和标准模块窗体模块和
10、标准模块13第13页,本讲稿共86页8.3.1 窗体模块窗体模块窗体模块是大多数窗体模块是大多数VB应用程序的基础应用程序的基础窗体模块与窗体对应,存放窗体上所有信息:窗体模块与窗体对应,存放窗体上所有信息:窗体及窗体上各控件界面信息、属性、事件过程窗体及窗体上各控件界面信息、属性、事件过程通用过程通用过程变量和常量的声明等。变量和常量的声明等。窗体模块文件的扩展名为窗体模块文件的扩展名为.Frm一个应用程序可以创建多个窗体模块一个应用程序可以创建多个窗体模块14第14页,本讲稿共86页8.3.2 标准模块和标准模块和Sub Main过程过程标准代码模块一般存放与特定窗体或控件无关标准代码模块
11、一般存放与特定窗体或控件无关的通用过程、全局变量的声明等的通用过程、全局变量的声明等如求阶乘如求阶乘一个过程要被多个不同对象或模块调用时,那一个过程要被多个不同对象或模块调用时,那么该过程一般可放在标准模块中。么该过程一般可放在标准模块中。一个应用程序可建立多个标准模块一个应用程序可建立多个标准模块建立标准模块的方法是:建立标准模块的方法是:使用使用“工程工程”菜单的菜单的“添加模块添加模块”命令项。命令项。15第15页,本讲稿共86页应用程序启动时,可先装载窗体,也可先运行应用程序启动时,可先装载窗体,也可先运行Sub Main过程过程Sub Main是过程名为是过程名为Main的特殊过程的
12、特殊过程Sub Main过程必须放在标准模块中才可作为过程必须放在标准模块中才可作为启动对象。启动对象。启动对象可以在工程属性中设置启动对象可以在工程属性中设置16第16页,本讲稿共86页8.4.1 定义定义Sub过程过程Sub过程一般指通用子过程,可在程序中调用执过程一般指通用子过程,可在程序中调用执行,执行完毕后无返回值。行,执行完毕后无返回值。它可以定义在窗体模块的通用对象中,也可以它可以定义在窗体模块的通用对象中,也可以定义在标准模块中。格式:定义在标准模块中。格式:Sub 过程名过程名(参数列表参数列表)语句块语句块 End Sub8.4 Sub8.4 Sub过程过程17第17页,本
13、讲稿共86页1关于格式关于格式过程名的命名方式与变量名命名一致。过程名的命名方式与变量名命名一致。参数列表为调用时传递给参数列表为调用时传递给Sub过程的参数,用过程的参数,用逗号间隔。逗号间隔。Sub过程也可以没有参数,但括号不可省。过程也可以没有参数,但括号不可省。参数的常用语法是:参数的常用语法是:参数名参数名 As 类型说明类型说明定义时的参数,又称为形式参数,简称形参。定义时的参数,又称为形式参数,简称形参。Sub和和End Sub必须成对出现必须成对出现18第18页,本讲稿共86页2关于语句块关于语句块语句块即为过程体,与事件过程的代码编写一语句块即为过程体,与事件过程的代码编写一
14、样样包含变量声明和可执行的语句、方法等包含变量声明和可执行的语句、方法等可以由顺序、分支、循环三种结构综合而成。可以由顺序、分支、循环三种结构综合而成。语句块中可直接使用参数语句块中可直接使用参数说明:说明:语句块中不能重复声明形式参数。语句块中不能重复声明形式参数。Sub 过程名过程名(参数列表参数列表)语句块语句块 End Sub19第19页,本讲稿共86页3过程定义步骤过程定义步骤打开代码窗口,对象框中选打开代码窗口,对象框中选“通用通用”,然后输,然后输入过程首行并回车,入过程首行并回车,VB自动显示自动显示End Sub然后再输入过程体就可以了。如:然后再输入过程体就可以了。如:定义
15、过程定义过程Hello:实现以姓名为参数显示:实现以姓名为参数显示“XXX你好!你好!”(XXX具体内容由参数决定)具体内容由参数决定)Sub 过程名过程名(参数列表参数列表)语句块语句块 End Sub20第20页,本讲稿共86页完整代码应为:完整代码应为:Sub Hello(XXX As String)MsgBox XXX&你好!你好!End Sub以上过程的过程名为以上过程的过程名为Hello形式参数为形式参数为XXX且是字符串型且是字符串型过程体只用了一句过程体只用了一句MsgBox,并同时使用了参,并同时使用了参数数XXX。21第21页,本讲稿共86页程序中使用调用语句可调用程序中使
16、用调用语句可调用Sub过程过程过程运行完毕或跳出过程运行后,返回到调用处。过程运行完毕或跳出过程运行后,返回到调用处。1调用调用Sub过程的方法过程的方法过程定义在当前模块或标准模块中过程定义在当前模块或标准模块中使用以下两种格式之一:使用以下两种格式之一:格式一:格式一:过程名过程名 实参数列表实参数列表 格式二:格式二:Call 过程名过程名(实参数列表实参数列表)如如Hello过程,可以使用:过程,可以使用:Hello 王小红王小红 或或 Call Hello(王小红王小红)22第22页,本讲稿共86页过程定义在窗体模块中而调用语句在其它模过程定义在窗体模块中而调用语句在其它模块中块中采
17、用以下两种格式之一:采用以下两种格式之一:格式一:格式一:窗体名窗体名.过程名过程名 实参数列表实参数列表格式二:格式二:Call 窗体名窗体名.过程名过程名(实参数列表实参数列表)调用调用Sub过程的方法也可以用来调用事件过程,过程的方法也可以用来调用事件过程,如例如例4-10,可用:,可用:Private Sub Check2_Click()Check1_Click 这时调用的过程名这时调用的过程名即为即为Check1_Click End Sub23第23页,本讲稿共86页2关于过程调用时的参数关于过程调用时的参数过程调用时的参数称为实际参数,简称实参。过程调用时的参数称为实际参数,简称实
18、参。它可以变量、常量或表达式。它可以变量、常量或表达式。实参与形参的个数应相同、类型应一致实参与形参的个数应相同、类型应一致若实参是表达式,则先计算值,再将值送若实参是表达式,则先计算值,再将值送给对应的形参。给对应的形参。实参和形参可以使用同名变量。实参和形参可以使用同名变量。如果定义的过程没有形参,则调用时就没有如果定义的过程没有形参,则调用时就没有实参。实参。24第24页,本讲稿共86页使用使用Call调用时,实参部分要加上括号调用时,实参部分要加上括号不使用不使用Call关键字,直接用过程名调用时,关键字,直接用过程名调用时,参数部分不能加上括号,但过程名和第一个参数部分不能加上括号,
19、但过程名和第一个参数之间要有空格。参数之间要有空格。例如,编程:要求输入姓名,调用例如,编程:要求输入姓名,调用Hello过过程,则程序如下:程,则程序如下:Private Sub Command1_Click()Dim S As String S=InputBox(请输入姓名请输入姓名)Hello SEnd Sub25第25页,本讲稿共86页【例例8-2】分析以下程序:分析以下程序:Sub A(n As Integer)Dim i As Integer For i=1 To n:Print i;:Next Call B PrintEnd SubSub B()Print BBBBBBEnd S
20、ubPrivate Sub Command1_Click()Call A(9)B 直接使用过程名调用过程直接使用过程名调用过程B()End Sub26第26页,本讲稿共86页8.4.2 调用调用Sub过程过程【例例8-3】设计一个如设计一个如图图所示的程序,其作用是显示字符图案。所示的程序,其作用是显示字符图案。显示的字符和行数由输入决定,形状可以是正三角形或倒三角显示的字符和行数由输入决定,形状可以是正三角形或倒三角形。形。编写通用过程编写通用过程Print_triangle,输出三角形图案。,输出三角形图案。显示的字符显示的字符S、行数、行数Line、及作为正或倒的三角形标志、及作为正或倒
21、的三角形标志Flag 均作为参数均作为参数Print_triangle供两个命令按钮调用供两个命令按钮调用两个命令按钮的两个命令按钮的Click事件:事件:输入输入1个字符和行数,调用个字符和行数,调用Print_triangle过程。过程。8.4 Sub8.4 Sub过程过程27第27页,本讲稿共86页8.4.2 调用调用Sub过程过程字符三角形字符三角形Sub Print_triangle(S As String,Line As Integer,Flag As Integer)通用过程通用过程 Dim A As Integer,B As Integer,i As Integer,j As
22、Integer Cls If Flag=-1 Then A=Line:B=1 Else A=1:B=Line For i=A To B Step Flag 正正:从小到大循环,倒从小到大循环,倒:从大到小循环从大到小循环 Print Tab(Line+10-i);For j=1 To 2*i 1:Print S;:Next j Print Next iEnd Sub28第28页,本讲稿共86页 Private Sub Command1_Click()Dim Ch As String*1,Line As Integer Ch只容纳只容纳1个字符个字符 Ch=InputBox(请输入一个要显示的字
23、符请输入一个要显示的字符)Line=Val(InputBox(请输入显示的行数请输入显示的行数)Print_triangle Ch,Line,1 以标志以标志1调用过程调用过程End SubPrivate Sub Command2_Click()Dim Ch As String*1,Line As Integer Ch=InputBox(请输入一个要显示的字符请输入一个要显示的字符)Line=Val(InputBox(请输入显示的行数请输入显示的行数)Print_triangle Ch,Line,-1 以标志以标志-1调用过程调用过程End Sub29第29页,本讲稿共86页8.4.3 Exi
24、t Sub语句语句使用使用Exit Sub语句可以中途结束子过程的运行。语句可以中途结束子过程的运行。程序不再执行程序不再执行Exit Sub到到End Sub之间的代码,之间的代码,而是直接返回到调用处。而是直接返回到调用处。Exit Sub语句一般往往与语句一般往往与If语句合用,如:语句合用,如:修改例修改例8-3中的中的Print_triangle过程,当过程,当Line参数小于等于参数小于等于0,Flag参数不等于参数不等于1时,显时,显示示“参数错误参数错误”并退出过程。并退出过程。30第30页,本讲稿共86页则可以在则可以在Print_triangle过程的过程的Cls前增加一前
25、增加一句:句:If Line=0 Or Abs(Flag)1 Then Msgbox 参数错误参数错误:Exit Sub Exit Sub也可以用在事件过程也可以用在事件过程特别注意:在过程中途退出过程不能使用特别注意:在过程中途退出过程不能使用End Sub。31第31页,本讲稿共86页8.5.1 定义定义Function函数过程函数过程Function函数过程执行完毕后有一个返回值。函数过程执行完毕后有一个返回值。函数过程定义后,可像系统函数一样使用。函数过程定义后,可像系统函数一样使用。函数可定义在窗体模块的通用对象中或标准模函数可定义在窗体模块的通用对象中或标准模块中。块中。格式:格式
26、:Function 函数名函数名(参数列表参数列表)As 类型说明类型说明 函数体函数体End Function8.5 Function8.5 Function函数过程函数过程32第32页,本讲稿共86页1关于格式关于格式函数名、参数列表的要求与函数名、参数列表的要求与Sub过程的过程过程的过程名、参数相同。名、参数相同。Function必须在必须在End Function之前出现,且之前出现,且必须成对必须成对Function语句中的类型说明,是返回值的类语句中的类型说明,是返回值的类型。型。如编一个判断整型参数如编一个判断整型参数n是否为素数的函是否为素数的函数,首行可写为:数,首行可写为
27、:Function Prime(n As Integer)As Boolean33第33页,本讲稿共86页8.5.1 定义定义Function函数过程函数过程2关于函数体关于函数体函数体是一系列用于完成某一功能的代码函数体是一系列用于完成某一功能的代码包含变量声明和可执行语句包含变量声明和可执行语句可由顺序、分支、循环三种结构合成。一般格式:可由顺序、分支、循环三种结构合成。一般格式:语句块语句块 函数名函数名=表达式表达式 语句块语句块一般,函数体中应有一句一般,函数体中应有一句“函数名函数名=表达式表达式”,表示该表达式的值就作为函数的返回值表示该表达式的值就作为函数的返回值该表达式的类型
28、应该与函数的类型说明一致该表达式的类型应该与函数的类型说明一致34第34页,本讲稿共86页3函数定义步骤函数定义步骤同编写过程一样,在同编写过程一样,在“通用通用”对象代码窗口输入对象代码窗口输入函数首行。函数首行。如定义函数过程如定义函数过程Max,实现求三个数的最大值:,实现求三个数的最大值:Function Max(a As Integer,b As Integer,c As Integer)As Integer Max=a If b Max Then Max=b If c Max Then Max=cEnd Function35第35页,本讲稿共86页以上函数过程的过程名为以上函数过程
29、的过程名为Hello形式参数形式参数a、b、c为整型为整型函数体中多次使用了函数名函数体中多次使用了函数名Max,并使用了参数,并使用了参数特别说明:特别说明:不能写成不能写成Max(a,b,c)=a。36第36页,本讲稿共86页8.5.2 调用调用Function函数过程函数过程函数调用方式如同调用函数调用方式如同调用VB内部函数内部函数调用格式:调用格式:函数过程名函数过程名(实参数列表实参数列表)调用函数往往在可以使用表达式的代码中出现,只要类型相同调用函数往往在可以使用表达式的代码中出现,只要类型相同就可以了。就可以了。如对如对Max函数过程,可以使用:函数过程,可以使用:A=Max(
30、1,43,5):Print Max(Max(1,3,21),56,4)如果函数定义在窗体模块中而调用语句在其它模块中,则调用如果函数定义在窗体模块中而调用语句在其它模块中,则调用时应在函数名前加上所属的窗体名。时应在函数名前加上所属的窗体名。实参用法和要求,与子过程调用相同。实参用法和要求,与子过程调用相同。37第37页,本讲稿共86页【例例8-4】编程计算,在本文框输出。要求计算编程计算,在本文框输出。要求计算n!使用函数过程使用函数过程Factorial(n)实现。实现。控件:控件:2个文本框、个文本框、3个标签个标签 1个命令按钮。个命令按钮。过程:过程:通用函数过程通用函数过程Fact
31、orial(n):求阶乘:求阶乘Command1_Click事件:求事件:求属性:属性:大部分属性在大部分属性在Form_Load中设置中设置命令按钮为图形按钮,更改命令按钮为图形按钮,更改Style、Caption和和Picture属性属性38第38页,本讲稿共86页Function Factorial(N As Integer)As Double 通用函数过程,求通用函数过程,求n!Dim i As Integer,T As Double T=1 For i=1 To N:T=T*i:Next i Factorial=TEnd FunctionPrivate Sub Command1_Cl
32、ick()计算结果,要求计算结果,要求mn Dim M As Integer,N As Integer M=Val(Text1.Text):N=Val(Text2.Text)If M N Then 当当mn时,给出提示,清除数据,跳出过程时,给出提示,清除数据,跳出过程39第39页,本讲稿共86页 MsgBox m必须大于等于必须大于等于n。,提示提示“Text1.Text=:Text2.Text=:Text1.SetFocus Exit Sub End If Label3.Caption=答案:答案:&Factorial(M)/(Factorial(N)*Factorial(M-N)End
33、SubPrivate Sub Form_Load()初始化控件属性初始化控件属性 Label1.Caption=m=:Label2.Caption=n=:Label3.Caption=“Text1.Text=:Text2.Text=“End Sub40第40页,本讲稿共86页8.5.3 Exit Function语句语句使用使用Exit Function语句跳出语句跳出Function函数过程。函数过程。Exit Function语句一般与语句一般与If语句合用,即在满足某种条件语句合用,即在满足某种条件时退出该函数过程,返回调用处。时退出该函数过程,返回调用处。如修改例如修改例8-4中的中的
34、Factorial函数过程,当函数过程,当N0时显示时显示“参数参数错误错误”并退出并退出Factorial函数过程。则可以增加:函数过程。则可以增加:If N0 Then Factorial=1:MsgBox 参数错误参数错误:Exit Function注意:在函数过程中途退出不能使用注意:在函数过程中途退出不能使用End Function。41第41页,本讲稿共86页形式参数形式参数(形参形参)是过程定义时的参数是过程定义时的参数实际参数实际参数(实参实参)是过程调用时的参数是过程调用时的参数过程调用时,实参向形参传递数据过程调用时,实参向形参传递数据传递的方法分为:传递的方法分为:“引用
35、传递引用传递”(“引用调用引用调用”)“按值传递按值传递”(“按值调用按值调用”)(这里的过程是统指子过程和函数过程)(这里的过程是统指子过程和函数过程)8.6 8.6 引用调用和按值调用引用调用和按值调用42第42页,本讲稿共86页8.6.1 引用调用引用调用引用调用:形参变量与实参变量引用调用:形参变量与实参变量共享一个内存单元。一个内存单元。此时,过程中对形参的修改,影响实参变量此时,过程中对形参的修改,影响实参变量即可实现把过程中对形参修改的结果带回调用过程。即可实现把过程中对形参修改的结果带回调用过程。前面格式中,所有参数都采用引用调用,除非实参是表达式。前面格式中,所有参数都采用引
36、用调用,除非实参是表达式。单击单击Command1后,后,N1和和N为同一为同一个内存单元,所以个内存单元,所以N1的值就变成的值就变成8。最终窗体显示最终窗体显示8。43第43页,本讲稿共86页引用调用的形参说明,可使用格式:引用调用的形参说明,可使用格式:ByRaf 参数名参数名 As 类型说明类型说明缺省缺省ByRaf表示引用调用。如:表示引用调用。如:Sub Abc1(N As Integer)N=N+5 End Sub Private Sub Command1_Click()Dim N1 As Integer N1=3:Call Abc1(n1):Print N1 End Sub44
37、第44页,本讲稿共86页8.6.2 按值调用按值调用按值调用时,实参值被按值调用时,实参值被复制复制到形式参数中到形式参数中如果实参为变量,相当于两者用了不同的存储单如果实参为变量,相当于两者用了不同的存储单元元对形参的操作对形参的操作不会影响不会影响实参的内容。实参的内容。按值调用的形式参数的说明,使用格式:按值调用的形式参数的说明,使用格式:ByValByVal 参数名参数名 As 类型说明类型说明若实参是表达式,则一律使用按值调用若实参是表达式,则一律使用按值调用单击单击Command1后,后,N1和和N实际上实际上是不同的内存单元,调用时只将是不同的内存单元,调用时只将N1的值送入形参
38、的值送入形参N中,最终显示中,最终显示3。45第45页,本讲稿共86页如:如:Sub Abc2(ByVal N As Integer)N=N+5 End Sub Private Sub Command1_Click()Dim N1 As Integer N1=3:Call Abc2(N1)Print N1 End Sub46第46页,本讲稿共86页【例例8-5】编写求一元二次方程实数解的过程并调编写求一元二次方程实数解的过程并调用它。用它。由于方程有两个解。而函数返回一个值。解决方法:由于方程有两个解。而函数返回一个值。解决方法:编写编写Sub过程过程Root,X1和和X2为引用调用,为引用调
39、用,A、B、C为为按值调用。按值调用。SubSub RootRoot(ByValByVal A As Single,A As Single,ByValByVal B As Single,_ B As Single,_ ByValByVal C As Single,X1 As Single,X2 As Single)C As Single,X1 As Single,X2 As Single)Dim D As Single Dim D As Single D=B*B-4*A*C D=B*B-4*A*C If A=0 Then MsgBox If A=0 Then MsgBox 不是一元二次方程!不
40、是一元二次方程!:Exit Sub:Exit Sub If D 0 Then MsgBox If D 0 Then MsgBox 方程无实数解!方程无实数解!:Exit Sub:Exit Sub X1=(-B+Sqr(D)/(2*A):X2=(-B-Sqr(D)/(2*A)X1=(-B+Sqr(D)/(2*A):X2=(-B-Sqr(D)/(2*A)End SubEnd Sub47第47页,本讲稿共86页Private Sub Command1_Click()Private Sub Command1_Click()Dim A As Single,B As Single,C As Single,
41、X1 As Single,X2 As SingleDim A As Single,B As Single,C As Single,X1 As Single,X2 As Single A=3:B=9:C=5A=3:B=9:C=5 Root A,B,C,X1,X2Root A,B,C,X1,X2 A A、B B、C C按值,按值,X1X1和和X2X2引用调用引用调用 Print X1,X2Print X1,X2End SubEnd Sub程序调用前,程序调用前,X1和和X2没有赋过值,通过没有赋过值,通过引用调用,使它们得到了方程的实数解。引用调用,使它们得到了方程的实数解。48第48页,本讲稿共
42、86页8.6.3 传递数组传递数组传递数组,形式参数的格式:传递数组,形式参数的格式:参数名参数名()As类型说明类型说明数组不能按值调用,只能引用调用数组不能按值调用,只能引用调用【例例8-6】随机产生两个随机产生两个34的矩阵的矩阵A和和B,矩阵元,矩阵元素值为素值为150的整数。求两个矩阵的和的整数。求两个矩阵的和C。并输出。并输出矩阵矩阵A、B和和C。运行如。运行如图图。矩阵加法使元素矩阵加法使元素C(i,j)=A(i,j)+B(i,j)49第49页,本讲稿共86页编写过程:编写过程:通用过程通用过程PrintM:实现矩阵输出:实现矩阵输出通用过程通用过程CreateM:产生矩阵:产生
43、矩阵事件过程事件过程Form_Load:初始化随机数种:初始化随机数种事件过程事件过程Command1_Click:调用通用过程并:调用通用过程并实现题目实现题目50第50页,本讲稿共86页8.6.3 传递数组传递数组-矩阵加法矩阵加法Sub CreateM(A()As Integer)Sub CreateM(A()As Integer)创建创建 For i=1 To UBound(A,1)For j=1 To UBound(A,2)A(i,j)=Int(Rnd*50)+1 Next j Next iEnd Sub51第51页,本讲稿共86页Sub PrintM(A()As Integer)输
44、出输出 For i=1 To UBound(A,1)For j=1 To UBound(A,2)Print A(i,j),Next j Print Next iEnd Sub 说明:说明:UBound函数的第函数的第2个参数指数组的维,当该数为个参数指数组的维,当该数为1时,指时,指它的第它的第1维上界,该数为维上界,该数为2时,指它的第时,指它的第2维上界。维上界。52第52页,本讲稿共86页Private Sub Command1_Click()Dim A(3,4)As Integer,B(3,4)As Integer Dim C(3,4)As Integer,i As Integer,j
45、 As Integer CreateM A 创建矩阵创建矩阵A CreateM B 创建矩阵创建矩阵B For i=1 To 3 矩阵加法矩阵加法 For j=1 To 4 C(i,j)=A(i,j)+B(i,j)Next j Next i Cls53第53页,本讲稿共86页 Print Tab(22);A 矩阵矩阵:PrintM A 输出输出A Print Tab(22);B 矩阵矩阵:PrintM B 输出输出B Print Tab(22);C 矩阵矩阵:PrintM C 输出输出C End Sub Private Sub Form_Load()Randomize End Sub54第54
46、页,本讲稿共86页8.6.4 可选参数可选参数可选参数表示调用时该参数可选(可不写)可选参数表示调用时该参数可选(可不写)定义可选参数是在形参的前加定义可选参数是在形参的前加Optional关键字关键字若该形参后还有参数,则后面必须都定义为可若该形参后还有参数,则后面必须都定义为可选。选。IsMissing函数判断是否提供可选参函数判断是否提供可选参数,若未提供,则值为数,若未提供,则值为True。这时两个过程调用语句可分别改为:这时两个过程调用语句可分别改为:Print_triangle Ch,Line 2个参数个参数Print_triangle Ch,Line,-1 3个参数。个参数。55
47、第55页,本讲稿共86页如例如例8-3的的Print_triangle过程,可将第过程,可将第3个参数个参数Flag设置为可选:若调用时不用设置为可选:若调用时不用Flag表示输出正表示输出正三角形:三角形:Sub Print_triangle(S As String,Line As Integer,Optional Flag As Integer)Dim A As Integer,B As Integer,C As Integer,i As Integer,j As Integer Cls:A=1:B=Line:C=1 If Not IsMissing(Flag)Then If Flag M
48、 Then M=A(i)Next i Max=MEnd FunctionPrivate Sub Command1_Click()调用时,参数个数可以不限调用时,参数个数可以不限 Print Max(6,4,3,2,1)使用了使用了5个参数个参数 Print Max(10,34,5,56,2,55,67,83,9)使用了使用了9个参数个参数End Sub58第58页,本讲稿共86页8.6.6 对象参数对象参数过程可以使用对象过程可以使用对象如在如在7.8节的节的“选择联系人选择联系人”例子中,例子中,List1_KeyDown事件过程和事件过程和List2_KeyDown事件事件过程的代码除了对
49、象名不同外,其它是可以相同过程的代码除了对象名不同外,其它是可以相同,因此可用参数为对象的通用过程,因此可用参数为对象的通用过程Delete:59第59页,本讲稿共86页 Sub Delete(a As Object,keyCode As Integer)将将a定义为对象变量定义为对象变量 Dim i As Integer If keyCode=vbKeyDelete Then 按下了按下了Delete键键,删除已选项目删除已选项目 For i=a.ListCount-1 To 0 Step-1 If a.Selected(i)=True Then a.RemoveItem i Next En
50、d If End Sub Private Sub List1_KeyDown(keyCode As Integer,Shift As Integer)Delete List1,keyCode End Sub Private Sub List2_KeyDown(keyCode As Integer,Shift As Integer)Delete List2,keyCode End Sub60第60页,本讲稿共86页变量是存放数据的单元,其中的数据随着程序变量是存放数据的单元,其中的数据随着程序的运行而变化。的运行而变化。过程中使用过程中使用Dim语句声明的变量,将随着过程的语句声明的变量,将随着