t=a(i)
a(i)=a(i-1)
a(i-1)=t
EndIf
Nexti
Nextj
Fori=1To10
Picture2.PrintVal(a(i));
Next
EndSub
PrivateSubCommand3_Click()
End
EndSub
PrivateSubForm_Load()
Picture1.Visible=False
Picture2.Visible=False
EndSub
(二)过程的定义和调用
1、Sub过程的定义和调用
练习一:
建立一个只有一个窗体的应用程序,如果在代码窗口中输入以下代码,则当程序运行时在窗体上单击会看到什么现象?
要求先分析后实验。
PrivateSubChange1(ByValxAsInteger,ByValyAsInteger)
DimtempAsInteger
temp=x:
x=y:
y=temp
EndSub
PrivateSubChange2(ByRefxAsInteger,ByRefyAsInteger)
DimtempAsInteger
temp=x:
x=y:
y=temp
EndSub
PrivateSubForm_Click()
DimaAsInteger,bAsInteger
a=8:
b=15
Print"a=";a,"b=";b
CallChange1(a,b)
Print"a=";a,"b=";b
CallChange2(a,b)
Print"a=";a,"b=";b
CallChange2(a+3,b)
Print"a=";a,"b=";b
EndSub
练习二:
下列二个子程序的功能分别是什么?
编写窗体的单击事件过程,通过调用语句分别调用这二个子程序,并将结果用Print方法在窗体上输出。
通过逐语句运行方式(调试菜单)运行程序,了解程序运行过程。
如果将第一个子程序的变量temp用Factorial1代替,程序运行时会发生什么?
FunctionFactorial1(ByValnAsInteger)AsLong
DimiAsInteger,tempAsLong
temp=1
Fori=1Ton
temp=temp*i
Nexti
Factorial1=temp
EndFunction
FunctionFactorial2(ByValnAsInteger)AsLong
Ifn=0Then
Factorial2=1
Else
Factorial2=n*Factorial2(n-1)
EndIf
EndFunction
程序1:
创建应用程序,要求对输入的非负整数m和n,如果m>=n,则显示组合数
的值,否则显示数据出错。
窗体如下图所示。
提示:
●利用函数求解n的阶乘。
组合数
程序代码见附录。
PrivateSubCommand1_Click()
IfText1.Text=""OrNotIsNumeric(Text1.Text)Then
MsgBox"请输入一个非负整数!
",,"提示"
Text1.SetFocus
ExitSub
EndIf
IfText2.Text=""OrNotIsNumeric(Text2.Text)Then
MsgBox"请输入一个非负整数!
",,"提示"
Text2.SetFocus
ExitSub
EndIf
IfCInt(Text1.Text)>CInt(Text2.Text)Then
MsgBox"数据出错,请重新输入!
",,"警告"
Text1.Text=""
Text2.Text=""
Text1.SetFocus
ExitSub
EndIf
n=CInt(Text1.Text)
m=CInt(Text2.Text)
Text3.Text=CStr(Fac(m)/Fac(n)/Fac(m-n))
EndSub
PrivateFunctionFac(ByValnAsInteger)AsDouble
DimiAsInteger,TempAsDouble
Temp=1
Fori=1Ton
Temp=Temp*i
Nexti
Fac=Temp
EndFunction
PrivateSubCommand2_Click()
End
EndSub
2、典型问题的算法
程序2:
利用下列两式求得圆周率π的近似值,忽略级数式中绝对值小于0.000001的项。
以及
提示:
●找出后一项与前一项的关系,通过前一项得到后一项,然后累加起来。
程序代码见附录。
PrivateSubForm_Click()
DimPiAsDouble
Pi=6*Arctan(1/Sqr(3))
PrintPi
EndSub
PrivateFunctionArctan(ByValxAsDouble)AsDouble
DimmAsLong,TempAsDouble,sAsDouble
Temp=0
s=x
m=1
DoWhileAbs(s)>=0.000001
Temp=Temp+s
m=m+2
s=-1*x*x*s/m*(m-2)
Loop
Arctan=Temp
EndFunction
实验思考题1
(1)参照下图,按“开始”按钮,可以实现每隔一秒加上一项,在两个文本框中分别显示已累加项数和圆周率的近似值,按“停止”按钮,结束累加工作,如何编写程序?
(2)这是一个利用级数求特殊数的值这样一个典型问题的算法,如下图所示,请总结此算法。
你是否还能找到其他类似的问题?
若能找到,请试着做一下。
答:
编写程序的步骤为:
(1)窗体及控件参照上图设计。
(2)打开“代码设计”窗口,建立一个标准模块,定义一个Sub过程用于累加项数和计算圆周率的近似值。
(3)打开“代码设计”窗口,设计代码用时间控件来计数,触发事件,调用Sub过程.具体程序如下
OptionExplicit
DimmRunAsBoolean,s&,Pi#
PrivateSubCommand1_Click()
mRun=True
WithTimer1
.Interval=1
.Enabled=True
EndWith
EndSub
PrivateSubCommand2_Click()
Timer1.Enabled=False
EndSub
PrivateSubCommand3_Click()
End
EndSub
PrivateSubTimer1_Timer()
s=s+1
Pi=4*((-1)^(s-1)/(2*s-1))+Pi
Text1.Text=s
Text2.Text=Pi
EndSub
提示:
●自然对数底e的级数表示如下:
e=1+1/1!
+1/2!
+1/3!
+…
可参照下图编程。
答:
编写程序的步骤为:
(1)窗体及控件参照上图设计。
(2)打开“代码设计”窗口,建立一个标准模块,定义一个Sub过程用于阶乘。
(3)打开“代码设计”窗口,使用循环语句,中间调用Sub过程得到阶乘值,然后求倒数,再进行叠加。
程序3:
如下图所示,求2-200之间的所有素数,要求每输出五个数据换一行。
提示:
●可以通过一个自定义函数来求解某个数是否为素数。
程序代码见附录。
PrivateSubForm_Click()
DimIAsInteger,MAsInteger
M=0
ForI=2To200
IfPrime(I)Then
PrintI,
M=M+1
IfMMod5=0ThenPrint
EndIf
NextI
EndSub
PrivateFunctionPrime(x)AsBoolean
DimIAsInteger
Prime=True
ForI=2ToInt(Sqr(x))
IfxModI=0Then
Prime=False
ExitFor
EndIf
NextI
EndFunction
程序4:
利用随机函数产生20个-500到500的随机整数(包括-500和500),单击窗体时,在窗体上输出这20个数,同时在窗体上显示输出从大到小排好序的这些数。
要求以每行5个数的格式显示,如下图所示。
说明:
●排序算法有很多,其中最典型的算法是冒泡法,请使用冒泡法求解上面的问题。
程序代码见附录。
PrivateSubForm_Click()
Dimx(20)AsInteger,MAsInteger,TempAsInteger
DimIAsInteger,JAsInteger
M=0
ForI=1To20
Randomize
x(I)=Int(Rnd*1001-500)
Printx(I),
M=M+1
IfMMod5=0ThenPrint
NextI
ForI=1To19
ForJ=1To20-I
Ifx(J+1)Temp=x(J):
x(J)=x(J+1):
x(J+1)=Temp
EndIf
NextJ
NextI
Print
ForI=1To20
Printx(I),
M=M+1
IfMMod5=0ThenPrint
NextI
EndSub
实验思考题2
●在上面的程序中,如果要求由一个Sub过程实现两个数交换,则如何修改程序?
答:
程序改为
ForI=1To19
ForJ=1To20-I
Ifx(J+1)a=x(J+1):
b=x(J):
Chang(a,b)
x(J+1)=a:
x(J)=b
EndIf
NextJ
NextI
.
.
.
.
.
PrivateSubChang(aAsInteger,bAsInteger)
Temp=b:
b=a:
a=Temp
Endsub
[选做实验]
综合题1:
依照“附件”中的计算器,自己编一个计算器。
本实验要求:
可以实现四则运算。
提示:
●可以使用变量保存当前选择的运算符等状态信息。
实验总结: