您好,欢迎访问三七文档
第六章循环控制6.1概述循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本程序构造单元。同时,循环结构也是等级考试的一个重点。循环结构主要有:(1)用goto语句和if语句构成循环;(2)用while语句;(3)用do-while语句;(4)用for语句。6.2goto语句以及用goto语句构成循环goto语句为无条件转向语句,它的一般形式为:goto语句标号;(1)语句标号由字母、数字和下划线组成,其第一个字符必须为字母或下划线,不能用整数来做标号;(2)goto语句通常有两种使用方法:1.与if语句一起构成循环结构;2.从循环体中跳转到循环体外;(3)goto语句的使用不符合结构化程序的原则,一般尽量不使用,除非不得已时;例6.1用if语句和goto语句构成循环,求main(){inti,sum=0;i=1;loop:if(i=100){sum=sum+i;i++;gotoloop;}printf(“%d”,sum);}1001nn6.3while语句•一般形式:while(表达式)语句•功能:当表达式为非0值时,执行while语句中的内嵌语句。•特点:先判断表达式,后执行语句。•流程图:表达式语句非00例6.2求main(){inti,sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(“%d”,sum);}1001nn说明:1)循环体中如果包含一个以上的语句,应该用花括号括起来;2)在循环体中应有使循环趋于结束的语句,避免进入死循环;在本例中,设置循环条件为i100,然后语句中有出i++,这样就不会出现死循环。6.4do-while语句•一般形式:do循环体语句while(表达式);•特点:先执行循环体,然后判断条件是否成立,成立继续执行,否则退出循环;•流程图:循环体语句表达式非00例6.3用do-while语句求main(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i=100);printf(“%d”,sum);}1001nnwhile语句与do-while语句之间的区别和相同点1)对同一问题可以用while语句处理,也可以用do-while语句处理。do-while语句结构可以转换成while结构,可以认为do-while结构是由一个语句加一个while结构构成;2)在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分一样,它们的结果也一样。但是对于while后面的表达式一开始就为0值,两种循环的结果不同;产生这样的原因是:对于while语句,当while后面的表达式一开始为0值,则将马上退出循环,一次也不执行语句;而do-while语句无论其while后面的表达式一开始是否为真假,都将至少执行一次语句;6.5for语句•for语句的一般形式为:for(表达式1;表达式2;表达式3)语句•执行过程及流程图:(1)先求解表达式1;(2)求解表达式2,若其值为真,则执行for语句中指定的内嵌语句,然后执行第(3)步。若为假,则结束循环,转到第(5)步;(3)求解表达式3;(4)转回上面第(2)步骤继续执行;(5)循环结束。例:for(i=1;i=100;i++)sum=sum+i求解表达式1求解表达式2真语句求解表达式3假for语句的下一语句i=1i=100真sum=sum+ii++假它相当于i=1;while(i=100){sum=sum+i;i++;}说明:(1)for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。比如:for(i=1;i=100;i++)sum=sum+i;可写为:i=1;for(;i=100;i++)sum=sum+i;(2)表达式2不能省略,否则会导致死循环;(3)表达式3可以省略,但此时应另外设法保证循环能正常结束。比如:for(i=1;i=100;i++)sum=sum+i;可写为:for(i=1;i=100;){sum=sum+i;i++;}(4)表达式1可以为设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他变量表达式。此外表达式1和表达式3还可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。例:for(sum=0;i=100;i++)sum=sum+i;for(i=0,j=100;i=j;i++,j--)k=i+j;(5)表达式一般是关系表达式或逻辑表达式,也可以为数值表达式或字符表达式,只要其值为非零,就执行循环体。例:for(;(c=getchar())!=‘\n’;)printf(“%c”,c);此句的作用是每读入一个字符后输出该字符,直到输入一个“换行符”为止。(6)for语句简单、方便,使用灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定只给出循环结束条件的情况,它完全可以取代while语句。6.6循环的嵌套C语言中,允许三种循环(while循环、do-while循环和for循环)相互嵌套和进行多层嵌套。6.8break语句和continue语句6.8.1break语句•break语句的一般形式:break;•作用:只能用于循环语句和switch语句,用来从循环体内跳出循环体,以提前结束循环。•例:for(r=1;r=10;r++){area=pi*r*r;if(area100)break;printf(“%f”,area);}6.8.2continue语句•一般形式:continue;•作用:结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。•contiune语句和break语句的区别是:contiune语句只是终止本次循环,不是终止整个循环,而break语句是结束整个循环;详细的流程图分析,可参见教科书P115之图6.10和图6.11.例6.5把100~200之间的不能被3整除的数输出;main(){intn;for(n=100;n=200;n++){if(n%3==0)continue;printf(“%d”,n);}}6.9程序举例例6.6用求的近似值,直到最后一项的绝对值小于10-6为止。下左为N-S流程图。t=1,pi=0,n=1,s=1当|t|=10-6pi=pi+tn=n+2s=-st=s/npi=pi*4输出pi#includemath.hmain(){ints;floatn,t,pi;t=1;pi=0;n=1.0;s=1;while((fabs(t))1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf(“pi=%10.6f\n”,pi);}例6.7求Fibonacci数列的40个数。Fibonacci数列为:)3()2(1)1(12121nFFFnFnFnnnf1=1,f2=1fori=1to20输出f1,f2f1=f1+f2f2=f2+f1main(){longintf1,f2;inti;f1=1;f2=1;for(i=1;i=20;i++){printf(“%12ld%12ld”,f1,f2);if(i%2==0)printf(“\n”);f1=f1+f2;f2=f2+f1;}}1,1,2,3,5,8,13,…例6.8判断m是否为素数。分析:判断一个数是否为素数,通常的做法是让这个数被从2到它的平方根(取整)的数除,如果能被其中任何一个数整除,则该数不是素数。读入mk=sqrt(m)I=2I=km被i整除真假用break结束循环i=i+1i=真k+1假输出:m是素数输出:m不是素数#includemath.hmain(){intm,i,k;scanf(“%d”,&m);k=sqrt(m);for(i=2;i=k;i++)if(m%i==0)break;if(i=k+1)printf(“%disprimenumber\n”,m);elseprintf(“%disnotprimenumber\n”,m);}例6.9在此基础上提出求素数的范围,这种情况可嵌套一个for循环即可处理。例6.10译密码。对字符的处理办法为:先判定它是否为大写字符或小写字符,若是,则将其值加4,变成其后的第四个字母。如果加4后字符值大于‘Z’或‘z’,则在加4后再减去26,转换为字母表前面的字母。(参见P119图6.15)#includestdio.hmain(){charc;while((c=gechar())!=‘\n’){if((c=‘a’&&c=‘z’||(c=‘A’&&c=‘Z’)){c=c+4;if(c’Z’&&c=‘Z’+4||c’z’)c=c-26;}printf(“%c”,c);}}
本文标题:第六章 循环控制2
链接地址:https://www.777doc.com/doc-3257867 .html