4函数与子程序Word文档格式.docx
- 文档编号:19691428
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:12
- 大小:62.04KB
4函数与子程序Word文档格式.docx
《4函数与子程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《4函数与子程序Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
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
tree=(s+1)/tree(s-1)
在设计递归函数必须具备递归条件,否则程序陷入死循环的逻辑错误之中。
上面这个递归函数的终止条件是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
triangle=-1
3.编写Command1的Click事件程序,如下:
PrivateSubCommand1_Click()
Printar
ar=triangle(15,17,28)
程序运行结果如下图4-2
图4-2程序运行结果
例2:
编写一个一维数组排序子过程,给定数组首地址,数组大小,返回数组排序结果。
编写调用该子过程的例子。
1.在已经建立的标准exe工程1中,在窗体form1添加命令按钮2,在工程中增加一个模块Module1
2.在模块中定义全局变量整数数组s(nn+1),其中nn为全局的常数,并编写给数组排序的子过程order(s()AsInteger,nAsInteger):
PublicConstnn=10
Publics(nn+1)AsInteger
PublicSuborder(s()AsInteger,nAsInteger)
Fori=1Ton
Forj=0Ton-i
3.在窗体Form1的代码最顶部的通用声明部分,写程序OptionExplicit告诉VB下面的程序中的变量必须声明才可使用。
在窗体加载事件中,对全局数组进行初始化,代码如下:
DimiAsInteger
Randomize
Fori=0Tonn
s(i)=Int(100*Rnd)+1
4.编写命令按钮Command2的Click事件,程序如下:
PrivateSubCommand2_Click()
PrintTab(i*4);
s(i);
程序运行结果如下图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
Nexti
EndFunction
3.编写Command3的Click事件,调用判断素数函数,计算1到10000的所有素数之和,代码如下:
PrivateSubCommand3_Click()
DimiAsLong
DimsumprimeAsLong
sumprime=0
Fori=2To10000
Ifprime(i)Then
Printi;
sumprime=sumprime+i
Printsumprime
程序运行结果如下图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
funn=n*funn(n-1)
3.编写Command4的Click程序,计算打印f(10)的结果,代码如下:
PrivateSubCommand4_Click()
Printfunn(10)
知识扩展:
(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的十六进制和八进制的转换值,打印到窗体上。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 子程序