第5章 循环结构程序设计.docx
- 文档编号:7757384
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:19
- 大小:116.04KB
第5章 循环结构程序设计.docx
《第5章 循环结构程序设计.docx》由会员分享,可在线阅读,更多相关《第5章 循环结构程序设计.docx(19页珍藏版)》请在冰豆网上搜索。
第5章循环结构程序设计
第5章循环结构程序设计
循环是指在程序设计中,从某处开始有规律地反复执行某一程序块的现象。
例如:
计算2n。
如果这样计算:
s=1
s=s*2
s=s*2
…
s=s*2
很显然,这不是解决问题的方法.在程序设计中要解决此问题,就需使用循环结构语句
使用了循环结构编写程序,可以简化程序;避免重复的不必要的工作;提高编程效率。
VB提供三种不同风格的循环结构,包括:
●当循环(While-Wend循环)
●Do循环(Do-Loop循环)
●FOR循环(For-Next循环)
其中For循环按规定的次数执行循环体,而当循环和Do循环则是在给定的条件满足时执行循环体。
§1、While…Wend语句(当循环语句)
1、格式:
While<条件>
<语句序列>
Wend
上述格式中,“条件”为一布尔表达式,用以指定循环条件。
2、功能:
根据条件进行判断,决定是否执行循环体。
3、执行过程:
如果“条件”为True(非0),执行由“语句序列”组成的循环体,当遇到Wend语句时,控制语句返回到While语句,并对“条件”进行测试,如果仍为True,则重复上述过程。
如果“条件”为False,则不再执行循环体内容,而转去执行Wend后继语句,跳出循环。
执行流程如图所示。
4、举例
例5_1_1计算2n
程序:
Dimn#,s#,k&
n=InputBox("inputn")
s=1
k=1
Whilek<=n
s=s*2
k=k+1
Wend
Print"s=";s
例5_1_1a计算
程序:
Dimn#,s#,x&
n=InputBox("inputn")
s=0
x=1
Whilex<=n
s=s+x
x=x+1
Wend
Print"s=";s
------------------------------------------------------------------------------------
例5_1_1b计算
Dimn#,s#,x&
n=InputBox("inputn")
s=1
x=1
Whilex<=n
s=s*x
x=x+1
Wend
Print"s=";s
例5_1_2从键盘上输入一串字符(每次输入一个字符),以“!
”结束,并对输入字符中的字母个数和数字个数进行统计。
分析:
需要输入的字符个数没有指定,停止计数的条件是输入字符为“!
”,所以用while…wend语句是合适的。
程序中,变量ch接受键盘输入的字符,变量T1,T2分别用于统计字母,数字的个数。
PrivateSubcommand1_click()
Dimch$,T1%,T2%
Cls
T1=0:
T2=0
Whilech<>"!
"
ch=InputBox("请输入一个字符:
")
Ifch>="a"Andch<="z"Orch>="A"Andch<="Z"Then
'ifLcase(ch)>="a"andLcase(ch)<="z"
T1=T1+1
ElseIfch>="0"Andch<="9"Then
T2=T2+1
EndIf
Wend
Print"字母个数:
";T1
Print"数字个数:
",T2
EndSub
5、说明
1.While…Wend循环语句先对“条件”进行测试,然后才决定是否执行循环体。
如果进入循环体之前,“条件”为False,则一次也不执行循环。
因此,进入循环体之前应正确设置循环条件。
2.循环体内应该有修改循环条件的语句,使得循环能正常执行和终止。
否则,会出现死循环,这是程序设计中容易出现的错误,应当尽量避免。
一旦出现“死循环”现象,可按下“Ctrl+Break”键强行退出。
§2、Do…Loop语句
Do循环有两种:
1、先判断后执行
DoWhile|Until条件
...
Loop
2、先执行后判断
Do
...
LoopWhile|Until条件
一、先判断条件形式
1.格式:
Do[While|Until<条件>]
<语句块>
Loop
2.功能:
While当条件为True时循环。
Until当条件首次为True时退出。
3.举例
例5_2_1用Dowhile……Loop改写例5_1_1
程序:
n=val(inputbox(“inputn”))
s=1
k=1
Dowhilek<=n
s=s*2
k=k+1
Loop
print“s=”;s
可以看出,DoWhile……Loop和While…….Wend语句功能相同。
例5_2_3计算S=1+2+3+……100改写例5_1_1a
程序:
PrivateSubForm_Activate()
Dims&,x&
s=0
x=1
DoWhilex<=100‘也可以用DoUntilx>100
s=s+x
x=x+1
Loop
Print"s=";s
EndSub
例5_2_2输入一个正整数(≥3),判断其是否为一素数。
分析:
所谓素数是指除了1和该数本身外,不能被任何整数整除的数。
可以依次用2~X-1作除数去除X(X>=3),若X不能被其中任何一个数整除,则X为素数。
程序:
PrivateSubCommand1_Click()
Dimx&
Cls
x=InputBox("输入一个整数X,(X>=3)")
flag=True
i=2
DoWhilei<=x–1‘理论证明判断至
即可,即SQR(x)
IfxModi=0Thenflag=False
i=i+1
Loop
IfflagThen
Printx&"是一个素数。
"
Else
Printx&"不是一个素数。
"
EndIf
EndSub
例5_2_4求SIN(x)的级数展开的值。
其中:
xx3x5x7
Y=sinx=─-─+─-─+…………
1!
3!
5!
7!
有以下关系:
Pn=Pn-1
(n=2,……)
P1=X
程序:
PrivateSubForm_Activate()
Dimy#,x#,p#,n%
x0=Val(InputBox("输入角度值X"))
n=InputBox("输入N的值")
x=x0*3.14159265359/180‘将角度值转换为弧度值
p=x
y=p
i=2
DoWhilei<=n
p=p*(-x*x/((2*i-1)*(2*i-2)))
y=y+p
i=i+1
Loop
Print"sin("&x0&")="&y
EndSub
例5_2_5打印图形,如下:
*
***
*****
*******
*********
程序:
PrivateSubForm_Activate()
FontSize=30
i=1
DoWhilei<=5
PrintTab(10-i);String(2*i-1,"*")
i=i+1
Loop
EndSub
例5_2_6打印图形,如下:
一江春水向东流
江春水向东流
春水向东流
水向东流
向东流
东流
流
程序:
PrivateSubForm_Activate()
FontSize=20
A="一江春水向东流"
b=Len(A)
DoWhileb>=1‘也可用语句DoUntilb<1
PrintTab(20-2*b);Right(A,b)
'函数Left、right、mid、len把一个汉字或全角字符中非字母和
‘数字的字符视为一个字符位,
'但是函数Tab、Space仍把一个汉字作为两个字符位
b=b-1
Loop
EndSub
二、后判断条件形式
1.格式:
Do
<语句块>
Loop[While|Until<条件>]
2.功能:
至少执行一次循环。
While当条件为True时循环。
Until当条件为True时退出。
3.举例
例5_2_7[例5_2_3计算S=1+2+3+……100]
程序:
PrivateSubForm_Activate()
Dims&,x&
s=0
x=1
Do
s=s+x
x=x+1
LoopWhilex<=100
Print"s=";s
EndSub
例5_2_8输入有效数字位数,利用下韦达公式(法国数学家1593年)计算圆周率π的近似值
π=
分析:
分母通项公式为:
Pn=
前n项的乘积为:
Yn=2Yn-1/Pn(n=2,3,….)
P1=0,Y1=2
程序:
(使用迭代法,且精确至|Yn-Yn-1|<ε)
PrivateSubCommand1_Click()
Dimp#,y#,s#,m%
Cls
m=InputBox("输入有效数字位数")
p=0:
y=2
Do
s=y
p=Sqr(2+p)
y=2*y/p
LoopUntilAbs(y-s)<10^-m
f=String(m,"#")
Print"有效位数到"&m&"位的π的近似值是:
"_
&vbCrLf&Format(y,"0."&f)
EndSub
例5_2_9求两个正整数M和N的最大公约数。
(龚P91例4.12)
分析:
采用“辗转相除法”的思想。
(南宋秦九韶)
(1)先将M,N中的较大数→a,较小数→b
(2)用大数a除以小数b,余数为R;
(3)若R=0,则b就是它们的最大公约数;
若R≠0,则a←b,b←R,重复上
(2)(3)过程,直至R=0
(4)最后得到的a就是最大公约数。
程序:
PrivateSubCommand1_Click()
Dima,b,r,m&,n&
Cls
m=InputBox("M=")
n=InputBox("N=")
Ifm m=n: n=t‘该句可省略 a=m: b=n Do r=aModb a=b b=r Loopuntilr=0 Printm;"和";n;"的最大公约数是: ";a EndSub §3For…Next语句 For循环也称计数循环。 常用于循环次数已知的程序结构中。 1、格式: For<循环变量>=<初值>To<终值>[Step<步长>] [<循环体>] Next[<循环变量>] 2、说明: (1).For格式中有多个参量,这些参量的含义如下: ·循环变量: 亦称"控制变量"。 它是一个数值变量,但不能是下标变量或记录元素。 ·初值: 循环变量的初值,它是一个数值表达式。 ·终值: 循环变量的终值,它也是一个数值表达式。 ·步长: 循环变量的增量,是一个数值表达式。 其值可以是正数(递增循环)或负数(递减循环),但不能为0。 如果步长为1,则可略去不写。 ·循环体: 在For语句和Next语句之间的语句序列,可以是一个或多个语句。 ·Next: 循环终结语句,在Next后面的"循环变量"与For语句中的"循环变量"必须相同。 (2).For循环语句的执行过程是: 首先把"初值"赋给"循环变量",接着检查"循环变量"的值是否超过终值,如果超过就跳出循环,执行Next后继语句;否则执行"循环体",然后把"循环变量+步长"的值赋给"循环变量",重复上述过程。 这里所说的"超过"有两种含义,即大于或小于。 当步长为正值时,检查循环变量是否大于终值;当步长为负值时,判断循环变量的值是否小于终值。 3、举例 例5_3_1[例5_2_3计算S=1+2+3+……100] 例5_3_2[例5_2_5打印三角形图形] 例5_3_3求斐波那契数列的前40项值。 即: 1,1,2,3,5,8,13,…… 程序: PrivateSubForm_Activate() Dimf&,f1&,f2& f1=1 f2=1 Printf1,f2, Fori=3To40 f=f1+f2 f1=f2 f2=f Printf, IfiMod5=0ThenPrint Nexti EndSub 例5_3_4.梯形法求定积分I= y y=f(x) x ab 分析: 求定积分从几何概念上求f(x)下的面积,将[a,b]均分为n等份,则有n+1个分点: a=x0 h=(b-a)/n;每个点的函数值为: y0=f(a) y1=f(a+h) ………… yn-1=f(a+(n-1)h) yn=f(b) 把每个小分段都看成小梯形,分别算出它们的面积,然后相加,就近似求得积分I。 即: 试编写求半径为1的园面积。 I= 4 dX的程序。 程序: PrivateSubForm_Activate() Dimn&,a%,b%,k&,i#,h! n=Val(InputBox("n=")) 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 Print"i=";i EndSub §4、多重循环与循环的退出 一、多重循环 在一个循环体中嵌套另一个循环结构,称为多重循环。 VB没有具体规定嵌套层数。 但是要注意嵌套时,不能交叉嵌套。 举例 例5_4计算S= 程序: PrivateSubCommand1_Click() Dimn#,m#,i#,j#,s# n=InputBox("n=") m=InputBox("m=") s=0 Fori=1Ton Forj=1Tom s=s+i*j Nextj,i Prints EndSub 例5_4_1“水仙花数”是指一个3位数,其各位数的立方和等于该数。 例如: 153=13+53+33,求100到999之间的所有水仙花数。 程序: PrivateSubForm_Activate() Fori=1To9 Forj=0To9 Fork=0To9 p1=i*100+j*10+k p2=i^3+j^3+k^3 Ifp1=p2ThenPrinti;j;k Nextk Nextj Nexti EndSub 例5_4_2编写输出九九乘法口诀表程序。 (龚P92例4.13) 程序: PrivateSubForm_Activate() Cls Forx=1To9 PrintTab((x-1)*10+2); Fory=xTo9 n=x&"*"&y&"="&x*y PrintFormat(n,"! @@@@@@@@@@"); Nexty Print Nextx EndSub 例5_4_3(例5_3_2[例5_2_5打印三角形图形]) 例5_4_6(龚P98例4.16)百元买百鸡问题。 假定公鸡每只2元,母鸡每只3元,小鸡每只5角。 现有一百元钱买一百只鸡,编程列出所有方案。 分析: 设母鸡、公鸡、小鸡各为X、Y、Z。 根据题意,有: X+Y+Z=100 3*X+2*Y+Z/2=100 X<=33 Y<=50 程序: (枚举法) PrivateSubForm_Activate() Dimx&,y&,z& Print"母鸡","公鸡","小鸡" Forx=0To33 Fory=0To50 z=100-x-y If3*x+2*y+z/2=100Then Printx,y,z EndIf Nexty Nextx EndSub 二、循环的退出 除了当条件满足时退出循环外,VB还提供了“ExitDo”和“ExitFor”两个语句,可以根据需要,在循环体中退出循环。 1、格式: Exitdo ExitFor 2、举例 例5_4_4显示3~100之间的所有素数。 (素数: 只能被1或其本身整除的自然数) 程序: PrivateSubForm_Activate() Forx=3To100Step2 flag=True Forn=2ToSqr(x) IfxModn=0Thenflag=False: ExitFor Nextn IfflagThenPrintx Nextx EndSub 例5_4_5判断回文数(例如: 121,1221,12321等) PrivateSubCommand1_Click() Dima$,w%,flag% flag=True a=Text1 w=Len(a) Fori=1Tow\2 IfMid(a,i,1)<>Mid(a,w-i+1,1)Then flag=False ExitFor EndIf Nexti IfflagThen Text2=a&"是回文数" Else Text2=a&"不是回文数" EndIf EndSub PrivateSubCommand2_Click() End EndSub 各种循环语句的比较 语句形式 特点 循环条件 终止条件 循环次数 While … Wend 先判断 True False ≥0 DoWhile … loop 先判断 True False ≥0 DoUntil … Loop 先判断 False True ≥0 Do … LoopWhile 后判断 True False ≥1 Do … loopUntil 后判断 False True ≥1 For … Next 先判断 循环变量 递增: ≤终值 递减: ≥终值 循环变量 >终值 <终值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第5章 循环结构程序设计 循环 结构 程序设计