4.3循环结构程序设计学习重点和难点循环的概念(重点)循环的基本语句结构和流程(难点)循环在常用算法中的应用(重点)和顺序结构、选择结构一样,循环结构是结构化程序中的三种基本程序结构之一。在程序中,凡是需要重复相同或相似的操作步骤,都可以用循环结构来实现。循环结构由两部分组成:•循环体,即要重复执行的语句序列;•循环控制部分,即用于规定循环的重复条件或重复次数,同时确定循环范围的语句。要使计算机能够正常执行某循环,由循环控制部分所规定的循环次数必须是有限的,即循环体可以重复0次到若干次。引例单击窗体,要求在窗体上显示6行星号分析:要求显示的信息是每行是由16个星号所构成的字符串,所以可以通过连续6次调用窗体的Print方法实现图形的显示PrivateSubForm_Click()Print****************Print****************Print****************Print****************Print****************Print****************EndSub若要求显示10行或更多行这样的信息若打印信息的行数要求是由用户决定专门用于进行重复操作的语句结构循环结构Do-Loop循环结构当型循环(While)直到型循环(Until)While型循环结构For-Next循环结构Do…Loop循环结构有几种演变形式,但每一种都是通过判断某条件以决定循环是否继续执行。所不同的是,是先判断条件后执行循环体,还是先执行循环体后判断条件;是条件成立时执行循环(当型循环),还是条件不成立时执行循环(直到型循环)。1.Do…Loop循环语句Do循环前测试型后测试型当型(DOWHILE……LOOP)直到型(DOUNTIL……LOOP)当型(DO……LOOPWHILE)直到型(DO……LOOPUNTIL)格式一:前测式当型循环DoWhile条件循环体[ExitDo]Loop格式二:前测式直到型循环DoUntil条件循环体[ExitDo]Loop格式三:后测式当型循环Do循环体[ExitDo]LoopWhile条件格式四:后测式直到型循环Do循环体[ExitDo]LoopUntil条件Do…Loop循环结构的四种格式当型循环(While)格式1DoWhile循环条件循环体Loop格式2Do循环体LoopWhile循环条件True循环条件循环体False循环条件循环体TrueFalse直到型循环(Until)格式1DoUntil循环条件循环体Loop格式2Do循环体LoopUntil循环条件False循环条件循环体True循环条件循环体FalseTrue四种格式的区别在于条件的书写位置不同,可以写在Do语句之后,也可以写在Loop语句之后,另外,条件之前的关键字可以是While,也可以是Until。•使用While条件时,当指定的条件为True时,执行循环体中的语句组,而当条件为False时则退出循环,执行循环终止语句Loop之后的语句。•使用Until条件时,当指定的条件为False时,执行循环体中的语句组,而当条件为True时则退出循环,执行循环终止语句Loop之后的语句。使用While和使用Until的区别是:•While条件表示当条件成立时执行循环体,•Until条件则是在条件不成立时执行循环体。也可以在Do语句和Loop语句之后都没有条件判断,这时循环将无条件地重复,因此在这种情况下,在循环体内必须有强行退出循环的语句,如ExitDo语句,以保证循环在执行有限次数后退出。ExitDo语句用于退出循环体,执行Loop语句之后的语句。该语句一般放在某条件结构中,用于表示当某种条件成立时,强行退出循环例:X=9DOPRINT“**”X=X-1IFX0THENEXITDOLOOP用循环实现引例单击窗体,要求在窗体上显示6行星号分析:要求重复6次输出一行由16个星号所构成的字符串,因此,循环条件就是输出的行数6,重复执行的循环体就是Print****************PrivateSubForm_Click()DimiAsInteger'定义计数器变量i来记录目前已输出的行数i=0DoWhilei6'当输出行数未达到6行,反复执行下面语句Print****************i=i+1'每输出一行信息,计数器i累加1Loop'返回到DoWhile行EndSub练习:用其他几种DO…LOOP语句改写程序用循环实现引例单击窗体,要求在窗体上显示n行星号分析:要求输出的16个星号的行数由用户决定——InputBoxPrivateSubForm_Click()…n=Val(InputBox(请输入行数:))'接收用户输入的行数i=0DoWhilein'当输出行数没有达到n行,就反复输出Print****************i=i+1'每输出一行信息,计数器i累加1Loop'返回到DoWhile行EndSub例4-10求1+2+3+…+n3000的最小n值。2、While型循环控制语句格式While循环条件循环体Wend这种结构使用完全类似于Do-Loop的当型循环(格式1),表示当循环条件为True时,反复执行循环体,直到循环条件为False为止一般,现在常用Do-Loop结构化与适应性更强的当型循环格式替换这种格式3、For-Next循环结构语句格式For循环控制变量=初值To终值[Step步长]循环体Next[循环控制变量]循环控制变量也称为“循环变量”、“控制变量”或“循环计数器”,它必须为数值型变量。初值、终值和步长也必须是数值表达式。其中步长是指每次循环变量的增量,一般当初值终值时,步长应取正数,而当初值终值,则步长应取负值。仅当步长为1时,Step步长可以省略在已知循环要执行多少次时,最好使用For…Next循环。在For…Next循环中使用一个起计数器作用的循环变量,每重复一次循环之后,循环变量的值就会按一定的步长增加或者减少,直到超过某规定的终值时退出循环。For语句和Next语句之间的循环体,可以由多条语句构成Next表示循环控制变量取下一个值,即首先完成循环变量的递增操作,即循环变量=循环变量+步长,然后类似于Do-Loop循环中的Loop,再返回至For语句行循环次数的一般计算公式:Int((终值-初值)/步长)+1事先已知循环次数,则可使用For-Next循环结构语句——计数循环For-Next循环结构语句的执行流程图计算初值、终值和步长表达式的值循环变量=初值表达式的值循环体循环变量=循环变量+步长循环变量超过终值?TrueFalseForI=2to18step3c=c+1printI,cNextIprintI,c上述For的循环次数第几次循环I12253841151461720c=18ForI=2tocstep3c=c+1NextI上述代码段中虽然变量c在循环体内改变,但根据For循环执行流程,循环控制变量I的终值依旧为18,并未改变,因此循环次数=6第几次循环cI1225384115146172019202122232424当循环变量在循环体内被重新赋值,则会影响和改变循环次数c=18ForI=2to18step3c=c+1I=I+2NextI上面循环体中,循环控制变量I被改变,所以此时会影响循环次数,循环次数=4第几次循环cI1224394141919202122227121722用For循环实现引例For循环实现:单击窗体,要求在窗体上显示6行星号PrivateSubForm_Click()DimIAsInteger'定义一个循环变量I来控制输出的行数'当输出行数没有超过6行,就反复执行下面的语句ForI=1To6'步长为1,可省略Step1Print****************NextI'完成I根据步长完成递增,即I=I+1,并返回到For行EndSub例题求1+2+3…+n的值分析:求多项数据之和,首先得设置一个累加器sum,存放累加结果。根据一般人们求和的步骤,多个数据累加的过程如下:sum0=0sum1=sum0+1sum2=sum1+2sum3=sum2+3………………sumn=sumn-1+n归纳:求多项数据之和,整个累加过程一直在重复执行sum=sum+i,一共重复n次,其中累加项i的变化规律为:i=i+1,i的初值为1,终值为n,即当i的值超过n结束累加操作求1+2+3…+n程序代码设计:循环体是sum=sum+i,而累加项i的变化恰好与累加次数一致,所以可以利用累加项i来控制循环次数,即将i兼用做循环变量,初值为1,终值为n,步长为1PrivateSubForm_Click()DimsumAsInteger,iAsIntegern=Val(InputBox(请输入累加的终值n:))sum=0'累加器清零Fori=1Tonsum=sum+i'累加NextiPrint1+...+;n;=;sumEndSub求1~n之间所有的偶数之和例题求1!+2!+3!…+10!的值。(书80页例4-13)分析:S存放累加结果,t存放每项值1!=1S=1!2!=1!*2S=S+2!3!=2!*3S=S+3!4!=3!*4S=S+4!…………t=t*nS=S+t4、循环嵌套无论是Do-Loop循环,还是For-Next循环,都可以在大循环中套小循环,进行嵌套使用,而且允许不同类型的循环进行嵌套使用嵌套的层数没有具体限制,但必须注意:每一个循环必须有一个唯一的循环控制变量(不能同名);内层的小循环一定要完整地被包含在外层的大循环之内,而不得相互交叉,即内层循环的Next语句必须放在外层循环的Next语句之前Fori=1To9Forj=1To9Printi;*;j;=;i*j;NextjPrintNexti例题4-14打印乘法“九九表”分析:9*9的二维表,用双重循环。PrivateSubForm_Click()FontSize=12PrintTab(25);“九九表”Print*;Fori=1To9PrintTab(i*6);i;NextIPrintForj=1To9Printj;Fork=1Tojm=j*kPrintTab(k*6);m;NextkPrintNextjEndSub思考题:素数问题素数就是大家在数学中熟知的质数,即一个大于1且只能被1和它本身整除的整数输入一个正整数,判断该正整数是否为素数分析:从素数的定义出发:既然素数除了1和它本身之外,不能被任何数整除,那么就把待判断的数X依次与除了1和它本身之外的其他所有的数进行除,看是否有整除的情况;若有,表示X不是素数,否则就是素数。除数的范围i从2开始到X-1(因为一个数不可能能整除比它自身大的数),由于要对这个范围内的每一个数都进行相同的重复除操作,所以使用循环输入一个正整数,判断该正整数是否为素数Fori=2Tox-1'如果能被某个数据整除,x就不是素数,直接提前结束循环IfxModi=0ThenExitForNextiIfi=x-1Then'若i=x-1循环非正常结束,说明x不是素数MsgBoxCStr(x)&不是素数Else'如果x不能被[2,x-1]数整除,则循环正常结束,ix-1,即说明x是素数MsgBoxCStr(x)&是素数EndIf利用循环实现数字金字塔输出分析:一共要输出指定塔高n行信息。每行信息都是有规律的:先重复输出若干个空格,然后重复输出若干个对应行号的数字字符,其中输出空格的数量和数字字符的数量都是有规律的:第1行,1个数字“1”,n-1个空格;第2行,3个数字“2”,n-2个空格;依次类推,可以找到规律:第i行,先输出n-i个空格,然后输出2i-1个数字字符“i”程序代码设计设置循环变量I控制输出信息的行数(1~n),循环体就是有规律的输出一行