您好,欢迎访问三七文档
第6章循环结构第6章循环结构6.1概述6.2while语句6.3dowhile语句6.4for语句6.6循环控制语句和goto转移语句6.5循环嵌套第6章循环结构6.1概述循环结构用来描述具有规律性的重复工作。例如,求若干个数的累积;输入全班所有学生的成绩等。几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。第6章循环结构6.2while语句1.while语句是当型循环控制语句,一般形式为:while表达式循环体;说明:(1)、“表达式”可以是任意表达式,用来判定循环是否终止(或者说判定循环体是否执行)。表达式的值要么为真,要么为假;如果其值为一个数值,则非0的任何数都为真,而0代表假。如果第一次执行时,“表达式”的值为假,则“循环体”中的语句一次都不执行。(2)、“循环体”中可以是单语句,也可以是空语句(只有一个;的语句)或复合语句,如果是复合语句,则必须括在{}之中。while语句的流程图见图6-1,其特点是先判断,后执行,若条件不成立,有可能一次也不执行。第6章循环结构2.举例应用例6.1求sum=1+2+3+......+100。分析:解决这类累加、累积问题,关键是要找出通用计算公式,即找到循环体中的部分。sum=sum+i是本例的通用性计算公式。公式中,sum既作为一个加数使用,也用于存放累加后的结果,其初值为0;i既作为另一个第6章循环结构加数使用,也作为循环变量,其取值范围是1到100。对于每个i值,要进行一次sum=sum+i的计算。如,当i=1时,sum=0+1=1;当i=2时,sum=1+2=3;当i=3时,sum=3+3=5;……依此类推下去,就可以得到结果sum。#includestdio.hvoidmain(){inti,sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(%d,sum);}图6-2求1+2+…+100算法描述第6章循环结构例6.2将输入的一串字符显示在屏幕上,遇到字符“$”时停止。#includestdio.hvoidmain(){charc;printf(\nPleaseinputastring:\n);c=getchar();while(c!='$'){putchar(c);c=getchar();}}第6章循环结构6.3dowhile语句1.dowhile语句的语法和框图dowhile循环语句的语法是:do{循环体语句;}while(表达式);(1)、说明:1)“表达式”可以是任意表达式,用来判定循环是否终止(或者说判定循环体是否执行)。表达式的值要么为真,要么为假;如果其值为一个数值,则非0的任何数都为真,而0代表假。即使第一次执行时“表达式”的值为假,“循环体”中的语句最少会被执行一次。2)“循环体”中可以是单语句,也可以是空语句(只有一第6章循环结构个;的语句)或复合语句,如果是复合语句,则必须括在{}之中。3)do-while作为一个语句,必须以分号(;)结束,所以在while(表达式)后一定要有分号。(2)、执行顺序:执行“循环体语句”,计算表达式的值,如果表达式的值非零(真),继续执行“循环体语句”,直到表达式的值为零(假),循环结束。程序结构流程图如图:第6章循环结构例6.3用dowhile语句求s=1+2+3+....+100#includestdio.hvoidmain(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i=100);printf(%d,sum);}第6章循环结构例6.4计算sin(x)=,直到最后一项的绝对值小10-7。n!x!x!x!xxn753753编程思路:这道题使用递推方法来做。让多项式的每一项与一个变量n对应,n的值依次为1,3,5,7,...,从多项式的前一项算后一项,只需将前一项乘一个因子:(-x2)/((n-1)*n)用s表示多项式的值,用t表示每一项的值。#includemath.h#includestdio.hvoidmain(){doubles,t,x;intn;printf(pleaseinputx:);第6章循环结构scanf(%lf,&x);t=x;n=1;s=x;do{n=n+2;t=t*(-x*x)/((n-1)*n);s=s+t;}while(fabs(t)=1e-7);printf(sin(%lf)=%lf,x,s);}运行结果如下:pleaseinputx:1.5753sin(1.575300)=0.999990第6章循环结构2.dowhile与while语句的区别dowhile总是要先做一遍循环体,再做表达式的判断,因此循环体中的语句肯定要做一次。在设计程序时,如果不知道重复执行的次数,而且第一次必须执行时,常采用dowhile语句。(1)为了避免编译系统把dowhile的while当做while语句的开始,dowhile的循环体即使是一句,也需要用括号括起。#includestdio.hvoidmain(){charc;do{第6章循环结构putchar(c=getchar());}while(c!='$');}但是,若将上例的dowhile语句写成:doputchar(c=getchar());while(c!='$');容易产生歧义和误解。(2)由于dowhile语句是先做循环体,再判断表达式,所以有些程序不能用dowhile语句编写。例如:输入某门功课的若干个同学的成绩,以-1作为终止的特殊成绩,计算平均成绩。也就是说,不能将-1计算在内。第6章循环结构例6.5求平均值的错误程序。#includestdio.hvoidmain(){intsum,i,a;sum=0;i=0;do{scanf(%d,&a);sum=sum+a;i++;}while(a!=-1);printf(aver=%f\n,1.0*sum/i);}但程序的逻辑是错误的,因为-1也被累加到sum中了,并且不能解决输入的第一个数就是-1的问题。第6章循环结构6.4for语句C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。for循环语句的语法是:for(表达式1;表达式2;表达式3)循环体语句;执行过程:(1)执行表达式1;(2)计算表达式2的值;(3)如果表达式2的值为真,则执行循环体,再执行表达式3,转到(2)步执行;(4)如果表达式2的值为假,则结束循环的执行,转而去执行for语句后的语句。第6章循环结构例6.6用for语句求s=1+2+3+....+n#includestdio.hvoidmain(){inti,sum,n;printf(\nPleaseinputainteger:);scanf(%d,&n);for(i=1,sum=0;i=n;i++)sum=sum+i;printf(sum=%d\n,sum);}第6章循环结构for循环使用说明:(1)for语句的表达式使用比较灵活,表达式1,表达式2,表达式3都可以省略,但是即使是三个表达式都省略了,二个“;”也不可省略。如下几种情形:①i=1;for(;i=100;i++)sum=sum+i;/*省略表达式1*/②for(i=1;;i++){sum=sum+i;if(i==100)break;}/*省略表达式2*/③i=1;for(;i=100;){sum=sum+i;i++;}/*省略表达式1和表达式3*/④i=1;for(;;){sum=sum+i;if(i==100)break;i++;}/*三个表达式均省略*/(2)在表达式1和表达式3中可以使用逗号运算符把执行语句并列在一起,并且循环体可以为空。第6章循环结构如:for(i=1,sum=0;i=100;sum+=i,i++);(3)表达式2一般是关系表达式(如i=100)或逻辑表达式(如ab&&xy),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。如:for(i=0;(c=getchar())!='\n';i+=c);在表达式2中先从终端接收一个字符赋给c,然后判断此赋值表达式的值是否不等于‘\n’(回车换行符),如果不等于‘\n’,就执行循环体。又如:for(;(c=getchar())!='\n';)printf(%c,c);只有表达式2,而无表达式1和表达式3。其作用是每读入一个字符后立即输出该字符,直到输入一个“换行”为止。第6章循环结构例6.8求Fibonacci数列的前40个数。该数列的生成方法为:F1=1,F2=1,Fn=Fn-1+Fn-2(n=3),即从第3个数开始,每个数等于前2个数之和。这是一个有趣的古典数学问题:有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少?编程思路:由题意可知,该数列的变化规律是第一项和第二项为1,从第三项起为前二项之和,令f1,f2分别为第一项和第二项,然后进入循环,首先输出f1,f2,接着执行语句“f1=f1+f2;”将二项所得和的值存入f1中,这就是数列的第三项,再执行语句“f2=f2+f1”(此时的f1代表第三项),将第二项和第三项所得和的值存入f2中,得到数列的第四项,重复以上步骤,每重复一次,变量f1、f2依次得到后面新的两项值,这是一个典型的递推法,第6章循环结构程序流程如图:#includestdio.hvoidmain(){longintf1=1,f2=1,i;for(i=1;i=20;i++){printf(“%-15ld%-15ld”,f1,f2);if(i%2==0)printf(“\n”);f1+=f2;f2+=f1;}}……………..第6章循环结构例6.9求s=aa…aa-a…a-…-aa-a,即第一项由n个a组成,第二项由n-1个a组成,依次类推,最后一项为a,a为1~9的任一数。例如:当n=4,a=2,则表达式:s=2222-222-22-2。编程思路:由表达式可知,该序列的规律是:前一项的数据比后一项大10倍,如果把前一项的数据对10进行整除,则商数即为后一项数据的值。所以程序的设计过程分为两步:第一步运用for循环求出序列的第一项;第二步还是运用循环实现取数和求和的功能,流程图如图:第6章循环结构源代码如下:#includestdio.hvoidmain(){inta,n,i;longs=0,t=a;scanf(a=%d,n=%d,&a,&n);for(i=1;in;i++)t=t*10+a;s=t;for(i=1;in;i++){t=t/10;s=s-t;}printf(s=%ld,s);}第6章循环结构6.5循环嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。一个循环外面仅包围一层循环叫二重循环;一个循环外面包围两层循环叫三重循环;一个循环外面包围多层循环叫多重循环。三种循环语句for、while、do...while可以互相嵌套自由组合。如下形式:第6章循环结构例6.10输出10~100之间的全部素数。编程思路:(1)显然,只要设计出判断某数n是否是素数的算法,外面再套一个for循环即可。(2)判断某数n是否是素数的算法:根据素数的定义,用2~(n-1)之间的每一个数去整除n,如果都不能被整除,则表示该数是一个素数。实际上用不到将n除至n-1,只要将n除以2~即可,这是因为任一整数n若能被另一整数a整除,其商为b,则a和b中有一个必然大于或等于,而另一个小于或等于,故只需将n依次除以2~即可。程序流程如图:第6章循环结构源程序如下:#includestdio.h#includemath.hvoidmain(){inti=11,j,counter=0,k,
本文标题:第6章 循环结构
链接地址:https://www.777doc.com/doc-3820687 .html