第六章 过程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
exit function
end if End function
例:定义一个MyReplace(S,OldS, NewS)函数过程,即用NewS子字符串替 换在S字符串中出现的OldS子字符串。
如:当调用MyReplace(“abcdefgabcdecd”,”cd”,”3”)时,函数的返回值为 “ab3efgab3e3” Public function MyReplace(s$,OldS$,NewS$) as string dim i%,lenOldS% lenOldS=len(OldS)
i=instr(s,OldS)
Do While i>0
„在字符串s中找OldS字符子串
s=Left(s,i-1)+NewS+Mid(s,i+lenOldS)
i=instr(s,OldS)
Loop MyReplace=s
„找下一个OldS字符子串
End Function
二、函数过程调用
1、直接调用 格式:函数过程名(实参列表) 其中: •实参列表的各参数之间要用逗号隔开; •实参个数必须与对应的函数过程的形参个数完全相同,且可以是常数、 表达式或与形参类型相同的变量和数组元素。 例:设计一界面(如下图),用于计算n的阶乘。
2、用Call语句调用 如果不需要函数的返回值,还可以用Call语句调用函数。格式为: 第一种:Call 函数名(实参表) 第二种:函数名 实参表 如:调用前面的求直角三角形的第三边的函数c,就可以用: Call c(3,4) 或 c 3,4 3、无参函数调用 无参函数调用,只需要给出函数名即可。 格式:函数名 如前面曾经调用过的随机函数 Rnd 注意:无参函数在定义时,函数名后面的空括号必须有,但在调用时可 以将其省略。
例:编制一个交换两数的子过程,以供主调程序调用。
Public Sub Swap(x,y) Private Sub Form_click( )
Dim t
t=x x=y y=t End Sub
Dim a,b
a=10 b=20 Swap a,b Print a,b „注意调用方式
End Sub
注意子过程与函数过程的区别: •把某功能定义为函数过程还是子过程,没有严格的规定,但只 要能用函数过程定义的,肯定能用子过程定义;反之不一定。 一般来说,当过程有一个计算值时,用函数过程,通过函数名 将计算结果返回到主程序;当有多个计算值时,用子过程,将 计算结果通过实参和形参的结合返回到主程序。 •在函数过程体内必须对函数过程名赋值,既函数过程名有值; 而子过程名无值,不能在过程体内对子过程名赋值; 二、子过程的调用方法 1、Call 过程名[(实参列表)] 如: Call Swap(a,b) 2、过程名 [实参列表] Call ChangForm ‘注意实参不加括号
exit Function End If
y= r & y
end if Loop Until x=0 decton=y End Function
y=“”
Do
Private Sub Command1_Click( ) Dim x%,n% x=InputBox(“请输入待转换的十进制整数”,“数值转换”, 0) n=InputBox(“请输入要转换的进制”,“数值转换”,2) MsgBox”转换结果:” & decton(x,n)
2、在代码窗口下直接建立 函数过程可以写在模块代码中除了通用声明段之外的任何 位置上,当然要独立于其它过程之外,可以位于事件过程之前, 也可以位于事件过程之间。如下图
函数过程的声明:
[Static][Private][Public] Function 函数过程名([形参列表]) [ As 类型]
5.1 函数过程 严格讲,VB系统提供给用户直接使用的函数如:Rnd( )、 Chr( )、Abs( )等也都属于函数过程,只是把它们称为内部函 数。而现在说的函数过程是由用户自己编写的用于处理某一 具体问题的函数。 一、函数过程的建立 1、利用菜单建立 在“工具”菜单下选择“添加 过程”,显示如下的对话框。 按所需选择相应的过程名称、 类型、范围等,即可建立一个 函数过程。 但此方法一般不用。
语句块1 函数名=返回值
[Exit Function]
语句块2 End Function 说明: •每个函数过程都有一个用户自己的命名的函数过程名,而不是象事件过程 名是由系统给定的;
•[Static][Private][Public]是用于确定函数过程的作用域(后面细讲);
•有[形参列表]时为有参函数过程,反之为无参函数过程; •函数体的语句中,必须有一条语句是:函数过程名=表达式。其作用是在 函数调用结束时,将函数的返回值赋给函数过程名。 •如果在函数体中含有Exit Function语句时,表示强行退出此函数过程。
注意:过程中的形参允许和主程序中的实参同名,为什么?
2、传址调用
如果在声明过程时,形参名前加上ByRef,则规 定了此种调用是传址调用,由于这是VB中默认的传 递参数方式,所以ByRef可以省略。此时,形参和实 参共用同一块存储空间,形参在过程中的值如果被改 变了,实参的值也就同时改变。
传址调用时,实参必须是变量或数组。若为变量, 是将变量的内存地址传给对应位置上的形参;若为数 组,是将数组的起始元素地址传给形参数组,使实参 数组和形参数组具有相同的起始地址。
End Sub 例:编写一个英文打字训练的程序,要求如下:
•在文本框内随机产生30个字母的范文;
•当焦点进入文本框时开始计时,并显示当前的时间;
•在输入文本框中按产生的范文输入相应的字母; •当满了30个字母时结束计时,禁止再向文本框中输入内容;且 要显示打字的速度和正确率。
5.2 Sub子过程
一、 Sub子过程的建立 和函数过程的建立方法类似, Sub子过程既可以通过菜 单建立,也可以在窗体/标准模块的代码窗口中,把插入点放 在所有现有过程之外,直接输入过程名而建立 格式:[Private][Public][Static] Sub 过程名[(形参列表)]
语句块1
[Exit Sub] 语句块2 End Sub 其中:子过程名、参数列表规定同函数过程,但当无形参时, 括号也应无。
r=x Mod n Function decton(ByVal x%,ByVal n%) as string Dim y$,r% If n>16 then MsgBox “不能转换大于16的进制” x=x\n „\为整除 if r>=10 then y=chr(r-10+65) & y else
decton=-1
For I=5 to 14
Print data(I) Next I
Call Sort(data()) „调用无须说明维数
For I=5 to 14 Print data(I)
Next I
End Sub
例:设计一个数值转换函数,能够将一个十进制整数转换成为16进制以内的 任意进制数 分析:十进制数转换成n进制,常采用的方法是“除n取余,余数倒写(即最先 求出的余数位数最低)”,当n大于9时,需要把大于9的余数转换成字母。 转换函数过程名为decton有两个参数,一个是待转换的十进制整数,一个 是需要转换的进制。转换结果是一个字符串。
如:Swap a,b
ChangForm
例:在单击按钮事件过程中输 入两个整数,用不同的方式分 别调用求和子过程Add和求差 子过程Subst。 Private Sub Command1_Click( ) dim x%,y% x=inputbox(“请输入数据”) y= inputbox(“请输入数据”) Call Add(x,y)
例:通过Exchange过程交换形参,要求实参同步变化。
Sub Command1_Click( ) Dim a%,b% a=100:b=900 Print a,b Call Exchange(a,b) Print a,b End Sub Sub Exchange(ByRef x%,ByRef y%) Dim t% Print x,y t=x:x=y:y=t Print x,y End Sub 3、综合举例
例:分析下面程序,理解传值调用
Private Sub Form_Click( ) Dim a as integer, b as integer, c as integer a=5:b=3:c=9 cls print a;b;c Call prod((a),(b),(c)) Print a;b;c End Sub Sub prod (a as integer,b as integer,c as integer) a=6:b=8:c=a*b End Sub
•[As 类型]:函数返回值类型。若省则为变体型 例:已知直角三角形两直角边的值,编写计算第三边(斜边) 的函数过程。
Function c(a as single,b as single ) as single
if a>0 and b>0 then c=sqr(a^2+b^2) else msgbox”无效边长”
例:将一个数值型一维数组升序排序输出,排序在过程Sort中 进行,采用选择法排序。
Private Sub Command1_Click( ) Dim data%(5 to 14) ,I% For I=5 to 14 data(I)=30-I Next I „降序 Private Sub Sort(Et() As Integer) Dim I%, J%, T% For I = LBound(Et) To UBound(Et) For J = I + 1 To UBound(Et) If Et(I) > Et(J) Then T = Et(I) Et(I) = Et(J) Et(J) = T End If Next J Next I End Sub
Private Sub Command1_Click() Text2.Text = fact(Val(Text1.Text)) End Sub Private Sub Command2_Click() Text1.Text = "" Text2.Text = "" End Sub Function fact(n As Integer) As Long Dim i As Integer, f As Integer f=1 For i = 1 To n f=f*i Next i fact = f End Function
第5章 过程
我们已经知道,高级语言是把把程序按功能分为多个模块。 在每个模块的代码中,又分为相互独立的程序段,而每个程序段 完成一个具有特定目的任务,这种程序段称为过程(Procedure) 事件过程就是过程的一种类型,我们已经知道,每个对象如 果要对一个事件作出反应,都必须以语句的形式组织在一个事件 过程中。但是,随着程序功能的不断复杂化,事件程序中语句的 数量会大幅度增加,阅读和调试就变的困难了。要是在多个事件 过程中需要执行相同的或是相似的功能,就得在这些事件过程中 使用相同的程序段,这样就会造成代码的重复。此时,就需要 VB提供的另一类过程:自定义过程。 在VB中,自定义过程共有四种,我们只学习两种:以 “Function”开始的函数过程和以“Sub”开始的子过程。
Sub Add(a,b)
Dim c% c=a+b Print c End Sub
Sub Subst(a,b)
Dim c% c=a-b Print c End Sub
Subst x,y
End SBaidu Nhomakorabeab
8.3 参数传递 1、传值调用 此种方式的参数传递是单向的,即实参把其值传递给形参,而形参却 不能把它的值回传给实参。
VB中,当实参是以下几种方式时,参数传递是按值传递的:
•实参为常量或表达式 如:前面提到的求n的阶乘的过程,如果调用方式为
Call fact(9) 或 Call fact(x+y)
则是将9或x+y的值传递个形参n,是典型的传值调用。 •实参为带括号的变量
如:Call fact((n),(f))
此时,VB就会将其当成表达式按值传递。 •定义过程时在形参前面加关键字ByVal,则调用这种过程,不管实参是什 么形式,均采用传值调用的方式