版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 循环结构程序设计,掌握循环结构的基本特点 掌握3种循环语句:for语句、while语句和do-while语句 学会利用for语句、while语句和do-while语句设计简单的循环程序 了解goto语句构成的循环,5.1 案例:一次有趣的投币游戏,5.1.1 游戏规则,5.1.2 问题的解决,游戏的开始首先游戏中的投币数和投币箱我们分别用变量i和s来存储。游戏之前,执行以下两条语句: s = 0;/*投币箱开始必须是空的*/ i = 1;/*投币数开始是1*/ 游戏的进行每次的投币操作都可以看成以下两条语句的执行: s = s + i; /*第i个人投币i 枚*/ i = i + 1;
2、 /*第i+1个人准备投币*/ 将以上两条语句运行100次就完成了任务,就相当于投币100次。 游戏的结束 还有个重要的问题就是,游戏什么时候结束?很显然,当第100个人投币结束,游戏结束,即只要i=100,游戏继续进行,否则结束。,5.1.2 问题的解决,s=0; /* 盒子开始为空*/ i=1; /* 第1次投币*/ while(i=100) /* 100次投币*/ s=s+i; /* 投入i 枚硬币到s中*/ i=i+1; /* 计算下次投币数 */ ,循环结构语句,for 循环 while 循环 do-while 循环,5.2 while循环,while循环通过while语句实现。wh
3、ile循环又称为“当型”循环。 一般格式为: while (表达式) 语句 其中,括号后面的语句可以是一条语句,也可以是复合语句。它们都称为循环体。 while语句的执行过程为: (1) 计算并判断表达式的值。若值为0,则结束循环,退出while语句;若值为非0,则执行循环体 (2) 转步骤(1),5.2 while循环,流程图,【例5-1】计算s=1+2+3+100。,#include void main() int i,s; i=1;s=0; while(i=100) /* 循环控制 */ s=s+i; i=i+1; printf(s=%dn,s); ,注意:,循环体包括一条或多条语句,多
4、条语句必须用一对花括号“”括起来。 合理的循环是有限次循环。如果循环不能退出,则称为“死循环”,在程序设计中应该避免出现。 控制循环执行的次数因素包括循环中的循环条件、控制循环的主要变量的初值和终值以及每次变化的幅度等。 例如,上例中i有效地控制了循环的运行,i从1循环到100,每次加1,循环运行了100次,i也可以称为循环变量。,注意:,如果只有一个循环变量,而且循环变量每次有固定的增加和减少,则循环的次数可以用以下公式计算: 循环次数 = (终值-初值)/ 步长 + 1 步长为循环变量每次增加或减少的值,例如,上例循环次数为:(1001)/1 + 1,即100次。 步长可以为负数。,【例5
5、-2】计算1到100之间所有3的倍数的和。,#include void main() int i,s; i=3;s=0; while(i=99) s=s+i; i=i+3; printf(s=%dn,s); ,5.3 do-while循环,do-while循环,又称为“直到型”循环,用do-while语句来实现,其一般格式为: do 语句 while(表达式); do-while语句的执行过程为:先执行循环体语句再判断表达式的值。若值为0,则结束循环,退出do-while语句;若值为非0,则继续执行循环体。,5.3 do-while循环,流程图,【例5-3】计算s=1+2+3+100。,#in
6、clude void main() int i,s; i=1;s=0; do s=s+i; i=i+1; while(i=100); printf(s=%dn,s); ,do-while循环和while循环可以完成相同的任务。例如上面的程序都可以计算出1到100的数的和。 do-while循环的循环条件的判断在循环体的后面,所以和while循环有区别,例如下面的两个程序: int i=1;s=0;int i=1,s=0; while(i1)do s=s+i; s=s+i; i=i+1; i=i+1; while(i1); printf(s=%dn,s);printf(s=%dn,s); 左边的
7、程序运行结果为:s=0 右边的程序运行结果为:s=1。,5.4 for循环,for循环是循环的一种标准形式,通过for语句实现,其语法如下: for(;) 表达式,通常用于循环的初始化。包括循环变量的赋初值、其他变量的准备等; 表达式,循环的条件判断式,如果为空则相当于真值; 表达式,通常设计为循环的调整部分,主要是循环变量的变化部分; 循环体,由一条或多条语句构成,多条语句需要用一对花括号括起来。,5.4 for循环,【例5-4】计算s=1+2+3+100。,#include void main() int i,s; for(i=1,s=0;i=100;i+) s = s + i; prin
8、tf(s=%dn,s); ,for循环可以用以下while循环代替: ; while () ; ; 表达式可以是多个表达式构成的逗号表达式,例如i=1,s=0;。 、构成循环的控制部分,3个表达式之间用分号分隔。 表达式可以放在for循环的前面,但后面的分号不能少,例如: ;for(; );,表达式也可以省略,相当于始终为真值,从而构成无条件循环,循环将不能终止,需要采取其他措施。 表达式也可以省略,但作为循环变量的调整功能不能缺少,可以在循环体中完成,例如下面的for循环。 for (i=1,s=0;i=100;) s = s + i+; 如果表达式和都省略的话,相当于while循环,例如下
9、面的程序形式: i=1,s=0; for (;i=100;) /*相当于 while(i=100)*/ s = s + i+;,、均省略,即: for (;) ; 相当于while (1) ;。循环的所有控制和计算功能都必须在循环体中完成,这样的循环适合于随机退出循环程序的情况。 表达式也可以省略,但必须至少保留一个分号,即: for (;) ; 一个分号即是一条空语句。 如果、均省略,即如以下形式: for (;); 这将构成一个死循环。,5.5 案例:倒数的求和,#include void main() int i; double s=0; /*s需要定义为double型 */ for(i
10、=1;i=99;i=i+2)/* 先计算: */ s = s + 1.0/i;/* 1.0/i不能写成1/i*/ for(i=2;i=100;i=i+2)/* 再计算: */ s = s 1.0/i; printf(s=%fn,s); ,#include void main() int i; double s=0; /*s需要定义为double型 */ for(i=1;i=100;i+) if(i %2 = 1) s = s + 1.0/i;/*i是奇数时加1.0/i */ else s = s -1.0/i;/*i是偶数时减1.0/i */ printf(s=%lfn,s); ,#inclu
11、de void main() int i; double s; /*s需要定义为double型 */ double flag=1; /*double型的flag用于处理符号问题 */ for(i=1,s=0;i=100;i+) s = s+flag*1.0/i;/*用flag处理符号问题*/ flag = - flag;/*下一次flag由1变成-1,或者由-1变成1*/ printf(s=%lfn,s); ,5.6 循环嵌套,(1)while () while () (2)for (;) for (;) (3)do do while (); while ();,(4)while () for
12、 (;) (5)for (;) while (;) (6)do for (;); while ();,【例5-6】计算s=1+(1+2)+(1+2+3)+ (1+2+3+4) + (1+2+3+4+5),#include void main() int i,j,s; for(i=1,s=0;i=5;i+) for(j=1;j=i;j+) printf(“i=%d,j=%d,s=%dn”,i,j,s); s=s+j; printf(s=%dn,s); ,可以删除,【例5-6】计算s=1+(1+2)+(1+2+3)+ (1+2+3+4) + (1+2+3+4+5),5.7 break语句、cont
13、inue语句和goto语句,5.7.1 break语句 switch结构中可以用break语句跳出结构去执行switch语句的下一条语句。实际上,break语句也可以用来从循环体中跳出,常常和if语句配合使用。例如: for(i=1;i100)break; 当变量i100时退出循环。 break语句不能用于循环语句和switch语句之外的任何其他语句中。,5.6 break语句、continue语句和goto语句,5.7.2 continue语句 与break语句退出循环不同的是,continue语句只结束本次循环,接着进行下一次循环的判断,如果满足循环条件,继续循环,否则退出循环。 5.7.
14、3 goto语句 goto语句为无条件转向语句,形式为: goto 语句标号 语句标号用标识符表示,命名规则同变量名。,【例5.7】阅读下面程序,写出运行结果。,5.8 案例:阶乘的计算,【例5-8】计算s=12348。 #include void main() int i; long s; for(i=1,s=1;i=8;i+) s = s * i; printf(s=%ldn,s); ,计算阶乘的方法与求和差不多,但需要注意以下几点: 求和时累加器s初始化为0,求阶乘时累乘器初始化为1。 求和时用s=s+i,求阶乘时用s=s*i。 由于阶乘的值很容易放大,所以数据类型定义为long型,输出
15、的时候用%ld。,5.9 案例:输出星号组成的图形,5.9 案例:输出星号组成的图形,回顾:循环变量的功能 控制循环 作为循环体中算法的引用变量,for(i=0;i100;i+) s=s+i;,for(i=1;i=100;i+) s=s+i;,for(i=1,j=1;i=100;i+) s=s+j; j=j+1; ,for(i=0;i100;i+) s=s+i+1;,0+1+2+99,1+2+3+100,1+2+3+100,1+2+3+100,for(i=2,j=1;i=200;i=i+2) s=s+j; j=j+1; ,控制,控制 + 引用,5.9 案例:输出星号组成的图形,分析,for(i
16、=1;i=4;i+) /*控制输出4行*/ for(j=1;j=i-1;j+) printf();/*输出i-1个空格*/ for(j=1;j=2*i-1;j+) printf(*);/*输出2*i-1个星号*/ printf(n); /*输出一行后换行*/ ,5.9 案例:输出星号组成的图形,完整的程序 #include void main() int i,j; /*行数从1到5*/ for (i=1;i=5;i+) for (j=1;j=i-1;j+) printf();/*代表空格*/ for (j=1;j=i;j+) printf(*); printf(n); /* 每输出一行需要换行
17、 */ ,j循环从1到i-1,共i-1次循环,每次打印1个空格,共输出i-1个空格,j循环从1到i,共i次循环,每次打印1个星号,共输出i个星号,5.10 案例:计算100以内的素数之和,【分析】 从定义来判断,除了1和本身之外,没有其他因子,所以程序的任务是依次判断1到100之间所有的数是否为素数,如果是,将其累加。最后输出累加的和。 需要嵌套的循环,外循环控制产生1到100的数的循环,循环变量的值也正是内循环需要判断的对象;内循环首先判断当前的循环变量的值是否为素数,是则累加。循环结束后输出累加的和。,5.10 案例:计算100以内的素数之和,#include void main() in
18、t i,j,s=0; for(i=2;ii-1) /* i是素数,因为2 i-1没有i的因子 */ s=s+i; printf(%dn,s); 以上程序中j=i-1也可以改成j=i/2或j=sqrt(i)。,判断方法与实现,5.11 案例:计算Fibonacci数列前20项的和,Fibonacci数列的特点是:前两个数为1和1,从第3个数开始,每个数都是前面两个数的和,即: F1=1,F2=1 (n=1或2) Fn=Fn-1+Fn-2 (n=3) 很显然,Fibonacci数列依次为:1,1,2,3,5,8,13,21,34,5.11 案例:计算Fibonacci数列前20项的和,#inclu
19、de void main() int f1,f2,f; int i;long s; f1=f2=1;s=f1+f2; for(i=1;i=18;i+) f=f1+f2; /*得到一个新数*/ s=s+f; f1=f2; /*重置两个数*/ f2=f; printf(%ldn,s); ,5.12 循环的阅读和技巧,不管是什么循环语句,循环的准备循环条件循环的调整循环体这四个部分通常都存在,5.12 循环的阅读和技巧,变量跟踪,5.13 案例:日历的打印,【例5-11】输入2012年的某个月份,打印该月份的日历。 #include main() int i; int month; int firs
20、t=0;/*2012年的1月1日是星期天*/ int daysmonth;/*用来记录该月有多少天*/ printf(Year is 2012,Please input the month:); scanf(%d,5.13 案例:日历的打印,for(i=1;i=month;i+) switch(i) case 2 :daysmonth = 29;break; case 4: case 6: case 9: case 11:daysmonth = 30;break; default:daysmonth = 31;break;/*其他月份都是31天*/ if(imonth)/*及时调整该月的1号对应的星期,0表示星期天*/ first = (first+daysmonth) % 7; ,5.13 案例:日历的打印,printf(Year:2012,Month:%d,First:%dn,month,first);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 17980.18-2026农药田间药效试验准则第18部分:杀虫剂防治十字花科蔬菜黄条跳甲
- 2026西安西开精密铸造有限责任公司招聘2人考试备考题库及答案解析
- 2026锦泰财产保险股份有限公司四川分公司招聘罗江支公司经理等岗位5人笔试备考题库及答案解析
- 2026年重庆工程学院单招职业适应性测试题库附答案详细解析
- 2026上半年北京门头沟区事业单位招聘45人笔试备考题库及答案解析
- 2026中国移动万源分公司招聘27人考试备考题库及答案解析
- 2026广西北海银滩开发投资股份有限公司招聘1人笔试备考题库及答案解析
- 2026届湖南长沙明德旗舰第二学期期末初三联考语文试题含解析
- 2025-2026学年陕西省西安市陕西师大附中初三下期中考试(英语试题文)含解析
- 2026届湖南省长沙市雅实校初三下期第一次月英语试题含解析
- 2025上半年广西现代物流集团社会招聘校园招聘149人笔试参考题库附带答案详解
- 高值耗材点评制度
- 2025高考化学一轮复习之物质结构与性质(解答大题)
- 【浙科综合实践】四上第四课项目一、美味的中秋月饼
- 2025年上海市安全员C3证(专职安全员-综合类)证模拟考试题库及答案
- 人教版(PEP)五年级英语下册第一单元测试卷-Unit 1 My day 含答案
- ASTM-D3359-(附著力测试标准)-中文版
- 部编版三年级语文下册1-8单元主题阅读附答案
- 团队建设与管理 课件 第1章 团队概述
- DBJ15-22-2021-T 锤击式预应力混凝土管桩工程技术规程(广东省)
- 【铁路信号设计中的计算机联锁系统探究13000字(论文)】
评论
0/150
提交评论