VB实习五 过程.docx
《VB实习五 过程.docx》由会员分享,可在线阅读,更多相关《VB实习五 过程.docx(33页珍藏版)》请在冰点文库上搜索。
VB实习五过程
实习五过程
一、实习目的
1.通过实习理解过程基本概念;
2.掌握创建过程的方法和过程调用方法,理解Sub过程和Function过程的异同;
3.掌握Sub过程和Function过程程序设计方法;
4.掌握过程调用时参数传递的两种方式及特点;
5.理解过程、变量的作用域;
6.理解递归的概念及编程方法特点。
二、实习内容
1.掌握Function过程的定义、设计和调用方法;
2.掌握Sub过程的定义、设计和调用方法;
3.理解并掌握参数传递的两种方式;
4.完成课后编程习题;
5.理解递归的编程方法。
三、编程题程序算法及代码
例题验证:
例题6-1
属性结果:
代码编写:
Subfact(xAsInteger,fAsDouble)
DimiAsInteger
f=1
Fori=1Tox
f=f*i
Nexti
EndSub
PrivateSubCommand1_Click()
DimmAsInteger,nAsInteger,sAsDouble,yAsDouble
n=10:
Callfact(n,y)
s=y
m=6:
Callfact(m,y)
s=s/y
Callfact(n-m,y)
s=s/y
Print"CMN="&s
EndSub
例题6-2
属性结果:
代码编写:
OptionBase1
Subparray(a()AsInteger)
Dimp
ForEachpIna
Printp;
Nextp
Print
EndSub
PrivateSubCommand1_Click()
Dimx(1To10)AsInteger,i%,t%
Fori=1To10
x(i)=Int(Rnd*100)
Nexti
Print"交换前个元素值:
";
Callparray(x)
Fori=1To5
t=x(i):
x(i)=x(10-i+1):
x(10-i+1)=t
Nexti
Print"交换后个元素值:
";
Callparray(x)
EndSub
例题6-3
属性结果:
代码:
Subgys(mAsInteger,nAsInteger,tAsInteger)
DimrAsInteger
Do
r=mModn
Ifr=0ThenExitDo
m=n
n=r
Loop
t=n
EndSub
PrivateSubcommand1_click()
DimaAsInteger,bAsInteger,xAsInteger,yAsInteger
a=16:
b=12
Callgys(a,b,x)
y=a*b/x
Print"最大公约数为:
"&x
Print"最小公倍数为:
"&y
EndSub
例题6-4
属性结果:
代码:
Subswap1(ByValxAsInteger,ByValyAsInteger)
DimtAsInteger
t=x:
x=y:
y=t
EndSub
Subswap2(xAsInteger,yAsInteger)
DimtAsInteger
t=x:
x=y:
y=t
EndSub
PrivateSubCommand1_Click()
DimaAsInteger,bAsInteger
a=3:
b=4
swap1a,b
Print"a="&a&",b="&b
a=5:
b=6
swap2a,b
Print"a="&a&",b="&b
EndSub
例题6-5
属性结果:
代码编写:
Subtj(x()AsInteger,AVERAsSingle)
DimmAsInteger,nAsInteger,iAsInteger,sAsInteger
m=LBound(x)
n=UBound(x)
Fori=mTon
s=s+x(i)
Nexti
AVER=s/(n-m+1)
EndSub
PrivateSubCommand1_Click()
Dima%(1To10),i%,AVER!
Fori=1To10
a(i)=Int(Rnd()*10)
Printa(i)
Nexti
Print
Calltj(a,AVER)
Print"这些数的平均值为:
"&AVER
EndSub
例题6-6
属性结果:
代码:
Subtj(x%(),max%,min%,aver!
)
Dimm%,n%,i%,s%
m=LBound(x)
n=UBound(x)
max=x(m):
min=x(m):
s=x(m)
Fori=m+1Ton
IfmaxIfmin>x(i)Thenmin=x(i)
s=s+x(i)
Nexti
aver=s/(n-m+1)
EndSub
PrivateSubCommand1_Click()
Dima%(1To10),i%,x%,y%,z!
Fori=1To10
a(i)=Int(Rnd()*10)
Printa(i)
Nexti
Print
Calltj(a,x,y,z)
Print"这组数的最大值为:
"&x
Print"这组数的最小值为:
"&y
Print"这组数的平均值为:
"&z
EndSub
例题6-7
属性结果:
代码:
Functionfact(ByValnAsInteger)AsDouble
DimiAsInteger,fAsDouble
f=1
Fori=1Ton
f=f*i
Nexti
fact=f
EndFunction
PrivateSubCommand1_Click()
DimsAsDouble
s=fact(10)/fact(6)/fact(4)
Print"CMN="&s
EndSub
例题6-8
属性结果:
代码编写:
DimaAsInteger,bAsInteger,cAsInteger
Subprod()
c=a*b
Print"prod子程序",a,b,c
EndSub
Subsum()
c=a+b
Print"sum子程序",a,b,c
EndSub
PrivateSubForm_click()
a=5:
b=3
PrintTab(16);"a";Tab(30);"b";Tab(42);"c=a*b"
Print"调用prod前",a,b,c
Callprod
Print"调用prod后",a,b,c
PrintTab(16);"a";Tab(30);"b";Tab(42);"c=a+b"
Print"调用sum前",a,b,c
Callsum
Print"调用sum后",a,b,c
Callsum
EndSub
例题6-9
属性结果:
代码编写:
PublicttAsInteger
PrivateSubtest1()
tt=tt+10
Printtt
EndSub
PrivateSubtest2()
DimttAsInteger
tt=tt+20
Printtt
EndSub
PrivateSubForm_Click()
tt=100
Printtt
Calltest1
Printtt
Calltest2
Printtt
EndSub
例题6-10
属性结果:
代码编写:
Subparray(x$())
Dimi%
Fori=LBound(x)ToUBound(x)
Picture1.Printx(i);"";
Nexti
Picture1.Print
EndSub
Subsort(y$(),ByValp%)
Dimi%,j%,k%,t%
Fori=LBound(y)ToUBound(y)-1
k=i
Forj=i+1ToUBound(y)
Ifp=0Then
IfVal(y(k))>Val(y(j))Thenk=j
Else
IfVal(y(k))EndIf
Nextj
t=y(k):
y(k)=y(i):
y(i)=t
Nexti
EndSub
PrivateSubForm_Load()
Text1=""
Frame1.Caption="排序选择"
Option1(0).Caption="升序"
Option1(0).Value=True
Option2
(1).Caption="降序"
EndSub
PrivateSubOption1_DblClick()'indexAsInteger
Dima()AsString
a=Split(Text1.Text,",")
Picture1.Print
Callparray(a())
Callsort(a(),index)
Picture1.PrintOption1(index).Caption&"排序后的数据"
Callparray(a())
EndSub
例题6-11
属性及结果:
代码编写:
Functionhw(ByValxAsString)AsBoolean
Dimn%,i%
n=Len(x)
Fori=1Ton\2
IfMid(x,i,1)<>Mid(x,n-i+1)Then
hw=False
ExitFunction
EndIf
Nexti
hw=True
EndFunction
PrivateSubCommand1_Click()
Dimx$
x=InputBox("请输入一个整数")
Ifhw(x)Then
MsgBoxx&"是回文数"
Else
MsgBoxx&"非回文数"
EndIf
EndSub
例题6-12
属性及结果:
代码编写:
Functiondecton(ByValx%,ByValn%)AsString
Dimp()AsString,y$,r%
p=Split("0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F",",")
Ifn>16Then
decton=""
ExitFunction
EndIf
y=""
Do
r=xModn
x=x\n
y=p(r)&y
LoopUntilx=0
decton=y
EndFunction
PrivateSubCommand1_Click()
Dimx%,n%,y$
x=InputBox("请输入待转换的十进制整数!
","数值转换",0)
n=InputBox("请输入需要的进制,注意不要大于16","数值转换",2)
y=decton(x,n)
Ify<>""Then
MsgBox"转换结果:
"&decton(x,n)
Else
MsgBox"对不起!
本程序不能转换超过16的禁止!
"
EndIf
EndSub
例题6-13
属性及结果:
代码编写:
Functionfact(n)AsDouble
Ifn>0Then
fact=n*fact(n-1)
Else
fact=1
EndIf
EndFunction
PrivateSubCommand1_Click()
DimnAsInteger,mAsDouble
n=Val(Text1.Text)
Ifn<0Orn>20Then
MsgBox"非法数据",0,"请输入0-20之间的整数"
ExitSub
EndIf
m=fact(n)
Label1.Caption=m
EndSub
例题6-14
代码编写:
Functiongys%(ByValm%,ByValn%)
Dimr%
r=mModn
Ifr=0Then
gys=n
Else
gys=gys(n,r)
EndIf
EndFunction
课后习题:
习题1、界面设置:
属性结果:
代码编写:
Functionmyabs(ByValx)
myabs=IIf(x<0,-x,x)
EndFunction
PrivateSubCommand1_Click()
DimmyabsAsLong
x=InputBox("请输入值")
a=IIf(x<0,-x,x)
PrintTab(10);a
EndSub
习题2
界面设置:
属性结果:
代码编写:
SubMValue(a()AsSingle,ByRefmaxAsSingle,ByRefminAsSingle)
'a()是待查找的数组,一位数组
'max,min分别为待求的最大数和最小数,我们通过地址传递的方法,将找到的结果传回主程序
l=LBound(a)
u=UBound(a)
max=a(l)
min=a(l)
Fori=lTou
IfmaxIfmin>a(i)Thenmin=a(i)
Next
EndSub
PrivateSubCommand1_Click()
Dimx()AsSingle
DimmaxAsSingle,minAsSingle
m=Val(Text1.Text)
ReDimx(1Tom)AsSingle
Fori=1Tom
x(i)=Int(Rnd*100)
Next
MValuex(),max,min
Label1.Caption="最大数为:
"&max&",最小数为:
"&min
EndSub
习题3、
界面设置:
属性结果:
代码编写:
FunctionisSXS(xAsInteger)AsBoolean
tmp=x^2
rs=Val(Right(tmp,Len(Trim(x))))'取出平方数右边和x相同位数的数
Ifrs=xThen'若两个相等则是守形数
isSXS=True
Else
rs=False
EndIf
EndFunction
PrivateSubCommand1_Click()
DimiAsInteger
n=0'用了计数,已经有多少个守形数
Fori=1To2000
IfisSXS(i)Then
Picture1.PrintTab((nMod5)*10);i;
n=n+1
EndIf
Next
EndSub
习题4、
界面设置:
略
属性结果:
代码编写:
FunctionGdc(ByValm%,ByValn%)
Dimr%
fontsie=20
Do
r=mModn
Ifr=0ThenExitDo
m=n
n=r
Loop
Gdc=n
EndFunction
PrivateSubCommand1_Click()
PrintTab(13);Gdc(1260,Gdc(198,72))
EndSub
习题5、
界面设置:
略
属性结果:
代码编写:
PrivateSubCommand1_Click()
DimintFAsLong,intLAsLong,intNAsInteger,intMAsInteger
DimvarTmpAsVariant
varTmp=InputBox("请输入随机数的范围,上界和下界用空格隔开!
"&vbCr&"注意:
我将不做正确检查.","输入","110")
intN=InputBox("请输入产生随机数的个数","个数",5)
intF=Split(varTmp,"")(0)
intL=Split(varTmp,"")
(1)
ForintM=1TointN
Randomize
n=n+1
IfnMod7=0ThenPrint
PrintCInt(Rnd*(intL-intF+1))+intF;
Next
EndSub
习题6、
界面设计:
属性结果:
代码编写:
Functionsum(a()AsSingle,nAsInteger)
sum=0
Fori=1Ton
sum=sum+a(i,i)+a(i,n-i+1)
Next
EndFunction
PrivateSubCommand1_Click()
Dimx!
(),nAsInteger
n=Val(Text1.Text)
ReDimx(1Ton,1Ton)
Picture1.Cls
Fori=1Ton
Forj=1Ton
x(i,j)=Int(Rnd*101)
Picture1.PrintTab((j-1)*8);x(i,j);
Next
Next
Picture1.Print
Picture1.Print"两条对角线之和为:
";sum(x(),n)
EndSub
习题7、
界面设计:
略
属性结果:
代码编写:
Functionss(ByValm%)AsBoolean
Dimk%,i%
k=Sqr(m)
Fori=2Tok
Ifm/i=m\iThenExitFor
Nexti
ss=IIf(i=k+1,True,False)
EndFunction
PrivateSubCommand1_Click()
Dimm%,n%
Form=100To200
Ifss(m)=TrueThen
PrintTab((nMod8)*6+1);m;
n=n+1
EndIf
Nextm
EndSub
习题8、
界面设计:
属性结果:
代码编写:
Functionss(ByValm&)AsBoolean
Dimk%,i%
k=Sqr(m)
Fori=2Tok
Ifm/i=m\iThenExitFor
Nexti
ss=IIf(i=k+1,True,False)
EndFunction
Functionhw(ByValm&)AsBoolean
IfLeft(m,1)=Right(m,1)AndMid(m,2,1)=Mid(m,4,1)Then
hw=True
Else
hw=False
EndIf
EndFunction
PrivateSubCommand1_Click()
Dimm&,n%
Form=10000To99999
Ifhw(m)Then
Ifss(m)Then'这里两个函数调用的先后对程序的运行速度影响较大,实习时可以将范围再扩大后调试,比如100000-999999之间。
PrintTab((nMod8)*8+1);m;
n=n+1
EndIf
EndIf
Nextm
EndSub
习题9、
界面设计:
属性结果:
代码编写:
习题10、
界面设计:
属性结果:
代码编写;PrivateSubCommand1_Click()
Picture1.PrintTab(8);sl(20)
EndSub
PrivateFunctionsl(i%)
Ifi<3Then
sl=1
Else
sl=sl(i-1)+sl(i-2)
EndIf
EndFunction
PrivateSubCommand2_Click()
End
EndSub
习题11
界面设计:
属性结果:
代码编写:
PrivateSubCommand1_Click()
n=Val(Text1.Text)
s1=s(n)
Ifs1=0Then
Label1.Caption="输入数太大!
"
Else
Label1.Caption=Round(s1,5)
EndIf
EndSub
Functions(ByValn