第5章循环结构程序设计_第1页
第5章循环结构程序设计_第2页
第5章循环结构程序设计_第3页
第5章循环结构程序设计_第4页
第5章循环结构程序设计_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、语言程序设计1第第5 5章章 循环结构程序设计循环结构程序设计语言程序设计2第第5 5章章 循环结构程序设计循环结构程序设计5.1 while5.1 while语句以及用语句以及用whilewhile语句构成的循环结构语句构成的循环结构5.2 do-while5.2 do-while语句和用语句和用do-whiledo-while构成的循环结构构成的循环结构5.3 for5.3 for语句以及用语句以及用forfor语句构成的循环结构语句构成的循环结构5.4 break5.4 break语句和语句和continuecontinue语句在循环结构中应用语句在循环结构中应用5.5 5.5 循环的嵌

2、套循环的嵌套5.6 5.6 三种循环的比较三种循环的比较5.7 5.7 程序举例程序举例主要内容:主要内容:语言程序设计3第第5 5章章 循环结构程序设计循环结构程序设计5.1 while5.1 while语句以及用语句以及用whilewhile语句构成语句构成的循环结构的循环结构 由由whilewhile语句构成的循环也称语句构成的循环也称“当当”循环,循环,whilewhile循环的一般形式如下:循环的一般形式如下: while(while(表达式表达式) ) 语句语句 其中表达式是循环条件,语句为循环体。其中表达式是循环条件,语句为循环体。5.1.1 while5.1.1 while循环

3、的一般形式循环的一般形式语言程序设计4第第5 5章章 循环结构程序设计循环结构程序设计说明:说明:whilewhile是是C C语言的关键字,要小写。语言的关键字,要小写。 whilewhile后一对圆括号中的表达式可以是后一对圆括号中的表达式可以是C C语言中任语言中任意合法的表达式,但不能为空,由它来控制循环体意合法的表达式,但不能为空,由它来控制循环体是否执行。是否执行。 在语法上,循环体只能是一条可执行语句,若循环在语法上,循环体只能是一条可执行语句,若循环体内有多条语句,则必须用一对花括号体内有多条语句,则必须用一对花括号括起来,括起来,构成一条复合语句。构成一条复合语句。 对于任何

4、循环,只要掌握两点内容:一是循环条件对于任何循环,只要掌握两点内容:一是循环条件是什么?二是循环体是谁?是什么?二是循环体是谁? 如何结束循环,一般是两种方式:一是正常结束(如何结束循环,一般是两种方式:一是正常结束(既不满足循环条件了);二是中途结束。既不满足循环条件了);二是中途结束。语言程序设计5第第5 5章章 循环结构程序设计循环结构程序设计5.1.2 while5.1.2 while循环的执行过程循环的执行过程 whilewhile循环的执行过程如下:循环的执行过程如下:(1 1)计算)计算whilewhile后圆括号中表后圆括号中表达式达式 的值。当值为非的值。当值为非0 0时,执

5、时,执行步骤(行步骤(2 2);当值为);当值为0 0时,执时,执行步骤(行步骤(4 4)。)。(2 2)执行循环体一次。)执行循环体一次。(3 3)转去执行步骤()转去执行步骤(1 1)。)。(4 4)退出)退出whilewhile循环。循环。图图5.1 while5.1 while循环语句循环语句的执行流程的执行流程语言程序设计6第第5 5章章 循环结构程序设计循环结构程序设计注意:注意:(1 1)whilewhile语句的循环体可能一次都不执行,因为语句的循环体可能一次都不执行,因为whilewhile后圆括号中的条件表达式可能一开始就为后圆括号中的条件表达式可能一开始就为0.0.(2

6、2)不要把由)不要把由ifif语句构成的分支结构与由语句构成的分支结构与由whilewhile语句语句构成的循环结构混同起来。若构成的循环结构混同起来。若ifif后条件表达式的值为后条件表达式的值为非非0 0,其后的,其后的ifif子句只可能执行一次;而子句只可能执行一次;而whilewhile后条件后条件表达式的值为非表达式的值为非0 0时,其后的循环体语句可能重复执行。时,其后的循环体语句可能重复执行。在设计循环时,通常应在循环体内改变条件表达式中在设计循环时,通常应在循环体内改变条件表达式中有关变量的值,使条件表达式的值最终变为有关变量的值,使条件表达式的值最终变为0 0,以便能,以便能

7、结束循环。结束循环。(3 3)当循环体需要无条件循环,条件表达式可以设为)当循环体需要无条件循环,条件表达式可以设为1 1(恒真),但在循环体内要有带条件的非正常出口(恒真),但在循环体内要有带条件的非正常出口(breakbreak等)。等)。语言程序设计7第第5 5章章 循环结构程序设计循环结构程序设计【例例5.15.1】用用whilewhile语句求语句求s=1+2+3+ +100s=1+2+3+ +100 (a a) (b b)图图5.2 5.2 例例5.15.1算法流程图算法流程图语言程序设计8第第5 5章章 循环结构程序设计循环结构程序设计#includemain() int i,s

