计算机设计语言(c语言)4_第1页
计算机设计语言(c语言)4_第2页
计算机设计语言(c语言)4_第3页
计算机设计语言(c语言)4_第4页
计算机设计语言(c语言)4_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、4 循环结构程序设计循环结构程序设计 循环结构是结构化程序循环结构是结构化程序设计的基本结构之一。设计的基本结构之一。 4.1 蜡烛燃烧之谜蜡烛燃烧之谜一、提出问题蜡烛燃烧之谜。苏联著名数学家R.H.别莱利曼在他的书中记录了一道题目:蜡烛燃烧之谜。题目是这样的:房间里电灯突然熄灭:保险丝烧断了!我点燃了书桌上备用的两支蜡烛,在烛光下继续工作,直到电灯修好。第二天,需要确定昨晚断电共有多长时间。我当时没有注意昨晚断电的时间,也没有注意什么时间来的电。我也不知道蜡烛的原始长度。我只记得两支蜡烛是一样长的,但粗细不同,其中粗的一支能用5小时(完全用完),细的一支能用4小时。两支蜡烛都是经我点燃的新烛

2、。我没有找到蜡烛的剩余部分,家里人把它扔掉了。“残烛几乎都烧光了,不值得保留”。家里人这样回答。“你还记得残余部分有多长吗?”“两支残烛不一样。一支残烛的长度等于另一支的4倍。”我无法知道得更多了,只好根据以上资料,推算出停电的时间。例如:例如: x=y=1 ; while (y10) +y ; x+=y ;printf(x=%d, y=%dn, x, y);4.1.2 while 语句语句while 语句语句 用来实现用来实现“ 当型循环当型循环” 结构。结构。 一般形式一般形式: while (表达式表达式) 语句语句“语句语句” 部分就是部分就是循环体循环体, while循环循环 先判断

3、表达先判断表达式的值,后执行语句。式的值,后执行语句。当当“表达式表达式”为为 非非0 值时值时执行该语句,直到执行该语句,直到“表达表达式式”为为 0 时跳出循环。时跳出循环。表达式表达式语句语句非非00流程图:流程图:注意注意: 如果语句部分包含一个以上的语句,应该如果语句部分包含一个以上的语句,应该用复合语句用复合语句 “ ” 的形式。的形式。1.在循环体中应有使循环趋于结束的语句。在循环体中应有使循环趋于结束的语句。x=11, y=10 x=55, y=10例例 2 用用 while 语句构成循环,求语句构成循环,求 1+2+3+.+100。main() int i , sum=0;

4、i=1; while (i=100) sum=sum+i; i+; printf(%dnsum);i=1;sum=0;i=100 sum=sum+i ; i+ ;假真流程图流程图循环体中有两个语句,要用循环体中有两个语句,要用 括起来。括起来。其中其中 i+ 是改变条件表达式值的语句。是改变条件表达式值的语句。4-2 从键盘输入一系列数,求其和,直至连续两次输入从键盘输入一系列数,求其和,直至连续两次输入的数等于的数等于0为止。为止。 #include void main() int n = 3;float x, y, s = 0;printf( 请输入第请输入第1个数:个数:);scanf(

5、%f, &x);printf( 请输入第请输入第2个数:个数:);scanf(%f, &y);s = y;while ( x | y ) s = s + x; y = x; printf( 请输入请输入%d个数个数:, n+ );scanf(%f, &x);printf( ns=%f, s);蜡烛燃烧之谜程序解析蜡烛燃烧之谜程序解析#include void main() float x=0, a, b; a=1-x / 5; b=4*( 1-x / 4 ); while (a b) x = x + 0.0001; a = 1-x / 5; b = 4 * ( 1- x / 4 ); prin

6、tf( 停电时间:%f小时。, x );4.2 口令程序口令程序1. 提出问题口令程序。用户进入某系统,有3次键盘回答口令的机会。3次中任何一次回答正确均可进入系统(显示“You are welcome!”),否则不能进入系统(显示“Sorry!”)。 (本例设口令是6位自然数123456)2 运行结果Please input password:12345Please input password:12346Please input password:12347Sorry!或者:Please input password:123456You are welcome! 4.2 do-while

