资源描述
14.2.3 循环语句循环语句l程程序序中中的的循循环环是是指指一一组组重重复复进进行行的的操操作作,周周而而复复始始地地进进行行,直直至至达达到到指指定定的的次次数数或或满满足足某某个个条条件件为为止止。如如计计算算全全班班同同学学的的平平均均成成绩绩、求求阶阶乘乘等等问问题。题。程序及程序设计的初步知识当条件判断表达式为真 循环体语句判断表达式循环体语句真假循环体语句直到判断表达式为假循环体语句判断表达式假真循环结构比较当型循环直到型循环【例5.1】计算ex,lnx。其中x=1,2,3,4,5。#include#include main()int x;float y,z;x=1;y=exp(x););z=log(x););printf(”y=%f,z=%f”,y,z);x=2;y=exp(x););z=log(x););printf(”y=%f,z=%f”,y,z);x=3;y=exp(x););z=log(x););printf(”y=%f,z=%f”,y,z);x=4;y=exp(x););z=log(x););printf(”y=%f,z=%f”,y,z);x=5;y=exp(x););z=log(x););printf(”y=%f,z=%f”,y,z);return(1);采用循环控制语句实现采用循环控制语句实现#include#include main()int x;float y,z;x=1;while (x=5)y=exp(x);z=log(x);x+;printf(“y=%f,z=%f”,y,z)循环执行的条件:循环执行的条件:(x=5)每一次循环执行每一次循环执行:计算计算y和和z 改变改变x的值的值 输出输出y和和z5while while 语句语句“当型当型”循环结构循环结构一般形式:一般形式:while(表达式)语句;/*循环体*/说明:说明:“表达式表达式”为循环条件;为循环条件;“语句语句”为循环体。为循环体。特点:特点:先判断表达式,后执行语句先判断表达式,后执行语句图6_1难点难点:如何设置表达式和循环体中的语句如何设置表达式和循环体中的语句.【例【例5.2】求】求 。数学方法数学方法lSUM=1+2+3+4+5+99+100lSUM=1+2+3+4+5+N-1+N改进方法:设两个变量:一个变量sum代表和,一个变量I代表序列中的某一个数。每一次相加的结果再放入sum中,再和下一项进行运算,表示如下:lsum=1+2+3+4+5+N-1+NsumIsumIsumIsumI8算法如下算法如下:用循环来表示算法,可以将算法表示如下:S1:读入NS2:sum=0S3:I=1S4:将sum+I 的和赋给sum,即:sum=sum+IS5:使I 的值加1,即:I=I+1S6:如果I=N,再做S4,否则,算法结束。10main()main()int i=1,sum=0;int i=1,sum=0;while(i=100)while(i=100)sum=sum+i;sum=sum+i;i+;i+;printf(%d n,sum);printf(%d n,sum);编程求解:1+2+3+100?图6_2“i1”可可否换成:否换成:“i0”11注意:注意:JJwhilewhile语句中的语句中的“表达式表达式”(即判断条件)可以(即判断条件)可以是任意的表达式,但一般为关系表达式或逻辑表是任意的表达式,但一般为关系表达式或逻辑表达式。达式。JJ循环体如果包含一个以上的语句,应该用花括弧循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。括起来,以复合语句形式出现。JJ在循环体中应有使循环趋向于结束的语句,以免在循环体中应有使循环趋向于结束的语句,以免形成死循环。形成死循环。12典型例题典型例题1.累加求和、求积(迭代算法)累加求和、求积(迭代算法)分析:这一类题型分析:这一类题型是求一数列是求一数列的和(积)。的和(积)。在处理此类问题时在处理此类问题时,通常采用的方法是通常采用的方法是:用一个变量存放累加和用一个变量存放累加和(积积),从从0(1)开始开始.第二个变量代表加数第二个变量代表加数(或乘数或乘数),每次按每次按一定一定的规律的规律进行变换进行变换.第三个变量控制循环第三个变量控制循环.从一个初始值从一个初始值(一般从一般从1开始开始),每做一次循环每做一次循环,其值改变其值改变,然后判断表达然后判断表达式的值式的值,最终跳出循环最终跳出循环.【例【例5.3】输入】输入10个数个数,求和求和【例5.3】输入10个数,求和算法分析算法分析:sum:存放累加和.(初值为0)x:加数i:控制循环.(初值为1)sum=0 i=1i=10得到加数 计算sum改变i01sum=0 i=1i=10scanf(“%f”,x)sum=sum+xi+01sum x1 x2 x3 x4 x10 1:sum2:sum3:sum10:sum设置表达式设置表达式:i=10设置循环体设置循环体:得到第得到第 i个数(加数)个数(加数)计算计算sum 改变循环变量改变循环变量i#include include“stdio.hstdio.h”main()float x,sum;int i;sum=0;i=1;/*对对sum和和i赋初值赋初值*/While (i=10)/*循环取决于循环取决于i的值的值*/scanf(“%f”,&x);sum=sum+x;i+;printf(”sum=%f”,sum););算法描述如下:算法描述如下:/*此时加数为一个输入量此时加数为一个输入量循环体每执行一次则执行循环体每执行一次则执行一次输入语句,即读入一一次输入语句,即读入一个数个数*/加数的变化规律:后一项=前一项+1(即增量为1)循环变量的规律:每做一次循环,则增1.因此可用一个变量i来代表加数和循环变量.设置表达式:isum改变加数改变循环变量(i+);sum=0 i=1i=100sum=sum+ii+01【例【例5.4】求求 1+2+3+4+1+2+3+4+100 +100 的和的和源程序如下源程序如下:#include“stdio.h”main()inti,sum=0;/*累加求和从0开始*/i=1;/*i既是加数,又是循环变量*/while(i=100)/*循环执行的条件是i=100*/sum=sum+i;i+;/*改变i*/printf(“%d”,sum);可能是有规律可寻的,比方说存在通项公式:可能是有规律可寻的,比方说存在通项公式:a(I)=f(I);a(I)=f(I);或递推公式或递推公式:a(I)=f(a(i-1),I)a(I)=f(a(i-1),I)算法可描述为算法可描述为:s=0;n=1;s=0;n=1;While (n=100)While (n=100)s=s+s=s+通项通项(某一项);某一项);/*/*这时通项需要通过计算这时通项需要通过计算*/*/n+n+;每次从变量的一个旧值推出新值(即迭代算法)。每次从变量的一个旧值推出新值(即迭代算法)。main()int i,sum=0;i=1;/*i 既是通项既是通项,又是循环变量又是循环变量*/while(i=99)/*循环执行的条件是循环执行的条件是i=99*/sum=sum+i;i=i+2;printf(“%d”,sum);【例【例5.5】求】求1+3+5+7+9+99难点难点:1)找出通项公式找出通项公式,即找出加数的变化规律为即找出加数的变化规律为:后一项后一项=前一项前一项+2;2)循环如何控制循环如何控制:每一次增加每一次增加2.思考思考:如果数列是如果数列是:1+1.1+1.2+1.3+1.4+1.5+2.019典型例题1.累加求和、求积(迭代算法)【例5.6】计算n!,其中n由键盘输入。输入fac=1 i=1i=nfac=fac*ii+01分析如下:分析如下:fac:存放累加乘积存放累加乘积.i:乘数乘数,又控制循环又控制循环.设置循环表达式设置循环表达式:ifac 改变乘数改变乘数 改变循环变量改变循环变量 (i+);源程序如下源程序如下:注注意意:这这里里,尽尽管管n n和和n!n!是是整整数数,但但当当n n较较大大时时,n!n!可可能能超超过过整整型型数数范范围围。所所以以将将变变量量facfac定定义义为实型为实型。算法为:。算法为:main()float fac;int i,n;scanf(“%f”,&n);fac=1=1;i=2;i=2;While (i=n)fac=fac*i;i+;i+;printf(“fac=%8.0f”,fac);思考:如何求思考:如何求S=1!+2!+3!+n!(这是一个累加问题,通项a(n)=n!=n*a(n-1)21【例【例5.75.7】求】求2 2n n。main()int i=1,n;long int p=1;scanf(%d,&n);while(i=n)p*=2;i+;printf(%dn,p);图5_3分析;分析;输入:输入:n输出:输出:P(表示表示n!)!)典型例题2.菲波拉契数列问题【例5.8】:求菲波拉契数列a0,a1a20分析:该数列的规律是:a0=0,a1=1,a2=1,a3=2,a4=3 an=an2+an1 即:a2=a0+a1;a3=a1+a2;a4=a2+a3;a20=a18+a19 难点:如何设置循环体:难点:如何设置循环体:an=an2+an1 考虑考虑an、an2、an1如何变换:如何变换:a3a2a3a4a2a1a0:代表前一个数a1:代表后一个数a2:代表需要计算的数每计算一次a2则a1 a0a2 a1 a2=a0+a1;a0=a1;a1=a2;a2=a0+a1;(a3=a1+a2;)(a4=a2+a3;)a0=a1;a1=a2;a2=a0+a1;用用a2代表所求的某一项,代表所求的某一项,a0、a1代表该项的代表该项的前两项,每求一次前两项,每求一次a2,将将a1、a2作为下一次作为下一次的的a0和和a1。算法描述算法描述:分析分析:1)序列中的前两项已知序列中的前两项已知,可直可直接输出接输出,需要计算的是需要计算的是a2,a3a20共19项.且通项公式为:每一项=前两项之和 2)设置循环表达式:i=193)设置循环体:计算a2;求a0,a1;输出a2;改变循环变量(i+);输出a0、a1i=19计算a2,a0,a1输出a2,i+01 源程序如下:#include “stdio.h”void main()float a0,a1,a2;int i=1;a0=0;a1=1;printf(“%10.0f,%10.0fd”,a0,a1);/*循环外给循环外给a0,a1赋初值,并输出这两个值赋初值,并输出这两个值*/while (i=19)/*从a2开始进入循环,到a20结束*/a2=a0+a1;/*计算公式*/a0=a1;a1=a2;i+;printf(“%10.0f”,a2)/*输出a2*/*这两个语句顺序不能这两个语句顺序不能颠倒,下标不能错颠倒,下标不能错*/典型例题2.菲波拉契数列问题【例5.9】:输出菲波拉契数列前21项,并求和。分析:在求和之前,应先求出通项的值,并输出.#include“stdio.h”main()float s,a0,a1,a2;int i=0;a0=0;a1=1;printf(“%10.f,%10.0f”,a0,a1);s=a0+a1;/*累累加加单单元元先先求求前前两两项项的的和和*/While (i=0时时.因此因此,循环表达式为循环表达式为 while (x=0)2)设置循环体设置循环体:每得到一个新的数每得到一个新的数x,就将它和就将它和max比较比较,如果如果(xmax),就执就执行行max=x,否则比较否则比较x和和min,如果如果(xmax)max=x;else if (x=0)/*当当x非负,执行循环体非负,执行循环体*/scanf(%f,&x);if (xmax)max=x;else if(x0 xmax10max=xX=a&c=A&c=0&ch=a&c=A&c=0&c=a&c=A&c=0&ch=9)s2+=1;ch=getchar();/*scanf(“%c”,&C);*/【例5.12】:输入某班学生的成绩,以负数结束,输出各分数段的人数。score:成绩成绩 S1:存放存放90分以上人数分以上人数 S2:存放存放8089分人数分人数 S3:存放存放7079分人数分人数 S4:存放存放6069分人数分人数 S5:存放存放60分以下的人数分以下的人数 循环终止条件为循环终止条件为score=0.设置循环体设置循环体:每次得到一个新的成绩每次得到一个新的成绩score,然后判断它在哪个分然后判断它在哪个分数段数段,将它所在的分数段对应将它所在的分数段对应的计数变量增的计数变量增1.如如score=89,则则s2=s2+1;#include“stdio.h”main()floatscore;ints1=s2=s3=s4=s5=0;scanf(“%f”,&score);while(score=0)if(score=90)s1=s1+1;elseif(score=80)s2+=1;elseif(score=70)s3+;elseif(score=60)s4+;elses5+;printf(“%8.1f,%8.1f,%8.1f,%8.1f,%8.1f”,s1,s2,s3,s4,s5);scanf(“%f”,&score);67 78 91 55 60 -77scorescore=67 s4=1score=78 s3=1score=91 s1=1score=55 s5=1score=60 s4=2score=-77 跳出循环34while 语句l在while循环体内也允许空语句。例如:while(c=getchar()!=X0D);/*这个循环直到键入回车为止 */l可以有多层循环嵌套。l语句可以是复合语句,此时必须用“”和“”括起来例:有如下程序,该程序段的输出结果是main()int n=8;while(n6)n-;printf(“%d”,n);WHILE 语句中的条件表达式:语句中的条件表达式:(n6)1)n-;即即n=7,输出输出 72)n-;即即n=6,输出输出 6(n6)条件不满足,结束循环条件不满足,结束循环7 6 例例:若输入字符串:若输入字符串:ENGLISHENGLISH,则以下则以下whilewhile循环体将执行循环体将执行 _ _ 次。次。While(ch=getchar()=S)printf(“*”);循环体执行的条件:循环体执行的条件:(ch=getchar())=S输入为:输入为:ENGLISH则则ch=E因此条件不满足,结束循环因此条件不满足,结束循环0do-while 语句_“直到型”循环结构一.格式(直到型)do 语句while(表达式);二二.执行过程执行过程 系统首先执行循环体,再判断表达式的值,若值为“真”,则继续执行循环体;否则跳出循环体,执行后续语句。它的特点是“先执行,后判断先执行,后判断”。至少要执行一次循环语句至少要执行一次循环语句循环体循环体表达式表达式0140三.典型例题【例5.13】:求 1+2+3+4+100 的和main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100)printf(“%d”,sum);sum=0 i=1i=100sum=sum+ii+10例例:假假定定a a和和b b为为intint型型变变量量,则则执执行行以以下下语语句句后后b b的值为的值为a=1;b=20;a=1;b=20;do b-=a;a+;while(b-0);do b-=a;a+;while(b-0);Do-while循环的特点:循环的特点:先执行后判断。先执行后判断。循环体是:循环体是:b-=a;a+;b-=a;a+;得到得到b=b-a=19b=b-a=19;a=2a=2;(b-0)(b-0)先判断先判断(b0)b0)之后再执行之后再执行b-b-18【例【例5.14】#include main()char c;do c=getchar();if(c=A&c=Z)c+=32;putchar(c);while(c!=n);将键盘输入将键盘输入字符中所有字符中所有大写字母转大写字母转换为小写字换为小写字母,其他字母,其他字符不变。符不变。比较 while语句与do-while语句1.do-while语句循环体至少执行一次2.都是在表达式值为真时执行循环体,为假时结束。3.do,while必须成对出现。do与while之间的语句组成循环体,可以是一句,也可以是多句。可以嵌套其它循环语句。循环体循环体表达式表达式100表达式表达式循环体循环体1for 语句一.格式for(;)语句;初始化是一个赋值语句,它用来给循环控制变量赋初值;条件表达式是一个关系表达式,它决定什么时候退出循环;增量定义循环控制变量每循环一次后按什么方式变化。【例】【例】for(i=1;i=5;i-)printf(“%d”,i);执行此语句将输出:执行此语句将输出:9 8 7 6 5FOR 语句s1.求解表达式1s2.求解表达式2,值为“真”,执行循环 体;值为“假”,跳出循环执行下一条语句s3.执行内嵌语句(循环语句)s4.求解表达式3;返回s2s5.执行语句下面的一条语句 注意注意 应用FOR语句时:循环体被执行的次数(N)应是已知的。求解表达式求解表达式1循环体循环体表达式表达式210求解表达式求解表达式3二二.循环执行过程循环执行过程50【例【例5.15】求】求 。(改【例。(改【例5.4】)】)main()int i,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(%d n,sum);52FOR 语句 注意注意注意注意 lfor循环中语句可以为语句体,但要用“”和“”将参加循环的语句括起来。lfor循环中的“初始化”、“条件表达式”和“增量”都是选择项,即可以缺省,但“;”不能缺省。53FOR 语句1)省略了表达式1(初始化),表示不对循环控制变量赋初值。例:for(;i=100;i+)sum=sum+i;可在循环开始之前初始化变量:i=1;for(;i=100;i+)sum=sum+i;54FOR 语句2)省略了表达式 2(条件表达式),则不做其它处理时便成为死循环。例:for(i=1;i+)sum=sum+i;/*成为死循环*/55FOR 语句3)省略了表达式3(增量),则不对循环控制变量进行操作。例:for(i=1;i=100;)sum=sum+i;可在循环体中控制循环变量:for(i=1;i=100;)sum=sum+i;i+;56FOR 语句4)可以省略表达式1和表达式3,即只有循环条件。例:for(;i=100;)sum=sum+i;i+;相当于 while(i=100)sum=sum+i;i+;57FOR 语句5)省略了表达式 1,2,3,则不做其它处理时便成为死循环。例:for(;)语句 /*成为死循环*/58FOR 语句6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其它表达式。例:例:for(sum=0,i=1;i=100;i+)sum=sum+i;for(i=0,j=100;ij;i+,j-)k=k+i+j;【例【例5.16】求调和级数求调和级数1+1/2+1/3+1+1/2+1/3+1/+1/n n 前前n n项的和。项的和。分析:分析:输入项输入项 n,输出项输出项 sum。调和级数的通项公式为调和级数的通项公式为1/n一级算法:一级算法:1.输入输入n,sum置置0;2.计算和计算和sum;3.输出输出sum二级求精:二级求精:2-1 for(i=1;i=n;i+)sum=sum+1.0/isum=0i=1i=nsum=sum+1/i1i=i+10【例【例5.17】求两个正整数(求两个正整数(a、b)的最大公约数的最大公约数(gcd)及最小公倍数(及最小公倍数(lcm)算法分析:算法分析:l确定输入(输入两个整数确定输入(输入两个整数a和和b)、)、输出(最大公约数输出(最大公约数gcd、最小公倍最小公倍数数lcm)l确定计算方法。即如何得到最大公确定计算方法。即如何得到最大公约数和最小公倍数。约数和最小公倍数。最大公约数:即两个数的最大公因子。最大公约数:即两个数的最大公因子。最小公倍数:即能被两个数整除的最最小公倍数:即能被两个数整除的最小整数,可由两数的乘积除以最大小整数,可由两数的乘积除以最大公约数得到。公约数得到。方案一方案一l确定范围:确定范围:1=最大公约数最大公约数=两个数中的较小数两个数中的较小数(min)l算法思想:算法思想:用用1,2,3min逐个逐个去除去除a和和b,如果其中的某如果其中的某一个数能将两个数除尽,说明它是一个数能将两个数除尽,说明它是a和和b的公因子,将其保留下来。的公因子,将其保留下来。一级算法:一级算法:1输入两个数输入两个数a、b2比较两个数的大小,得到较小数比较两个数的大小,得到较小数min3FOR (j=1;j=min;j+)4如果如果a和和b均能被均能被j整除,则将整除,则将j的值暂时保留,的值暂时保留,赋值给赋值给gcd,否则做下一次循环。否则做下一次循环。5计算计算lcm=a*b/gcd6输出输出gcd、lcm。二级求精:二级求精:4-1 if (!(a%j)&(b%j=0)gcd=j;程序段如下:程序段如下:scanf(“%d,%d”,&a,&b););min=(ab)?a:b;for (j=1;j=1;j-)if (!(a%j)&(b%j=0)gcd=j;break;l用用WHILE语句实现语句实现:j=min;while (a%j|b%j)j-;gcd=j;73三种循环的比较:三种循环的比较:l l三种循环都可以用来处理同一问题,一般情况下三种循环都可以用来处理同一问题,一般情况下它们可以互相代替。它们可以互相代替。l l用用whilewhile和和do do whilewhile循环时,循环变量初始化循环时,循环变量初始化的操作在的操作在while while 和和do do while while语句前完成;语句前完成;forfor语句可以在表达式语句可以在表达式1 1中完成。中完成。74三种循环的比较三种循环的比较(续续):l lwhilewhile和和do do whilewhile循环只在循环只在whilewhile后面指定循环后面指定循环条件,且在循环体中应包含使循环趋于结束的语条件,且在循环体中应包含使循环趋于结束的语句;句;forfor循环可以在表达式循环可以在表达式3 3中包含使循环趋于结中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到束的操作,甚至可以将循环体中的操作全部放到表达式表达式3 3中,功能更强。中,功能更强。l lwhile while 和和forfor循环是先判断表达式,后执行语句;循环是先判断表达式,后执行语句;do do whilewhile循环是先执行语句后判断表达式。循环是先执行语句后判断表达式。75循环的嵌套循环的嵌套l定义:一个循环体中又包含一个完整的循环结构,称为循环的嵌套。l说明:while 循环、do while循环和 for循环都可以进行嵌套,而且可以相互嵌套。几种合法的嵌套结构:几种合法的嵌套结构:while()while()do do while();while();for(;)for(;)while()do while();for(;)while()do for(;)while();77使用循环嵌套时注意:使用循环嵌套时注意:要保证嵌套的每一层循环在逻辑上都是完整的,要保证嵌套的每一层循环在逻辑上都是完整的,避免嵌套交叉使用。避免嵌套交叉使用。要保证循环到最后有一个跳出循环的条件,否则要保证循环到最后有一个跳出循环的条件,否则会产生死循环会产生死循环(嵌套循环中检查死循环错误,相对嵌套循环中检查死循环错误,相对来说比较困难来说比较困难)。在编程时,注意循环嵌套的书写最好用在编程时,注意循环嵌套的书写最好用阶梯缩进阶梯缩进阶梯缩进阶梯缩进的形式,可使程序层次分明。的形式,可使程序层次分明。【例5.20】输出1100内所有的素数。(穷举算法)分析:素数是大于,且除了和它本身外,不能被其它任何素数是大于,且除了和它本身外,不能被其它任何整数所整除的整数。整数所整除的整数。一级算法:一级算法:for(i=2;i=100;i+)1.判判断断每每一一个个数数i是是否为素数否为素数 1-1 for(j=2;j=i1;j+)if (i%j!=0)flag=1;Else flag=0;1-2 if (flag=1)输出素数输出素数i 二级算法:二级算法:1-1.用2i-1去去除除i,考考察察是是否能除尽否能除尽,设置标识设置标识.1-2.判判断断标标识识,如如果果一一直直除除不不尽尽,输输出出I是是素素数数的的信信息息.二级求精:二级求精:对于一个数对于一个数i,如果从如果从2i-1都不能将都不能将i整除,才能说明整除,才能说明i是素数,否则是素数,否则i不是素数。不是素数。1-1 flag=1;1-2 for(j=2;j=i1;j+)if (i%j=0)flag=0;1-3 if (flag=1)输出素数输出素数i 【例5.20】输出1100内所有的素数。优化算法优化算法:为判断某数为判断某数I是否为素数,用是否为素数,用2 sqrt(i)去除该数,若全都除去除该数,若全都除不尽,则是素数不尽,则是素数。若被其中一个数除尽,则不是素数。若被其中一个数除尽,则不是素数。二级算法:二级算法:1-1.用用2sqrt(i)去去除除i,考考察察是是否否能能除除尽尽,设设置置标标识识.1-2.判判断断标标识识,如如果果一一直直除除不不尽尽,输输出出I是是素数的信息素数的信息.二级求精:二级求精:1-1 flag=1;1-2 for(j=2;j=sqrt(i);j+)if (i%j=0)flag=0;1-3 if (flag=1)输出素数输出素数i#include Void main()int I,j,flag;for(I=2;I100;I+)flag=1;for(j=2;j=sqrt(i);j+)if (i%j=0)flag=0;if (flag=1)printf(“%d is a prime number”,I);以以I=49为例为例j=2 flag=149%2=1 j=3 flag=149%3=1 j=4 flag=1.49%7=0 flag=0【例5.20】输出1100内所有的素数。【例5.20】输出1100内所有的素数。思考:如果将如果将for-for嵌套改为嵌套改为for-while嵌套,嵌套,程序如何修改?程序如何修改?For(I=2;I=100;I+);j=2;flag=1;while (j=(sqrt(i)&flag)if (i%j=0)flag=0;j=j+1;If (flag)printf(“%d is a prime number”,i);break break 语句语句无条件转移语句无条件转移语句vv一般形式:一般形式:break;vv功能:功能:v用在用在switchswitch语句中使流程跳出语句中使流程跳出switchswitch结构,继续执行结构,继续执行switchswitch语句语句后面的语句。后面的语句。v用在循环体内,迫使所在循环立即用在循环体内,迫使所在循环立即终止终止(跳出当前循环体跳出当前循环体),继续执行,继续执行循环体后面的第一条语句。循环体后面的第一条语句。vv说明:说明:该语句仅能用于switch语句和循环语句。【例5.20】输出1100内所有的素数。优化算法优化算法:为判断某数为判断某数I是否为素数,用是否为素数,用2 sqrt(i)去除该数,若全都除去除该数,若全都除不尽,则是素数不尽,则是素数。若被其中一个数除尽,则不是素数,不再对此数若被其中一个数除尽,则不是素数,不再对此数继续判断。继续判断。一级算法:一级算法:for(i=2;i=100;i+)1.2sqrt(i)去去除除i,考考察察是否能除尽是否能除尽 2.if 除不尽除不尽 输出素数输出素数 i 二级求精:二级求精:1-1 flag=1;1-2 for(j=2;j=sqrt(i);j+)if (i%j=0)flag=0;break;Main()int i,j,flag;For (i=2;i=100;i+)j=2,flag=1;for (;j=sqrt(i);j+)if i%j=0 flag=0;break;if flag printf(“%d is a prime number”,i);i=100j=2,flag=1j=sqrt(i)i%j=0flag=0101100例:例:I=16进入外循环,进入外循环,j=2,flag=1进入内循环,经过进入内循环,经过1次次内循环内循环,flag=0,内循环结束,内循环结束,没有输出没有输出 flag输出i例:例:I=17进入外循环,进入外循环,j=2,flag=1进入内循环,经过进入内循环,经过3次次内循环内循环flag=1,内循环结束,内循环结束,输出输出17 is a prime number continuecontinue语句语句无条件转移语句无条件转移语句无条件转移语句无条件转移语句一般形式:一般形式:continue;功能:功能:结束本次循环结束本次循环(跳过循环体中尚未执行的语句跳过循环体中尚未执行的语句),接着进行是否执行下一次循环的判定。,接着进行是否执行下一次循环的判定。continue和break的区别:continue只结束本次循环,而非终止整个循环。break则是结束所在循环,不再进行条件判断。例设例设x x和和y y均为均为intint型变量型变量,则则y y值为值为 for(y=1,x=1;y=10)break;if(x=10)break;if(x%2)if(x%2)x+=5;continue;x+=5;continue;x-=3;x-=3;If (x%2=1)1)x=1;x%2=1;x=x+5=6,结束本次循环,结束本次循环,Y=1+1=22)(6%2=1)条件不满足,执行条件不满足,执行X=X-3=6-3=3,Y=2+1=33)(3%2=1)条件满足,则条件满足,则X=X+5=8;结束本次循环,结束本次循环,Y=3+1=4;4)(8%2=1)不满足,则不满足,则X=X-3=5;Y=4+1=5;5)(5%2=1)满足,则满足,则X=X+5=10;Y=5+1=6;6)(X=10)条件满足,执行条件满足,执行break;结束循环。结束循环。6【例5.25】输出如下图形:*#include include Void main()Void main()int i,j,n;int i,j,n;scanf(scanf(“%d%d”,&n);,&n);for(i=1;i=n;i+)for(i=1;i=n;i+)for(j=1;for(j=1;j=2*i-1j=1;i-);i=1;i-)for(j=1;for(j=1;j=2*i-1j=2*i-1;j+);j+)printf(printf(“*”);printf(“n”);102103goto goto 语句语句l一般形式:goto 语句标号;l说明:goto为无条件转向语句。语句标号必须是合法的标识符。不能用整数作标号。l用途:与if语句一起构成循环结构;从多层循环体的内层循环跳到外层循环。结构化程序设计结构化程序设计方法主张限制使用方法主张限制使用gotogoto语句,因为滥用语句,因为滥用gotogoto语句将使程序流语句将使程序流程无规律、可读性差程无规律、可读性差只有不得已只有不得已只有不得已只有不得已(如能大大提高效率如能大大提高效率如能大大提高效率如能大大提高效率)时才能使用时才能使用时才能使用时才能使用gotogotogotogoto!【例【例5.245.24】用】用ifif和和gotogoto语句构成循环,求语句构成循环,求 。main()int i=1,sum=0;loop:if(i=100)sum=sum+i;i+;goto loop;printf(Sum=%d,sum);
展开阅读全文