8、um=0; i=1; while(i=100) sum=sum+i; i+; printf(“sum=%dn”,sum); 结果:sum=5050语言程序设计9第第5 5章章 循环结构程序设计循环结构程序设计【例例5.25.2】用用whilewhile语句求语句求s=1+1/ (2s=1+1/ (2* *2)+1/ 2)+1/ (3(3* *3)+1/ (43)+1/ (4* *4)+ +1/ (1004)+ +1/ (100* *100)100) 分析:本题的算法也是求累加和,只是求和分析:本题的算法也是求累加和,只是求和的每一项与例的每一项与例5.15.1不同。本题是求分式的累加和,不同。

9、本题是求分式的累加和,因此需要注意:求和变量因此需要注意:求和变量sumsum应该是应该是doubledouble或或floatfloat类型。由于分式中每一项的分子小于分母,类型。由于分式中每一项的分子小于分母,因此为使分式的值不为零,累加的每一项应该写因此为使分式的值不为零,累加的每一项应该写成成1.0/(i1.0/(i* *i)i)。 语言程序设计10第第5 5章章 循环结构程序设计循环结构程序设计#include#includemain()main() double sum=0; double sum=0; int i; int i; i=1; i=1; while(i=100) wh

10、ile(i=100) sum=sum+1.0/(i sum=sum+1.0/(i* *i);i); i+; i+; printf(“sum=%fn”,sum); printf(“sum=%fn”,sum); 结果:结果:sum=1.634984sum=1.634984语言程序设计11第第5 5章章 循环结构程序设计循环结构程序设计【例例5.35.3】用用 公式求公式求 的近的近似值,直到最后一项的绝对值小于似值,直到最后一项的绝对值小于1010-6-6为止。为止。 -11111.43579 分析:分析:(1 1)用分母的值来控制循环的次数。若用)用分母的值来控制循环的次数。若用n n存放分母的

11、值,存放分母的值,则每累加一次则每累加一次n n应当增应当增2 2。每次累加的数不是整数,而是一个。每次累加的数不是整数,而是一个实数,因此实数,因此n n应当定义成应当定义成floatfloat类型。类型。(2 2)可以看成隔一项的加数是负数。若用)可以看成隔一项的加数是负数。若用t t来表示相加的每来表示相加的每一项,则每加一项之后,一项,则每加一项之后,t t的符号的符号s s应当改变,这可用交替乘应当改变,这可用交替乘1 1和和-1-1来实现。来实现。(3 3)从以上求)从以上求的公式来看,不能决定的公式来看,不能决定n n的最终值应该是多的最终值应该是多少,但可以用最后一项的绝对值小

12、于少,但可以用最后一项的绝对值小于1010-6-6来作为循环的结束来作为循环的结束条件。条件。语言程序设计12第第5 5章章 循环结构程序设计循环结构程序设计#include#include#include#includemain()main() float n,t,pi; float n,t,pi; int s; int s; s=1; s=1; n=1.0; t=1.0; n=1.0; t=1.0; pi=0; pi=0; while(fabs(t)=1e-6) while(fabs(t)=1e-6) pi+=t; pi+=t; n+=2; n+=2; s=-s; s=-s; t=s/n;

13、 t=s/n; pi=pi pi=pi* *4;4; printf(“pi=%fn”,pi); printf(“pi=%fn”,pi); 结果:结果:pi=3.141594pi=3.141594语言程序设计13第第5 5章章 循环结构程序设计循环结构程序设计5.2 do-while5.2 do-while语句以及用语句以及用do-whiledo-while语语句构成的循环结构句构成的循环结构 5.2.1 do-while5.2.1 do-while语句构成的循环结构语句构成的循环结构 do-whiledo-while循环结构的形式如下循环结构的形式如下: :dodo 循环体循环体whilewh

14、ile(表达式);(表达式);语言程序设计14第第5 5章章 循环结构程序设计循环结构程序设计说明:说明:(1 1)dodo是是C C语言的关键字,必须和语言的关键字,必须和whilewhile联合使联合使用。用。(2 2)do-whiledo-while循环由循环由dodo开始,至开始,至whilewhile结束。结束。必须注意的是:在必须注意的是:在whilewhile(表达式)后的(表达式)后的“;”不可丢,它表示不可丢,它表示do-whiledo-while语句的结束。语句的结束。(3 3)whilewhile后一对圆括号中的表达式,可以是后一对圆括号中的表达式,可以是C C语言中任意

