第五讲基本控制结构-2内容提要循环结构当循环Do循环For循环程序的调试循环结构循环结构是在满足一定的条件下,反复执行一段程序语句的结构。•如输入全班学生的成绩、计算平均分需要反复处理相同的问题VisualBasic有三种循环结构•当循环•Do循环•For循环当循环当循环结构适用于事先不知道循环的次数,需要通过条件来判断是否继续循环时。While条件[语句块]Wend条件语句块真假当循环的执行过程为:当条件为真时,执行下面的语句块,执行到Wend语句时,控制返回到While语句,再判断条件,如为真,则重复上述过程。如果条件为假,则直接跳到Wend后面的语句继续执行。因为While语句本身不能修改循环条件,所以必须在循环体内包含改变循环条件的语句,否则会出现死循环。当循环--例求自然数1~100的和PrivateSubCommand1_Click()Dimsum%,i%i=1sum=0Whilei=100sum=sum+ii=i+1WendPrintsumEndSub分析:求和需要累加运算,累加过程需要用循环处理,可用While语句。5050运行结果:Do循环Do循环也是用于循环次数未知的循环结构。Do循环的格式有两种:Do[语句块][ExitDo]Loop[While|Until条件]Do[While|Until条件][语句块][ExitDo]LoopDo、Loop、While、Until都是关键字,Do和Loop构成Do循环。格式1为先执行后判断,语句块至少执行一次,格式2为先判断后执行,语句块有可能一次都不执行。关键字While指明当条件为真时,执行循环体中的语句块;关键字Until指明在条件变为真之前,执行循环体中的语句块。格式1:格式2:Do……Loop语句Do[语句块][ExitDo]LoopDo循环仅由Do……Loop组成时,表示无条件循环。由于此结构本身没有设置退出循环的条件,这时在循环体中必须有ExitDo语句或Goto语句跳出循环体,否则为死循环。Dimi%,sum%i=1sum=0Dosum=sum+ii=i+1Ifi100ThenExitDoLoopPrintsum用Do……Loop语句实现求自然数1~100的和Do……LoopWhile语句Do[语句块][ExitDo]LoopWhile条件Do……LoopWhile语句的执行过程是先执行循环体的语句块,然后检查条件,当条件为真时,继续执行循环体的语句块,当条件为假时,退出循环,执行LoopWhile子句后面的语句。语句块条件真假Dimi%,sum%i=1sum=0Dosum=sum+ii=i+1LoopWhilei=100Printsum用Do……LoopWhile语句实现求自然数1~100的和Do……LoopUntil语句Do[语句块][ExitDo]LoopUntil条件Do……LoopUntil语句的执行过程是先执行循环体的语句块,然后检查条件,当条件为假时,继续执行循环体的语句块,当条件为真时,退出循环,执行LoopWhile子句后面的语句。语句块条件真假Dimi%,sum%i=1sum=0Dosum=sum+ii=i+1LoopUntili100Printsum用Do……LoopUntil语句实现求自然数1~100的和DoWhile……Loop语句DoWhile条件[语句块][ExitDo]LoopDoWhile……Loop语句的执行过程是先检查条件,当条件为真时,执行循环体的语句块,当条件为假时,退出循环,执行Loop子句后面的语句。条件语句块真假Dimi%,sum%i=1sum=0DoWhilei=100sum=sum+ii=i+1LoopPrintsum用DoWhile……Loop语句实现求自然数1~100的和DoUntil……Loop语句DoUntil条件[语句块][ExitDo]LoopDoUntil……Loop语句的执行过程是先检查条件,当条件为假时,执行循环体的语句块,当条件为真时,退出循环,执行Loop子句后面的语句。条件语句块假真Dimi%,sum%i=1sum=0DoUntili100sum=sum+ii=i+1LoopPrintsum用DoUntil……Loop语句实现求自然数1~100的和For循环在循环次数已知的情况下,使用For循环。For循环变量=初值To终值[Step步长][循环体][ExitFor]Next[循环变量]循环变量是一个数值型变量,用来控制循环的执行次数。初值和终值代表循环变量的初值和终值,可以是常数或数值表达式步长是循环变量的增量,可以是常数或数值表达式。步长可为正(初值小于终值),也可为负(初值大于终值),但不能为0。当步长为1时,可省略不写。Dimi%,sum%sum=0Fori=1To100sum=sum+iNextiPrintsumFor循环的流程图循环变量=初值循环变量超过终值执行循环体循环变量=循环变量+步长假真Next后面的循环变量必须和For后面的循环变量相同,也可省略不写。可在循环体的任何位置放置ExitFor语句,随时退出循环。循环的次数由初值、终值和步长决定,计算公式为:循环次数=Int()For循环可以嵌套使用,嵌套层数没有限制,每层循环必须有唯一的变量名作为循环变量,内外层循环不能交叉。1步长初值终值For循环—例1计算n!,n由用户输入PrivateSubCommand1_Click()Dimi%,n%DimfactAsDoublefact=1n=Val(Text1.Text)Fori=1Tonfact=fact*iNextiText2.Text=factEndSubFor循环—例2PrivateSubForm_Click()Dimi%,j%j=0PrintTab(20);ASCII码表Fori=32To126Printi&:&Chr(i),j=j+1IfjMod4=0ThenPrintNextiEndSub输出可打印字符的ASCII码,每行显示4个。分析:ASCII码中从32~126是可打印字符,其余是不可打印字符,使用For循环输出循环的嵌套在一个循环体内部包含另一个循环体称为循环的嵌套•内嵌的循环还可以嵌套循环,构成多重循环当循环、Do循环和For循环都可以互相嵌套•内层循环和外层循环不能交叉•内外层的循环变量不能重名循环的嵌套-例1对不大于50的三个整型变量a、b、c,找出所有的“勾股三边”。分析:利用三重For循环可找出所有可能的三边PrivateSubCommand1_Click()Dima%,b%,c%Print勾,股,弦Print------------------------------Fora=3To50Forb=aTo50Forc=aTo50Ifa*a+b*b=c*cThenPrinta,b,cNextcNextbNextaEndSub循环的嵌套-例2PrivateSubCommand1_Click()Dimi%,j%,n%,m%n=Val(Text1.Text)m=n\2+1Fori=1Tom'打印上三角Forj=(m+1)-iTo(m-1)+iPrintTab(15+j);*;'菱形左侧空15列NextjPrintNextiFori=1Tom-1'打印下三角Forj=iTo2*(m-1)-iPrintTab(15+j+1);*;NextjPrintNextiEndSub在窗体上输出下面的菱形,行数由用户输入(行数为奇数)循环出口语句一般情况下是不能在循环的过程中退出循环的,必须从头到尾执行完循环体的语句。而在实际问题中,有时希望在一定条件下退出循环,VisualBasic以循环出口语句ExitDo和ExitFor的形式提供了提前退出循环的途径。无条件循环出口语句ExitForExitDo条件形式循环出口语句If条件ExitForIf条件ExitDo循环出口语句-例1在窗体上打印出100以内的素数PrivateSubCommand1_Click()Dimi%,m%,k%,count%count=0Form=2To100'外循环,对100以内的每个数判断其是否是素数k=Sqr(m)Fori=2Tok'内循环,判断数m是否是素数If(mModi)=0ThenExitFor'm不是素数,提前退出循环NextiIfi=k+1ThenPrintm;count=count+1If(countMod8)=0ThenPrintEndIfNextmEndSub判断一个数m是否是素数的方法是让m被2~中的整数整除,如果m能被其中任何一个整数整除,则提前退出循环,此数不是素数,否则是素数。m循环出口语句-例2用迭代法求x=。求平方根的迭代公式为:=(+)要求前后两次求出的x误差的绝对值小于10-6。a1nx21nxnxaPrivateSubCommand1_Click()Dima!,x!,y!a=Val(Text1.Text)x=a/2y=(x+a/x)/2Dox=yy=(x+a/x)/2IfAbs(x-y)=0.000001ThenExitDoLoopText2.Text=yEndSub循环-例1用=+++……+近似公式求的值,当10-6为止,输出的值和循环次数。6221122123121n分析:先求i2,然后把累加,由于循环次数事先未知,可使用Do循环,根据第i项达到精度来决定退出循环PrivateSubCommand1_Click()Dimm#,s#,t#,pi#Dimi%s=0'存放累加结果i=1'循环控制变量t=1'第i项DoWhilet0.000001s=s+t'求和i=i+1m=i^2'求平方t=1/m'第i项值Looppi=Sqr(6*s)Printpi=;piPrint循环次数为;iEndSub21i21i21n循环-例21111........4357用公式计算的值PrivateSubForm_Click()Dims#,f#,n&,sign%s=1n=1sign=1DoWhilen10000sign=-signf=1/(2*n+1)s=s+sign*fn=n+1LoopPrints*4EndSub循环-例3编程序找出1000之内的所有完数,并打印出它的所有因子。分析:一个数恰好等于它的因子之和,这个数称为“完数”。用二重循环找出1000以内的完数,并打印其因子。PrivateSubCommand1_Click()Dimx%,y%,z%,i%,sum%Forx=2To1000Sum=0Fory=1Tox-1IfxMody=0ThenSum=Sum+yEndIfNextyIfx=SumThenPrintSum;其因子为;Fori=1ToSum-1IfxModi=0ThenPrinti;NextiPrintEndIfNextxEndSub循环-例4猴子吃桃问题。猴子摘了若干个桃子,第一天吃了一半多一个,第二天吃了剩下的一半还多一个,以后每天都吃剩下的一半多一个,到第7天要吃时只剩下一个了,问小猴一共摘了多少桃子分析:该问题用递推法,由第7天的桃子数推出第6天的桃子数,再由第6天的桃子数推出第5天的桃子数,……,直到推出第1天的桃子数。假设第i天的桃子数是xi,那么猴子在第i天吃了xi-1/2+1只桃子,第i天的桃子数xi=xi-1-(xi-1/2+1)=xi-1/2-1,于是得到公式xi-1=2(xi+1),i=7时,x7=1,得到x6=4,…..。PrivateSubForm_Click()Dimi%,x%x=1Fori=6To1Step-1x=2*(x+1)Print第;i;天桃子数为:;x;只NextiPrint猴子一共摘了;x;只桃子。EndSub循环-例5验证“角谷猜想”一个自然数,若为偶数则除以2,若为奇数,则乘3加1,重复此过程,最终可得1。PrivateSubForm_Click()Dimn%,i%i=1