4函数与子程序.docx

上传人:b****6 文档编号:6675106 上传时间:2023-01-08 格式:DOCX 页数:12 大小:62.04KB
下载 相关 举报
4函数与子程序.docx_第1页
第1页 / 共12页
4函数与子程序.docx_第2页
第2页 / 共12页
4函数与子程序.docx_第3页
第3页 / 共12页
4函数与子程序.docx_第4页
第4页 / 共12页
4函数与子程序.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

4函数与子程序.docx

《4函数与子程序.docx》由会员分享,可在线阅读,更多相关《4函数与子程序.docx(12页珍藏版)》请在冰豆网上搜索。

4函数与子程序.docx

4函数与子程序

第四节函数与子程序

应用背景

函数和子程序是构成程序的一个模块,往往是完成一个相对独立的功能,这个模块定义一个入口数据接口,一个中间过程处理算法逻辑,最后给定计算得到的出口数据接口。

因此模块的基本过程为:

数据接口+算法逻辑+数据接口。

将一个程序分解为多个模块过程,可以使程序更清晰,更容易调试,且更容易多人合作开发项目,共同完成一个大项目。

下图4-1描述了一个典型的程序构架,这里包括全局类定义,全局变量,局部变量,全局函数,局部函数,程序模块,全局常数,数据文件等等。

 

全局类定义

全局常数

全局变量

全局函数

 

程序入口SubMain()

 

图4-1程序构架

知识要点

(1)函数的定义与调用

一般函数有返回值,故有返回值类型定义,且返回值保存在函数名变量里。

函数定义的基本方式如下:

[public|private|static]function过程名(参数列表)as返回值类型

endfunction

在函数的定义中,过程名就是函数名,他代表一个返回值变量,而参数列表是一组数,代表函数的入口数据,即函数过程中要处理的数据。

调用函数的最基本方式为:

[变量名=]过程名([传递参数列表])

下面是一个给定三角形的三个边长,计算面积的函数定义:

PrivateFunctiontriangle(ByValaAsSingle,ByValbAsSingle,ByValcAsSingle)AsSingle

DimrAsSingle

r=(a+b+c)/2

r=r*(r-a)*(r-b)*(r-c)

Ifr<0Then

triangle=-1‘不符合条件,返回-1

Else

triangle=Sqr(r)

EndIf

EndFunction

函数调用方式如下:

DimarAsSingle

ar=triangle(6,8,10)

(2)参数传递

VB中实参与虚参的传递有两种方法:

Bydef(传地址)和Byval(传数值),在参数列表前定义。

在VB中,函数和子过程的默认传递方式是传址方式(Bydef),Bydef(传地址)是默认的方法,又成为引用。

当不写传递方式时,采用传址方式传递参数。

数组,对象只能通过传地址方式传递参数。

传递地址方式可以用来传递数据,也可以用来返回数据,而传递数据方式只能用于传递数据,不能返回数据。

(3)内部函数

内部函数是VB种自带的全局函数,程序员可以在程序的任意地方非常方便的引用一些常规的功能。

数学函数:

Sin(x):

返回x的正弦值,x单位为弧度。

Cos(x):

返回x的余弦值,x单位为弧度。

Tan(x):

返回x的正切值,x单位为弧度,如,Tan(45*3.1416/180)=1。

Atan(x):

返回x的反正切值,返回值单位为弧度,在-3.1416/2与3.1416/2之间,如,Atan

(1)的值为3.1416/4。

Exp(x):

返回以e为底的x指数值,如,Exp(3)表示求e的3次方。

Log(x):

返回x的自然对数,如表达式Log(x)/Log(10)可以计算以10为底的x的对数值。

Sqr(x):

返回x的平方根,Sqr(4)返回2.

Abs(x):

返回x的绝对值,Abs(-8.9)的结果为8.

Int(x):

当x为正数时,去掉小数部分,当x为负数时,返回小于负数的整数,Int(-7.8)的结果为-8,而int(7.8)的结果为7。

Fix(x):

该函属与Int(x)函数类似,只是当x为负数时,返回大于该负数的负整数。

Fix(-7.9)返回-7.

Rnd(x):

产生一个介于0到1之间的但精度随机数,x为产生随机数的种子,如:

8*rnd+1产生1—8之间的随机数。

有时候,为避免每次运行程序时产生相同的随机数,可以在使用随机函数语句之前,首先初始化随机函数,使用Ranomize函数进行初始化随机函数。

Hex(x):

以字符串的形式返回x的十六进制值。

Oct(x):

以字符串的形式返回x的八进制值。

字符串函数:

Instr([起始位置],str1,str2):

确定str2在str1中的一次出现的位置,如:

Instr(10,”nihao,helloworld,Imissyou”,””)就是找第10位置以后出现空格的位置,返回13.

Ltrim(str):

去掉字符串str左端的空格。

Rtrim(str):

去掉字符串str右端的空格。

Trim(str):

去掉字符串str左端和右端的空格。

Left(str,n):

