版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章 循环结构程序设计,郭 瑞,主要内容,6.1 循环语句概述6.2 while语句6.3 直到型循环do-while语句 6.4 for语句6.5 break语句与continue语句 6.6 应用举例,6.1 循环语句概述,求1100的累计和。 根据已有的知识,可以用“1+2+100”来求解,但显然很繁琐。现在换个思路来考虑: 首先设置一个累计器sum,其初值为0,利用sum += n来计算(n依次取1、2、100),只要解决以下3个问题即可: (1)将n的初值置为1; (2)每执行1次“sum += n”后,n增1; (3)当n增到101时,停止计算。此时,sum的值就是1100的累计
2、和。 根据已有的知识,单独实现每一步都不难。但是,由于需要经常使用这种重复计算结构(称为循环结构),C语言提供了3条循环语句来实现,以简化、并规范循环结构程序设计。 在语言中,可用以下语句实现循环: (1)用for语句。 (2)用do-while语句。 (3)用while语句,4)用goto语句和if语句构成循环。使用goto语句实现求解1100累计和的程序可以如下: main() int n=1, sum=0; loop: sum += n; n+; if (n=100) goto loop; printf(“sum=%dn”, sum); 其中“loop:”为语句标号(格式:标号: 语句行
3、),其命名遵循标识符命名规则。goto语句格式:goto 标号,功能为:使系统转向标号所在的语句行执行。 注意:结构化程序设计方法,主张限制使用goto语句。因为滥用goto语句,将会导致程序结构无规律、可读性差。 另外,从功能上说,for语句可完全代替当型循环语句while,所以该语句也不是必需的,6.2 while语句,while语句是支持“当型”循环控制结构的语句: 一般格式为: while (表达式) 语句 注意:语句部分可以是一个语句,也可以是多个语句。若有多个语句,则要用大括号“”将多个语句括起来构成复合语句,执行过程: 1)求解表达式。如果其值为非0,转2);否则转3)。 2)执
4、行循环体语句组,然后转1)。 3)执行while语句的下一条,案例 用while语句求1100的累计和。 main() int i=1,sum=0; /*初始化循环控制变量i和累计器sum*/ while( i=100 ) sum += i;/*实现累加*/ i+;/*循环控制变量i增1*/ printf(“sum=%dn”,sum); 程序运行情况如下:sum=5050,while语句的特点是先判断表达式的值,然后才决定是否执行循环体。如果一开始表达式的值就是0,那么循环体一次也不执行。例如程序段 i=10; while (i3) printf (“i=%dn”,i); 在这个while语句
5、中循环体一次也不执行。 注意:当表达式的值恒为非“0”时,则表示循环条件永远成立,循环就会无休止地执行下去,称这种情况称为“死循环”,在程序设计中必须设法排除。 例如: while (10),6.3 直到型循环do-while语句,Dowhile 结构: Do 语句 While (表达式) 先执行语句; 计算表达式的值.根据其值判断,为真(非0)时,返回重新执行; 根据表达式判断,其值为假(即0)时,结束 do-while语句,执行其后继语句 do-while 语句和while语句基本相似,执行do-while 语句时,它的循环体语句最少执行一次,而while语句的循环体语句可能一次也不被执行
6、。当while 后面的表达式的值第一次为 “真”时,两种循环结构得到的结果相同。否则,二者结果不同,案例 用do-while语句求解1100的累计和。 main() int i=1, sum=0; /*定义并初始化循环控制变量,以及累计器*/ do sum += i; /*累加*/ i+; while(i=100);/*循环继续条件:i=100*/ printf(“sum=%dn”,sum); do-while语句比较适用于处理:不论条件是否成立,先执行1次循环体语句组的情况,6.4 for语句,for语句的一般形式: for(表达式1;表达式2;表达式3;) 语句组 其中: 表达式1循环初始
7、化表达式,主要作用是对循环变量置初值。 表达式2控制是否继续循环的条件表达式,为真则继续循环,否则跳出循环。 表达式3对循环控制变量增量或减量的表达式。 语句循环体,循环过程中将被重复执行,在3条循环语句中,for语句最为灵活,不仅可用于循环次数已经确定的情况,也可用于循环次数虽不确定、但给出了循环继续条件的情况。 案例 求1100的累计和。main() int i,sum=0; /*将累加器sum初始化为0*/ for(i=1; i=100; i+) sum += i;/*实现累加*/ printf(sum=%dn,sum); 程序运行情况如下: sum=5050,几点说明: 1. for语
8、句for( i=0,j=1; jn结果完全相同,3.若省略表达式1和表达式3,则while语句与这样的for语句等价。 for(;表达式;) while(表达式) 语句 语句 4.若省略表达式2,则表达式循环条件永远成立,此时,会出现死循环,除非在循环体中用其他手段(如break,return或goto语句等)来结束循环。 例如:for(i=1; ;i+) printf(%n,i); if(i4) break; 5.若三个表达式全省略。 例如:for( ; ; ) 语句 等价于while(1) 语句 注意: for( ; ; ); 是一个死循环语句,6.对for语句的功能完全可以用while语
9、句来实现。 例如: for(表达式1;表达式2;表达式3) 语句 等价于: 表达式1; while(表达式2) 语句 表达式3; 7.表达式部分是一个逻辑量,除一般的关系(或逻辑)表达式外,也允许是数值(或字符)表达式。例:for(i=0;(c=getchar()!=n;i+=c,案例 求n的阶乘n!(n!=1*2*n)。 main() int i, n; long fact=1; /*将累乘器fact初始化为1*/ printf(“Input n: ”); scanf(“%d”, 程序运行情况如下:Input n: 55 ! = 120,6.5 break语句与continue语句,为了使循
10、环控制更加灵活,语言提供了break语句和continue语句。 1一般格式: break; continue; 2功能 (1)break:强行结束循环,转向执行循环语句的下一条语句。 (2)continue:对于for循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于while和do-while循环,跳过循环体其余语句,但转向循环继续条件的判定。 3break, continue主要区别: continue语句只终止本次循环,而不是终止整个循环结构的执行; break语句是终止循环,不再进行条件判断。 4说明 (1)break能用于循环语句和switch语句中,continue只能
11、用于循环语句中。 (2)循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关,6.6 应用举例,例 求Fibonacci数列(斐波纳契数列)的前40个数。该数列的生成方法为:F1=1,F2=1,Fn=Fn-1+Fn-2(n=3),即从第3个数开始,每个数等于前2个数之和. main() long int f1=1,f2=1; /*定义并初始化数列的头2个数*/ int i=1;/*定义并初始化循环控制变量i*/ for( ; i=20; i+ ) /*1组2个,20组40个数*/ printf(“%15ld%15ld”, f1, f2); /*输出当前的2个数*/
12、 if(i%2=0) printf(“n”); /*输出2次(4个数),换行*/ f1 += f2; f2 += f1; /*计算下2个数*/,例 输出10100之间的全部素数。所谓素数n是指,除1和n之外,不能被2(n-1)之间的任何整数整除。 算法设计要点: (1)显然,只要设计出判断某数n是否是素数的算法,外面再套一个for循环即可。 (2)判断某数n是否是素数的算法:根据素数的定义,用2(n-1)之间的每一个数去整除n,如果都不能被整除,则表示该数是一个素数。 判断一个数是否能被另一个数整除,可通过判断它们整除的余数是否为0来实现,参考源程序如下: #include stdio.h v
13、oid main() int i=11, j, counter=0; for( ; i=100; i+=2) /*外循环:为内循环提供一个整数i*/ for(j=2; j=i-1; j+) /*内循环:判断整数i是否是素数*/ if(i%j=0) /*i不是素数*/ break; /*强行结束内循环,执行下面的if语句*/ if(counter%10=0) /*每输出10个数换一行*/ printf(n); if(j=i) /*整数i是素数:输出,计数器加1*/ printf(%6d,i); counter+; printf(n);,例: 输入任意两个整数,求其最大公约数。 分析:假设输入两个
14、整数分别是和,最大公约数肯定位于之间(包含和)。所以用和依次除以8,7,6,5,4,3,2,1,最先能够整除的数,则为最大公约数。显然当除到时,后边的3,2,1就无需再除,循环中止,最大公约数为4,main() int a,b,min,i; printf(请输入整数a,b:); scanf(%d,%d,例 :求整数a和b的最小公倍数i。 如果i为a和b的最小公倍数,则必能被a和b整除,同时必须是自然数,所以其取值范围为1,方法一 i从1开始,依次增加1,直到第一个能被a和b整除为止,这个i就是a和b的最小公倍数。于是可编制程序如下: main( ) int a,b,i; printf(请输入两个整数:a,b); scanf(%d,%d,方法二令i从a开始,而不是从1开始,使i每次增加a而不是增加1,这就保证了i总是a的倍数。因此,每次只要判断i能否被b整除就可以了。一旦判断成立,i就是a和b的最小公倍数。程序如下: main( ) int a ,b,i; printf(请输入两个整数:a,b); scanf(%d,%d,作业: 1.用/41-1/3+1/5-1/7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贵州城市职业学院《房地产策划与运营》2023-2024学年第一学期期末试卷
- 淫羊藿培育项目可行性研究报告-淫羊藿市场需求持续增大
- 贵阳人文科技学院《聚合物改性原理及方法》2023-2024学年第一学期期末试卷
- 广州中医药大学《英语教师核心素养解读》2023-2024学年第一学期期末试卷
- 2025山东省安全员-B证考试题库附答案
- 2025年云南省安全员《A证》考试题库及答案
- 广州应用科技学院《建筑给排水与消防》2023-2024学年第一学期期末试卷
- 广州现代信息工程职业技术学院《增材制造技术》2023-2024学年第一学期期末试卷
- 2025黑龙江省建筑安全员C证(专职安全员)考试题库
- 2025年河南省建筑安全员-C证(专职安全员)考试题库
- 2024-2025学年人教版数学七年级上册期末复习卷(含答案)
- 2024年度中国PE、VC基金行业CFO白皮书
- 2023年南京市江宁区招聘教师考试真题
- 《中国民族史》重点笔记(期末)
- 中南大学《物联网原理及应用》2022-2023学年第一学期期末试卷
- 抓斗课件教学课件
- 第三方物流供应商准入与考核制度
- 基于Python的去哪儿网酒店数据采集与分析
- 文学描写辞典
- 2024年决战行测5000题言语理解与表达(培优b卷)
- 广东省深圳市2023-2024学年高一上学期期末考试物理试题(含答案)
评论
0/150
提交评论