15、合法的表达式,由它控制循环是否执语言中任意合法的表达式,由它控制循环是否执行。行。(4 4)按语法,在)按语法,在dodo和和whilewhile之间的循环体只能之间的循环体只能是一条可执行语句。若循环体内需要多个语句,是一条可执行语句。若循环体内需要多个语句,应该使用复合语句。应该使用复合语句。 语言程序设计15第第5 5章章 循环结构程序设计循环结构程序设计5.2.2 do-while5.2.2 do-while循环的执行过程循环的执行过程图图5.3 do-while5.3 do-while语句的执行流程语句的执行流程do-whiledo-while循环的执行过程如下:循环的执行过程如下:

16、(1 1)执行)执行dodo后面循环体后面循环体中的语句。中的语句。(2 2)计算)计算whilewhile后一对后一对圆括号中表达式的值。当圆括号中表达式的值。当值为非值为非0 0时,转去执行步时,转去执行步骤(骤(1 1);当值为);当值为0 0时,执时,执行步骤(行步骤(3 3)。)。(3 3)退出)退出do-whiledo-while循环循环语言程序设计16第第5 5章章 循环结构程序设计循环结构程序设计do-whiledo-while循环与循环与whilewhile循环的重要区别是:循环的重要区别是:whilewhile循环的控制出现在循环体之前,只有当循环的控制出现在循环体之前,只

17、有当whilewhile后面条件表达式的值为非后面条件表达式的值为非0 0时,才可能执行时,才可能执行循环体,因此循环体可能一次都不执行;在循环体,因此循环体可能一次都不执行;在do-do-whilewhile构成的循环中,总是先执行一次循环体,然构成的循环中,总是先执行一次循环体,然后再求条件表达式的值,因此,无论条件表达式后再求条件表达式的值,因此,无论条件表达式的值是的值是0 0还是非还是非0 0,循环体至少要被执行一次。,循环体至少要被执行一次。在在do-whiledo-while循环体中,一定要有能使循环体中,一定要有能使whilewhile后后表达式的值变为表达式的值变为0 0的操

18、作,否则,循环将会无限制的操作,否则,循环将会无限制地进行下去,除非循环体中有带条件的非正常出地进行下去,除非循环体中有带条件的非正常出口(口(breakbreak等)。等)。 语言程序设计17第第5 5章章 循环结构程序设计循环结构程序设计【例例5.45.4】用用do-whiledo-while语句求语句求s=1+2+3+ +100s=1+2+3+ +100。 (a (a) (b b) 图图5.4 5.4 例例5.35.3算法流程图算法流程图语言程序设计18第第5 5章章 循环结构程序设计循环结构程序设计#include#includemain()main() int i,sum=0; in

19、t i,sum=0; i=1; i=1; do do sum=sum+i; sum=sum+i; i+; i+; while(i=100); while(i=100); printf(“%dn”,sum); printf(“%dn”,sum); 结果:结果:sum=5050sum=5050语言程序设计19第第5 5章章 循环结构程序设计循环结构程序设计【例例5.55.5】用迭代法求方程用迭代法求方程cosy=ycosy=y的根,要求误的根,要求误差小于差小于1010-6-6。分析:迭代法的求解思想是从一个初始值开始,分析:迭代法的求解思想是从一个初始值开始,将初始值代入迭代公式,得到一个迭代输

20、出值。将初始值代入迭代公式,得到一个迭代输出值。再次迭代时,将上一次的迭代输出当作本次的迭再次迭代时,将上一次的迭代输出当作本次的迭代输入,不断重复以上过程,直到满足要求。代输入,不断重复以上过程,直到满足要求。 根据迭代法的基本思想,求解步骤如下:根据迭代法的基本思想,求解步骤如下:(1 1)取)取y1y1的初值为的初值为0.00.0。(2 2)y0=y1y0=y1,把,把y1y1的初值赋给的初值赋给y0y0。(3 3)y1=cosy1=cos(y0y0),求出一个新的),求出一个新的y1y1。(4 4)判断)判断| y0-y1|10-6| y0-y1|10-6是否成立,若是否成立,若y0-

21、y1y0-y1的的绝对值小于绝对值小于10-610-6,则执行步骤(,则执行步骤(5 5),否则执行步),否则执行步骤(骤(2 2)。)。(5 5)所求)所求y1y1就是方程就是方程cosy=ycosy=y的根。计算结束,的根。计算结束,输出结果。输出结果。语言程序设计20第第5 5章章 循环结构程序设计循环结构程序设计#include#include#include#includemain()main() double y0,y1=0.0 double y0,y1=0.0 ; ; do do y0=y1 y0=y1 ; ; y1=cos(y0) y1=cos(y0) ; ; while(fa

22、bs(y0-y1)=1e-6 while(fabs(y0-y1)=1e-6 ) ) ; ; printf(”y1=%fn”,y1) printf(”y1=%fn”,y1) ; ; 结果:结果:y1=y1= 0.7390860.739086语言程序设计21第第5 5章章 循环结构程序设计循环结构程序设计【例例5.65.6】计算计算FibonacciFibonacci数列,直到某项大于数列,直到某项大于10001000为止,并输出该项的值。为止,并输出该项的值。 分析:分析:FibonacciFibonacci数列,数列,f f0 0=0=0,f f1 1=1=1,f f2 2=1=1,f f3