字符串str从左边取出n个字符串,若n大于str的长度,则取str。

Right(str,n):

字符串str从右边取出n个字符串,若n大于str的长度,则取str。

Mid(str,n1,n2):

由起始位置n1,取字符串str的n2个字符串,如,Mid(“nihao,helloworld”,3,2)的返回值为hao。

Len(str):

返回字符串str的长度。

Ucase(str):

将字符串str转换为大写形式。

Lcase(str):

将字符串str转换为小写形式。

Space(n):

返回指定n个的空格。

String(n,s):

返回指定n个字符s的字符串。

日期函数:

Date():

返回当前系统日期。

Time():

返回当前系统时间。

Now():

返回当前系统日期和时间。

Hour():

返回0-23之间的数,Hour(T)返回小时数。

Day():

返回1-31之间的数,Day(T)返回当前日。

Month():

返回1-12之间的数,Month(T)返回当前月份。

Year():

返回年份,Year(T)返回给定日期的年份。

Weekday():

返回星期几,1-7之间的数,1表示周日。

类型转换函数:

Str(数值表达式):

强制转换为字符串。

Val(字符串表达式):

强制转换为数据类型。

Asc(字符):

将一个字符转换为Ascii码值,Asc(A)=65。

Chr(Ascii码值):

将Ascii码值转换为字符,Chr(65)=”A”。

判断函数:

IsDate(表达式):

判断表达式是否为日期类型,若是则返回true,否则返回false。

IsNumeric(表达式):

判断表达式是否为数值类型,若是则返回true,否则返回false。

IsArray(变量名):

该函数用来判断变量是否为数组,若是则返回true,否则返回false。

(4)过程的定义与调用

[public|private|static]sub子过程名([bydef|byval]参数列表)

…..

endsub

过程的调用方式如下:

call子过程名([bydef|byval]参数列表)

或者在不使用Call关键字的情况下,采用如下方式调用:

子过程名[bydef|byval]参数列表

函数与子过程的明显不同是采用函数名作为返回值,而子过程名则采用参数传递方式返回计算值,而且返回的参数可以很多,或者返回很复杂的数据结构等,一般用于比较复杂的功能,而函数一般功能比较单一。

下面的子过程给一个指定的数组进行排序,代码如下:

PrivateSuborder(s()AsInteger,nAsInteger)

Dimi,jAsInteger

DimtmpAsInteger

Fori=0Ton-1

Forj=0Ton-i-1

Ifs(j)>s(j+1)Then

tmp=s(j)

s(j)=s(j+1)

s(j+1)=tmp

EndIf

Nextj

Nexti

EndSub

调用子过程如下:

Constnn=10

Dims(nn)AsInteger

Callorder(s,nn)

该函数的传递参数有两个,一个是整数数组,一个是整数。

本例子就是采用默认的传递地址方式传递整数数组,在子过程中排序后,将排序好的数组传递回来。

因此,在调用排序函数的前打印数组与调用函数后打印数组是不一样的。

(5)递归函数

VB允许子过程或函数内部调用自己,这样的子过程或函数成为递归函数。

递归函数在程序的设计中是一个技巧,有时候能够很巧妙的解决很多实际问题。

下面是一个简单的递归函数举例:

PublicFunctiontree(sAsLong)AsLong

Ifs=0Then

tree=1

Else

tree=(s+1)/tree(s-1)

EndIf

EndFunction

在设计递归函数必须具备递归条件,否则程序陷入死循环的逻辑错误之中。

上面这个递归函数的终止条件是s=0。

(6)变量的作用域

在窗体和标准模块中定义的变量或过程,加Private作限制的,只能在当前模块中使用。

在窗体中定义的过程,一般应该用Private加以限制,说明该过程或变量是窗体级变量,只能在窗体模块中使用,在其他模块中是不可见的。

在模块中定义的过程,默认的为全局的,也可以加Public作说明。

局部变量为在子过程内使用或不加说明使用的变量,只能在过程中使用,离开过程该变量失效.

窗体或模块级变量:

在通用声名区域中声明的变量,可以在窗体或模块代码中使用,private或Dim,成为窗体级或模块级变量,离开窗体或者模块级变量失效。

全局变量:

在模块级变量定义中,使用Public或者Global,则该变量可以在整个程序范围内任意地方使用,当在程序运行过程中改变一个全局变量的值,那么当程序再次使用该变量时,就是已经改变的变量值拉。

在一个工程中,所有的窗体对象,连接对象,类定义都是全局的,可以在程序的人一地方使用。

应用举例:

例1:

编写一个计算三角形面积的函数,计算边长为(6,8,10)和(15,17,28)的三角形面积,并打印在窗体上。

1.建立一个标准exe的工程1,在窗体上添加命令按钮1

2.在窗体代码的通用声明部分,写程序OptionExplicit告诉VB下面的程序中的变量必须声明才可使用。

并编写计算三角形面积的函数如下:

OptionExplicit

