c语言第4章循环结构

上传人:痛*** 文档编号:170661931 上传时间:2022-11-22 格式:PPT 页数:30 大小:549.02KB
收藏 版权申诉 举报 下载
c语言第4章循环结构_第1页
第1页 / 共30页
c语言第4章循环结构_第2页
第2页 / 共30页
c语言第4章循环结构_第3页
第3页 / 共30页
资源描述:

《c语言第4章循环结构》由会员分享,可在线阅读,更多相关《c语言第4章循环结构(30页珍藏版)》请在装配图网上搜索。

1、14.1 用格里高利公式求的近似值(while语句)第4章 循环结构例4-1 用格里高利公式求的近似值,要求精确到最后一项的绝对值小于10-5。循环结构:根据条件的判断对某一段程序重复执行构成循环的要素:循环体、条件判断、进入每次循环的准备循环语句:for(表达式1;表达式2;表达式3)语句循环变量控制循环次数:循环变量、初值、终值、增量71513114pi=pi+item(通项)item=flag*1.0/(2*i-1)flag=1,i=1,2,?分析循环结束条件:|item|=10-5pi=pi+item非00i=1i=i+1pi=04.1.1 程序解析item=1flag=1item=f

2、lag/(2*i-1)flag=-flagpi=4*pi输出pi停表达式1和表达式3不明确#include#include void main()int i,flag;double item,pi;pi=0;flag=1;i=1;item=1;for(;fabs(item)=1e-5;)pi=pi+item;i=i+1;flag=-flag;item=flag*1.0/(2*i-1);pi=pi*4;printf(pi=%fn,pi);省略了表达式1和表达式3#include#include void main()int i,flag;double item,pi;pi=0;flag=1;i=

3、1;item=1;while(fabs(item)=1e-5)pi=pi+item;i=i+1;flag=-flag;item=flag*1.0/(2*i-1);pi=pi*4;printf(pi=%fn,pi);for循环语句改用while循环语句44.1.2 while循环语句当型循环 当条件为真(非0)时做循环,否退出循环格式 while(表达式)语句其中 语句是一个语句或复合语句 表达式是条件,求值得真(非0)或假(0)操作 当表达式的值非0,执行语句后继续循 环;当表达式的值0,终止循环。表达式语句非00 loop:if(表达式)语句;goto loop;等价于 for(;表达式;)

4、语句;for(表达式1;表达式2;表达式3)语句;表达式1;while(表达式2)语句;表达式3;5例4-2 输入一批学生的成绩,统计平均分循环体 sum=sum+mark mark学生成绩循环判断 一批 mark=0 则mark为负值结束循环mark=0sum=sum+mark非00num=num+1num=0sum=0aver=sum/num输出aver停输入mark输入mark#include void main()int num;double mark,sum,aver;num=0;sum=0;scanf(%lf,&mark);while(mark=0)sum=sum+mark;num

5、=num+1;scanf(%lf,&mark);aver=sum/num;printf(aver=%fn,aver);64.2 统计一个整数的位数(dowhile语句)例4-3 从键盘读入一个整数,统计该数的位数。例如,输入1234,输出4;输入0,输出1。一个整数由多位数字组成,统计过程需要一位位地数利用 num/10-num,每统计一次减少一位数例 1234 整数 位数 1234 11234/10-123 2 123/10-12 3 12/10-1 4 1/10-0 不计判断条件 num!=0例 0整数 位数 0 1 0/10-0 不计先统计后判断条件 num!=0coun=coun+1非

6、00num=num/10coun=0输出coun停输入num74.2.1 程序解析#include void main()int coun,num;coun=0;scanf(%d,&num);docoun=coun+1;num=num/10;while(num!=0);printf(count=%dn,coun);num!=0coun=coun+1非00num=num/10coun=0输出coun停输入num84.2.2 dowhile循环语句直到型循环 做循环一直到条件不满足为止格式 do 语句 while(表达式);其中 语句是一个语句或复合语句 表达式是条件,求值得真(非0)或假(0)操

7、作 先做语句,然后判别表达式的值,如 非0则继续循环;否终止循环。表达式语句非00 loop:语句;if(表达式)goto loop;等价于94.2.3 循环语句的选择循环语句的选择:for:知道循环次数、能表示增量型、只要能表示三个表达式。最常用。while:当循环次数未知时,使用较多。先判断,后循环do-while:必须从循环体中才能得到循环变量的值,然后再判决 定是否进行下一次循环。先循环,后判断104.3 break语句和continue语句4.3.1 break语句 当break语句出现在while、dowhile、for语句的循环体内,执行 break时立即终止循环 表达式2语句非

