




已阅读5页,还剩107页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Page1,第4章程序控制结构,教学目标:C语言的执行语句;三种基本结构程序的设计方法及算法举例重点:if语句和switch语句;while语句、do-while语句、for语句;使用循环实现穷举、迭代和递推等算法;循环结构的嵌套。难点:使用循环实现穷举、迭代和递推等算法;循环结构的多重嵌套,Page2,第4章程序控制结构,4.1C语言的执行语句4.2顺序结构4.3选择结构上机任务44.4循环结构上机任务5上机任务6上机任务7,Page3,4.1C语言的执行语句,C程序组成,Page4,4.1C语言的执行语句,C语句的分类:表达式语句空语句复合语句控制语句,Page5,表达式语句,赋值语句:变量=表达式;功能:将“=”右侧表达式的值赋给左侧变量的值。函数调用语句;如:putchar(ch);,Page6,空语句和复合语句,空语句:仅由一个分号构成的语句,在执行时不产生任何指令。复合语句:用一对花括号将多个语句括起来构成一个整体。复合语句中的每个语句必须以分号结束,但右花括号后不能有分号复合语句中可以有自己的数据说明,Page7,控制语句,条件选择语句:if开关分支语句:switch当循环语句:while直到循环语句:dowhile计数循环语句:for中止本次循环语句:continue中止整个循环语句:break函数返回语句:return无条件转移语句:goto,Page8,4.2顺序结构,顺序结构程序:由两个或两个以上的语句组成,先执行A操作,然后再执行B操作。传统流程图N-S流程图,Page9,顺序结构程序设计举例,例4.1输入任意两个整数,求它们的和及平均值。要求平均值取两位小数输出。#includevoidmain()intnum1,num2;floatsum,aver;printf(“Pleaseinputtwointegers,suchas(5,3):n);scanf(%d,%d,Page10,顺序结构程序设计举例,#includevoidmain()intm,m0,m1,m2;printf(Inputanumber(100999):);scanf(%d,例4.2给定一个三位正整数,分别输出它的个位数、十位数和百位数。,Page11,顺序结构程序设计举例,例4.4求方程ax2+bx+c=0的根。a、b、c由键盘输入,假设a0且b2-4ac0。,#include#includevoidmain()floata,b,c,d,x1,x2;printf(Inputthreefloats(a,b,c):);scanf(%f,%f,%f,Page12,4.3选择结构,C语言的选择控制结构语句有:if语句和switch语句if语句是用来判断所给定的条件是否满足,根据判定的结果(真或假)决定执行给定的某种操作之一。,Page13,if语句的形式1单分支结构,格式:if(表达式)语句执行过程:,Page14,if语句的形式2双分支结构,格式:if(表达式)语句1else语句2执行过程:,Page15,if语句举例1,例4.6:输入两个实数,按升序输出两个实数。解法一:#includevoidmain()floata,b,t;scanf(%f%f,单边条件(条件判断两次),Page16,if语句举例1,解法二:#includevoidmain()floata,b;scanf(%f%f,双边条件(条件判断一次),Page17,if语句举例1,解法三:#includevoidmain()floata,b,t;scanf(%f%f,单边条件(条件判断一次),3个语句用花括号括起来构成1个复合语句,若不使用复合语句,则可用t=a,a=b,b=t;,Page18,if语句的形式3多分支结构,格式:if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3:elseif(表达式n)语句nelse语句n+1,入口,出口,Page19,if语句举例2,解法一:用多分支if语句#includevoidmain()intx,y;scanf(%d,1(x0)y=0(x=0)-1(x=a,注意:case后面应为字符常量A、B等,不能为变量A、B等。,Page30,switch语句举例(无break语句的效果),例4.9:输入成绩等级,打印出百分制分数段。#includevoidmain()charc;printf(Pleaseenteracharn);c=getchar();c=(c=a,去掉break语句,程序运行后,从键盘上输入b,则程序运行的顺序和结果如下:,808970796069=A,Page36,例2:计算分段函数。课本P73例4.8,#includevoidmain()floatx,y;scanf(%f,Page37,例3:从三个数中找出最大的数。,#includevoidmain()inta,b,c,max;scanf(%d,%d,%d,Page38,例4输入三角形三边长,求三角形面积。课本P82例4.14,#include#includevoidmain()floata,b,c,s,area;scanf(%f,%f,%f,Page39,例5:判断闰年算法,闰年的条件:能被4整除,但不能被100整除;能被100整除,又能被400整除。,(year%4=0scanf(%d,Page41,例6计算器程序。用户输入运算数和四则运算符,输出运算结果。当输入运算符不是“+”、“-”、“*”或“/”时提示出错,当输入除数为0时也提示出错。课本P80例4.12,#include#includevoidmain()floata,b;charc;scanf(%f%c%f,接下页,Page42,switch(c)case+:printf(=%fn,a+b);break;case-:printf(=%fn,a-b);break;case*:printf(=%fn,a*b);break;case/:if(b=0)printf(Divisionbyzero!n);elseprintf(=%fn,a/b);break;default:printf(Operatorerror!n);,Page43,例7求一元二次方程的根算法。课本P86例4.17,Page44,#includevoidmain()floata,b,c,disc,x1,x2,real,imag;scanf(%f,%f,%f,表示a等于0,表示disc等于0,注意a=0这种表示不够准确!,Page45,elseif(disc0)x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf(distinctrealroots:%8.4fand%8.4f,x1,x2);elsereal=-b/(2*a);imag=sqrt(-disc)/(2*a);printf(complexroots:n);printf(%8.4f+%8.4fin,real,imag);printf(%8.4f-%8.4fin,real,imag);,Page46,例8:对三个数进行升序排序思路:1.先将a、b进行比较,将二者之中的较小者放入变量a中,较大者放入b中,这样a就是a、b中较小数;2.再将变量a与变量c进行比较,将a、c中的较小者放到a中,较大者放到c中,这样,变量a中存放的就一定是三个数中的最小数;3.最后将b和c进行比较,将二者之中较小者放入变量b中,较大者放入变量c中,就完成了对三个数的升序排序。即对三个数进行排序,需要进行3次比较。,Page47,#includevoidmain()inta,b,c,t;scanf(%d,%d,%d,Page48,习题4.8参考答案,输入一个年份和一个月份,输出该年的这个月有多少天。#includevoidmain()unsignedy,m,d;scanf(%u-%u,Page49,4.4循环结构,C语言的循环结构共有下列三种:while语句do-while语句for语句,Page50,4.4循环结构,例4.18求1100之间所有整数的和,当型循环,直到型循环,Page51,while语句,格式:while(表达式)语句,注:循环体可能一次也不执行。,Page52,while语句,例4.18用while语句求1100之间整数和,语句sum=sum+i;和语句i+;能否改变位置?程序的哪些地方应作相应的改动?,循环,#includevoidmain()inti,sum;sum=0;i=1;while(i=100)sum=sum+i;i+;printf(i=%d,sum=%dn,i,sum);,Page53,do-while语句,格式:do语句while(表达式);,注:循环体至少执行一次。,用do-while语句实现直到循环,Page54,do-while语句,例4.18用do-while语句求100以内正整数的和#includevoidmain()inti,sum;sum=0;i=1;dosum=sum+i;i+;while(i=100);printf(i=%d,sum=%dn,i,sum);,循环,分号不可缺少,Page55,for语句,格式:for(表达式1;表达式2;表达式3)语句,实质是当型循环!,Page56,for语句,在for语句中,通常表达式1用来为循环变量赋初值;表达式2一般用来设置循环条件;表达式3一般用于循环变量增值。for语句的最常用格式:for(循环变量赋初值;循环条件;循环变量增值)语句,Page57,for语句,例4.18用for语句求1100之间的整数之和#includevoidmain()inti,sum;sum=0;for(i=1;i1e-6);pi=pi*4;printf(pi=%10.6fn,pi);,Page60,for语句,例4.26统计从键盘输入一行字符的个数,以回车结束。,#includevoidmain()intn;charc;printf(Inputastring:n);n=0;while(c=getchar()!=n)n+;printf(%d,n);,Page61,for语句,例4.27编程输出“斐波那契数列”的前20项。,#includevoidmain()inti,x1=1,x2=1;for(i=1;i=10;i+)printf(%10d%10d,x1,x2);if(i%2=0)printf(n);x1=x1+x2;x2=x2+x1;,Page62,for语句的灵活使用,循环之前的赋初值语句可以放在表达式1中,中间用逗号间隔。表达式3可缺省(但其前的分号不能省略),将表达式3作为语句放到循环体的末尾。循环体中的内容可以放在表达式3中,但要在for语句圆括号的后面加一个分号。表达式1、表达式3可同时缺省,但表达式2前后的分号都不能省略。,Page63,for语句的灵活使用,表达式2可缺省,放在循环体之中,但for语句中的两个分号都不能省略;且判断与退出放在循环体中。,inti,sum;sum=0;for(i=1;i+)if(i=100)sum=sum+i;elsebreak;/*退出循环*/printf(i=%d,sum=%dn,i,sum);,Page64,几种循环的比较,1)while循环、dowhile循环、for循环都可以用来处理同一个问题,一般可以互相代替。2)在while和do-while循环的循环体中,应包括使循环趋于结束的语句。3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可以在表达式1中实现循环变量的初始化。4)三种循环均可用break语句跳出循环,用continue语句结束本轮循环。5)for语句功能最强。,Page65,break语句和continue语句,break语句格式:break;功能:提前结束循环,从循环体中无条件跳转到循环语句后面执行。可用于switch语句和循环结构中。continue语句格式:continue;功能:结束本次循环,即在本次循环中,不再执行循环体中continue后面的语句。只能用于循环结构。,Page66,break语句的使用,例4.28将数字512表示成两个数的和,这两个数分别为15和13的倍数。,!(512-i*15)%13)等价于(512-i*15)%13=0,#includevoidmain()inti;for(i=1;i=512/15;i+)if(!(512-i*15)%13)break;printf(%d+%d=512n,i*15,512-i*15);,for(i=1;i+),Page67,continue语句的使用,例4.29输出100200之间所有能够被7或9整除的数。#includevoidmain()inti,n=0;for(i=100;i=200;i+)if(i%7!=0)/*当n被5整除时换行,即一行输出5个数*/,Page68,break与continue的区别,分析以下两个程序,程序一:#includevoidmain()inti;for(i=1;i=10;i+)if(i%3=0)continue;printf(%3d,i);printf(n);结果输出12457810,break;,结果输出12,Page69,循环嵌套,一个循环体中又包含了另一个完整的循环结构,叫做循环的嵌套。三种循环结构可以互相嵌套。循环嵌套的执行过程是:外循环执行一次,内循环执行一个全过程。,Page70,举例:输出一个图形,*,/*外循环控制输出图形的行数*/,#includevoidmain()inti,j;for(i=1;i=4;i+)for(j=1;j=i;j+)printf(*);printf(n);,Page71,举例:输出一个图形,/*外循环控制输出的行数*/,#includevoidmain()inti,j,k;for(i=1;i=4;i+)for(j=1;ji;j+)printf();for(k=1;k=3;k+)printf(*);printf(n);,*,Page72,举例:输出一个图形,#includevoidmain()inti,j,k;for(i=1;i=4;i+)for(j=1;j=4-i;j+)printf();for(k=1;k=2*i-1;k+)printf(*);printf(n);,*,Page73,举例,例4.31计算s=1!+2!+3!+10!解1:#includevoidmain()inti,n;floats,t;s=0;t=1;for(i=1;i=10;i+)t=t*i;s+=t;printf(”s=%.0fn”,s);,t=1;for(j=1;j=i;j+)t=t*j;,解2:用双重循环实现外循环计算累加内循环求i!,Page74,循环结构程序设计举例,累加、连乘算法统计个数数的分离辗转相除法求最大公约数判断一个数是否为素数方程求根求定积分穷举法其他,Page75,累加、连乘算法,从键盘上输入10个整数,求总和及平均值。解1:#includevoidmain()intx,i;floatsum=0,aver;for(i=1;i=10;i+)scanf(%d,Page76,累加、连乘算法,解2:#include#defineN10/*数的个数用符号常量表示*/voidmain()intx,i;floatsum=0,aver;for(i=1;i+)scanf(%d,i=N,N,Page77,累加、连乘算法,从键盘上输入n个整数,求总和及平均值,n由键盘输入#includevoidmain()intx,i,n;floatsum=0,aver;for(i=1;i+)scanf(%d,scanf(%d,printf(sum=%.0f,aver=%.2fn,sum,aver);,scanf(%d,x!=-1;),x!=-1,若i=0说明没有输入,无需进行操作,Page79,累加、连乘算法,求若干个整数的总和,要求总和不大于1000#includevoidmain()intx,sum=0;while(sum=1000)scanf(%d,sum-x,Page80,累加、连乘算法,例4.35计算多项式的值。scanf(%d,%f,Page81,累加、连乘算法,例4.21猴子吃桃问题:猴子摘下了一堆桃子,第一天吃总数的一半多一个,第二天吃剩下的一半多一个,以后每天都吃前一天剩下的一半多一个,到第十天想再吃时剩一个,求第一天共有多少个桃子?,x=1;for(k=1;k=9;k+)x=(x+1)*2;,Page82,递推法总结,以上的算法采用了递推的方法,即在一个数的序列中,后一项值是前一项或前几项的基础上推算出来的。使用该方法的两个注意事项:1)确定初始条件或边界条件;2)找出递推公式。典型的例子包括求斐波那契数列,牛顿迭代法求方程的根等,Page83,统计个数,例4.38输入十个数,求出最小数和奇数、偶数个数。inti,min,odd=0,eve=0,x;for(i=1;i=10;i+)printf(Pleaseinputinteger%d:,i);scanf(%d,Page84,数的分离,求出所有的水仙花数,水仙花数是指一个3位数的个位数、十位数、百位数之和正好等于该数本身。,i=a3+b3+c3,Page85,数的分离,voidmain()inti,a,b,c;for(i=100;i=999;i+)c=i%10;/*取出个位数*/a=i/100;/*取出百位数*/b=i/10%10;/*取出十位数*/if(i=a*a*a+b*b*b+c*c*c)printf(“%dt”,i);,Page86,数的分离,例4.33输入132767之间的整数,把这个整数显示为一系列数字,每组数字都是用两个空格分开。例如,整数1234应该显示为:1234。scanf(%d,Page87,数的分离,续上页while(num)printf(%3d,num/t);num=num%t;t=t/10;printf(n);,Page88,辗转相除法求最大公约数,求两个整数的最大公约数与最小公倍数。用辗转相除法求最大公约数,Page89,辗转相除法求最大公约数,voidmain()intm,n,t,r;printf(“请输入2个整数”);scanf(“%d%d”,Page90,判断一个数是否为素数,例判断整数m是否为素数素数即为质数,如果一个整数只能被1或者它本身整除,这个数就称为是素数。判断素数的思路是:让m被2sqrt(m)之间所有的整数整除,如果m能被2sqrt(m)之中的任何一个整数整除,则m一定不是素数;如果在2sqrt(m)之间不存在能被m整除的整数,则m是素数。,Page91,判断整数m是否为素数算法N-S图,或者i=k+1,循环结束后根据i的值来决定m是否为素数,Page92,#include#includevoidmain()intm,i,k;scanf(%d,判断整数m是否为素数程序1,Page93,判断整数m是否为素数程序2,#include#includevoidmain()intm,i,k;scanf(%d,Page94,举例用二分法求一元方程的根,用二分法求非线性方程f(x)=x3+1.1x2+0.9x-1.4=0的根。基本思路:取区间两端点x1和x2,(1)若f(x1)、f(x2)符号相同,则无解。(2)若f(x1)、f(x2)符号相反,则在(x1,x2)区间内有一实根;取(x1,x2)的中点x,若f(x)=0,则x即为方程的根若f(x1)、f(x)符号相反,则实根在(x1,x)区间内;若f(x1)、f(x)符号相同,则实根在(x,x2)区间内;重复上述步骤,直到找到方程的根。,Page95,举例用二分法求一元方程的根,floatx,x1,x2,y1,y2,y;doprintf(Inputx1,x2:n);scanf(%f,%f,Page96,用牛顿迭代法求一元方程的根,用牛顿迭代法求方程2x3-4x2+3x-6=0的在1.5附近的根。从导数的物理意义得出:因此:令=2x3-4x2+3x-6=(2x-4)x+3)x-6则=6x2-8x+3=(6x-8)x+3,Page97,举例用迭代法求一元方程的根,补充用迭代法求方程2x3-4x2+3x-6=0的在1.5附近的根。基本思路:将f(x)=0改写成x=g(x)的形式如2x3-4x2+3x-6=0则x=(-2x3+4x2+6)/3将初值x0代入上式等号右边,求得x的第一次近似值x1,再由x1求得下一次近似值直到前后两次求出的x的差的绝对值小于10-5,Page98,用牛顿迭代法求一元方程的根N-S图,Page99,求定积分,例4.39用梯形法求定积分:其中:f(x)=x2+4.8。inti,n;floata=0,b=1.5,h,x,area=0,s=0;printf(Pleaseinputn=);scanf(%d,Page100,用穷举法解决问题,百钱买百鸡问题(出自算经,古代数学家张丘建):鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何。变量cocks:存放鸡翁数量,取值020变量hens:存放鸡母数量,取值033变量chicks:存放鸡雏数量,取值0100有下列方程:cocks+hens+chicks=1005*cocks+3*hens+chicks/3=100,Page101,百钱买百鸡问题N-S图,Page102,百钱买百鸡问题的程序1,#includevoidmain()intcocks,hens,chicks;for(cocks=0;cocks=20;cocks+)for(hens=0;hens=33;hens+)for(chicks=0;chicks=100;chicks+=3)if(cocks+hens+c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏省扬州市江都区八校2022-2023年九年级上学期期中联考化学试题(含答案)
- 电竞耳机专业知识培训课件
- 高经财税课件
- 高粱产业基础知识培训课件
- 高空抛物安全知识培训课件
- 高硅厂安全知识培训总结课件
- 北京精雕技能考试试题及答案
- Quinocycline-B-生命科学试剂-MCE
- 北京vr消防考试题库及答案
- 保育员考试理论单选题及答案
- 2025-2026学年沪教版(2024)初中音乐七年级上册教学计划及进度表
- 2025年四川高校大学《辅导员》招聘考试题库及答案
- 2025-2026学年统编版(2024)初中语文七年级上册教学计划及进度表
- 养老护理员全套培训课件
- 标准化产品需求文档编写方法
- 2025年高考【数学】真题及答案(新高考Ⅱ卷)
- 2025年【高压电工】模拟试题及答案
- 2025年广东省广州市中考历史试卷(含解析)
- 2025版《中国系统性红斑狼疮诊疗指南》解读 4
- 徒步小组管理办法
- 2025至2030中国任天堂行业市场深度研究与战略咨询分析报告
评论
0/150
提交评论