c语言C程序的流程设计.ppt

上传人:tia****nde 文档编号:12706163 上传时间:2020-05-14 格式:PPT 页数:38 大小:374KB
返回 下载 相关 举报
c语言C程序的流程设计.ppt_第1页
第1页 / 共38页
c语言C程序的流程设计.ppt_第2页
第2页 / 共38页
c语言C程序的流程设计.ppt_第3页
第3页 / 共38页
点击查看更多>>
资源描述
C语言程序设计教程,HuanghuaiUniversityDepartmentofComputerScience,主讲:傅丰黄淮学院计算机科学系,高等教育出版社,谭浩强张基温等编著,第三章C程序的流程设计,1算法2C语句概述3选择结构程序设计3.1双分支结构(if-else)3.13.2多分支结构(elseif、switch)4循环结构程序设计,2学时,2学时,本节,4学时,4循环结构程序,一、while和do-while语句,while(条件)循环体;,do循环体;while(条件);,1、若循环体为多条语句,应用括起来构成复合语句。2、循环体中应有使循环结束的语句,否则会出现死循环。,说明,条件为真(非0即真)时,执行循环体;然后再判断条件,为真时再执行循环体,直到条件为假时结束循环语句,执行后续语句。,先执行循环体,再判断条件。为真则执行循环体,然后再判断条件,为真时再执行循环体,直到条件为假时结束循环,执行后续语句。,先判断后执行,先执行后判断,P98习题10:,main()intn=0;while(n+=1)printf(“%dt”,n);printf(“%dn”,n);,n=0+1,n=1+1,2=1不成立,输出n的值,输出n的值,输出n的值,n,1,2,3,0=1成立,n=2+1,1=1成立,n=0,0,1,2,3,循环体为多个语句时要用括起来,应在条件表达式或循环体中改变条件表达式的值,否则会出现死循环。,2次,输出n的值,P98习题10用do-while实现的对比:,main()intn=0;doprintf(“%dt”,n);while(n+=1);printf(“%dn”,n);,n=0+1,n=1+1,2=1不成立,输出n的值,输出n的值,输出n的值,n,0,1,3,0=1成立,n=2+1,1=1成立,n=0,0,1,2,3,2,3次,P83例1416:,main()intnumber=0;while(number=1)number+;printf(“%dn”,number);,main()intnumber=0;while(number+=1)printf(“*%dn”,number);printf(“*%dn”,number);,#include“stdio.h”main()intc;while(c=getchar()!=EOF)putchar(c);,main()intc;c=getchar();while(c!=EOF);putchar(c);c=getchar();,eehhz,*1*2*3,12,EOF为符号常数,在stdio.h中定义:#defineEOF1(当键盘输入Z或遇到文件结束标志时,其值为-1),14,15,16,类似P98习题10,(1)1+3+5+99(2)2+4+6+100(3)1-2+3-4+99-100(4)(5),#include“stdio.h”voidwait_a_char(charc)charch;while(ch=getchar()!=c);return();,P83例17:口令检查函数,将循环体合并到了条件表达式中,P12例6:求1+2+3+10,main()ints=0,i=1;while(i=10)s=s+i;i=i+1;printf(“s=%dn”,s);,课后练习,main()ints=0,i=1;dos=s+i;i=i+1;while(i=10);printf(“s=%dn”,s);,P85例18:搬砖问题。,main()intx=0,y,z;while(x=8)y=0;while(y=11)z=36-x-y;if(4*x+3*y+z/2=36)printf(“men:%d”,x);printf(“women:%d”,y);printf(“children:%dn”,z);y+;x+;,36块砖,36人搬;男搬4,女搬3,两个小孩抬一砖。要求一次搬完,问男、女、小孩各若干?,穷举法,算法分析:,在某一范围内逐个验证是否满足要求的方法称为穷举法,P99习题7:百马百担问题P99习题6:换零钱问题P99习题8:客票问题P99习题9:验证欧拉公式,类似问题:,若问有几种解决方法,则应如何修改程序?,用变量k作为计数器,在if语句中增加“k+;”语句,P87例19:爱因斯坦阶梯问题。,设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨7阶,正好到阶梯顶。问共有多少阶梯?,穷举法,设共有x个台阶,则:x%2=1x%3=2x%5=4x%6=5x%7=0,算法分析:,X是奇数,X是7的倍数,X:7,7+7,7+7+7,7+7+7+7,7+7+7+7+7,X:7,7+14,7+14+14,哪个X满足?要逐个验证,当中有一者不满足时,便验证X的下一个值是否满足,main()intx=7;while(x%3=2,当中有一者不满足时,便验证X的下一个值是否满足,运行结果:flightofstairs=119,(x%3!=2|x%5!=4|x%6!=5),P87例19(续):,程序中有无错误?,P87例20:欧几里德算法,求非负整数u和v的最大公因数,迭代法,不断由旧值递推出新值的方法,辗转相除(设u=24,v=15):,intgcd(intu,intv)intr;r=u%v;while(r!=0)u=v;v=r;r=u%v;return(v);,u=24v=15r=u%v=9,u=v=15v=r=9r=u%v=6,u=v=9v=r=6r=u%v=3,u=v=6v=r=3r=u%v=0,u=v=3v=r=0,r=0时,v为所求,v=0时,u为所求,intgcd(intu,intv)intr;while(v!=0)r=u%v;u=v;v=r;return(u);,P80例11:人口增长问题。,main()floatm=12;intn=1;while(n=10)m=m*(1+0.02);n=n+1;printf(“%fn”,m);,按年2%的增长速度,现有12亿人,则10年后将有多少人?,算法分析:,迭代法,课后作业及上机任务,教材P98习题:11、13(4)(6)(9)、2(3)(5),上机调试P98习题10、12编写并调试本节例题,(1)1+3+5+99(2)2+4+6+100(3)1-2+3-4+99-100(4)(5),课后练习,for(初始表达式;条件表达式;修正表达式)循环体;,二、for语句,Y,N,s=0;for(i=1;i=10;i+)s=s+i;,s=0;i=1;for(;i=10;i+)s=s+i;,初始表达式;while(条件表达式)循环体;修正表达式;,执行过程,for(s=0,i=1;i=10;)s=s+i;i+,s=0;i=1;while(i=10)s=s+i;i+;,1、省略初始表达式时,分号不能省。2、省略修正表达式时,循环体内应有改变条件表达式的值的语句。,说明:,形状,形状,main()inti,j;for(i=1;i=9;i+)printf(“%4d”,i);printf(“n”);for(i=1;i=9;i+)printf(“%c”,-);printf(“n”);for(i=1;i=9;i+)for(j=1;j=9;j+)printf(“%4d”,i*j);printf(“n”);,P91例22:打印九九乘法表,形状,1234567891234567892468101214161836912,打印表头9个数字,打印虚线,打印表体,for(i=1;i=9;i+)for(j=1;j=i;j+)printf(“%4d”,i*j);printf(“n”);,打印表体,for(i=1;i=9;i+)for(j=0;j=n-1,求100200间的全部素数,课后练习:,也可用n/2或sqrt(n),P80例12:兔子繁殖问题(Fibonacci提出的)P94例24:打印Fibonacci数列前n项,main()intn,m;longf1=1,f2=1,f3;scanf(“%d”,设有一对新生兔子,从第3个月开始,每个月都生一对兔子。按此规律,若所有兔子都不死,问一年后共有多少对兔子?,迭代法,f1f211f3=f1+f22f1f2f3=f1+f23f1f2f3=f1+f25f1f2f3=,初始条件,终止条件,迭代公式,思考:f1=f2和f2=f3能否对换位置?不,main()intx,y,z;for(x=0;x20;x+)for(y=0;y33;y+)z=100-x-y;if(5*x+3*y+z/3=100)printf(“x=%d”,x);printf(“y=%d”,y);printf(“z=%dn”,z);,补充例题:百钱百鸡问题,P85例18:搬砖问题P99习题7:百马百担问题P99习题6:换零钱问题P99习题8:准备客票问题P99习题9:验证欧拉公式,穷举法,类似问题:,每只公鸡5元,每只母鸡3元,三只小鸡1元。用100元钱买100只鸡,问公、母、小鸡各买多少只?,算法分析:,补充举例:打印图形。,算法分析:,第1行:1个空格,5个*号,换行第2行:2个空格,5个*号,换行第3行:3个空格,5个*号,换行第4行:4个空格,5个*号,换行第5行:5个空格,5个*号,换行,第i(15)行:i个空格,5个*号,换行,main()inti,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(“”);for(j=1;j=5;j+)printf(“*”);printf(“n”);,i个空格,5个*号,换行,循环语句嵌套时,当外层循环变量取1个值时,内层循环变量要取遍所有值,补充举例(续):打印图形。,小结,循环控制有两种方法:计数法和标志法。能确定循环次数时,采用计数法,用for语句比较清晰;不能确定循环次数时,采用标志法,设法找出循环终止条件,用while或do-while语句来实现。用while与do-while语句能实现的程序,用for语句未必可以实现。while语句是先判断后执行,do-while语句是先执行后判断。在循环体至少执行一次的情况下两者等价。,课后作业及上机任务,教材P97习题:11、13(2)(3)(5)(9),编写并调试例22、例23编程求100200间的全部素数,(1)1+3+5+99(2)2+4+6+100(3)1-2+3-4+99-100(4)(5),课后练习,习题课,main()intvalue1,value2;value1=50;value2=25;sum=value1+value2;printf(“%d+%d=%dn”,value1,value2,sum);,P96习题1:用N-S图描述算法,main()inta;scanf(“%d”,main()intx,max,i;scanf(“%d”,P97习题2:设计算法,(2)依次输入不10个数,找出最大数。,main()intn;scanf(“%d”,P97习题2:设计算法,(4)判断一个整数n能否被3和5整除。,main()inty;scanf(“%d”,P98习题7:,设计一个判断输入年份是否为闰年的程序:(1)能被4整除但不能被100整除的年份;(2)能被4整除且能被400整除的年份。,main()floats,a,b,c;scanf(“%f%f%f”,P98习题8:计算以输入的三个数为边长的三角形面积,若S=(a+b+c)/2,则面积为,main()intyes;/*设1表示float,否则为int*/charc;c=getchar();while(c!=n)if(c=.)yes=1;c=getchar();if(yes=1)printf(“floatn”);elseprintf(“intn”);,P98习题9:,输入的必须是数字,将程序段改写得更合理,while(A)if(!B)C;,doif(A)B;C;while(A);,输入一个数,打印其类型标识符,P98习题11:,P98习题12:输入“qwert?”时,程序的执行结果。,#include“stdio.h”main()charc;c=getchar();while(c!=?)putchar(c);c=getchar();/*不是?时原样输出*/,#include“stdio.h”main()charc;while(c=getchar()!=?)putchar(+c);/*不是?时输出其后的字符*/,#include“stdio.h”main()while(putchar(getchar()!=?);/*立即原样输出输入字符,当输入的是?时退出*/,qwert,rxfsu,qwert?,main()intn;for(n=33;n=255;n+)if(n%8=0)printf(“n”);printf(“%4d%2c”,n,n);,P99习题(2):,打印码值为33255的ASCII码值-字符对照表,每8个换行,main()inti=1;doublee=1.0,y,x,d;scanf(“%lf),P99习题(4):,计算e=,使误差小于给定值d。,即i!,main()inti;longf(intn);doublee=0.0,y=1.0,d;scanf(“%lf),printf(“%12.10lfn”,e),longf(intn)longx=1;inti;for(i=1;i=n;i+)x=x*i;return(x);,f()为求n!的函数,不能用for,因不能确定n值,迭代法,自定义函数法,P99习题(5):递增的牛群,若有一头母牛,从第4年开始,每年生一头母牛。按此规律,第n年时有多少头母牛?,main()intn,y;longf1,f2,f3,f;scanf(“%d”,算法分析:,1112346913192841f1f2f3f=f1+f3f1f2f3f=f1+f3f1f2f3f=f1+f3f1f2f3f=f1+f3,迭代法,P99习题(6):换零钱,把一元钱兑换成硬币(1、2、5分),有几种兑换方法?,设5、2、1分钱各为x、y、z:5x+2y+z=100可得:0x200y500z100,算法分析:,main()intx,y,z,k=0;for(x=0;x=20;x+)for(y=0;y=50;y+)z=100-5*x-2*y;printf(“x=%d”,x);printf(“y=%d”,y);printf(“z=%dn”,z);k+;printf(“%dn”,k);,P85例8:搬砖问题补充举例:百钱百鸡问题,问题对比:,穷举法,541种,P99习题(7):百马百担,有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担。问有大、中、小马各多少?,算法分析:,main()intx,y,z,k=0;for(x=0;x33;x+)for(y=0;y50;y+)z=100-x-y;if(3*x+2*y+z/2=100)printf(“x=%d”,x);printf(“y=%d”,y);printf(“z=%dn”,z);k+;printf(“%dn”,k);,穷举法,7种,P99习题(8):准备客票,某铁路线上共10个车站,问需要准备几种车票?,穷举法,算法分析:,两个站点往返,需要设2种车票(往返票)。设两站点分别为x和y,则从x站到y站:1x10 x+1y10 x:12345678910y:12345678910,main()intx,y,k=0;for(x=1;x10;x+)for(y=x+1;y=10;y+)k=k+2;printf(“%dn”,k);,内层循环的for语句能否改为:for(y=x;y10;y+),90种,main()inta,n,i;for(n=-39;n=40;n+)a=n*n+n+41;for(i=2;i=sqrt(a);i+)if(a%i=0)printf(“errorn”);exit(0);printf(“OKn”);,P99习题(9):验证欧拉公式an=n2+n+41,验证:是否为在-3940之间范围内计算素数的通项公式,穷举法,不是素数正常终止程序,算法分析:,n取-3940时:(1)求出an(2)判断an是否为素数,main()intn;doubles=0.0,x=1.0;for(n=1;n=1;n-)x=(x+1)*2;printf(“%dn”,x);,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


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

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


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