8、00表达式1表达式3break例 半径为1100,要求打印圆 面积100时的半径和圆面积#include stdio.hvoid main()int r;float area;for(r=1;r100)break;printf(r=%d,area=%fn,r,area);表达式?0非0语句11例4-4输入一个正整数m,判断它是否为素数。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。素数:指只能被1和自身整除的正整数即 用m分别去除以2、3、m-1,全除不尽时,m是素数实际上除数的范围2,m/2,可以证明在2,mim/2输出no10#include stdio.hvoid main(

9、)int i,m;scanf(%d,&m);for(i=2;im/2)printf(YESn);else printf(NOn);break12#include stdio.hvoid main()int i,m;scanf(%d,&m);for(i=2;i=m/2;i+)if(m%i=0)printf(NO n);else printf(YES n);若改动程序#include stdio.hvoid main()int i,m;scanf(%d,&m);for(i=2;i=m/2;i+)if(m%i=0)printf(NO n);break;printf(YES n);未退出循环退出循环未

10、退出程序13要考虑边界值:1不是素数,2是素数#include stdio.hvoid main()int i,m;scanf(%d,&m);for(i=2;im/2)printf(YESn);else printf(NOn);m i im/2)1 2 21/2 -yes2 2 22/2 -yes#include stdio.hvoid main()int flag,m;scanf(%d,&m);if(m=1)flag=0;else if(m=2)flag=1;else int i;flag=1;for(i=2;i=m/2;i+)if(m%i=0)flag=0;break;if(flag)pr

11、intf(YESn);else printf(NOn);144.3.2 continue语句 格式 continue;当continue语句出现在while、dowhile、for语句的循环体内,执行 continue时终止本次循环,接着执行下一次循环表达式2语句非00表达式1表达式3continue表达式?0非0例 把100200之间的不能被3整 除的数输出#include stdio.hvoid main()int n;for(n=100;n 1 s=0i=4 4%2 -0 s=0+4=4i=3 3%2 -1 s=4i=2 2%2 -0 s=4+2=6i=1 1%2 -1 s=6i=0 循

12、环结束16循环嵌套 循环语句的循环体中又包含了另一个循环语句(1)while().While().(2)do .While().while()(3)for().While().4.4 循环嵌套17例4-6 求 s=1!+2!+3!+100!分析 1!+2!+3!+100!累加需要循环 s=s+ti!=1*2*i需要循环 t=t*js=0i=1,100,1t=1j=1,i,1t=t*jjs=s+ti输出s#include stdio.hvoid main()int i,j;double t;s=0;for(i=1;i=100;i+)t=l;for(j=1;j=i;j+)t=t*j;s=s+t;p

13、rintf(s=%fn,s);18执行过程 首先外层循环变量i固定在一个值上,然后执行内层循环j,内层循环变量j变化一个轮次;外层循环变量i加1后,重新执行内层循环,j再变化一个轮次。s=0;for(i=1;i=100;i+)t=l;for(j=1;j=i;j+)t=t*j;s=s+t;19实际该题单循环可以解决i!=(i-1)!*i#include stdio.hvoid main()int i,j;double t=l,s=0;for(i=1;i=100;i+)t=t*i;s=s+t;printf(s=%fn,s);改动程序#include stdio.hvoid main()int i,

14、j;double t;s=0;t=l;for(i=1;i=100;i+)for(j=1;j=i;j+)t=t*j;s=s+t;printf(s=%fn,s);?每一个i!的累积器t,从1开始204.5 循环程序设计循环程序实现要点:(1)找出什么要反复执行循环体 (2)重复到何时结束循环控制条件循环次数、循环增量关系或逻辑表达式例4-7 从键盘输入一批学生的成绩,找出最高分。循环次数:1,2n;n为已知值输入。用for循环设定一个特殊数据(伪数据)作为循环的结束标志,由于成绩都是正数,选用一个负数作为输入的结束标志。用while或dowhile分析循环体:输入的一个学生成绩比较取高分211,2