23、3=2=2,f f4 4=3=3,.,f fn n=f=fn-2n-2+f+fn-1n-1。程序中可定义。程序中可定义三个变量三个变量f1f1、f2f2和和f f,给,给f1f1赋初值赋初值0 0,f2f2赋初值赋初值1 1,然后进行以下步骤:,然后进行以下步骤:(1 1)f=f1+f2f=f1+f2;f1=f2f1=f2;f2=ff2=f;(2 2)判断)判断f2f2是否大于是否大于10001000,若不大于,重复,若不大于,重复步骤(步骤(1 1)继续循环;否则执行步骤()继续循环;否则执行步骤(3 3)。)。(3 3)循环结束,输出)循环结束,输出f2f2的值。的值。语言程序设计22第第

24、5 5章章 循环结构程序设计循环结构程序设计#include#includemain()main() int f1,f2,f ; int f1,f2,f ; f1=0; f2=1; f1=0; f2=1; do do f=f1+f2; f=f1+f2; f1=f2; f1=f2; f2=f; f2=f; while(f2=1000); while(f2=1000); printf(“F=%dn”,f2); printf(“F=%dn”,f2); 结果:结果:F=1597F=1597语言程序设计23第第5 5章章 循环结构程序设计循环结构程序设计5.3 for5.3 for语句以及用语句以及用f

25、orfor语句构成的循环语句构成的循环结构结构 5.3.1 for5.3.1 for语句构成的循环结构语句构成的循环结构 forfor循环的一般形式如下:循环的一般形式如下: for(for(表达式表达式1 1;表达式;表达式2 2;表达式;表达式3) 3) 循环体循环体forfor语句最简单最容易理解的形式如下:语句最简单最容易理解的形式如下:for(for(循环变量赋初值;循环条件;循环变量增量循环变量赋初值;循环条件;循环变量增量) ) 循环体循环体语言程序设计24第第5 5章章 循环结构程序设计循环结构程序设计例如例如: :for(i=1; i=100; i+) sum=sum+i;

26、for(i=1; i=100; i+) sum=sum+i; 以上以上forfor循环的作用是求循环的作用是求s=1+2+3+ +100s=1+2+3+ +100,它相,它相当于以下语句:当于以下语句: i=1;i=1; while while(i=100i=100) sum=sum+i; sum=sum+i; i+; i+; 语言程序设计25第第5 5章章 循环结构程序设计循环结构程序设计对于以上对于以上forfor语句的一般形式也可以改写成语句的一般形式也可以改写成whilewhile循环的形式:循环的形式: 表达式表达式1;1; while while(表达式(表达式2 2) 循环体循环

27、体 表达式表达式3;3; 在在C C语言中,语言中,forfor语句使用最为灵活,不仅可以用语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代不确定而只给出循环结束条件的情况,它完全可以代替替whilewhile语句。语句。 语言程序设计26第第5 5章章 循环结构程序设计循环结构程序设计5.3.2 for5.3.2 for循环的执行过程循环的执行过程图5.5 for语句的执行流程forfor循环的执行过程如下:循环的执行过程如下:(1 1)求解表达式)求解表达式1 1。(2 2

28、)求解表达式)求解表达式2 2,若其值为非,若其值为非0 0,转去执行步骤(转去执行步骤(3 3);若其值为);若其值为0 0,转步骤(转步骤(5 5)。)。(3 3)执行一次)执行一次forfor循环体。循环体。(4 4)求解表达式)求解表达式3 3,转向步骤(,转向步骤(2 2)(5 5)循环结束。)循环结束。 语言程序设计27第第5 5章章 循环结构程序设计循环结构程序设计5.3.3 5.3.3 有关有关forfor语句的说明语句的说明 1 1、表达式的省略、表达式的省略如果在如果在forfor语句之前给循环变量赋了初值,则表语句之前给循环变量赋了初值,则表达式达式1 1可以省略,但其后

29、的分号不可省略。可以省略,但其后的分号不可省略。对于从对于从1 1到到100100求和的求和的forfor循环语句:循环语句:for(i=1; i=100; i+) sum=sum+i;for(i=1; i=100; i+) sum=sum+i;如果省略表达式如果省略表达式1 1,可以写成如下形式:,可以写成如下形式:i=1; /i=1; /* * 在在forfor语句之前给循环变量赋初值语句之前给循环变量赋初值* */ /for( ; i=100; i+) sum=sum+i;for( ; i=100; i+) sum=sum+i;语言程序设计28第第5 5章章 循环结构程序设计循环结构程序

