RWAC程序的设计第6章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

6.1概述在许多问题中需要用到循环控制。例如,要输入全校学生成绩;求若干个数之和;迭代求根等。几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。6.2goto语句以及用goto语句构成循环goto语句为无条件转向语句,它的一般形式为goto语句标号;语句标号用标识符表示,它的定名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。不能用整数来做标号。如:gotolabel-1正确goto123;错误结构化程序设计方法主张限制使用goto语句,因为滥用goto语句将使程序流程无规律、可读性差。但也不是绝对禁止使用goto语句。一般来说,可以有两种用途:(1)与if语句一起构成循环结构;(2)从循环体中跳转到循环体外,一般从多层循环中的内层循环跳到外层循环.但在c语言中可以用break语句和continue语句跳出本层循环和结束本次循环。【例6.1】用if语句和goto语句构成循环,求∑n。此问题的算法是比较简单的,可以直接写出程序:#includestdio.hvoidmain(){inti,sum=0;i=1;loop:if(i=100){sum=sum+i;i++;gotoloop;}printf(%d,sum);}运行结果如下:50506.3while语句while语句用来实现“当型”循环结构。其一般形式如下:while(表达式)语句当表达式为非0值时,执行while语句中的内嵌语句。其流程图见图6.1。其特点是:先判断表达式,后执行语句。图6.1【例6.2】求∑n。用传统流程图和N-S结构流程图表示算法,见图6.2(a)和图6.2(b)。根据流程图写出程序:#includestdio.hvoidmain(){inti,sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(%d,sum);}注意:(1)循环体如果包含一个以上的语句,应该用花括号括起来,一符合语句形式出现.(2)在循环体中,应有使循环趋向于结束的语句.例如:i++否则将成为死循环.图6.26.4dowhile语句dowhile语句的特点是先执行循环体,然后判断循环条件是否成立。其一般形式为do循环体语句while(表达式);它是这样执行的:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。可以用图6.3表示其流程。请注意dowhile循环用N-S流程图的表示形式(图6.3(b))。图6.3对同一个问题可以用while语句处理,也可以用do-while语句处理。Do-while语句结构可以转换成while结构。图6.3可以改画成图6.5形式,二者完全等价。图6.5【例6.3】用dowhile语句求∑n。流程图见图6.4。程序如下:#includestdio.hvoidmain(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i=100);printf(%d,sum);}图6.4例:while和do…while循环的比较(1)#includestdio.hvoidmain(){intsum=0.i;scanf(“%d”,&i);while(i=10){sum=sum+I;i++;}printf(“sum=%d\n”,sum);}}输入1输出:sum=55输入11输出sum=0(2)#includestdio.hvoidmain(){intsum=0.i;scanf(“%d”,&i);do{sum=sum+I;i++;}printf(“sum=%d\n”,sum);}while(i=10)}输入1输出:sum=55输入11输出sum=11While循环是先判断后执行,有可能循环0次.do…while循环是先执行,后判断,至少循环一次6.5for语句for语句不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以替代while语句for语句的一般形式为for(表达式1;表达式2;表达式3)语句它的执行过程如下:(1)先求解表达式1。(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。(3)求解表达式3。(4)转回上面第(2)步骤继续执行。(5)循环结束,执行for语句下面的一个语句。可以用图6.6来表示for语句的执行过程。for语句最简单的应用形式也就是最易理解的如下形式:for(循环变量赋初值;循环条件;循环变量增值)语句例如:for(i=1;i=100;i++)sum=sum+i;它相当于以下语句:i=1;while(i=100){sum=sum+i;i++;}所以for语句的一般形式相当于如下的while语句:表达式1;while(表达式2){语句表达式3;}图6.6说明:(1)for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如:for(;i=100;i++)sum=sum+i;(2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。如:for(i=2;;i++)sum=sum+i;(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如for(i=1;i=100;){sum=sum+i;i++;}(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。for(;i=100;){sum=sum+i;i++;}此时完全等同于while语句可见for和while功能强,除了可以给出循环条件,还可以赋初值,使循环变量自动增值.(5)三个表达式都可省略,无终止地执行循环体。(6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如:for(sum=0;i=100;i++)sum=sum+i;表达式3也可以是与循环控制无关的任意表达式。表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:for(sum=0,i=1;i=100;i++)sum=sum+i;或for(i=0,j=100;i=j;i++,j--)k+=i*j;在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为其最右边的表达式的值.如:for(i=1;i=100;i++,i++)sum=sum+i;相当于for(i=1;i+100;i=i+2)sum=sum+i;(7)表达式一般是关系表达式(如i=100)或逻辑表达式(如ab&&xy),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。①for(i=0;(c=getchar()!=‘\n’;i+=c);作用:从键盘不断读入字符,将其ASCII码相加,直到输入一个换行符为止.可以在表达式中完成循环体的工作②for(;(c=getchar()!=‘\n’;i+=c)printf(“%c”,c);无式1和式3结果:输入computer输出:computerC语言中的for语句笔其他语言中的For语句功能强得多,可以把循环体和一些与循环控制无关的操作,也作为表达式1或表达式3出现,这样程序可以短小简结.但过分得利用这一特点会使for语句现得杂乱,可读性降低,最好不要把与循环控制无关的内容放到for语句中6.6循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。三种循环(while循环、dowhile循环和for循环)可以互相嵌套。例如,下面几种都是合法的形式:(1)while(){…while(){…}}(2)do{…do{…}while();}while();(3)for(;;){for(;;){…}}(4)while(){…do{…}while();…}(5)for(;;){…while(){}…}(6)do{…for(;;){}}while();6.7几种循环的比较(1)四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。(2)while和dowhile循环,只在while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如i++,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。(3)用while和dowhile循环时,循环变量初始化的操作应在while和dowhile语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。(4)while循型、dowhile循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环(break语句和continue语句见6.8节)。而对用goto语句和if语句构成的循环,不能用break语句和continue语句进行控制。6.8break语句和continue语句6.8.1break语句用break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句。break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。如:floatpi=3.14159;for(r=1;r=10;r++){area=pi*r*r;if(area100)break;printf(“r=%f,area=%\n”,r,area);}计算r=1到10时的圆面积,直到面积area大于100为止.break语句的一般形式为:break;break语句不能用于循环语句和switch语句之外的任何其他语句中。6.8.2continue语句一般形式为:continue;其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。如果有以下两个循环结构:(1)while(表达式1){…if(表达式2)break;…}(2)while(表达式1){…if(表达式2)continue;…}程序(1)的流程图如图6.10所示,而程序(2)的流程如图6.11所示。图6.10图6.116.9程序举例【例6.6】用公式求π的近似值,直到最后一项的绝对值小于10-6为止。用N-S结构化流程图表示算法(见图6.12)。11114357图6.12#includestdio.h#includemath.hvoidmain(){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个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即:f1=1(n=1)f2=1(n=2)fn=fn-1+fn-2(n≥3)解此题的算法如图6.13所示。图6.13程序如下:#includestdio.hvoidmain(){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 / 29
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功