1、第第6章章VB控制结构(控制结构(2)循环结构程序设计循环结构程序设计本章内容及要求:本章内容及要求:(1)掌握)掌握For.Next语句及语句及ExitFor语句的使用;语句的使用;(2)掌握)掌握Do.Loop循环语句与循环语句与ExitDo语句的使用;语句的使用;(3)掌握循环结构的嵌套应用;)掌握循环结构的嵌套应用;(4)掌握循环结构和选择结构的嵌套应用。)掌握循环结构和选择结构的嵌套应用。6.1概述概述在在VisualBasic程程序序设设计计中中,实实现现循循环环结结构构的的语语句句主主要要有有下列下列几几种:种:l lForNext语句语句lDoLoop语句语句 l lWhile
2、Wend语句语句 DoWhileLoop形式形式DoLoopWhile形式形式DoUntilLoop形式形式DoLoopUntil形式形式DoLoop形式形式打印九九乘法表打印九九乘法表DimSgsAsStringDimi,jAsIntegerFori=1To9被乘数从被乘数从1变到变到9Forj=iTo9乘数从乘数从1变到变到9Sgs=i&j&=&Str(i*j)打印公式如打印公式如11=1Picture1.PrintTab(j-1)*9+1);Sgs;NextjPicture1.PrintNextIFor循环语句循环语句(一般用于循环次数已知一般用于循环次数已知)形式:形式:For循环变量
3、初值循环变量初值to终值终值Step步长步长语句块语句块ExitFor语句块语句块Next循环变量循环变量循环体=0循环变量循环变量=终值终值=终值终值=1可省略可省略步长步长6.2For.Next循环结构循环结构循环次数循环次数例例:ForI=2To13Step3PrintI,NextIPrint“I=“,I循环执行次数循环执行次数4输出输出I的值分别为的值分别为:25811出了循环输出为出了循环输出为:I=146.2For.Next循环结构循环结构6.2For.Next循环结构循环结构注意跳出注意跳出FOR循环时的循环变量的值循环时的循环变量的值Fori=1to10step1s=s+iNe
4、xtiPrintiFori=-1to-10step-1s=s+iNextiPrinti6.2For.Next循环结构循环结构注意对于注意对于ForNext语句来说,一旦进入循环,其语句来说,一旦进入循环,其“终止值终止值”和和“增量增量”便不会再改变了。便不会再改变了。PrivateSubForm_Click()DimiAsInteger,jAsInteger,kAsIntegerj=10:k=1Fori=1TojStepkPrintij=j-1k=k+1NextPrintj,kEndSub练习:分析下面程序段结束时窗体上显示的值是多少?练习:分析下面程序段结束时窗体上显示的值是多少?(2)i
5、2=0Fori=1To-2Step-1i2=i2+1NextPrinti,i2(-34)(1)Fori=1To10i2=i2+1NextPrinti(11)(3)i2=0Fori=1To5Step2i2=i2+1NextPrinti(7)(4)i2=1Fori=1To10i=i+1i2=i2+1NextPrinti,i2(116)(5)i2=1i3=10i=10Fori=1Toi3i=i+1i2=i2+1i3=i3+1NextPrinti,i2(116)(6)i2=0Fori=1To10i2=i2+1Ifi6ThenExitForNextPrinti,i2(77)(7)i2=0i=10Doi2
6、=i2+1LoopWhilei=i2Printi2(1)例例6.7编程计算:编程计算:S=1+2+3+100Dim S%,I%S=0 累加前变量累加前变量S为为0For I=1 to 100 S=S+INext IPrintS=,S当I=100I=I+1打印SS=0,I=1S=S+I例例6.7的算法流程图的算法流程图6.2For.Next循环结构循环结构前测型前测型:DoWhile语句块语句块ExitDo语句块语句块LoopDoLoop循环语句使用形式循环语句使用形式6.3Do.Loop循环结构循环结构6.2Do.Loop循环结构循环结构PrivateSubForm_Click()DimiAs
7、Integer:DimaAsInteger定义所需变量定义所需变量i=0:a=0给变量赋初值给变量赋初值0,这两条语句可省略这两条语句可省略DoWhilei100i=i+1每次循环,变量每次循环,变量i都增加都增加1a=a+i每次循环,变量每次循环,变量a都加变量都加变量i的值的值LoopPrinta计算完毕,变量计算完毕,变量a的值即为所求的值即为所求EndSub例例:使用使用DoWhileLoop循环语句计算循环语句计算1+2+3+100的值的值后测型后测型:Do语句块语句块ExitDo语句块语句块LoopWhile6.3Do.Loop循环结构循环结构6.3Do.Loop循环结构循环结构例
8、例:使用使用DoLoopWhile循环语句计算循环语句计算1+2+3+n的值的值,n的的值由文本框输入。值由文本框输入。PrivateSubCommand1_Click()DimiAsInteger,nAsInteger,aAsInteger定义所需变量定义所需变量n=Text1.Text得到输入的值得到输入的值Doi=i+1每次循环,变量每次循环,变量i都增加都增加1a=a+i每次循环,变量每次循环,变量a都加变量都加变量i的值的值LoopWhileinText2.Text=a显示计算结果,变量显示计算结果,变量a的值即为所求的值即为所求EndSub前测型前测型:DoUntil语句块语句块E
9、xitDo语句块语句块LoopDoLoop循环语句使用形式循环语句使用形式6.3Do.Loop循环结构循环结构6.3Do.Loop循环结构循环结构例例:计算阶乘计算阶乘n!的值(!的值(n的值由文本框输入)。的值由文本框输入)。PrivateSubCommand1_Click()DimiAsInteger,nAsIntegerDimaAsLongn=Text1.Text得到输入的值得到输入的值na=1必须为变量必须为变量a赋初值赋初值1DoUntili=ni=i+1每次循环,变量每次循环,变量i都增加都增加1a=a*i每次循环,变量每次循环,变量a都乘以变量都乘以变量i的值的值LoopText
10、2.Text=a计算完毕,变量计算完毕,变量a的值即为所求的值即为所求EndSub后测型后测型:Do语句块语句块ExitDo语句块语句块LoopUntil6.3Do.Loop循环结构循环结构例例:使用级数求使用级数求的值。的值。根据下式,计算圆周率根据下式,计算圆周率的近似值,当计算到绝对值小于的近似值,当计算到绝对值小于0.0001的通项时,认为满足精度要求,停止计算。的通项时,认为满足精度要求,停止计算。/4=1-1/3+1/5-1/7+(-1)n+11/2n-1+6.3Do.Loop循环结构循环结构PrivateSubcmdPi_Click()DimaAsSingle变量变量a保存通项之
11、和保存通项之和DimmAsSingle变量变量m保存通项的绝对值保存通项的绝对值DimsAsInteger变量变量s产生通项的符号产生通项的符号DimiAsInteger变量变量i产生通项的分母产生通项的分母s=1第一项符号为正第一项符号为正i=1第一项为第一项为1Do开始循环开始循环m=1/i计算通项的绝对值计算通项的绝对值a=a+s*m总和加上一个通项总和加上一个通项i=i+2产生下一个通项分母产生下一个通项分母s=-s轮流转换通项的正负号轮流转换通项的正负号LoopUntilm0.0001测试是否满足精度要求测试是否满足精度要求Text1.Text=a*4输出计算结果输出计算结果EndS
12、ub6.3Do.Loop循环结构循环结构6.3Do.Loop循环结构循环结构Do语句块语句块ExitDo语句块语句块LoopPrivateSubCommand1_Click()DimiAsInteger,nAsIntegerDimaAsLongn=val(Text1.Text)a=1Doi=i+1a=a*iIfi=nThenExitDoLoopText2.Text=aEndSub例例6.5:计算计算n!本节小结:本节小结:(1 1)当当使使用用WhileWhile 构构成成循循环环时时,当当条条件件为为“真真”,则则反复执行循环体,当条件为反复执行循环体,当条件为“假假”,则退出循环。,则退出
13、循环。(2)当当使使用用Until构构成成循循环环时时,当当条条件件为为“假假”,则则反反复执行循环体,直到条件成立,即为复执行循环体,直到条件成立,即为“真真”时,则退出循环。时,则退出循环。(3 3)在在循循环环体体内内一一般般应应有有一一个个专专门门用用来来改改变变条条件件表表达达式式中中变变量量的的语语句句,以以使使随随着着循循环环的的执执行行,条条件件趋趋于于不不成成立立(或或成成立立),最后达到退出循环。,最后达到退出循环。(4)语句)语句ExitDo的作用是退出它所在的循环结构,它只能的作用是退出它所在的循环结构,它只能用在用在DO/Loop结构中,并且常常是同选择结构一起出现在
14、循环结构中,并且常常是同选择结构一起出现在循环结构中,用来实现当满足某一条件时提前退出循环。结构中,用来实现当满足某一条件时提前退出循环。6.3Do.Loop循环结构循环结构 思考思考:将一个十进制数转换成二进制。将一个十进制数转换成二进制。算法流程图算法流程图6.3Do.Loop循环结构循环结构 用用Do.LoopDo.Loop循环的五种形式分别完成循环的五种形式分别完成 将一个十进制数转换成二进制。将一个十进制数转换成二进制。算法流程图算法流程图6.3Do.Loop循环结构循环结构分析分析:将一个十进制数转换成二进制采用连除将一个十进制数转换成二进制采用连除2 2取余数的方法,即将十进制数
15、除以取余数的方法,即将十进制数除以2取余数,直取余数,直到商为到商为0,然后所得的余数即为二进制数各位的,然后所得的余数即为二进制数各位的数码,从右到左排列,第一次除数码,从右到左排列,第一次除2的余数在最右的余数在最右边。算法设计如下:用变量边。算法设计如下:用变量Dec表示十进制数,表示十进制数,BinBin表示转换所得的二进制数字符串。表示转换所得的二进制数字符串。(1)输入十进制输入十进制Dec(2)Dec除除以以2 2得得余余数数R Res,商商又又赋赋值值给给Dec;让让Bin=Res&BinBin=Res&Bin(3)若若DecDec=0,则算法结束;否则执行(,则算法结束;否则
16、执行(2)将一个十进制数转换成二进制的程序如下将一个十进制数转换成二进制的程序如下:Private Sub Form_Click()Dim Dec As Integer 表示十进制数表示十进制数 Dim Bin As String 转换为二进制表示转换为二进制表示 Dim Res As Integer Dec=Val(InputBox(输入一个十进制数输入一个十进制数Dec=?)Print 十进制数:十进制数:;Dec Do Res=Dec Mod 2 求出除以求出除以2的余数的余数 Bin=Res&Bin Dec=Dec 2 Loop Until Dec=0 Print 转换为二进制数为:转
17、换为二进制数为:;BinEnd SubEnd Sub 6.3Do.Loop循环结构循环结构6.4.1WhileWend语句语句使用格式如下:使用格式如下:WhileWend说说明明:该该语语句句的的功功能能与与DoWhile.Loop实实现现的的循环完全相同。循环完全相同。6.4WhileWend语句语句6.5.1循环的嵌套循环的嵌套多重循环结构多重循环结构如果在一个循环内完整地包含另一个循环结构,则称如果在一个循环内完整地包含另一个循环结构,则称为多重循环,或循环嵌套,嵌套的层数可以根据需要而定,为多重循环,或循环嵌套,嵌套的层数可以根据需要而定,嵌套一层称为二重循环,嵌套二层称为三重循环。
18、嵌套一层称为二重循环,嵌套二层称为三重循环。上上面面介介绍绍的的几几种种循循环环控控制制结结构构可可以以相相互互嵌嵌套套,下下面面是是几种常见的二重嵌套形式:几种常见的二重嵌套形式:6.5嵌套结构嵌套结构(1)ForI=.ForJ=.NextJ.NextI(2)ForI=.DoWhile/Until.Loop.NextI(3)DoWhile.ForJ=.NextJ.Loop(4)DoWhile/Until.DoWhile/Until.Loop.Loop6.5嵌套结构嵌套结构Fori=1To10Forj=1To20NextjNextiFori=1To10NextiFori=1To10Nexti对
19、于循环的嵌套,要注意以下事项:对于循环的嵌套,要注意以下事项:(1)内循环变量与外循环变量不能同名;内循环变量与外循环变量不能同名;(2)外循环必须完全包含内循环,不能交叉;外循环必须完全包含内循环,不能交叉;下面是正确的嵌套下面是正确的嵌套6.5嵌套结构嵌套结构Fori=1To10Forj=1To20NextiNextjFori=1To10Fori=1To20NextiNexti下面是不正确的嵌套下面是不正确的嵌套6.5嵌套结构嵌套结构 PrivateSubForm_Click()DimiAsInteger,jAsIntegerFori=1To3Printi=;iForj=1To3Print
20、Tab;j=;jNextNextEndSub循环嵌套的执行流程循环嵌套的执行流程:6.5嵌套结构嵌套结构6.5嵌套结构嵌套结构PrivateSubCommand1_Click()Dimx%,a%,y%Forx=1to2a=0Fory=1tox+1a=a+1NextyPrinta;NextxEndSub程序运行后程序运行后,单击命令按钮单击命令按钮,在窗体上显在窗体上显示的值是示的值是(23)6.5嵌套结构嵌套结构ExitDo和和ExitFor语句在循环嵌套时的作用语句在循环嵌套时的作用6.5嵌套结构嵌套结构例:打印九九乘法表例:打印九九乘法表.Fori=1To9Forj=1To9se=i&j&
21、=&i*jPicture1.PrintTab(j-1)*9+1);se;NextjPicture1.PrintNexti6.5嵌套结构嵌套结构6.5嵌套结构嵌套结构例例:编一程序,显示出所有的水仙花数。所谓水仙花数,编一程序,显示出所有的水仙花数。所谓水仙花数,是指一个三位数,其各位数字立方和等于该数字本身。例是指一个三位数,其各位数字立方和等于该数字本身。例如,如,153153是水仙花数,因为:是水仙花数,因为:6.5嵌套结构嵌套结构PrivateSubForm_Click()DimiAsInteger,jAsInteger,kAsIntegerDimnAsIntegerFori=1To9i
22、表示百位上的数表示百位上的数Forj=0To9j表示十位上的数表示十位上的数Fork=0To9k表示个位上的数表示个位上的数n=i*100+j*10+kIfi3+j3+k3=nThenPrintnNextkNextjNextiEndSub解法一解法一:6.5嵌套结构嵌套结构解法二解法二:PrivateSubForm_Click()DimiAsInteger,jAsInteger,kAsIntegerDimnAsIntegerForn=100To999i=n100得到百位上的数字得到百位上的数字j=n10-i*10得到十位上的数字得到十位上的数字k=nMod10得到个位上的数字得到个位上的数字I
23、fi3+j3+k3=nThenPrintnNextnEndSub6.5.2循环结构与选择结构的嵌套循环结构与选择结构的嵌套在循环结构中可以完整嵌套选择结构在循环结构中可以完整嵌套选择结构,即整个选择结构即整个选择结构都属于循环体。在选择结构中嵌套循环结构时,则要求整都属于循环体。在选择结构中嵌套循环结构时,则要求整个循环结构必须完整地嵌套在一个分支内,一个循环结构个循环结构必须完整地嵌套在一个分支内,一个循环结构不允许出现在两个或两个以上的分支内。不允许出现在两个或两个以上的分支内。6.5嵌套结构嵌套结构(1)For I=IF Then End IF Next I(6)IF Then For
24、I=End IF Next I(5)Select Case For I=Case Case Next I End Select(3)For I=IF Then Next I End IF(2)IF Then For I=Next I End IF(4)For I=Select Case Case Case End Select Next I6.5嵌套结构嵌套结构6.6强制退出循环强制退出循环6.6.1用Exit for语句强制退出For循环Exit For 语句可以使程序从For循环中退出来,转到Next语句后面的程序继续执行,而不必等到循环变量到达终值时才退出来。注意:在循环体外面,不可以使
25、用Exit For 语句,而且Exit For通常与IF语句一起使用。例:用300元买100只鸡,母鸡9元1只,小鸡1元1只,问母鸡、小鸡各应买多少只?分析:设买母鸡x只,则x的变化范围为130只,因为买的母鸡只数不可能超过30只,超过30只就不可能买到100只鸡。设小鸡为y只,则y=100-x。下面要做的工作就是求x为何值时,9x+y=300成立。6.6强制退出循环强制退出循环程序代码:Option ExplicitPrivate Sub Form_Click()Dim x as IntegerDim y as IntegerFor x=1 to 30 Y=100-x If 9*x+y=30
26、0 then Exit forNext xPrint“母鸡有”;x;”只”,”小鸡有”;y;”只”End Sub6.6强制退出循环强制退出循环6.6.2用Exit Do语句强制退出Do循环Exit Do语句可以使程序从Do循环中退出来,转到Loop语句后面的程序继续执行,而不必等到循环达到结束条件时才退出来。注意:在循环体外面,不可以使用Exit Do 语句,而且Exit Do通常与IF语句一起使用。例:用Do While循环改写上例程序,体会Exit Do语句的作用6.6强制退出循环强制退出循环程序代码:Option ExplicitPrivate Sub Form_Click()Dim x
27、 as IntegerDim y as IntegerX=1Do while xKThenPrintN;是素数是素数ElsePrintN;不是素数不是素数EndIf算法流程图算法流程图程序代码:程序代码:6.7应用举例应用举例6.7应用举例应用举例例例:将一角钱换成零钱(可以包括含将一角钱换成零钱(可以包括含1分、分、2分、分、5分中分中的任意多个面值),共有多少种换法?的任意多个面值),共有多少种换法?组成一角的零钱中,最多有组成一角的零钱中,最多有10个个1分、分、5个个2分、分、2个个5分。判分。判断所有的组合中,总和正好是一角(断所有的组合中,总和正好是一角(10分)的情况有多少次即分
28、)的情况有多少次即为所求。这类方法称为为所求。这类方法称为“穷举法穷举法”,也称为,也称为“列举法列举法”。6.7应用举例应用举例6.7应用举例应用举例PrivateSubCommand1_Click()DimiAsInteger,jAsInteger,kAsIntegerDimnAsIntegerPrint1分个数分个数,2分个数分个数,5分个数分个数Fori=0To10Forj=0To5Fork=0To2Ifi+j*2+k*5=10Thenn=n+1Printi,j,kEndIfNextNextNextPrint共有共有&n&种方法种方法EndSub几种循环语句比较几种循环语句比较本章小结本章小结