30、设计如果省略表达式如果省略表达式3 3,则应在,则应在forfor语句的循环体内修改循语句的循环体内修改循环控制变量,例如:环控制变量,例如:for(i=1; i=100;) for(i=1; i=100;) sum=sum+i; sum=sum+i; i+; / i+; /* * 修改循环控制变量修改循环控制变量* */ / 如果表达式如果表达式1 1和表达式和表达式3 3都省略,则都省略,则forfor语句就相当于语句就相当于whilewhile语句,例如:语句,例如: i=1;i=1; for for(;i=100;i100 if(i100)break; break; / /* * 如果

31、如果i i大于大于100100,则退出循环,则退出循环 * */ / 总之总之,forfor语句中的三个表达式可以都省略语句中的三个表达式可以都省略,也也可以部分省略可以部分省略,但是起分隔作用的两个分号是绝不能但是起分隔作用的两个分号是绝不能省略的。省略的。 语言程序设计30第第5 5章章 循环结构程序设计循环结构程序设计2 2、forfor语句中的逗号表达式语句中的逗号表达式 逗号运算符的主要应用就是在逗号运算符的主要应用就是在forfor语句中。语句中。forfor语句中的表达式语句中的表达式1 1和表达式和表达式3 3可以是逗号表达式,特可以是逗号表达式,特别是在有两个循环变量参与对循

32、环控制的情况下。别是在有两个循环变量参与对循环控制的情况下。若表达式若表达式1 1和表达式和表达式3 3为逗号表达式,将使程序显得为逗号表达式,将使程序显得非常清晰非常清晰. . 例如:例如: #include #include main() main() int i,j; int i,j; for(i=1,j=10;ij;i+,j-) for(i=1,j=10;ij;i+,j-) printf(“i=%d,j=%dn”,i,j); printf(“i=%d,j=%dn”,i,j);运行结果为运行结果为:i=1,j=10i=1,j=10i=2,j=9i=2,j=9i=3,j=8i=3,j=8i

33、=4,j=7i=4,j=7i=5,j=6i=5,j=6语言程序设计31第第5 5章章 循环结构程序设计循环结构程序设计3 3、循环体为空语句、循环体为空语句对于对于forfor语句,循环体为空语句的一般形式为:语句,循环体为空语句的一般形式为: for(for(表达式表达式1 1; ;表达式表达式2 2; ;表达式表达式3)3) ; ;例如求例如求s=1+2+3+ +100s=1+2+3+ +100可以用如下循环语句完成。可以用如下循环语句完成。 for for(sum=0,i=1;i=100;sum+=i,i+sum=0,i=1;i=100;sum+=i,i+) ; ;上述上述forfor语

34、句的循环体为空语句,不做任何操作。语句的循环体为空语句,不做任何操作。实际上已把求累加和的运算放入表达式实际上已把求累加和的运算放入表达式3 3中了。中了。 语言程序设计32第第5 5章章 循环结构程序设计循环结构程序设计【例例5.75.7】根据公式根据公式S=1+1/(1+2)+1/(1+2+3)+ S=1+1/(1+2)+1/(1+2+3)+ +1/(1+2+3+ +n),+1/(1+2+3+ +n),求前求前2020项之和。项之和。分析:本题主要是利用分析:本题主要是利用forfor循环来实现累加及循环来实现累加及递推运算,可由题中所给计算公式获得递推关递推运算,可由题中所给计算公式获得

35、递推关系,程序中需要有累加和变量系,程序中需要有累加和变量sumsum,初值为,初值为0 0,循环变量循环变量i i从从1 1到到2020,以及一个累计量,以及一个累计量t t,t=1+2+3+ +it=1+2+3+ +i。 语言程序设计33第第5 5章章 循环结构程序设计循环结构程序设计#include#includemain()main() float sum=0.0; float sum=0.0; int t=0,i; int t=0,i; for(i=1;i=20;i+) for(i=1;i=20;i+) t+=i; t+=i; sum+=1.0/t; sum+=1.0/t; prin

36、tf(“the result is :sum=%fn”,sum); printf(“the result is :sum=%fn”,sum); 结果:结果:the result is :sum=1.904762the result is :sum=1.904762语言程序设计34第第5 5章章 循环结构程序设计循环结构程序设计【例例5.85.8】从键盘输入一个正整数,判断它是否从键盘输入一个正整数,判断它是否为素数(质数)?为素数(质数)? 分析:按照素数的定义,如果一个数只能被分析:按照素数的定义,如果一个数只能被1 1和它和它本身整除,则这个数是素数。反过来说,如果一个数本身整除,则这个数

37、是素数。反过来说,如果一个数x x能被能被2 2到到x-1x-1之间的某个数整除,则这个数之间的某个数整除,则这个数i i就不是素数就不是素数。由此推理可得。由此推理可得判断一个正整数判断一个正整数x x是否为素数的条件有是否为素数的条件有三个:三个:(1 1)x x被被2 2 x-1x-1来除,若都不能被整除,则来除,若都不能被整除,则x x就是素就是素数。数。(2 2)x x被被2 2 x/2x/2来除,若都不能被整除,则来除,若都不能被整除,则x x就是素就是素数。数。(3 3)x x被被2 2 来除,若都不能被整除,则来除,若都不能被整除,则x x就是素就是素数。数。 x语言程序设计3

38、5第第5 5章章 循环结构程序设计循环结构程序设计解法解法1 1:( (标志变量法标志变量法 ) ) #include#includemain()main() int x,i,f=1; / int x,i,f=1; /* * f f是标志变量是标志变量 * */ / scanf(“%d”,&x); scanf(“%d”,&x); for(i=2;ix;i+) for(i=2;ix;i+) if(x%i=0) f=0;break; if(x%i=0) f=0;break; if(f=1) printf(“ if(f=1) printf(“是素数是素数”);); else prin

39、tf(“ else printf(“不是素数不是素数”);); 语言程序设计36第第5 5章章 循环结构程序设计循环结构程序设计解法解法2 2:利用判断循环是如何退出的方法,编写:利用判断循环是如何退出的方法,编写程序如下:程序如下:#include#includemain()main() int x,i; int x,i; scanf(“%d”,&x); scanf(“%d”,&x); for(i=2;ix;i+) for(i=2;ix;i+) if(x%i=0) break; if(x%i=0) break; if(i=x) printf(“ if(i=x) printf(

40、“是素数是素数”); ); else printf(“ else printf(“不是素数不是素数”);); 语言程序设计37第第5 5章章 循环结构程序设计循环结构程序设计5.4 break5.4 break语句和语句和continuecontinue语句在循环语句在循环结构中的应用结构中的应用5.4.1 break5.4.1 break语句语句用用breakbreak语句可以使流程跳出语句可以使流程跳出switchswitch语句体,也语句体,也可用可用breakbreak语句在循环结构中终止本层循环体,语句在循环结构中终止本层循环体,从而提前结束本层循环。从而提前结束本层循环。【例例5.

