第五章 循环结构程序设计.docx
- 文档编号:3822973
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:51
- 大小:421.47KB
第五章 循环结构程序设计.docx
《第五章 循环结构程序设计.docx》由会员分享,可在线阅读,更多相关《第五章 循环结构程序设计.docx(51页珍藏版)》请在冰豆网上搜索。
第五章循环结构程序设计
第五章循环结构程序设计
5.1循环结构程序设计的概念
计算机具有速度快、精度高的特点,特别适于进行重复性的操作,重复次数越多越能显示它的威力。
所以,使用计算机时,应尽量把问题归纳为简单而有规则的重复运算和操作,以充分发挥计算机的特长。
在实际的数据处理中,常需要进行一些大量重复的运算和操作,如计算:
1+2+3+……+n
1!
+2!
+3!
+……+n!
这些操作都可有用循环结构的程序来实现。
在循环结构的程序中,在指定的条件下,程序会多次重复执行一组语句或程序块,重复执行的语句组称为“循环体”。
使用循环可以避免代码的重复编写,简化程序,节约内存,提高程序运行效率。
VisualBasic中实现循环结构语句有:
◇Do…Loop
◇For…Next
◇While…Wend
◇ForEach…Next
其中最常用的是Do…Loop和For…Next语句。
5.2循环语句
循环结构的语句都有两个共同的特点,一是有一个重复操作的程序块或语句组;二是能在一定的条件下进入循环体进行循环操作,当条件不满足时能退出循环体终止循环体的操作。
程序对循环体的操作只能是有限次,如果程序对循环体的操作不能终止,就是所谓的“死循环”,会导致程序无法正常执行结束,这是编程时必须避免的。
5.2.1For…Next循环语句
如果知道要执行的循环操作次数,或间接知道要执行循环操作的次数,这样的循环程序常用For…Next来实现。
引例:
计算1+2+3+……+n。
用InputBox函数输入数据n,直接在窗体上输出计算结果,程序代码如下:
PrivateSubForm_Load()
DimiAsInteger,sAsInteger,nAsInteger
Show
n=Val(InputBox("请输入一个正整数。
"))
s=0
Fori=1TonStep1
s=s+i
Print"i=";i;"s=";s
Nexti
Print"i=";i;"s=";s
EndSub
程序运行后,输入10,输出的情况如图5-1所示。
说明:
For…Next循环语句结构由三部分组成:
①For语句:
即循环起始语句(又称为循环说明语句),说明循环(控制)变量的初值、增量(步长值)和终值,实现对循环次数的控制。
如本例中的i便是循环变量,初值为1,终值为n(若输入为10,n=10),增量(步长)为1。
②循环体:
给出循环操作语句组或程序块。
本例循体为:
s=s+i
Print"i=";i;"s=";s
③Next语句:
即循环终端语句,给出了循环操作结束的位置,每次执行到Next语句,循环变量都按步长增值。
在本例中,程序执行到Next时,对循环变量执行“i=i+1”的操作。
程序执行到循环变量i的值超过终值n时,便退出循环操作。
图5-1引例的运行情况
从图5-1可以看到,当输入的终值n=10时,循环变量i每执行一次循环体后都自动加1,退出循环操作后,循环变量i(=11)超过终值n(=10)。
For…Next循环语句的结构格式为:
For循环变量=初值To终值[Step步长值]
循环体
Next[循环变量]
说明:
①For语句与Next语句必须成对出现,缺一不可,For语句必须在Next语句之前。
②For语句中的循环变量与Next语句中的循环变量必须为同一变量,Next语句中的循环变量可以省略,一般最好在Next后不写循环变量,避免不必要的错误。
③初值、终值和步长值都是数值表达式,步长值可以是正数(称为递增循环,初值<=终值),也可以是负数(称为递减循环,初值>=终值)。
但是步长值不能是0。
若步长值为0,循环将不能正常终止。
若步长值为+1,则Step1可以省略。
④可以在循环体中的任何位置放置Exitfor语句,随时退出循环操作。
For…Next循环语句的执行步骤归纳如下:
⑴求出初值、终值和步长值,并保存起来。
⑵将初值赋给循环变量。
⑶判断循环变量的值在其变化方向上是否超过终值(步长值为正时,大于终值;步长值为负时小于终值)。
当循环变量超过终值,则程序退出循环,执行Next之后的语句。
⑷若循环变量没有超过终值,执行循环体,执行到Next语句时,修改循环变量:
循环变量=循环变量+步长值
⑸重复执行⑶和⑷,直到循环变量超过终值。
例5-1求素数。
输入一个正整数,判断该数是否是素数。
分析:
所谓的“素数”是指一个自然数除了1和该数本身,不能被任何其它整数整除。
判断一个自然数n(n>=3)是否为素数,只要依次用2~
整数作为除数去除n,若n不能被其中任何一个数整除,则n为素数,否则便不是素数。
⑴创建一个工程,在窗体上添加一个框架Frame1,一个文本框Text1(用于输入正整数),一个命令按钮Command1和一个标签Label1(用于显示判断结果),程序界面如图5-2所示。
⑵编写程序代码。
首先编写窗体的Load事件过程,设置各控件的有关属性。
代码如下:
PrivateSubForm_Load()
Show
Frame1.Caption="请输入一个正整数:
"
Command1.Caption="判断素数"
Label1.Caption=""
Text1.Text=""
Text1.SetFocus
Text1.SelStart=0
EndSub
图5-2判断素数
编写命令按钮Command1的Click事件过程,输入整数,判断是否为素数。
代码如下:
PrivateSubCommand1_Click()
DimnAsLong
SelectCaseVal(Text1.Text)
CaseIs<3
MsgBox"请输入一个大于2的整数!
",vbInformation+vbOKOnly,"注意"
CaseIs>2147483647
MsgBox"此数太大!
",vbInformation+vbOKOnly,"注意"
CaseElse
n=Val(Text1.Text)
Fori=2ToInt(Sqr(n))
IfnModi=0ThenExitFor'n被某个数整除,不是素数i 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五章 循环结构程序设计 第五 循环 结构 程序设计
![提示](https://static.bdocx.com/images/bang_tan.gif)