Next
Ifi>Sqr(n)Then'n没有被任何整除,是素数i>Sqr(n)
Label1.Caption=n&"是一个素数。
"
Else
Label1.Caption=n&"不是素数。
"
EndIf
EndSelect
Text1.SetFocus
EndSub
编写Text1的GotFocus事件过程,以方便输入新的整数。
代码如下:
PrivateSubText1_GotFocus()
Text1.SelStart=0
Text1.SelLength=Len(Text1.Text)
EndSub
运行程序,通过文本框输入一个整数,单命令“判断素数”,便可知道该数是否是素数,如图5-2所示。
例5-2求n!
。
⑴创建一个工程,在窗体上添加一个框架Frame1,一个文本框Text1(用于输入正整数),一个命令按钮Command1和一个标签Label1(用于显示计算结果),程序界面如图5-3所示。
图5-3计算n!
⑵编写程序代码。
窗体的Load事件过程与上例类似,Text1的GotFocus事件过程与上例相同。
编写命令按钮Command1的Click事件过程,输入数据n,计算n!
,显示计算结果。
程序代码如下:
PrivateSubCommand1_Click()
DimnAsInteger,pAsCurrency
SelectCaseVal(Text1.Text)
CaseIs<0
MsgBox"请输入一个大于0的整数!
",vbInformation+vbOKOnly,"注意"
CaseIs>17
MsgBox"此数太大!
",vbInformation+vbOKOnly,"注意"
CaseElse
n=Val(Text1.Text)
p=1
Fori=1Ton
p=p*i
Next
Label1.Caption=n&"!
="&p
EndSelect
Text1.SetFocus
EndSub
程序运行情况如图5-3所示。
程序中把存放阶乘值的变量p定义为货币型,目的是为了程序能计算尽可能大的整数的阶乘。
若把p定义为长型变量,输入的n值不能超过程12。
例5-3求从1000到1100之间的所有素数,并从大到小,显示在文本框中。
分析:
从1100开始到1000,对其各个数依次进行测试,判断是否是素数,若是,便在连接到输出字符串中,若不是,则放弃,测试下一个数。
显然这里需要双重的For循环,外层循环生成各个数,内层循环测试其是否是素数。
⑴创建一个工程,在窗体上添加一个框架Frame1,一个文体框Text1(显示求得的素数),一个命令按钮Command1,程序界面如图5-4所示。
在属性窗口,把文本框Text1的属性MultiLine设置为True,属性ScrollBars设置为2。
⑵编写程序代码。
首先编写窗体的Load事件过程,设置控件的有关属性。
代码如下:
PrivateSubForm_Load()
Frame1.Caption="1100到1000的素数"
Command1.Caption="计算"
Text1.Text=""
Text1.Locked=True
EndSub
图5-4求素数
编写命令按钮Command1的Click事件过程,求出素数,并显示在文本框中。
代码如下:
PrivateSubCommand1_Click()
ss=""
Forn=1099To1000Step-2
Fori=2ToInt(Sqr(n))
IfnModi=0ThenExitFor
Next
Ifi>Sqr(n)Then
ss=ss&n&vbCrLf
EndIf
Next
Text1.Text=ss
EndSub
运行程序,单击命令“计算”,即可得到如图5-4的运算结果。
5.2.2Do…Loop循环语句
VB提供的Do…Loop循环语句具有完整的语法格式,能实现各种形式的循环程序。
细分起来,Do...Loop循环语句共有五种语法格式,下面分别介绍之。
1.无条件循环型
语法格式:
Do
循环体
Loop
说明:
①Do语句表示循环操作开始,Loop语句表示循环操作结束,Do与Loop之间便是进行重复操作的循环体。
当程序执行到Loop语句时,程序又返回到Do语句之后执行,周而复始永不休止。
②由于该程序结构无条件重复执行循环体中的操作,使程序无法正常结束。
为了避免发生此类情况,可以在循环体中通过If语句测试循环操作的结束条件,当条件满足时,用ExitDo语句退出循环操作,执行Loop语句之的语句。
例如,可以利用无条件循环型的Do语句计算1×1+2×2+……+n×n。
程序代码如下:
PrivateSubForm_Load()
DimnAsInteger,kAsInteger,sAsLong
Show
n=Val(InputBox("请输入一个正整数"))
k=1:
s=0
Do
s=s+k*k
k=k+1
Ifk>nThenExitDo‘k>n退出循环操作
Loop
MsgBox"1×1+2×2+……+"&n&"×"&n&"="&s&Chr(13)&"k="&k
EndSub
运行程序,输入整数10,消息对话框给出了计算结果,如图5-5所示。
显然,程序每执行一次循环体,都会在执行If语句时,判断条件k>n是否成立,当k=11,超过了输入的整数n(=10),程序退出了Do…Loop循环语句。
图5-5计算平方和
2.当型循环前测试型
语法格式:
DoWhile条件
循环体
Loop
说明:
DoWhile…Loop语句中给出的条件是执行循环操作的条件,即当条件成立(True)时,执行循环体的操作;当条件不成立(False)时,终止循环操作。
所以带“While条件”的Do...Loop循环语句结构称为当型循环。
该结构在程序每次执行循环体的操作之前,首先测试条件,所以又称为前测试型。
两者合起来称为当型循环前测试型。
当型循环前测试型Do循环结构的执行过程为:
⑴执行DoWhile语句,测试条件是否为True。
⑵如果条件为True(成立),程序执行循环体的操作,然后返回⑴执行;否则执行Loop之后的语句。
如果程序第一次测试条件便不成立(False),则循环体一次也不会被执行。
例如,可以用DoWhile…Loop语句计算1×1+2×2+……+n×n。
程序代码如下:
PrivateSubForm_Load()
DimnAsInteger,kAsInteger,sAsLong
Show
n=Val(InputBox("请输入一个正整数"))
k=1:
s=0
DoWhilek<=n'k<=n执行循环体的操作
s=s+k*k
k=k+1
Loop
MsgBox"1×1+2×2+……+"&n&"×"&n&"="&s&Chr(13)&"k="&k
EndSub
运行程序,输入整数10,消息对话框给出了计算结果,如图5-5所示。
如果在程序中设置k=10,输入的整数为5,则k<=n不成立,循环体一次也不会被执行,输出的s=0。
3.当型循环后测试型
语法格式:
Do
循环体
LoopWhile条件
说明:
Do…LoopWhile语句中给出的条件仍然是执行循环操作的条件,只不过是在每次循环体的操作执行完之后,才测试条件,所以该结构称为当型循环后测试型。
当型循环后测试型Do循环结构的执行过程为:
⑴执行循环体的操作。
⑵测试LoopWhile语句中的条件是否为True,如果条件为True(成立),程序返回⑴执行;否则执行Loop之后的语句。
显然,不管Do…LoopWhile语句中条件是否成立,循环体的操作只少被执行一次。
例如,可以用DoWhile…Loop语句计算1×1+2×2+……+n×n。
程序代码如下:
PrivateSubForm_Load()
DimnAsInteger,kAsInteger,sAsLong
Show
n=Val(InputBox("请输入一个正整数"))
k=1:
s=0
Do
s=s+k*k
k=k+1
LoopWhilek<=n'k<=n执行循环体的操作
MsgBox"1×1+2×2+……+"&n&"×"&n&"="&s&Chr(13)&"k="&k
EndSub
运行程序,输入整数10,消息对话框给出了计算结果,如图5-5所示。
如果在程序中设置k=10,输入的整数为5,则k<=n不成立,循环体被执行一次,输出的s=100。
4.直到型循环前测试型
语法格式:
DoUntil条件
循环体
Loop
说明:
DoUntil…Loop语句中给出的条件是终止循环操作的条件,即当条件不成立(Fasle)时,执行循环体的操作;直到条件成立(True)时,才终止循环操作。
所以带“Until条件”的Do...Loop循环语句结构称为直到型循环。
该结构在程序每次执行循环体的操作之前,首先测试条件,所以称为前测试型。
两者合起来称为直到型循环前测试型。
直到型循环前测试型Do循环结构的执行过程为:
⑴执行DoUntil语句,测试条件是否为True。
⑵如果条件为False(不成立),程序执行循环体的操作,然后返回⑴执行;条件为True执行Loop之后的语句。
如果条件第一次测试时便为True(成立),则循环体一次也不会被执行。
例如,可以用DoWhile…Loop语句计算1×1+2×2+……+n×n。
程序代码如下:
PrivateSubForm_Load()
DimnAsInteger,kAsInteger,sAsLong
Show
n=Val(InputBox("请输入一个正整数"))
k=1:
s=0
DoUntilk>n'k>n退出执行循环体的操作
s=s+k*k
k=k+1
Loop
MsgBox"1×1+2×2+……+"&n&"×"&n&"="&s&Chr(13)&"k="&k
EndSub
运行程序,输入整数10,消息对话框给出了计算结果,如图5-5所示。
如果在程序中设置k=10,输入的整数为5,则k>n成立,循环体一次也没有被执行,输出的s=0。
5.直到型循环后测试型
语法格式:
Do
循环体
LoopUntil条件
说明:
Do…LoopUntil语句中给出的条件是仍然终止执行循环操作的条件,只不过是在每次循环体的操作执行完之后,才测试条件,所以该结构称直到型循环后测试型。
直到型循环后测试型Do循环结构的执行过程为:
⑴执行循环体的操作;
⑵测试Loop…Until语句中的条件,如果条件为False(不成立),程序返回⑴,如果条件为True执行Loop之后的语句。
显然,不管Do…LoopUntil语句中条件是否成立,循环体的操作只少被执行一次。
例如,可以用Do…LoopUntil语句计算1×1+2×2+……+n×n。
程序代码如下:
PrivateSubForm_Load()
DimnAsInteger,kAsInteger,sAsLong
Show
n=Val(InputBox("请输入一个正整数"))
k=1:
s=0
Do
s=s+k*k
k=k+1
LoopUntilk>n'k>n终止执行循环体的操作
MsgBox"1×1+2×2+……+"&n&"×"&n&"="&s&Chr(13)&"k="&k
EndSub
运行程序,输入整数10,消息对话框给出了计算结果,如图5-5所示。
如果在程序中设置k=10,输入的整数为5,则k>n成立,循环体被执行一次,输出的s=100。
例5-4输入两个正整数,求它的最大公约数。
分析:
求最大公约数可以用“辗转相除法”。
如果两个正整数分别为m和n,其具体操作为:
⑴求出m/n的余数r;
⑵若r≠0,则把原来的除数n作为新的被除数m,把余数r作为新的除数n;
⑶重复⑴、⑵的操作,直到r=0为止。
最后的除数n便是最大公约数。
根据此分析,可以画出流程图,如图5-6所示。
设计步骤如下:
⑴创建一个工程,在窗体上添加一个框架Frame1,一个命令按钮Command1,三个文本框Text1~Text2和三个标签Label1~Label3,程序的运行界面如图5-7所示。
⑵编写程序代码。
首先编写窗体的Load事件过程,设置各控件的有关属性。
代码如下:
PrivateSubForm_Load()
Frame1.Caption="输入两个整数"
Label1.Caption="两数的最大公约数是"
Label2.Caption="m="
Label3.Caption="n="
Command1.Caption="计算"
Text1.Text=""
Text2.Text=""
Text3.Text=""
Text3.Locked=True
EndSub
图5-6“辗转相除法”图5-7例5-4程序的运行情况
编写命令按钮Command1的Click事件过程,根据辗转相除法的流程图,输入两个整数,计算最大公约数。
代码如下:
PrivateSubCommand1_Click()
DimmAsInteger,nAsInteger,rAsInteger
m=Val(Text1.Text)
n=Val(Text2.Text)
Ifm<=0Orn<=0Then
MsgBox"输入数据出错!
"
ExitSub
EndIf
Do
r=mModn
m=n
n=r
LoopUntilr=0
Text3.Text=m
EndSub
运行程序,输入两个整数,单击命令按钮即可完成计算,如图5-7所示。
本程序利用直到型循环后测试型,实现了用“辗转相除法”求两个整数的最大公约数的计算。
例5-5用级数
,求π的近似值,当最后一项的绝对值小于10-k时,停止计算。
分析:
若最后项为
,停止计算的条件为
<10-k,即级数中数据项的分母n>10k,进行计算的条件为n<=10k。
用变量pi存储级数和,变量s控制数据项的加、减,画出计算的流程图如图5-8所示。
设计步骤如下:
⑴创建一个工程,在窗体上添加一个框架Frame1,一个命令按钮Command1,两个文本框Text1和Text2,两个标签Label1和Label2,程序界面如图5-9所示。
⑵编写程序代码。
首先编写窗体的Load事件过程,设置各控件的有关属性。
代码如下:
PrivateSubForm_Load()
Frame1.Caption="计算圆周率"
Label1.Caption="输入小数点后的有效数字位数"
Label2.Caption="π="
Command1.Caption="计算"
Text1.Text=""
Text2.Text=""
Text2.Locked=True
Show
Text1.SetFocus
EndSub
图5-8计算π值的流程图图5-9计算圆周率π
编写命令按钮Command1的Click事件过程,计算圆周率。
代码如下:
PrivateSubCommand1_Click()
DimPiAsDouble,nAsLong
DimsAsInteger,kAsInteger
k=Val(Text1.Text)
n=1:
s=1:
Pi=0
DoWhilen<=10^k
Pi=Pi+s/n
s=-s
n=n+2
Loop
Pi=Pi*4
f