15、n;n为已知值输入。用for循环#include stdio.hvoid main()int i,mark,max,n;scanf(%d,&n);scanf(%d,&mark);max=mark;for(i=1;in;i+)scanf(%d,&mark);if(max=0)if(maxmark)max=mark;scanf(%d,&mark);printf(%fn,max);#include stdio.hvoid main()int mark,max;max=-1;doscanf(%d,&mark);if(max=0)printf(%fn,max);23例4-8 将键盘读入的一个任意正整数逆

16、序输出。例如键盘输入12345,屏幕输出显示54321。分离整数各位算法整数x x%10 -余数 分离最低位 x=x/10 -去掉最低位 当x0或x!=0 循环分离整数所有的位例 x=12345 12345%10-5 12345/10=12340 1234%10-4 1234/10=1230 123%10-3 123/10=120 12%10-2 12/10=10 1%10-1 1/10=0#include stdio.hvoid main()int x;scanf(%d,&x);while(x)printf(%d,x%10);x=x/10;printf(n);分析循环控制:x0 循环体:x%

17、10-余数 输出余数x=x/10-去掉最低位24例4-8 将键盘读入的一个任意整数逆序输出。设正数和负数逆序输出的结果一样。即逆序输出不带负号#include stdio.hvoid main()int x;scanf(%d,&x);while(x)printf(%d,x%10);x=x/10;printf(n);x%10输出带负号#include stdio.h#include math.hvoid main()int x;scanf(%d,&x);x=fabs(x);while(x)printf(%d,x%10);x=x/10;printf(n);将 x取绝对值要考虑特殊解0#includ

18、e stdio.h#include math.hvoid main()int x;scanf(%d,&x);x=fabs(x);do printf(%d,x%10);x=x/10;while(x);printf(n);25例4-9 求500之内的全部素数,1不是素数,2是素数。分析 素数定义:只能被1或数本身除尽的数判别素数:(1)给出在2500之间的m数 (2)用2,3,4,.,m-1除,只要有个被除尽,m不是素数 可以证明除数只要取2,3,.mm=2,500,1 k=mi=2,k,1m%i=0iik+1输出mk0110流程图程序#include math.hvoid main()int i

19、,m,k,n=0;for(m=2;m=500;m+)k=sqrt(m);for(i=2;i=k+1)printf(%d ,m);n+;if(n%10=0)printf(n);要验证边界值:1不是素数,2是素数26例4-10 求Fibonacci(斐波那契)数列的前10个数 1,1,2,3,5,8,13,数之间的关系F1=1 n=1 F2=1 n=2 Fn=Fn-1+Fn-2 n3分析前2项之和等于后项值 f3=f1+f2i=1 2 3 4 5 6 7f1=1 1 1 2 3 5f2=1 1 2 3 5 8f3=2 3 5 8 13+得 f1=f2 f2=f3 f3=f1+f227流程图f1=1

20、f2=1f3=2i10i=4i=i+110输出f1,f2,f3f1=f2f2=f3f3=f1+f2输出f3表达式1表达式2表达式3程序#include stdio.hvoid main()int i,f1,f2,f3;f1=1;f2=1;f3=2;printf(%d%d%d ,f1,f2,f3);for(i=4;i=10;i+)f1=f2;f2=f3;f3=f1+f2;printf(%d ,f3);if(i%5=0)printf(n);终28例4-11 某工地搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬一块。问用45人正好搬45块砖,有多少种搬法?列出方程:men+women+ch

21、ild=45men*3+women*2+child*0.5=452个方程解3个未知数,只有通过试算,有多种答案。即 men=0,145、wonen=0,145、child=0,145代入求解#include stdio.h void main()int men,women,child;for(men=0;men=45;men+)for(women=0;women=45;women+)for(child=0;child=45;child+)if(men+women+child=45&men*3+women*2+child*0.5=45)printf(men=%d,women=%d,child=%

22、dn,men,women,child);29程序改进for(men=0;men=45;men+)for(women=0;women=45;women+)for(child=0;child=45;child+)三重循环45*45*45约9万多次减少循环次数,去掉明显不能组合的循环由于最多只有45块砖,男人的数量不会超过15人,女人的数量不会超过22人;一旦男人和女人的数量确定下来后,小孩的人数应该是(45-男人数-女人数)。#include stdio.h void main()int men,women,child;for(men=0;men=15;men+)for(women=0;women=22;women+)child=45-men-women;if(men*3+women*2+child*0.5=45)printf(men=%d,women=%d,child=%dn,men,women,child);程序执行15*22次30习题43、6、8、11、13、16

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!