41、95.9】计算计算s=1+2+3+ +is=1+2+3+ +i,直到累加到,直到累加到s s大于大于50005000为止,并输出为止,并输出s s和和i i的值。的值。语言程序设计38第第5 5章章 循环结构程序设计循环结构程序设计#include#includemain()main() int i,s; int i,s; s=0; s=0; for(i=1; ;i+) for(i=1; ;i+) s=s+i; s=s+i; if if(s5000s5000)break;break; printf(“s=%d,i=%dn”,s,i); printf(“s=%d,i=%dn”,s,i); 结果:

42、结果:s=5050,i=100 s=5050,i=100 语言程序设计39第第5 5章章 循环结构程序设计循环结构程序设计breakbreak语句的使用说明:语句的使用说明:(1 1)只能在循环体内和)只能在循环体内和switchswitch语句体内使用语句体内使用breakbreak语句。语句。(2 2)当)当breakbreak出现在循环体中的出现在循环体中的switchswitch语句语句体内时,其作用只是跳出该体内时,其作用只是跳出该switchswitch语句体,并语句体,并不能终止循环体的执行。若想强行终止循环体不能终止循环体的执行。若想强行终止循环体的执行,可以在循环体中,但并不

43、在的执行,可以在循环体中,但并不在switchswitch语语句中设置句中设置breakbreak语句,当满足限定条件时则跳出语句,当满足限定条件时则跳出本层循环体。本层循环体。语言程序设计40第第5 5章章 循环结构程序设计循环结构程序设计5.4.2 continue5.4.2 continue语句语句 continuecontinue语句的作用是跳过本次循环体中余下尚未语句的作用是跳过本次循环体中余下尚未执行的语句,立刻进行下一次的循环条件判定,可以执行的语句,立刻进行下一次的循环条件判定,可以理解为仅结束本次循环。注意:执行理解为仅结束本次循环。注意:执行continuecontinue

44、语句并语句并没有使整个循环终止。没有使整个循环终止。在在whilewhile和和do-whiledo-while循环中,循环中,continuecontinue语句使得流程语句使得流程直接跳到循环控制条件的测试部分,然后决定循环是直接跳到循环控制条件的测试部分,然后决定循环是否继续进行。在否继续进行。在forfor循环中,遇到循环中,遇到continuecontinue后,跳过后,跳过循环体中余下的语句,而去对循环体中余下的语句,而去对forfor语句中的语句中的“表达式表达式3”3”求值,然后进行求值,然后进行“表达式表达式2”2”的条件测试,最后根的条件测试,最后根据据“表达式表达式2”2

45、”的值来决定的值来决定forfor循环是否执行。循环是否执行。语言程序设计41第第5 5章章 循环结构程序设计循环结构程序设计【例例5.105.10】把把100100200200之间的不能被之间的不能被3 3整除的数输出。整除的数输出。#include#includemain()main() int n; int n; for(n=100;n=200;n+) for(n=100;n=200;n+) if(n%3= =0) if(n%3= =0) continue; continue; printf(“%d ”,n); printf(“%d ”,n); printf(“n”); printf(“

