第5章 循环结构程序设计 (2).ppt
循环结构程序设计循环结构程序设计所谓循环结构就是根据某一条件重复地执行某些所谓循环结构就是根据某一条件重复地执行某些操作(程序段)。操作(程序段)。在在VB.NET环境中,提供了两种类型的循环语句:环境中,提供了两种类型的循环语句:(1)计数型循环语句,也称)计数型循环语句,也称For循环。循环。(2)条件型循环语句。)条件型循环语句。ForNext循环语句循环语句ForNext循环语句以循环语句以指定的次数指定的次数重复执行一组语句。重复执行一组语句。主要用在事先能计算出循主要用在事先能计算出循环次数的情况下环次数的情况下。其语法结构如下:。其语法结构如下:For循环控制变量循环控制变量=初值初值To终值终值Step步长步长ExitForNext循环控制变量循环控制变量说明:(说明:(1)循环控制变量(简称循环变量)是一个)循环控制变量(简称循环变量)是一个数值型的变量数值型的变量。(2)初值和终值分别表示循环控制变量的起始值和终止值。初值可以小于等于)初值和终值分别表示循环控制变量的起始值和终止值。初值可以小于等于终值,也可在大于等于终值。终值,也可在大于等于终值。(3)步长:表示每次循环时,循环控制变量的变化量。步长可以是正数,也可)步长:表示每次循环时,循环控制变量的变化量。步长可以是正数,也可以是负数。若省略不写,默认值为以是负数。若省略不写,默认值为1。步长不能为。步长不能为0。通过初值、终值和步长可以计算循环体的循环次数:通过初值、终值和步长可以计算循环体的循环次数:循环次数循环次数=int(终值终值-初值初值)/步长步长)+1若计算结果若计算结果1000ThenExitForEndIfEndIfNextMsgBox(和为:和为:+Str(s),求和求和)例:求例:求100到到999之间的所有之间的所有“水仙花数水仙花数”。“水仙花数水仙花数”的含的含义是一个数的每个数位的立方和等于该数。例义是一个数的每个数位的立方和等于该数。例153=13+53+33。分析:对于某一个数说,先把这分析:对于某一个数说,先把这个数拆开成单个的数字个数拆开成单个的数字,然后,然后再判断它们的立方和是否等于本身。再判断它们的立方和是否等于本身。程序如下:程序如下:Dimbw,gw,sw,iAsIntegerDimstr1AsStringstr1=Fori=100To999bw=i100sw=(iMod100)10gw=iMod10Ifbw3+sw3+gw3=iThenstr1=str1+Str(i)+vbCrLfEndIfNextMsgBox(结果为:结果为:+vbCrLf+str1,求水仙花数求水仙花数)例子例子1、从键盘输入一个字符串,分别统计字母、从键盘输入一个字符串,分别统计字母“M”和和“m”在其中出现的次数。在其中出现的次数。2、计算并输出下面级数前、计算并输出下面级数前n项项(n=40)中偶数项的中偶数项的和。和。s=1*2+2*3+3*4+4*5+n*(n+1)+3、计算并输出所有、计算并输出所有6位正整数中能被位正整数中能被6整除且其整除且其十位数不是十位数不是4的数之和,并求它们中的最大数。的数之和,并求它们中的最大数。4、编写程序,计算并输出下面数列前、编写程序,计算并输出下面数列前n项的和项的和(设设n=15,结果取结果取4位小数位小数)。数列为:数列为:2/1,3/2,5/3,8/5,13/8,21/13,While.EndWhile循环循环此循环也称此循环也称“当型循环当型循环”,表示当条件成立时,重复执,表示当条件成立时,重复执行某个动作。语法如下:行某个动作。语法如下:While语句块语句块ExitWhile语句块语句块EndWhile其中:(其中:(1)条件表达式表示循环要满足的条件。若表达)条件表达式表示循环要满足的条件。若表达式的值为式的值为True,则执行语句块。,则执行语句块。(2)语句块:即循环体。)语句块:即循环体。执行的流程如图所示。执行的流程如图所示。说明如下:说明如下:语句块Y N条件表达式例:用辗转相除法求两个数例:用辗转相除法求两个数m,n的最大公约数和最小公倍数。的最大公约数和最小公倍数。分析:辗转相除法求两个数m,n的最大公约数的思想如下:(1)求m除以n的余数r,即r=m mod n;(2)若r0,转(3);若r=0,则此时的n就是最大公约数,转(4);(3)把n的值给m,把r的值给n,即mn,nr,转(1);(4)循环结构的下一个语句。求最小公倍数的方法:两个数的乘积除以它们的最大公约数。Dimm,n,r,x,y,zAsIntegerm=TextBox1.Textn=TextBox2.Textx=m:y=n保存最初两个数的值给保存最初两个数的值给x和和y,以备求最小公倍数时使用,以备求最小公倍数时使用r=mModnWhiler0m=nn=rr=mModnEndWhilez=x*y/n求最小公倍数求最小公倍数MsgBox(最大公约数为:最大公约数为:+Str(n)+vbCrLf+最小公倍数为:最小公倍数为:+Str(z),求求最大公约和最小公倍最大公约和最小公倍)例:判断一个数例:判断一个数n是否为素数。是否为素数。分析:根据素数的定义可知:一个数除了1和它本身之外,不能被其它数整除的数就是素数。可以推断:如果只要发现了从2到n-1之间的一个整数能被n整除,则n就不是素数;否则,n就是素数。可以先假定一个标志变量Flag,其初值为True,表示假定n是素数。然后把从2到n-1之间的所有整数试一遍,只要发现某一个数能被n整除,就把标志变量Flag的值赋值为False,表示n不再是素数。循环结束后,根据Flag的值来判断n是否素数,若Flag的值为True,则n是素数;否则n不是素数。Dimn,iAsIntegerDimflagAsBooleann=InputBox(请输入一个数值请输入一个数值n:,判断素数判断素数)flag=Truei=2Whilei=0.0001s=s+1/(i*(i+1)i=i+1EndWhiles=s+1/(i*(i+1)退出循环时,小于退出循环时,小于0.0001的项没有的项没有加上去。因此,再加一次。加上去。因此,再加一次。MsgBox(结果为:结果为:+Str(s),求和求和)注意注意:1.防止出现死循环防止出现死循环2.在在While.End While循环结构中,由于是先判断循环的循环结构中,由于是先判断循环的条件,然后再决定是否执行循环体。若在第一次进入循环条件,然后再决定是否执行循环体。若在第一次进入循环结构之前,条件不成立,那么循环体一次也不执行。结构之前,条件不成立,那么循环体一次也不执行。DoLoop语句语句可分为四种可分为四种:1.DoWhileLoop循环结构循环结构语句形式如下:语句形式如下:DoWhile语句块语句块AExitdo语句块语句块BLoop这种结构也是先判断条件,然后决定是否执行这种结构也是先判断条件,然后决定是否执行循环体循环体.例:判断一个数例:判断一个数n是否为素数。是否为素数。Dimn,iAsIntegerDimflagAsBooleann=InputBox(请输入一个数值请输入一个数值n:,判断素数判断素数)flag=Truei=2DoWhilei=Sqrt(n)IfnModi=0Thenflag=FalseExitDoEndIfi=i+1LoopIfflagThenMsgBox(Str(n)+是素数是素数!,判断素数判断素数)ElseMsgBox(Str(n)+不是素数不是素数!,判断素数判断素数)EndIf2.DoLoopWhile循环结构循环结构语句形式如下:语句形式如下:Do语句块语句块AExitDo语句块语句块BLoopWhile根据语句形式的书写可以看出,此结构是先执行循根据语句形式的书写可以看出,此结构是先执行循环体,后进行条件的判断,以决定是否进行下一次循环。环体,后进行条件的判断,以决定是否进行下一次循环。也就是说,这种循环的循环体至少执行一次。也就是说,这种循环的循环体至少执行一次。例:求自然对数例:求自然对数e的近似值,要求其误差小于的近似值,要求其误差小于0.000001(即求和公式的最即求和公式的最后一项的值小于后一项的值小于0.000001),近似公式为:,近似公式为:分析:本例涉及两个重要的运算:一个是累加求和,另一个是求阶乘。分析:本例涉及两个重要的运算:一个是累加求和,另一个是求阶乘。DimiAsIntegerDimfac,sAsDoubles=1fac=1i=0Doi=i+1fac=fac*i求第求第i项分母的值,即项分母的值,即i!s=s+1/facLoopWhile1/fac=0.000001MsgBox(e的值为:的值为:+Format(s,#.#),求求e的值的值)方法一:方法一:s=1Fac=1i=1DoWhile1/fac=0.000001s=s+1/faci=i+1fac=fac*iLoop方法二:方法二:s=1Fac=1i=1Dos=s+1/faci=i+1fac=fac*iLoopWhile1/fac=0.000001请找出以上两种方法错误的原因。请找出以上两种方法错误的原因。3.DoUntilLoop循环语句循环语句语句形式如下:语句形式如下:DoUntil语句块语句块AExitdo语句块语句块BLoop此语句与此语句与DoWhileLoop语句的功能的区别仅语句的功能的区别仅仅在于:若条件表达式的值为仅在于:若条件表达式的值为False,就执行循环体;,就执行循环体;否则,退出循环。也就是说,用否则,退出循环。也就是说,用dowhile与与dountil的的条件刚好相反。条件刚好相反。4.DoLoopUntil循环语句循环语句语句形式如下:语句形式如下:Do语句块语句块AExitDo语句块语句块BUntil此语句与此语句与DoWhileLoop语句的功能的区别仅语句的功能的区别仅仅在于:若条件表达式的值为仅在于:若条件表达式的值为False,就执行下次循,就执行下次循环体;否则,退出循环。使用的条件与环体;否则,退出循环。使用的条件与DoWhileLoop刚好相反。刚好相反。例:求例:求1+2+3+100的和。的和。方法一:用方法一:用dowhileloop语句实现语句实现Dimi,sAsIntegeri=1s=0DoWhilei=100s=s+ii=i+1Loop方法二:用方法二:用doloopwhile语句实现语句实现Dimi,sAsIntegeri=1s=0Dos=s+ii=i+1LoopWhilei 100 s=s+i i=i+1 Loop 方法四:用Do Loop Until语句实现 Dim i,s As Integer i=1 s=0 Do s=s+i i=i+1 Loop Until i 100程序段一:程序段一:i=10s=0DoWhilei5s=s+ii=i+1Loop程序段程序段2:Dimi,sAsIntegeri=10s=0Dos=s+ii=i+1LoopWhilei5当第一个程序段执行结束时,当第一个程序段执行结束时,s的值为的值为0;则第二个程序段执行结束时,;则第二个程序段执行结束时,s的值为的值为10。说明:说明:(1)条件表达式在循环体前面的循环(包括)条件表达式在循环体前面的循环(包括While、DoWhile、DoUntil)的循环体有可能执行零次或者多)的循环体有可能执行零次或者多次;条件表达式在循环体后面的循环(包括次;条件表达式在循环体后面的循环(包括DoLoopWhile、DoLoopUntil)的)的循环体至少要执行一次。循环体至少要执行一次。关键字关键字Until和和While之间的区别在于条件表达式:之间的区别在于条件表达式:条件反转后就可以用另一个关键字。条件反转后就可以用另一个关键字。(2)在)在DoLoop中可以在任何位置放置任意多个中可以在任何位置放置任意多个ExitDo语句,随时跳出语句,随时跳出DoLoop循环。循环。ExitDo通常用通常用于条件判断之后,例如于条件判断之后,例如IfThen,在这种情况下,在这种情况下,ExitDo语句将控制权转移到语句将控制权转移到Loop后的语句。后的语句。循环的嵌套循环的嵌套在一个循环体内又包含了另一个循环结构的循环,在一个循环体内又包含了另一个循环结构的循环,称为循环的嵌套。前面讲的所有循环结构语句都可以称为循环的嵌套。前面讲的所有循环结构语句都可以互相包含(必须是完整的包含,而不能交叉)形成循互相包含(必须是完整的包含,而不能交叉)形成循环的嵌套。环的嵌套。例:例:fori=1to2forj=1to3msgbox(I&“&j)nextjnextI例:例:求和求和 i=1S=0DoWhilei=10求求i!赋给赋给facS=s+1/faci=i+1Loop Dim i,j As Integer Dim s,fac As Double i=1 s=0 Do While i=10 fac=1 For j=1 To i fac=fac*j Next s=s+1/fac i=i+1 Loop注:在循环嵌套的结构中,内、外层循环的循环变量不能同名。Fac=1For j=1 To i Fac=fac*jNext例:例:显示显示1000以内的所有素数(每行显示以内的所有素数(每行显示5个)。个)。Dim str1 As String Dim i,n As Integer Dim flag As Boolean i=0 str1=For n=2 To 1000 判断n是不是素数(通过flag的值来标识)。If flag Then str1=str1+n+i=i+1 If i Mod 5=0 Then str1=str1+vbCrLf End If End If Next MsgBox(str1,素数为)Dim i,j,n As Integer Dim str1 As String str1=i=0 For n=2 To 1000 For j=2 To n-1 If n Mod j=0 Then Exit For End If Next If n=j Then 若j的值超过了n-1(即=n),表示n是素数 str1=str1+Str(n)+i=i+1 If i Mod 5=0 Then str1=str1+vbCrLf End If End If Next MsgBox(str1,素数为)例:例:利用循环结构,输出如下图形。利用循环结构,输出如下图形。*分析:为了便于输出,我们把这个图形看成是由多个行字符串连接起来的字符分析:为了便于输出,我们把这个图形看成是由多个行字符串连接起来的字符串。用双重循环实现。串。用双重循环实现。(1)外层循环控制行数(循环)外层循环控制行数(循环5次,每次产生一行字符)。次,每次产生一行字符)。(2)内层循环控制每一行的字符如何产生。又分为三步:)内层循环控制每一行的字符如何产生。又分为三步:为了产生居中对齐的效果,要在每行字符前面加适当个数的空格:通过观察为了产生居中对齐的效果,要在每行字符前面加适当个数的空格:通过观察图形可知,空格数依次少一个;假定第一行图形可知,空格数依次少一个;假定第一行“*”前面的空格数有前面的空格数有10个,则每一个,则每一行前面的空格数为行前面的空格数为11-i;这可以用函数;这可以用函数space(11-i)或用循环实现:或用循环实现:str1=两个引号之间没有空格两个引号之间没有空格Fori=1To11-istr1=str1+两个引号之间有一个空格两个引号之间有一个空格Next产生若干个产生若干个“*”:个数是:个数是2*i-1,其中的,其中的i为行号。为行号。换行。换行。Dimi,jAsIntegerDimstr1AsStringstr1=Fori=1To5str1=str1+Space(11-i)Forj=1To2*i-1str1=str1+*Nextstr1=str1+vbCrLfNextMsgBox(str1,结果为:结果为:)P98 例子例子 Dim i,j As Integer Dim str1 As String str1=For i=1 To 5 str1=str1+Space(10+i)For j=1 To 11-2*i str1=str1+*Next str1=str1+vbCrLf Next MsgBox(str1,结果为:结果为:)例:编写程序,用循环生成下面的图形例:编写程序,用循环生成下面的图形(每列数字左对齐每列数字左对齐),如图所示。,如图所示。分析:与上例类似,是显示图形,不同之处在于:这个题中每行字符串的内容不分析:与上例类似,是显示图形,不同之处在于:这个题中每行字符串的内容不相同。通过分析发现:每个数字与它们所在的行、列号有一定的关系。假定行号为相同。通过分析发现:每个数字与它们所在的行、列号有一定的关系。假定行号为i,列,列号为号为j,数字为,数字为k,则,则k=(i-1)*4+j。还有一点值得注意的是:当数字超过。还有一点值得注意的是:当数字超过10时,每两个数时,每两个数字之间的空格数比小于字之间的空格数比小于10的空格数少一个。的空格数少一个。Dimi,j,kAsIntegerDimstr1AsStringstr1=Fori=1To3Forj=1To4k=(i-1)*4+jIfk=10-6MsgBox(的值为:的值为:+Format(4*s,#.#),利用求和公式利用求和公式求求的值的值)例:裴波那契数列是由计算某类动物繁殖增长量而提例:裴波那契数列是由计算某类动物繁殖增长量而提出的。数列的前两项是出的。数列的前两项是1、1,以后的每一项都是其相邻前,以后的每一项都是其相邻前两项之和。即:两项之和。即:1、1、2、3、5、8、13.。显示该数列的。显示该数列的前前20项。项。分析:在编写程序时,特别的循环程序,要找出循环分析:在编写程序时,特别的循环程序,要找出循环的规律。通过对数列的观察,可以发现:假定最实初的两的规律。通过对数列的观察,可以发现:假定最实初的两个值个值1,分别赋值给,分别赋值给a和和b,通过,通过a+b求求c;为了求下一个数据,;为了求下一个数据,可以把刚才可以把刚才b的值赋给的值赋给a,把,把c的值赋给的值赋给b,再通过求,再通过求a+b得出得出新的新的c来。来。Dim a,b,c,i As Integer Dim str1 As String a=1:b=1 str1=a&b For i=3 To 20 c=a+b str1=str1&c a=b b=c Next MsgBox(str1,结果为:结果为:)例:百鸡问题:假定公鸡每只例:百鸡问题:假定公鸡每只2元,母鸡每只元,母鸡每只3元,小鸡元,小鸡每元钱每元钱3只。请问用只。请问用100元钱买元钱买100只鸡,有多少种买法?只鸡,有多少种买法?分析:根据题意,可列出方程:分析:根据题意,可列出方程:x+y+z=1002*x+3*y+z/3=100其中的其中的x、y、z分别表示公鸡、母鸡和小鸡的只数,且只分别表示公鸡、母鸡和小鸡的只数,且只能是整数。能是整数。由于有由于有3个未知数,两个方程,解不唯一。因此要充分利个未知数,两个方程,解不唯一。因此要充分利用计算机的循环特长,把全部的组合挨个试一遍,找出符合条用计算机的循环特长,把全部的组合挨个试一遍,找出符合条件的解。这种方法叫件的解。这种方法叫“穷举法穷举法”或或“枚举法枚举法”。通过分析可知,公鸡的只数在通过分析可知,公鸡的只数在050之间,母鸡的只数在之间,母鸡的只数在033之间,小鸡的只数在之间,小鸡的只数在0100之间,那么可以利用三重循之间,那么可以利用三重循环,把这些组合全部测试一遍。环,把这些组合全部测试一遍。Dimx,y,zAsIntegerDimstr1AsStringstr1=Forx=0To50Fory=0To33Forz=0To100Ifx+y+z=100And6*x+9*y+z=300Thenstr1=str1+Str(x)+Str(y)+Str(z)+Chr(13)+Chr(10)EndIfNextNextNextMsgBox(所有的买法如下:所有的买法如下:+vbCrLf+str1,百鸡问题百鸡问题)最内层的语句循环的次数为:最内层的语句循环的次数为:50*33*100=165000次,次,算法的改进:由于公鸡和母鸡的只数(算法的改进:由于公鸡和母鸡的只数(x、y)已确定,那么)已确定,那么z的值肯定是的值肯定是100-x-y,否则,第一个方程不成立。所此,可以把第,否则,第一个方程不成立。所此,可以把第三层循环去掉,变成两重循环。三层循环去掉,变成两重循环。两重循环的程序如下两重循环的程序如下(为了省略篇幅,只写出了循环部分为了省略篇幅,只写出了循环部分):Forx=0To50Fory=0To33z=100-x-yIf6*x+9*y+z=300Thenstr1=str1+Str(x)+Str(y)+Str(z)+vbCrLfEndIfNextNext这个程序最内层语句的循环次数为:这个程序最内层语句的循环次数为:50*33=1650次,效率明次,效率明显提高显提高例:打印九九乘法表(运行的结果如图所示)。例:打印九九乘法表(运行的结果如图所示)。Dim i,j,c As Integer Dim str1 As String str1=For i=1 To 9 For j=1 To i c=i*j If c=9 Then str1=str1&i&*&j&=&c&Else str1=str1&i&*&j&=&c&End If Next str1=str1&vbCrLf Next MsgBox(str1,结果为:结果为:)