7、语句语句do-while 语句用来实现语句用来实现 “直到型直到型” 循环结构循环结构。 一般形式一般形式: do 循环体语句循环体语句 while (表达式表达式) ; 循环体语句循环体语句表达式表达式真真假假流程图流程图 执行过程:先执行一次指定的执行过程:先执行一次指定的 “循环体语句循环体语句”,然后判别,然后判别 “表达式表达式”,当,当 “表达式表达式”的值为的值为 非非0 时,返回重新执行时,返回重新执行 “循环体语句循环体语句”,如此,如此反复,直到表达式的值等于反复,直到表达式的值等于0为止,此时循环结束。为止,此时循环结束。 即即do-while 语句至少执行一次循环体。语

8、句至少执行一次循环体。注意:注意: 当当“语句语句”部分包含一个以上的语句时,应该用复合语句部分包含一个以上的语句时,应该用复合语句 的形式的形式; 在循环体中应有使循环趋于结束的语句。在循环体中应有使循环趋于结束的语句。例例3 用用 do-while 语句构成循环语句构成循环,求求 1+2+3+.+100main() int i, sum=0; i=1; do sum=sum+i; i+; while(i=100) ; printf(%dn, sum) ; i=1;sum=0; sum=sun+i ; i+ ; i=100 真假do-while 语句的语句的while 语句后要语句后要加加分

9、号分号 “ ;”。while 语句可能一次也不执行循环体语句可能一次也不执行循环体, 但但do-while 语句至语句至少执行一次循环体。少执行一次循环体。 对于同一个问题对于同一个问题, 既可以用既可以用 while 语句语句 , 也可以用也可以用 do-while 语句处理。语句处理。 do-while 结构可以转换成结构可以转换成while 结构,结构, 即即do-while 结构由一个语句和一个结构由一个语句和一个while 结构构成。结构构成。 循环体语句循环体语句表达式表达式非00表达式表达式语句语句非非00语句语句为一个为一个while 结构结构说明:说明:在一般情况下,用在一般

10、情况下,用while语句和用语句和用do-while处理同一问题处理同一问题时,若二者的时,若二者的循环体部分循环体部分是一样的是一样的, 它们的结果也一样。它们的结果也一样。 但是如果但是如果while 后面的表达式一后面的表达式一 开始就为假(开始就为假(0),两种循环的结果是不同的。),两种循环的结果是不同的。 亦即当亦即当while 后面的表达式第一次的值为真(后面的表达式第一次的值为真(非非0)时,两种循环得到的结果相同。否则结果不同。)时,两种循环得到的结果相同。否则结果不同。例例6.4 while和和do-while循环的比较。循环的比较。(2) main( ) int sun=

11、0, i; scanf(%d,&i) ;do sum=sum+i ; i+ ; while(i=10) ;printf(sum=%dn,sum) ; (1) main( ) int sum=0, i ; scanf(“%d”,&i) ; while(i=10) sum=sum+i ; i+ ; printf(“sum=%dn”,sum) ; 运行情况如下:运行情况如下: 1 再运行一次:再运行一次: 12 (1) sum=0 (2) sum=12sum=55 例 4 2 口令程序。用户进入某系统,有3次键盘回答口令的机会。3次中任何一次回答正确均可进入系统(显示“You are welcome

12、!”),否则不能进入系统(显示“Sorry!”)。 (本例设口令是6位自然数123456) 1. 分析 本例中输入密码和判断密码操作至少要执行一次,适于用“do-while”实现。循环控制条件最好选择用户回答口令的次数。2. 源代码#include void main() long password; int i=0,flag=0; do printf(nPlease input password: );scanf(%ld,&password);i+;if (password=123456) flag=1; break; while(i3); if (flag=1) printf(n Welc

13、ome!); else printf(n Sorry!); /* 一定是三次都答错 */一般形式一般形式: for ( 表达式表达式1; 表达式表达式2; 表达式表达式3 ) 语句语句执行过程执行过程: 1. 求解表达式求解表达式1; 2. 求解表达式求解表达式2: 如果值为真如果值为真(非非0), 则执行则执行“语句语句”部分;如果值为假部分;如果值为假( 0 ),则结束循环,则结束循环; 3. 当表达式当表达式2为真时为真时, 在执行了在执行了“语句语句”部分部分后后, 求解表达式求解表达式3; 4. 转到第转到第2步继续执行。步继续执行。说明:当说明:当“语句语句”部分包含一个以上的语句