46、n”); 语言程序设计42第第5 5章章 循环结构程序设计循环结构程序设计5.5 5.5 循环的嵌套循环的嵌套在一个循环体内又包含另一个完整的循环结构,称在一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。前面介绍的三种类型的循环都可以为循环的嵌套。前面介绍的三种类型的循环都可以互相嵌套,循环的嵌套可以多层,但每一层循环在互相嵌套,循环的嵌套可以多层,但每一层循环在逻辑上必须是完整的。逻辑上必须是完整的。在编写程序时,为了增强程序的可读性,循环嵌在编写程序时,为了增强程序的可读性,循环嵌套的书写要采用缩进形式,像以下例题程序所示,套的书写要采用缩进形式,像以下例题程序所示,内循环中的语句

47、应该比外循环中的语句有规律地向内循环中的语句应该比外循环中的语句有规律地向右缩进右缩进24列,这样的程序层次分明,易于阅读。列,这样的程序层次分明,易于阅读。语言程序设计43第第5 5章章 循环结构程序设计循环结构程序设计【例例5.115.11】输出输出n nn n个字符个字符“* *”。分析:分析:(1 1)n n行行“* *”的输出,可用下列循环控制。的输出,可用下列循环控制。 for(i=1;i=n;i+)for(i=1;i=n;i+)(2 2)每行)每行n n个个“* *”的输出,可用下列循环语句实现:的输出,可用下列循环语句实现: for(j=1;j=n;j+)for(j=1;j=n

48、;j+) putchar( putchar(* *);); putchar(n); putchar(n);所以输出所以输出n nn n行行“* *”可用双重循环语句可用双重循环语句实现实现, ,程序如下:程序如下:语言程序设计44第第5 5章章 循环结构程序设计循环结构程序设计#include#includemain()main() int i,j; int i,j; for(i=1;i=n;i+) for(i=1;i=n;i+) for(j=1;j=n;j+) / for(j=1;j=n;j+) /* * 输出一行输出一行* * * */ / putchar( putchar(* *); )

49、; putchar(n); / putchar(n); /* * 换行换行 * */ / 语言程序设计45第第5 5章章 循环结构程序设计循环结构程序设计【例例5.125.12】编写程序输出如下图形。编写程序输出如下图形。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *分析:分析:(1 1)用循环控制变量)用循环控制变量i i(1i51i5)控制输出行)控制输出行 for(i=1;i=5;i+)for(i=1;i=5;i+)语言程序设计46第第5 5章章 循环结构程序设计循环结构程序设计(2 2)每行上的)每行上的“* *

50、”个数是随着行控制变量个数是随着行控制变量i i的的值变化而变化的。值变化而变化的。 i=1i=1时,执行时,执行1 1次次putchar(putchar(* *);); i=2 i=2时,执行时,执行2 2次次putchar(putchar(* *);); i=5 i=5时,执行时,执行5 5次次putchar(putchar(* *););输出第输出第i i行时执行行时执行i i次次“putchar(putchar(* *);”);”,所,所以内循环体语句应如下:以内循环体语句应如下: for(j=1;j=i;j+)for(j=1;j=i;j+) putchar( putchar(* *)

51、; /); /* * 输出一行输出一行* * * */ /语言程序设计47第第5 5章章 循环结构程序设计循环结构程序设计#include#includemain()main() int i,j; int i,j; for(i=1;i=5;i+) for(i=1;i=5;i+) for(j=1;j=i;j+) / for(j=1;j=i;j+) /* * 输出第输出第i i行行* * * */ / putchar( putchar(* *); ); putchar(n); putchar(n); 语言程序设计48第第5 5章章 循环结构程序设计循环结构程序设计【例例5.135.13】编写程序,

52、找出编写程序,找出2100以内的所有素以内的所有素数(质数)。数(质数)。 #include#includemain()main() int x,i,j,f; / int x,i,j,f; /* * f f是标志变量是标志变量* */ / for(i=2;i=100;i+) for(i=2;i=100;i+) f=1; f=1; for(j=2;ji;j+) for(j=2;ji;j+) if(i%j=0) f=0;break; if(i%j=0) f=0;break; if(f=1) printf(“%d, ”i); if(f=1) printf(“%d, ”i); 语言程序设计49第第5

53、5章章 循环结构程序设计循环结构程序设计【例例5.145.14】编写程序,找出大于正整数编写程序,找出大于正整数m m且靠近且靠近m m的的k k个素数,个素数,m m和和k k均从键盘输入。均从键盘输入。分析:本题中要求找出大于分析:本题中要求找出大于m m且靠近且靠近m m的的k k个素个素数,因此需要从数,因此需要从m+1m+1开始循环查找素数,如果开始循环查找素数,如果是素数则将其输出,同时计数器是素数则将其输出,同时计数器n n加加1 1,直到,直到n=kn=k为止。而验证一个数为止。而验证一个数i i是不是素数,则需要是不是素数,则需要利用循环从利用循环从2 2到到i-1i-1逐个

