已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4 循环结构程序设计,循环结构是结构化程序设计的基本结构之一。,4.1 蜡烛燃烧之谜,一、提出问题 蜡烛燃烧之谜。苏联著名数学家R.H.别莱利曼在他的书中记录了一道题目:蜡烛燃烧之谜。题目是这样的: 房间里电灯突然熄灭:保险丝烧断了!我点燃了书桌上备用的两支蜡烛,在烛光下继续工作,直到电灯修好。 第二天,需要确定昨晚断电共有多长时间。我当时没有注意昨晚断电的时间,也没有注意什么时间来的电。我也不知道蜡烛的原始长度。我只记得两支蜡烛是一样长的,但粗细不同,其中粗的一支能用5小时(完全用完),细的一支能用4小时。两支蜡烛都是经我点燃的新烛。我没有找到蜡烛的剩余部分,家里人把它扔掉了。 “残烛几乎都烧光了,不值得保留”。家里人这样回答。 “你还记得残余部分有多长吗?” “两支残烛不一样。一支残烛的长度等于另一支的4倍。” 我无法知道得更多了,只好根据以上资料,推算出停电的时间。,例如: x=y=1 ; while (y10) +y ; x+=y ; printf(“x=%d, y=%dn“, x, y);,4.1.2 while 语句,while 语句 用来实现“ 当型循环” 结构。 一般形式: while (表达式) 语句,“语句” 部分就是循环体, while循环 先判断表达式的值,后执行语句。 当“表达式”为 非0 值时执行该语句,直到“表达式”为 0 时跳出循环。,注意: 如果语句部分包含一个以上的语句,应该用复合语句 “ ” 的形式。 在循环体中应有使循环趋于结束的语句。,x=11, y=10,x=55, y=10,例 2 用 while 语句构成循环,求 1+2+3+.+100。,main() int i , sum=0; i=1; while (i=100) sum=sum+i; i+; printf(“%dn“sum); ,循环体中有两个语句,要用 括起来。 其中 i+ 是改变条件表达式值的语句。,4-2 从键盘输入一系列数,求其和,直至连续两次输入的数等于0为止。,#include void main() int n = 3; float x, y, s = 0; printf( “请输入第1个数:“); scanf(“%f“, ,4.2 do-while 语句,do-while 语句用来实现 “直到型” 循环结构。 一般形式: do 循环体语句 while (表达式) ;,执行过程:先执行一次指定的 “循环体语句”,然后判别 “表达式”,当 “表达式”的值为 非0 时,返回重新执行 “循环体语句”,如此反复,直到表达式的值等于0为止,此时循环结束。 即do-while 语句至少执行一次循环体。 注意: 当“语句”部分包含一个以上的语句时,应该用复合语句“ “的形式; 在循环体中应有使循环趋于结束的语句。,例3 用 do-while 语句构成循环,求 1+2+3+.+100,main() int i, sum=0; i=1; do sum=sum+i; i+; while(i=100) ; printf(“%dn“, sum) ; ,do-while 语句的while 语句后要加分号 “ ;”。 while 语句可能一次也不执行循环体, 但do-while 语句至少执行一次循环体。 对于同一个问题, 既可以用 while 语句 , 也可以用 do-while 语句处理。 do-while 结构可以转换成while 结构, 即do-while 结构由一个语句和一个while 结构构成。,说明:,在一般情况下,用while语句和用do-while处理同一问题时,若二者的循环体部分是一样的, 它们的结果也一样。 但是如果while 后面的表达式一 开始就为假(0),两种循环的结果是不同的。 亦即当while 后面的表达式第一次的值为真(非0)时,两种循环得到的结果相同。否则结果不同。,例6.4 while和do-while循环的比较。,(2) main( ) int sun=0, i; scanf(“%d“, ,(1) main( ) int sum=0, i ; scanf(“%d”, ,运行情况如下: 1 ,再运行一次: 12 ,(1) sum=0 (2) sum=12,sum=55,例 42 口令程序。用户进入某系统,有3次键盘回答口令的机会。3次中任何一次回答正确均可进入系统(显示“You are welcome!”),否则不能进入系统(显示“Sorry!”)。 (本例设口令是6位自然数123456) 1. 分析 本例中输入密码和判断密码操作至少要执行一次,适于用“do-while”实现。循环控制条件最好选择用户回答口令的次数。,2. 源代码 #include void main() long password; int i=0,flag=0; do printf(“nPlease input password: “); scanf(“%ld“, /* 一定是三次都答错 */ ,一般形式: for ( 表达式1; 表达式2; 表达式3 ) 语句,执行过程: 1. 求解表达式1; 2. 求解表达式2: 如果值为真(非0), 则执行“语句”部分;如果值为假( 0 ),则结束循环; 3. 当表达式2为真时, 在执行了“语句”部分后, 求解表达式3; 4. 转到第2步继续执行。 说明:当“语句”部分包含一个以上的语句时,应该用复合语句 “ ” 的形式。,4.3 for 语句,for 语句既可用于循环次数已经确定的情况,也可用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。,for 语句最常用的形式: for ( 循环变量赋初值 ; 循环结束条件 ; 循环变量增值 ) 语句,main() int i, sum=0; for (i=1;i=100;i+) sum=sum+i ; printf(“%d“,sum) ; ,例如:用 for 语句构成循环, 求1+2+3+.+100。,for 循环语句也可以写为while 语句形式:,如果 “表达式2” 省略,即不判断循环条件,则认为 表达式 2 始终为真,此时循环无法终止(死循环)。 for( i=1 ; ; i+) sum+=i ;,如果 “表达式3” 省略,则程序中必须有保证循环能正常结束的措施。,说明: 若循环变量在 for 语句之前已经赋初值,则for 语句的一般形式中的“表达式1”可以省略,但是“;” 不能省略。 例如: i=1 ; for( ; i=100 ; i+) sum+=i ;,for( i=1 ; i=100 ; ) sum+=i ; i+ ; ,三个表达式都省略,如 for( ; ; ) 语句 相当于 while(1) 语句 即不设初值,不判断条件(认为表达式2为真),循环变量不增值,无终止地执行循环体 (死循环) 。,可以省略表达式1 和 表达式3,只有表达式2,即只给循环条件。 for( ; i=100 ; ) while (i=100) sum=sum+i ; 相当于 sum=sum+i; i+ i+ ,在这种情况下,for语句完全等同于while语句。 可见,for 语句比while 语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。,“表达式1” 既可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其它表达式。如 i=1 ; for(sum=0 ; i=100 ; i+) sum=sum+i ;,“表达式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;,在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为其中最右边的表达式的值。如 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) ;,由于 for 语句功能很强,尽量按 for 语句的规范来写,也尽量不要把与循环控制无关的内容放到 for 语句中。,例. 分别用while、do-while、for 语句构成的循环求n!。,循环的嵌套,三种循环( while 循环、do-while 循环和 for 循环)可以互相嵌套。 (1) while( ) do for( ; ;) : : while( ) do for( ; ;) : : : : : while( ) ; while( ) ; (2) while( ) do( ) for( ; ;) : : : do for(;) while( ) while( ); . : while( ) ; : ,一个循环体内又包含另一个完整的循环结构时,称为循环的嵌套。内嵌的循环中还可以嵌套循环,即循环嵌套可以多于一层,这就是多层循环嵌套。,几种循环的比较,共有四种循环结构( if 与 goto 、 while、do-while 、for ) 四种循环都可以处理同一问题,一般情况下它们可以互相代替。但是不提倡用 goto型循环。 while 和 do-while 循环,在while 后面指定循环条件,而使循环趋于结束的语句包含在循环体中。 for 循环可以在“表达式3”中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到“表达式3”中。因此,for 语句的功能更强,凡是用while 循环能完成的,用for 循环都能实现。 用while 和 do-while循环时,循环变量初始化应在 while 和 do-while之前,for 循环可以在“表达式1” 中实现循环变量的初始化。 while 循环先判断,后执行; do-while 循环先执行,后判断; for 循环先判断,后执行。 对 while循环、do-while循环、for 循环,可以用 break 语句跳出循环,还可以用 continue 语句结束本次循环。而对用goto语句和if 语句构成的循环不能用continue 语句和break 语句进行控制。,比较:四种循环 求 1+2+3+.+100。,break语句和continue,break 语句 break 语句除了可以用来跳出 switch 结构之外,还可以用来从循环体内 跳出循环,即提前结束循环,接着执行循环下面的语句。如,当 r=6时,area大于100,这时执行break语句,提前结束循环,即不再继续执行其余的几次循环。,if(area100) break;,for(r=1;r=10;r+) area=pi*r*r; printf(“%fn“, area); ,r=1, area=3.14 r=2, area=12.56 r=3, area=28.26 r=4, area=50.24 r=5, area=78.5 r=6, area=113.04,continue 语句 语句的一般形式: continue ; 作用: 结束本次循环, 即跳过循环体中的 continue 之后的其它语句,而转到进行下一次是否执行循环的判断。,break 语句的一般形式: break ;,注意: break 语句只能用于循环语句和 switch 语句,不能用于其它语句。,break语句和continue语句的区别: continue 语句只结束本次循环,然后进行是否执行下一次循环的判断,而不是终止整个循环的执行。 break语句结束整个循环过程,不再进行条件判断。,只输出100,101。因为102%3= =0,则break 跳出循环。,例5 输出 100-200 之间的不能被 3 整除的数。,main( ) int n; for (n=100 ; n=200 ; n+) if (n%3=0) continue; printf(“%dn“,n); ,当n 能被3 整除时,执行continue语句,结束本次循环(即跳过printf函数语句), 只有n不能被3整除时才执行printf函数。,1. 下列while 循环,将执行几次 ( ) int i=4 ; while( i- - ) printf(“%d”, i ) ; A) 3 B) 4 C) 0 D) 无限次 2. 下列程序段执行几次循环 ( ) int j=0 ; while( ! ( +j%3) break ; A) 2 B) 3 C) 6 D) 一次也不执行 3. 执行下列程序段后,a 值为( ) int a=15 , b= -1 ; if(ab)? a+ : b+ ) a%=5 ; A) 15 B) 0 C) 1 D) 16,思考练习题:,1. B,2. D,3. C,4. 执行下列程序段后,n 值为( ) int n=0 , a=1 ; switch(a) case 1: n+=1 ; case 2: n+=2 ; break ; default : n+=3 ; A) 1 B) 2 C) 3 D) 6 5. 执行以下程序后,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. B,4. C,6. 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, 3, 5, 8, . 的前40个数。 F1=1 (n=1) F2=1 (n=2) Fn=Fn-1 + Fn-2 (n=3) 兔子问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少?,当
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年留置导尿管项目资金需求报告代可行性研究报告
- 急救理论知识模拟试题(附答案)
- 散装白酒购销协议
- 合作开发房地产协议
- 常见建筑设备租赁合同书范例
- 建筑工程合作协议书示例
- 外汇借款合同书编写要点
- 合作劳动合同范本
- 耕地承包合同范本
- 考试命题保护协议
- CTF信息安全竞赛理论知识考试题库大全-下(多选、判断题)
- 女方放弃房产离婚协议书(2024版)
- 隋唐时期:繁荣与开放的时代 单元作业设计
- DL-T956-2017火力发电厂停(备)用热力设备防锈蚀导则
- 危险货物道路运输规则第5部分:托运要求(JTT617.5-2018)
- JT-T-939.2-2014公路LED照明灯具第2部分:公路隧道LED照明灯具
- DZ/T 0462.1-2023 矿产资源“三率”指标要求 第1部分:煤(正式版)
- 呕血窒息的护理查房
- 《纸质文物修复与保护》课件-30古籍的版式
- 工程防渗漏培训课件
- 钢结构厂房拆除施工方案案例
评论
0/150
提交评论