14、时部分包含一个以上的语句时,应该用复合语句,应该用复合语句 “ ” 的形式。的形式。 4.3 for 语句语句 for 语句语句既可用于循环次数已经确定的情况,也可用于循环次数不既可用于循环次数已经确定的情况,也可用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替确定而只给出循环结束条件的情况,它完全可以代替while语句。语句。 求解表达式求解表达式1表达式表达式2求解表达式求解表达式 1语句语句 求解表达式求解表达式3求解表达式求解表达式3 for语句的语句的下一条语句下一条语句 for 语句的语句的下一条语句下一条语句真真假假for 语句最常用的形式语句最常用的形式: for

15、( 循环变量赋初值循环变量赋初值 ; 循环结束条件循环结束条件 ; 循环变量增值循环变量增值 ) 语句语句main() int i, sum=0; for (i=1;i=100;i+) sum=sum+i ; printf(%d,sum) ;例如:用例如:用 for 语句构成循环语句构成循环, 求求1+2+3+.+100。i=100i=1语句语句 i+ for语句的下一条语句 for语句的语句的下一条语句下一条语句for 循环语句也可以写为循环语句也可以写为while 语句形式:语句形式:for ( 表达式表达式1; 表达式表达式2; 表达式表达式3 ) 语句语句表达式表达式 1 ;while

16、( 表达式表达式 2 ) 语句语句 ; 表达式表达式 3 ;例如:例如:for(i=1 ; i=100 ; i+) sum=sum+i ;i=1 ;while(i=100) sum=sum+i ; i+ ;如果如果 “表达式表达式2” 省略,即不判断循环条件,则认为省略,即不判断循环条件,则认为 表达表达式式 2 始终为真,此时循环无法终止(始终为真,此时循环无法终止(死循环)死循环)。 for( i=1 ; ; i+) sum+=i ;如果如果 “表达式表达式3” 省略,则程序中必须有保证循环能正常省略,则程序中必须有保证循环能正常结束的措施。结束的措施。:若循环变量在若循环变量在 for

17、语句之前已经赋初值,则语句之前已经赋初值,则for 语句的一语句的一般形式中的般形式中的“表达式表达式1”可以省略,但是可以省略,但是“;” 不能省略。不能省略。 例如:例如: i=1 ; for( ; i=100 ; i+) sum+=i ;for( i=1 ; i=100 ; ) sum+=i ;i+ ; 三个表达式都省略,如三个表达式都省略,如 for( ; ; ) 语句语句相当于相当于while(1) 语句语句即不设初值,不判断条件(认为表达式即不设初值,不判断条件(认为表达式2为真),循环为真),循环变量不增值,无终止地执行循环体变量不增值,无终止地执行循环体 (死循环死循环) 。可

18、以省略表达式可以省略表达式1 和和 表达式表达式3,只有表达式,只有表达式2,即只给循环,即只给循环条件。条件。for( ; i=100 ; )while (i=100) sum=sum+i ;相当于相当于 sum=sum+i;i+ i+ 在这种情况下,在这种情况下,for语句完全等同于语句完全等同于while语句。语句。 可见,可见,for 语句比语句比while 语句功能强,除了可以给出循环语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。条件外,还可以赋初值,使循环变量自动增值等。“表达式表达式1” 既可以是设置循环变量初值的赋值表达式,既可以是设置循环变量初值的赋

19、值表达式,也可以是与循环变量无关的其它表达式。如也可以是与循环变量无关的其它表达式。如i=1 ;for(sum=0 ; i=100 ; i+) sum=sum+i ;v “表达式表达式1” 和和 “表达式表达式3” 可以是一个简单的表达式可以是一个简单的表达式,也可以是,也可以是逗号表达式。逗号表达式。例如例如: for (sum=0, i=1 ; i=100 ; i+) sum=sum+i;for (i=1 , j=100 ; i=j ; i+, j- -) k+=i+j;v 在逗号表达式内按在逗号表达式内按自左至右自左至右顺序求解,整个逗号表达顺序求解,整个逗号表达式的值为其中最右边的表达

20、式的值。如式的值为其中最右边的表达式的值。如for (sum=0, i=1 ; i=100 ; i+,i+) sum=sum+i;相当于相当于 for (sum=0, i=1 ; i=100 ; i+=2) sum=sum+i;“表达式表达式2”一般是关系表达式或逻辑表达式,但也可以是一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式数值表达式或字符表达式, 只要其值非只要其值非0,就执行循环体。,就执行循环体。分析:分析:for( i=0; (c=getchar( ) )!=n; i+=c ) ;及及for( ; (c=getchar( ) )!=n ; ) putchar(c)