PrivateFunctiontriangle(ByValaAsSingle,ByValbAsSingle,ByValcAsSingle)AsSingle

DimrAsSingle

r=(a+b+c)/2

r=r*(r-a)*(r-b)*(r-c)

Ifr<0Then

triangle=-1

Else

triangle=Sqr(r)

EndIf

EndFunction

3.编写Command1的Click事件程序,如下:

PrivateSubCommand1_Click()

DimarAsSingle

ar=triangle(6,8,10)

Printar

ar=triangle(15,17,28)

Printar

EndSub

程序运行结果如下图4-2

图4-2程序运行结果

例2:

编写一个一维数组排序子过程,给定数组首地址,数组大小,返回数组排序结果。

编写调用该子过程的例子。

1.在已经建立的标准exe工程1中,在窗体form1添加命令按钮2,在工程中增加一个模块Module1

2.在模块中定义全局变量整数数组s(nn+1),其中nn为全局的常数,并编写给数组排序的子过程order(s()AsInteger,nAsInteger):

OptionExplicit

PublicConstnn=10

Publics(nn+1)AsInteger

PublicSuborder(s()AsInteger,nAsInteger)

Dimi,jAsInteger

DimtmpAsInteger

Fori=1Ton

Forj=0Ton-i

Ifs(j)>s(j+1)Then

tmp=s(j)

s(j)=s(j+1)

s(j+1)=tmp

EndIf

Nextj

Nexti

EndSub

3.在窗体Form1的代码最顶部的通用声明部分,写程序OptionExplicit告诉VB下面的程序中的变量必须声明才可使用。

在窗体加载事件中,对全局数组进行初始化,代码如下:

DimiAsInteger

Randomize

Fori=0Tonn

s(i)=Int(100*Rnd)+1

Nexti

4.编写命令按钮Command2的Click事件,程序如下:

PrivateSubCommand2_Click()

DimiAsInteger

Fori=0Tonn

PrintTab(i*4);s(i);

Nexti

Print

Callorder(s,nn)

Fori=0Tonn

PrintTab(i*4);s(i);

Nexti

EndSub

程序运行结果如下图4-3

图4-3程序运行结果

例3:

编写一个判断整数是否为素数的函数,输入一个整数,返回一个布尔型变量,为true时代表该整数为素数,为false时不是素数。

请计算1到10000之间的所有素数之和

1.在已经建立的标准exe工程1中,在窗体form1添加命令按钮3

2.在窗体代码的通用声明部分,写程序OptionExplicit告诉VB下面的程序中的变量必须声明才可使用,并编写判断素数的函数如下:

PublicFunctionprime(ByValmAsLong)AsBoolean

DimiAsLong

prime=True

Fori=2Tom-1

If(mModi)=0Then

prime=False

ExitFor

EndIf

Nexti

EndFunction

3.编写Command3的Click事件,调用判断素数函数,计算1到10000的所有素数之和,代码如下:

PrivateSubCommand3_Click()

DimiAsLong

DimsumprimeAsLong

sumprime=0

Fori=2To10000

Ifprime(i)Then

Printi;

sumprime=sumprime+i

EndIf

Nexti

Print

Printsumprime

EndSub

程序运行结果如下图4-4

图4-4程序运行结果

例4:

利用递归函数计算n>0时的f(n)=n*f(n-1),其中n=1时f

(1)=1。

1.在已经建立的标准exe工程1中,在窗体form1添加命令按钮4

2.在窗体代码的通用声明部分,写程序OptionExplicit告诉VB下面的程序中的变量必须声明才可使用,并编写f(n)=n*f(n-1)的递归函数如下:

PrivateFunctionfunn(nAsInteger)AsLong

Ifn=0Then

funn=1

Else

funn=n*funn(n-1)

EndIf

EndFunction

3.编写Command4的Click程序,计算打印f(10)的结果,代码如下:

PrivateSubCommand4_Click()

Printfunn(10)

EndSub

知识扩展:

(1)内部函数Shell

内部函数Shell(外部程序全路径,窗体状态常数),用于执行外部的程序,这给用户提供了很多方便之处。

例如:

Shell"cmd",vbNormalFocus

表示执行启动命令cmd,并获得焦点,即Console控制台。

培训练习:

(1)编写函数,用于计算一个数组的平均值,该函数定义如下:

Functionavg(aasSingle,ByvalnasInteger)asSingle,并请验证函数。

(2)编写一个子过程,用于查找一个数组的最大值和最小值,该子过程如下定义:

PrivateSubseek(aassingle,byvalnasInteger,minaasSingle,maxaasSingle),并请验证子过程。

(3)编写随机数产生程序,x为在0-99之间的随机数,请编写命令按钮点击程序,不考虑纵向位置,在窗体上横向x的位置打印A字符,且当不断点击时产生的位置不一样。

(4)计算

的值,当x=97.2,108.6时的值。

(5)在自动化系统中经常使用十六进制数,请计算100,800,654,8765,2,233的十六进制和八进制的转换值,打印到窗体上。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1