54、去取余,都除不尽则是逐个去取余,都除不尽则是素数。素数。 语言程序设计50第第5 5章章 循环结构程序设计循环结构程序设计#include#includemain()main() int i,j,m,k,n=0; int i,j,m,k,n=0; printf(“please enter m and k:”); printf(“please enter m and k:”); scanf(“%d%d”,&m,&k); scanf(“%d%d”,&m,&k); for(i=m+1;nk;i+) for(i=m+1;nk;i+) for(j=2;ji;j+) for

55、(j=2;j=i) printf(“%d ”,i); n+; if(j=i) printf(“%d ”,i); n+; 输入:输入:20 5 20 5 (回车)(回车)输出:输出:23 29 31 37 4123 29 31 37 41语言程序设计51第第5 5章章 循环结构程序设计循环结构程序设计以上以上4 4个例子都是两重个例子都是两重forfor循环嵌套。另外,循环嵌套。另外,3 3种种循环(循环(whilewhile循环、循环、dowhiledowhile循环和循环和forfor循环)循环)也可以互相嵌套。例如,下面几种都是合法的形也可以互相嵌套。例如,下面几种都是合法的形式式: :

56、注意:循环嵌套的程序中,要求内循环必须被包含在注意:循环嵌套的程序中,要求内循环必须被包含在外循环的循环体中,不允许出现内外层循环体交叉的外循环的循环体中,不允许出现内外层循环体交叉的情况。情况。 语言程序设计52第第5 5章章 循环结构程序设计循环结构程序设计5.6 5.6 三种循环的比较三种循环的比较 三种循环都可以用来处理同一个问题,一般可以三种循环都可以用来处理同一个问题,一般可以互相代替。例如,用三种循环方法都实现了求互相代替。例如,用三种循环方法都实现了求“s=1+2+3+ +100s=1+2+3+ +100(即从(即从1 1到到100100的和)的和)”。forfor循环语句和循

57、环语句和whilewhile循环语句都是先检查循环条循环语句都是先检查循环条件是否成立,后执行循环体,因此循环体可能一件是否成立,后执行循环体,因此循环体可能一次也不执行;而次也不执行;而do-whiledo-while循环语句是先执行循环循环语句是先执行循环体,后检查循环条件是否成立,因此循环体至少体,后检查循环条件是否成立,因此循环体至少被执行一次。被执行一次。语言程序设计53第第5 5章章 循环结构程序设计循环结构程序设计对于对于whilewhile和和do-whiledo-while循环语句,对循环语句,对“表达式表达式”中循环控制变量赋初始值是在执行这两个循环语中循环控制变量赋初始值

58、是在执行这两个循环语句之前完成的;而对于句之前完成的;而对于forfor循环语句,对循环语句,对“表达表达式式2”2”中的循环控制变量赋初始值既可在中的循环控制变量赋初始值既可在“表达表达式式1”1”中完成,又可在执行中完成,又可在执行forfor循环语句之前完成。循环语句之前完成。 为了防止出现为了防止出现“死循环死循环”,whilewhile和和do-whiledo-while循循环语句的循环体中一般应包括改变环语句的循环体中一般应包括改变“表达式表达式”中中循环控制变量值的语句,以便使循环操作趋于结循环控制变量值的语句,以便使循环操作趋于结束;而束;而forfor循环语句通常是在循环语句

59、通常是在“表达式表达式3”3”中包含中包含改变循环控制变量的值,进而使循环趋于结束。改变循环控制变量的值,进而使循环趋于结束。 语言程序设计54第第5 5章章 循环结构程序设计循环结构程序设计5.7 5.7 程序举例程序举例【例例5.155.15】计算并输出计算并输出100100以内(包括以内(包括100100),能),能被被3 3或或7 7整除的所有自然数的倒数之和。整除的所有自然数的倒数之和。分析:本例中要找到小于等于分析:本例中要找到小于等于100100的每一个整的每一个整数,即用变量数,即用变量i i从从1 1到到100100循环,判断条件能否循环,判断条件能否被被3 3或者被或者被7

60、 7整除即整除即i%3=0|i%7=0i%3=0|i%7=0,最后求得,最后求得符合要求的倒数的累加和符合要求的倒数的累加和. . 语言程序设计55第第5 5章章 循环结构程序设计循环结构程序设计#include#includemain( )main( ) int i; int i; double sum=0.0; double sum=0.0; for(i=1;i=100;i+) for(i=1;i=100;i+) if(i%3=0 | i%7=0) if(i%3=0 | i%7=0) sum+=1.0/i; sum+=1.0/i; printf(“sum=%f”,sum); printf(“sum=%f”,sum); 运行结果:运行结果:sum=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论