21、 ;由于由于 for 语句功能很强,尽量按语句功能很强,尽量按 for 语句的规范来写,也语句的规范来写,也尽量不要把与循环控制无关的内容放到尽量不要把与循环控制无关的内容放到 for 语句中。语句中。main() int i=1, mul=1, n; scanf(%d,&n); while (i=n) mul=mul*i; i+; printf(%d ,mul);while语句语句构成的循环构成的循环main() int i=1, mul=1, n; scanf(%d,&n); do mul=mul*i; i+; while(i=n); printf(%d,mul);do-while语句语句

22、构成的循环构成的循环main() int i, mul=1; scanf(%d,&n); for (i=1;i=n;i+) mul=mul*i; printf(%d,mul);for 语句语句构成的循环构成的循环例例. 分别用分别用while、do-while、for 语句构成的循环求语句构成的循环求n!。!。循环的嵌套循环的嵌套三种循环(三种循环( while 循环、循环、do-while 循环和循环和 for 循环)可以循环)可以互相嵌套。互相嵌套。(1) while( ) do for( ; ;) : : while( ) do for( ; ;) : : : : : while( )

23、; while( ) ; (2) while( ) do( ) for( ; ;) : : : do for(;) while( ) while( ); . . : while( ) ; : 一个循环体内又包含另一个完整的循环结构时,称为循环的嵌套。内嵌的循一个循环体内又包含另一个完整的循环结构时,称为循环的嵌套。内嵌的循环中还可以嵌套循环,即循环嵌套可以多于一层,这就是环中还可以嵌套循环,即循环嵌套可以多于一层,这就是多层循环嵌套。多层循环嵌套。几种循环的比较几种循环的比较 共有共有四四种循环结构种循环结构( if 与与 goto 、 while、do-while 、for )四种循环都可以

24、处理同一问题,一般情况下它们可以互相代替。但是四种循环都可以处理同一问题,一般情况下它们可以互相代替。但是不提倡用不提倡用 goto型循环。型循环。while 和和 do-while 循环,在循环,在while 后面指定循环条件,而使循环趋于结后面指定循环条件,而使循环趋于结束的语句包含在循环体中。束的语句包含在循环体中。 for 循环可以在循环可以在“表达式表达式3”中包含使循环趋于结束的操作,甚至可以将中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到循环体中的操作全部放到“表达式表达式3”中。因此,中。因此,for 语句的功能更强,语句的功能更强,凡是用凡是用while 循环能

25、完成的,用循环能完成的,用for 循环都能实现。循环都能实现。用用while 和和 do-while循环时,循环变量初始化应在循环时,循环变量初始化应在 while 和和 do-while之之前,前,for 循环可以在循环可以在“表达式表达式1” 中实现循环变量的初始化。中实现循环变量的初始化。while 循环先判断,后执行;循环先判断,后执行; do-while 循环先执行,后判断;循环先执行,后判断; for 循环先判断,后执行。循环先判断,后执行。1.对对 while循环、循环、do-while循环、循环、for 循环,循环,可以用可以用 break 语句跳出循环语句跳出循环,还可以用还

26、可以用 continue 语句结束本次循环。语句结束本次循环。而对用而对用goto语句和语句和if 语句构成语句构成的循环不能用的循环不能用continue 语句和语句和break 语句进行控制。语句进行控制。main() int i,sum=0; i=1;loop: if (i=100) sum=sum+i; i+; goto loop; printf(%d,sum);goto 语句语句构成的循环构成的循环main() int i,sum=0; i=1; while (i=100) sum=sum+i; i+; printf(%d ,sum);while语句语句构成的循环构成的循环main(

27、) int i,sum=0; i=1; do sum=sum+i; i+; while(i=100); printf(%d,sum);do-while语句语句构成的循环构成的循环main() int i, sum=0; for (i=1; i100) break;for(r=1;r=10;r+)area=pi*r*r;printf(%fn, area);r=1, area=3.14r=2, area=12.56r=3, area=28.26r=4, area=50.24r=5, area=78.5r=6, area=113.04 continue 语句语句 语句的一般形式语句的一般形式: co

