- 111.00 KB
- 2022-08-17 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
课题:循环结构教学时间:授课班级:教学目标:学会用for…next语句和do…loop编写简单的程序,并会调试它教学重点、难点:1.For–next语句的用法2.Do-loop语句的用法3.循环语句的嵌套教学过程在用计算机处理问题时,除了分支问题外,还有不少是需要重复执行某一组操作的问题。这就要采用循环结构,VB中提供了两种语句实现循环结构,For-Next语句和Do-Loop语句。【例6-6-1】求s=1+2+3+……+100利用赋值语句可写出如下形式的代码:sum=0sum=sum+1sum=sum+2sum=sum+3……sum=sum+100很显然,使用这种形式也能得到结果,但程序很冗长。观察上面的代码可以发现,这段代码实际上重复了同一个操作:sum=sum+I,只不过是每次相加的自然数不同而已。使用VB提供的循环语句可以很容易实现这种重复操作功能。具体算法如下:①设sum=0;②设i=1;③若i<=100则转④,否则算法停止,最后sum中的数值即是自然数列前100项之和;图6-23开始0→sum1→ii<=100sum+i→sumi+1→i输出sum结束YN④将sum与i相加,其结果送给变量sum,即sum+i→sum;⑤使i值增加1,即i+1→i;⑥转③。流程图如图6-23,程序及运行结果如下:'求1、2、3……、100之间自然数的和PrivateSubForm_Click()DimiAsIntegerDimsumAsIntegersum=0Fori=1To100sum=sum+i'循环体10用心爱心专心\nNextiPrint"sum=";sumEndSub运行结果为:sum=5050一、For...Next循环这个程序中使用的是For...Next循环,它的一般形式是:For循环变量=初值To终值Step循环变量增量循环体Next循环变量循环变量的初值、终值、循环变量增量都是数值型。其中要重复执行的操作称为循环体,增量可正可负,如果没有设置Step,则增量的缺省值为1。For-Next循环的执行过程是:①循环变量取初值;②循环变量与终值比较,没有超过终值转③,否则循环结束,接着执行循环语句的后继语句;③执行一次循环体;④循环变量增加一个增量;⑤重复步骤②~④。从上看出,For-Next循环变量是一种当型循环,图6-24是它的执行过程。说明:①For语句与Next语句必须成对出现,而且它们当中的“循环变量”必须是同一个变量,如本例中均为i;②当循环变量增量为正时,循环变量超过终值,是指循环变量的值大于终值,若为负,则是指循环变量的值小于终值。图6-24从例6-6-1程序的流程图和For-Next循环的招待过程可以看出,执行For-Next循环时,先判断循环变量是否超过终值,如果没有超过终值,就执行循环体,这种循环称为当型循环,它的一般结构如图6-25所示。循环体A执行有限次后,条件P不再成立,从而退出循环。图6-25讨论与思考:10用心爱心专心\n⒈本例中循环结束时,循环变量i的值是多少?⒉若有如下一段代码:Forj=15to3Step–2PrintjNextj则循环结束时,循环变量j的值是多少?⒊循环变量的增量能否为0,如果为0,运行结果怎样?图6-26【例6-6-2】设计一个界面如图6-26所示的程序,要求执行程序后,窗体上的星星在闪烁,单击“结束”按钮结束程序。为了实现星星闪烁的效果,本例设置了一个定时器控件,窗体启动后,每隔500ms触发一次Timer事件,在该事件中使用循环语句随机产生50个坐标值,然后用窗体的Pset方法在这些坐标处画点,窗体上出现星星的效果,在Timer事件的开头,使用Cls方法清屏,以产生闪烁效果。完成本程序需要在设计阶段设计的属性如表6-11。表6-11缺省的对象名设置的对象名属性设置值Form1frmStarCaption星星闪烁BackColor黑色ForeColor黄色Command1cmdEndCaption结束Timer1tmrAnimationEnabledFalseInterval500程序代码如下:′星星闪烁DimxposAsInteger,yposAsIntegerDimiAsIntegerPrivateSubForm_Load()tmrAnimation.Enabled=TrueRandomizeEndSubPrivateSubtmrAnimation_Timer()′清屏,产生闪烁效果10用心爱心专心\nClsFori=1To50xpos=Int(frmCircle.Width*Rnd)ypos=Int(frmCircle.Height*Rnd)PSet(xpos,ypos)NextiEndSubPrivateSubcmdEnd_Click()EndEndSub二、Do...Loop循环For-Next循环的次数是确定的,有的问题只知道循环结束的条件,重复执行的次数事先并不知道,这时需用Do-Loop循环。格式一:DoWhile条件循环体Loop当VB执行DoWhile-Loop循环时,先判断指定的条件是否为真,若条件为真,执行循环体,条件为假时退出循环。这也是一种当型循环。【例6-6-3】设计一个界面如图6-27所示的程序,从键盘输入任意两个正整数a、b,输出它们的最大公约数。图6-27本程序运行时,通过单击“计算”按钮在“最大公约数”框中显示a与b的最大公约数,因此,求最大公约数的代码就编写在“计算”按钮的Click事件中。完成本程序界面需要设置的属性如表6-12。表6-12缺省的对象名设置的对象名属性设置值Form1frmDivisorCaption最大公约数Label1lblaCaption输入ALabel2lblbCaption输入BLabel3lblDivisorCaption最大公约数Text1txtaText(空白)Text2txtbText(空白)10用心爱心专心\nText3txtDivisorText(空白)Command1cmdCalcuCaption计算Command2cmdEndCaption结束求两个正整数a、b(a>b)的最大公约数的算法见例6-1-3,流程图见图6-3,程序代码如下:′求最大公约数PrivateSubcmdCalcu_Click()DimaAsIntegerDimbAsIntegerDimrAsIntegera=Val(txta.Text)b=Val(txtb.Text)r=aModbDoWhiler<>0a=bb=rr=aModbLooptxtDivisor.Text=Str(b)EndSubPrivateSubcmdEnd_Click()EndEndSub格式二:Do循环体LoopUntil条件APN入口出口这种循环的执行过程如图6-28所示,进入循环后,先执行一次循环体A,然后再检查条件是否成立,如果不成立,就执行循环体A,直到条件D成立,退出循环。这种循环结构称为直到型。Y图6-28【例6-6-4】如果我国人口以每年平均1.5%的速度增长,问多少年后我国人口达到或超过15亿,设现在人口为12.3亿。解决这个问题的思路是:设现在人口为p0=12.3亿,人口增长率r=1.5%=0.015,则一年后人口为p1=p0+p0×r=p0×(1+r),看它是否达10用心爱心专心\n到或超过15亿;如果未达到,再算二年后的人口p2=p1+p1×r=p1×(1+r);如果未达到,再计算三年后的人口……,直到n年后的人口数达到或超过15亿。流程图见图6-29,程序代码如下:′直到型循环PrivateSubForm_Click()DimpAsSingle图6-29DimrAsSingleDimnAsIntegerp=1230000000#r=0.015n=0Dop=p*(1+r)n=n+1LoopUntilp>=1500000000#Printn;"年后","人口=";pEndSub运行结果如下;14年后人口=1.51506E+09三、循环的嵌套在一个循环中又完整地包含另一个循环,称为循环的嵌套。前面介绍的几种类型的循环可以互相嵌套,例如可以在一个For-Next循环中包含另一个For-Next循环,也可以在一个Do-Loop循环中包含一个For-Next循环。结束图6-30换行j+1→jYN开始-3→ii<=31→j确定每行起始位置j<=2*(4-Abs(i))-1输出"*"i+1→iYN【例6-6-5】设计一个程序,打印如下所示的图案。*************************为解决这个问题,可以采用如下的算法:使用双重For-Next循环,外循环确定行数和各行起始打印位置,内循环用来确定各行打印的个数。设外循环的循环变量为i,内循环的循环变量为j。由于图案上下对称,上下两半对应行的起始位置和字符个数完全一致,所以i的取值也应对称:i=-3To3。设i=0行的起始打印位置为5,则第i行的起始打印位置为Tab(Abs(i)+5),第i行的字符的个数为2*(4-Abs(i))-1。流程图如图10用心爱心专心\n6-30所示,程序代码如下:′打印菱形图案PrivateSubForm_Click()DimiAsInteger,jAsIntegerFori=-3To3PrintTab(Abs(i)+5);′确定每行的起始位置Forj=1To2*(4-Abs(i))-1Print"*";NextjPrint′换行NextiEndSub【例6-6-6】求3到100之间的全部质数。YYYNNNNYn<=100质数是除了1和它本身之外,不能被其它任何整数整除的大于1的自然数。要验证一个自然数n是否为质数,方法很多。我们采用的算法是:一个数n是否是质数,只需将n被2~间全部整数除即可,如果都除不尽,n就是质数。图6-31先计算出k=,然后将n被i=2~k除。Flag是个“标志变量”,初始时Flag=0,表示n未被任何一个整数整除,如果在某一次n被一个整数i整除,则Flag改变为1,表明该数不是质数。如果n不被任何一个i整除,则Flag始终保持为0。因此,在结束循环后根据Flag的值为0或1,来判断一个数是否为质数。′求3到10之间的全部质数PrivateSubForm_Click()DimnAsInteger,iAsIntegerDimflagAsIntegerDimkAsIntegerForn=3To100Step2k=Int(Sqr(n))i=2flag=0DoWhilei<=kIfnModi=0Thenflag=1′n能被某一个数整除EndIfi=i+1Loop图6-31Ifflag=0ThenPrintnNextnEndSub运行结果为:10用心爱心专心\n357111317192329313741434753596167717379838997说明:①由于偶数决不会是质数,不必对偶数进行测试,因此外循环的增量为2;②内循环中nModi=0中的Mod为取余运算,若n能被i整除,则余数为0;实践与探索请考察程序的内循环部分,如果n是一个质数,如n=11,则内循环结束时,标志变量flag的值仍为0;如果n不是一个质数,如n=63,则进行第二次循环时,n能被3整除,此时flag的值为1,已经可以判断出n不是质数,但程序中的内循环仍然要执行6次,程序的效率不高。请问该如何修改程序,当flag的值为1时直接结束循环。练习⑴比较三种循环结构:For-Next、DoWhile-Loop、Do-LoopUntil,指出各在什么情况下使用?DoWhile-Loop与Do-LoopUntil之间又有什么区别?⑵写出下列程序的执行结果。①PrivateSubForm_Click()DimxAsIntegerDimnAsIntegern=0Forx=3To11Step2n=n+1Print"x=";xNextxPrint"n=";nPrint"x=";xEndSub②PrivateSubForm_Click()DimaAsIntegerDimbAsIntegerDimcAsIntegera=1:b=1:c=1DoWhilea+b+c<=10a=a+1b=b*2c=b/2Printa,b,c10用心爱心专心\nLoopEndSub③PrivateSubForm_Click()DimxAsIntegerDimyAsIntegerx=3y=77DoPrintxLetx=x+2LoopUntilx>Sqr(y)EndSub④PrivateSubForm_Click()DimkAsIntegerDimtAsIntegerDimsAsIntegers=0:t=1Fork=2To4s=s+kt=t*kNextkPrint"s=";s,"t=";tEndSub⑤PrivateSubForm_Click()DimaAsIntegerDimbAsIntegerDimcAsIntegerDimsAsIntegerDimiAsIntegera=2:b=1:s=0Fori=10To6Step-1s=s+ac=a+ba=bb=cNextiPrint"s=";sEndSub⑥PrivateSubForm_Click()DimiAsIntegerDimjAsIntegerDimyAsIntegerDimsAsIntegers=1:y=1Fori=2To4Forj=1To210用心爱心专心\ny=y*jNextjs=s+yNextiPrint"s=";sEndSub⑦PrivateSubForm_Click()DimiAsIntegerDimjAsIntegerFori=1To6Forj=1ToiPrint"^";NextjPrintNextiEndSub⑶编写计算下列各式的程序:①P=n!(n!=n*(n-1)*(n-2)*(n-3)*…1,n由键盘输入)②S=1-1/2+1/3-1/4+1/6-1/6+…+1/99-1/100④S=1!+2!+3!+4!+……+10!⑷某工厂1997年总产值为200万元,若总产值以每年5%的速度增长,问多少年后总产值翻一番?⑸编写求下式中n最大值的程序,画出流程图。12+22+32+……+n2<=1000⑹编写程序打印下列图形:①*②***************************************⑺设计一个界面如图6-32所示的程序,图中上排的两个文本框用于输入一个分数的分子分母,中排有一个结果框,用于显示计算结果,下排为“计算”和“退出”按钮。单击“计算”钮时,在中间框中立即显示出该分数的化简结果,单击“退出”钮时,结束程序。要求写出完成该程序所要绘制的控件及需要重新设置的属性,并编写程序。图6-32化简分数的算法如下:①求分子与分母的最大公约数;②将分子、分母分别用最大公约数相除;③用上步求出的两个数组成化简分数,送到结果框显示。例如:分子框输入126,分母框输入210,单击“计算”按钮后,化简分数框显示3/5。10用心爱心专心