第五章 循环结构程序设计.docx

上传人:b****4 文档编号:3822973 上传时间:2022-11-25 格式:DOCX 页数:51 大小:421.47KB
下载 相关 举报
第五章 循环结构程序设计.docx_第1页
第1页 / 共51页
第五章 循环结构程序设计.docx_第2页
第2页 / 共51页
第五章 循环结构程序设计.docx_第3页
第3页 / 共51页
第五章 循环结构程序设计.docx_第4页
第4页 / 共51页
第五章 循环结构程序设计.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

第五章 循环结构程序设计.docx

《第五章 循环结构程序设计.docx》由会员分享,可在线阅读,更多相关《第五章 循环结构程序设计.docx(51页珍藏版)》请在冰豆网上搜索。

第五章 循环结构程序设计.docx

第五章循环结构程序设计

第五章循环结构程序设计

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1