28、ntinue ; 作用作用: 结束本次循环,结束本次循环, 即跳过循环体中的即跳过循环体中的 continue 之后之后的其它语句,而转到进行下一次是否执行循环的判断。的其它语句,而转到进行下一次是否执行循环的判断。break 语句的一般形式:语句的一般形式: break ;注意注意: break 语句只能用于循环语句和语句只能用于循环语句和 switch 语句,不语句,不能用于其它语句。能用于其它语句。break语句和语句和continue语句的区别语句的区别: continue 语句语句只结束本次循环只结束本次循环,然后进行是否执行下,然后进行是否执行下一次循环的判断,而不是终止整个循环的

29、执行。一次循环的判断,而不是终止整个循环的执行。 break语句语句结束整个循环过程结束整个循环过程,不再进行条件判断。,不再进行条件判断。表达式表达式1语句语句 语句语句while语句的语句的下一条语句下一条语句表达式表达式2假假真真真真假假continue表达式表达式1语句语句 语句语句while语句的语句的下一条语句下一条语句表达式表达式2假假真真真真假假breakwhile(表达式表达式1) if (表达式表达式2)continue; while(表达式表达式1) if (表达式表达式2) break; 比较下面两个循环结构:比较下面两个循环结构:main( ) int n ; for

30、( n=100 ; n=200 ; n+) if(n%3=0) break ;printf(%d,n) ; 改写例改写例6.5如下,结果?如下,结果?只输出只输出100,101。因为因为102%3= =0,则则break 跳出循环。跳出循环。例例5 输出输出 100-200 之间的不能被之间的不能被 3 整除的数。整除的数。main( ) int n; for (n=100 ; nb)? a+ : b+ ) a%=5 ; A) 15 B) 0 C) 1 D) 16思考练习题:思考练习题:1. B2. D3. C4. 执行下列程序段后,执行下列程序段后,n 值为(值为( )int n=0 , a

31、=1 ;switch(a) case 1: n+=1 ; case 2: n+=2 ; break ; default : n+=3 ; A) 1 B) 2 C) 3 D) 65. 执行以下程序后,执行以下程序后,s 值为(值为( )int n=1 , s=0 ;while(+n10) if( ! (n%5) break ; s+=n ; A) 1 B) 9 C) 25 D) 以上均不是以上均不是6. 以下程序循环几次(以下程序循环几次( ) int x= -1 ;do x=x*x ; while( ! x) ; A) 1 B) 2 C) 死循环死循环 D) 有语法错误有语法错误5. B4.

32、C6. A#include main( ) int s; float n, t, pi; t=1; n=1; s=1; pi=0; while ( fabs(t)=1.0e-6 ) pi=pi+t; n=n+2; s= -s; t=s/n; /*若若n定义为定义为int ?*/ pi=pi*4; printf(%fn,pi);变量说明:变量说明:pi 级数和级数和t 一般项一般项n 分母分母s 符号符号 3.3.9 程序举例程序举例【例【例 6】 用公式用公式求求的近似值,的近似值, 直到最后一项的绝对值直到最后一项的绝对值=10-6例例7 求求 Fibonacci 数列数列: 1, 1, 2

33、, 3, 5, 8, . 的前的前40个数。个数。 F1=1 (n=1) F2=1 (n=2) Fn=Fn-1 + Fn-2 (n=3)兔子问题:有一对兔子,从出生后第兔子问题:有一对兔子,从出生后第3个月起每个月都生个月起每个月都生一对兔子,小兔子长到第一对兔子,小兔子长到第3个月后每个月又生一对兔子。个月后每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少?假设所有兔子都不死,问每个月的兔子总数为多少?第n个月小兔子对数中兔子对数老兔子对数兔子总数110012010131012411135212563238753513当月小兔子数为当月小兔子数为下月中兔子数;下月中兔子数;当月中兔子数加当月中兔子数加上老兔子数为下上老兔子数为下月老兔子数;月老兔子数;老兔子生出相同老兔子生出相同数目的小兔子。数目的小兔子。否否结束结束i=40是是f3=f2+f1;输出输出 f3; f1=f2; f2=f3;i=i+1i=3开始开始置初值置初值f1=1; f2=1;main() long int f1,f2,f3; int i; f1=1; f2=1; printf(%12ld%12ld,f1,f2); for (i=3; i=40; i+

温馨提示

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

评论

0/150

提交评论