第7章过程Word下载.docx
- 文档编号:6783857
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:22
- 大小:58.84KB
第7章过程Word下载.docx
《第7章过程Word下载.docx》由会员分享,可在线阅读,更多相关《第7章过程Word下载.docx(22页珍藏版)》请在冰点文库上搜索。
(4)过程说明符可省略。
若说明符省略,Sub过程为公用过程,即Public过程。
例如:
Suba()等同于Publicsuba()
二、使用“添加过程”对话框
使用“添加过程”对话框建立自定义过程办法:
1、打开代码编辑窗口。
2、执行“工具”菜单中的“添加过程”命令,打开“添加过程”对话框。
3、在“名称”文本框中输入过程名。
从“类型”组中选择过程类型从“范围”组中选择范围,相当于使用Public或Private关键字。
4、单击“确定”按钮。
使用本方法,建立一个过程模板,程序员可以通过修改它建立自己的工程。
1.2、自定义过程的调用
……
主程序子程序1子程序n
一、调用自定义过程有两种方法;
使用Call语句;
格式:
Call<
[(<
实参表>
)]
直接使用过程名;
<
[<
]
例如;
以下两个语句都调用了名为Stars的过程:
Stars40,a,b,c
CallStars(40,a,b,c)
其中的40,a,b,c都是实参。
实际参数允许是常量、变量、表达式。
无参自定义过程调用方法:
Stars
CallStars
二、举例
例7_1_1计算S=5!
+6!
+8!
分析:
要计算S=5!
十6!
十8!
先要分别计算出5!
,6!
和8!
。
由于3个求阶乘的运算过程相同,可以用自定义过程来计算任意阶乘,在Sub过程中将所求结果放入到total变量中,返回主程序后将total的值加到S变量中。
这样3次调用子程序便可求得S。
程序:
Dimtotal!
PrivateSubCommand1_Click()
Dima%,b%,c%,s!
s=0
a=5
CallFact(a)
s=s+total
b=6
CallFact(b)
c=8
CallFact(c)
Print"
s="
;
s
EndSub
'
子程序Fact
SubFact(m%)
Dimi#
total=1
Fori=1Tom
total=total*i
Nexti
例p7_1_2.键盘任输入一个偶数(>
4),验证该数为两个素数之和。
分析:
(1)素数:
只能被1或其本身整除的自然数;
(2)题意:
偶数=素数+素数
X=M+L
方法:
可先选择偶数范围内的最小一个素数M,用该偶数减去该素数,再判断差是否是一素数,若是,打印X=M+L;
否则,再选择偶数范围内的稍大的素数M,继续判断,一直找到所求素数。
如果该偶数范围内所有素数都试过,仍为挑出合适的素数,则证明出错。
程序:
例7_1_2.键盘任输入一个偶数(>
4),验证该数为两个素数之和。
DimflagAsBoolean
Dimx#,l#,m#
Cls
FontSize=20
x=InputBox("
任输入一个偶数(>
4)"
)
Form=3Tox-1Step2
Callz7_1_2(m)
IfflagThen
l=x-m
z7_1_2l
Printx;
"
="
m;
+"
l
ExitFor
EndIf
Nextm
Ifm>
=x-1ThenPrint"
命题错误!
!
"
判断素数的子程序
Subz7_1_2(a)
Dimn#
flag=True
Forn=2ToSqr(a)+1
IfInt(a/n)=a/nThen
flag=False
Nextn
例7_1_3、例5_3_4.梯形法求定积分I=
y
y=f(x)
x
ab
求定积分从几何概念上求f(x)下的面积,近似求得积分I。
即:
hn-1f(a)+f(b)n-1
I≈━━∑(yi+yi+1)=h[━━━━━+∑f(a+ih)]
2i=02i=1
试编写求半径为1的园面积。
I=
4
dX的程序。
程序:
DimI#
PrivateSubForm_Click()
Dimi1#,i2#,e#
e=10^(-Val(InputBox("
输入误差精度位数:
)))
n=100
Calld_integral(n)
i2=I
Do
i1=i2
n=2*n
Calld_integral(n)
i2=I
LoopUntilAbs(i2-i1)<
=e
i="
i2,"
n="
n
PrivateSubd_integral(ByValn)
Dima%,b%,k&
h!
b=1
a=0
h=(b-a)/n
I=(Sqr(1-a*a)+Sqr(1-b*b))/2
Fork=1Ton-1
x=a+k*h
I=I+Sqr(1-x*x)
Nextk
I=4*I*h
例7_1_4、(P309实验4.2打印两个三角形图案)
2、自定义函数(Function过程)
自定义函数实际上也是一个过程,当过程的执行返回一个值时,使用自定义函数就比较简单。
2.1、Function过程的建立
一、格式:
[Private|Public][Static]Function<
函数名>
])[As类型]
[<
=<
表达式>
[ExitFunction]
EndFunction
二、说明:
格式同自定义过程;
的值是函数返回的结果。
如果过程中省略“<
=<
”.则
该过程返回一个默认值:
数值函数过程返回0,字符串函数过程返回空字符串,Boolean函数过程返回False。
缺省为字符类型。
2.1、Function过程的调用
实参表>
Function过程的调用比较简单,可以像使用vB内部函数一样来调用Function过程。
printStar(3.6)
还可像调用Sub过程那样调用Function过程。
当用这种方法调用函数时,VB放弃返回值。
例7_2_1计算S=5!
Dims!
s=Fact(5)+Fact(6)+Fact(8)
自定义函数Fact
FunctionFact(m%)
total=total*i
Fact=total
EndFunction
例7_2_2求两个正整数M和N的最小公倍数。
由数学知识可知:
最小公倍数=
最大公约数。
采用“辗转相除法”的思想。
(1)用大数M除小数N,余数为R;
(2)若R=0,则N就是它们的最大公约数;
若R≠0,则M←N,N←R,重复上过程,直至R=0
(3)最后得到的N就是最大公约数。
a=m:
b=n
r=aModb
a=b
b=r
LoopWhiler<
>
0
Dimm&
n&
m=Val(InputBox("
M="
))
n=Val(InputBox("
N="
Ifm<
nThent=m:
m=n:
n=t
Printm;
和"
n;
的最小公倍数是:
m*n/Z7_2_2(m,n)
FunctionZ7_2_2(m,n)
Dima&
b&
r&
r=aModb
a=b
b=r
Z7_2_2=a
例7_2_3统计1~100间的能被3或被5整除的整数的个数。
分别统计能被3、5整除数的个数,再减去能被15整除数的个数。
统计个数为:
f(3)+f(5)-f(15)
Functionf%(m%)
Dimi%,s%,k%
s=0:
k=0
Fori=1To100
Ifi\m=i/mThen
s=s+1
PrintFormat(i,"
@@@@"
);
k=k+1
Ifk=10ThenPrint:
f=s
例7_2_4、写一个函数过程数判断一个数是否是一个“完数”,所谓“完数”是指该数的值等于其所有因子之和。
6=1+2+36是一个完数,求1到200的所有完数。
PrivateSubForm_Click()
DimkAsInteger
Fork=1To200
Ifws(k)ThenPrintk
Nextk
Functionws(mAsInteger)AsBoolean
DimnAsInteger,iAsInteger,sAsInteger
n=m\2
Fori=1Ton
IfmModi=0Then
s=s+i
EndIf
Nexti
Ifs=mThenws=TrueElsews=False
EndFunction
3、过程的参数传递问题
当用户自定义函数或过程被调用时,调用语句中的实参就和定义语句中的形参一一对应起来,并以某种方式把实参传递给形参,供过程使用。
称为过程的参数传递。
VB中过程的参数传递的方式有两种:
一种是按值传递,另一种是按地址传递。
地址传递:
将形参变量的地址作为实参变量的地址。
即形参与实参使用相同的内存地址单元,对形参变量的访问实际也是对实参变量的访问。
值传递:
将实参变量的数据赋予形参变量,对形参变量的访问不会改变实参变量的值。
一、按地址传递参数
如果调用语句中的实际参数为变量,或者定义过程时选用ByRef关键字,就可以按地址传递。
系统缺省按地址传递参数。
在传址调用时,实际参数必须是变量,常量或表达式无法传址。
例7_3_1地址传递参数例(过程)。
x=1:
y=1:
z=1
调用子程序前的X,Y,Z值 "
x;
y;
z
exax,y,z
调用子程序后的X,Y,Z值 "
Subexa(a,b,c)
a=a+1
b=b+2
c=c+3
调用子程序中的A,B,C值 "
a;
b;
c
例7_3_2地址传递参数例(函数)。
例7_3_4(例7_1_1计算S=5!
PrivateSubForm_Activate()
Dimf1#,f2#,f3#
Callfact(5,f1)
Callfact(6,f2)
Callfact(8,f3)
f1+f2+f3
Subfact(n%,f#)
f=1
Fori=1Ton
f=f*i
Nexti
二、按值传递参数
如果调用语句中的实参是常量或表达式,或者定义过程时选用ByVal关键字,就可以按值传递。
简单变量若用括号括起作实参时,视为表达式。
例7_3_3值传递参数例(过程)。
exa(x),(y),z+0
4、数组和下标元素的传递
在使用通用过程和函数过程时;
可以将数组或数组元素作为参数进行传递。
一、格式
传递整个数组时,实参与其对应的形参均为:
数组名>
()
传递数组中的某一元素时,实参为下标元素,对应形参为简单变量。
Calltest(x(3))
数组传递是地址传递
三、举例
例7_4_1.[例6_1_1]产生50个[1,100]间的随机整数,将他们从大到小排序。
产生50个随机数
(1To50)
Randomize
Fori=1To50
a(i)=Fix(Rnd*100+1)
PrintFormat(a(i),"
IfiMod10=0ThenPrint
Print:
Print:
Calltaxis(a())
从小到大排序(起泡排序法)
Subtaxis(c&
())
Fori=1To49
Forj=i+1To50
Ifc(i)<
c(j)Then
t=c(i):
c(i)=c(j):
c(j)=t
Nextj
Callp_taxis(c())
打印
Subp_taxis(b&
PrintFormat(b(i),"
5、过程、函数的递归调用
在一个过程(Sub过程或Function过程)中调用另外一个过程,称为过程的嵌套调用;
而过程直接或间接地调用其自身,则称为过程的递归调用。
递归使我们能过用有限的语句描述一个无穷的集合。
例如求阶乘的递归定义:
nxf(n-1)当n>
1
f(n)=
1当n=1
例7_5_1求阶乘的递归s=n!
(使用函数递归)
Dimn%
f(n)
PrivateFunctionf#(ByValn%)
Ifn=1Then
f=1
Else
f=n*f(n-1)
EndIf
n=4则4!
=4X3X2X1=24
n
F(n)
4
4*f(3)
3
3*f
(2)
2
2*f
(1)
1
例7_5_2求阶乘的递归s=n!
(使用过程递归)
Dimf#
Calls(n)
f
PrivateSubs(ByValn%)
Calls(n-1)
f=n*f
f=4*ff=3*ff=2*ff=1*1
(4*3*2*1)(3*2*1)(2*1)
例7_5_3求斐波那契数列的前n项。
F(n)=F(n-1)+F(n-2)n>
=2
F(0)=0,F
(1)=1
Dimn%,i%
Fori=1Ton
Printf(i),
IfiMod5=0ThenPrint
Next
SelectCasen
Case0
f=0
Case1
CaseElse
f=f(n-1)+f(n-2)
EndSelect
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 过程