




已阅读5页,还剩68页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,第四章c程序的三种基本结构,1.理解程序控制的方法和作用,2.学会制定简单程序的算法,3.掌握选择结构的使用方法,4.掌握实现循环的各种方法,5.掌握break,continue的用法,本章目标:,.,4.1C程序三种基本结构,从结构化程序设计角度出发,程序只有三种结构:,顺序结构,选择结构,循环结构,.,1.顺序结构,表示,先执行A,再执行B.,.,2.选择结构,表示为,存在某条件P,若P为真,则执行A,否则执行B。,.,另一种选择结构多分支结构.,.,3.循环结构,表示为,(1)当型结构当P条件成立时(T),反复执行A,直到P为“假”时才停止循环.,有两种结构:当型和直到型,.,(2)直到型,先执行A,再判断P,若为F,再执行A,如此反复,直到P为F.,已证明:上述三种结构组成的程序可以解决全部的问题,所以任何一种高级语言都具备上述三种结构。,.,函数调用语句:,如:printf();,1.表达式语句,赋值语句:如:i=i+1;i+;x+y;,空语句:任何事情都不做。,C程序语句可分为五大类:,如:;,4.2C语句,.,2.控制语句改变语句的执行顺序,if()else(条件),for()(循环),while()(循环),dowhile(循环),switch(多分支选择),()表示条件,表示语句,.,continue(结束本次循环),break(中止整个循环),return(函数返回),3.限定转向(无条件转向)语句,5.终止程序运行语句,4.无条件转移语句,goto,exit,.,6.复合语句(语句体),用括起来的一系列语句。如:z=x+y;t=z/100;printf(%f,t);,.,1.if(表达式)语句,一、if语句的三种形式,执行过程:当表达式的值为“真”(非零)时,执行语句,否则,不执行语句。,如:if(xy)z=x;,4.3选择结构程序设计,.,2.if(表达式)语句1else语句2,执行过程:当表达式的值为“真”(非零)时,执行语句1,否则,执行语句2。,如:if(xy)z=x;elsez=y;,.,3.if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3:elseif(表达式m)语句melse语句n,如:if(grade=85)level=A;elseif(grade=70)level=B;elseif(grade=60)level=C;elselevel=D;,.,if语句说明:,if后面的表达式一般为逻辑表达式或关系表达式,也可以是任意数值类型表达式。,该语句是合法的:if(3)printf(“ok!”);,if语句中的“语句”为一个简单语句或复合语句。,如:下面程序段是否有错?,if(x=0)printf(“Xispositive.”);x+;elseprintf(“Xisnegative.”);,if(x=0)printf(“Xispositive.”);x+;elseprintf(“Xisnegative.”);,.,二、if语句的嵌套,在if语句中又包含一个或多个if语句称为if语句的嵌套。,一般形式:,if(条件1)if(条件2)语句1else语句2elseif(条件3)语句3else语句4,内嵌if,内嵌if,如:if(x0)if(y0)printf(x0,y0);elseprintf(“x0,y0)printf(“x0);elseprintf(“x=0,y6)if(n12)printf(“6n12”);elseprintf(“n6)if(n12)printf(“6n12”);elseprintf(“n=6”);,.,三、用if语句实现选择结构举例,main()intx,y;scanf(%d,.,main()floata,b,c;scanf(“%f%f%f”,.,程序2:将程序1的if语句改为:/*exp52.c*/#includemain()intx,y;scanf(“%d,程序1:/*exp51.c*/#includemain()intx,y;scanf(“%d,.,程序4:将程序1的if语句改为:/*exp54.c*/#includemain()intx,y;scanf(“%d,程序3:将程序1的if语句改为:/*exp53.c*/#includemain()intx,y;scanf(“%d,.,1.程序1和程序2是正确的。它们代表的函数为:,2.程序3和程序4是错误的。它们代表的函数为:,结论:,.,四switch多分支选择语句,用if或if/else或它们的嵌套也可使程序实现多路分支,但容易出现下面的问题:,可读性差,破坏结构,解决问题的方法:采用switch语句。,.,switch(变量)case常量表达式1:语句体1case常量表达式2:语句体2case常量表达式n:语句体ndefault:语句体(n+1),一般形式:,.,根据表达式的取值,判断其与哪一个常量表达式相等。如=表达式i,则自语句i开始执行,直到语句n+1止。,若与所有常量表达式值不相等,则从default后的语句开始执行。,功能:,注:default可有可无。,.,例:根据成绩等级打印百分数段.,switch(grade),caseA:printf(85100n);,caseB:printf(7084n);,caseC:printf(6069n);,caseD:printf(60n);,default:printf(errorn);,.,程序如下:,/*exp55.c*/#includemain()chargrade;scanf(%c,.,运行结果为:,A,程序运行结果不在预料之中!,产生错误的原因:没有完全起到分支作用。,85-10070-8460-6960n);break;caseD:printf(60n);break;,例如:,.,4.4循环结构,循环结构的特点是:程序的流程是在给定条件时,反复执行,某个程序段。,语言中可以用以下语句来实现循环:用goto语句和if语句构成循环;用while语句;用do_while语句;用for语句。,.,4.4.1goto语句和goto语句构成的循环,一、goto语句,goto语句为无条件转向语句,其作用为:使程序的执行无条件地转移到指定处。,如:gotolabel_1;goto123;,执行过程:执行语句时,程序转移到以标号为前缀的语句处继续执行。,如:p1:x+;.gotop1;,.,说明:,goto语句是一种非结构化语句,结构化程序设计方法不提倡使用goto语句,因为滥用goto语句将使程序流程无规律,可读性差。但也不是绝对禁止使用,只有在能够大大提高程序效率时才使用。,且记:不要从循环体外跳到循环体内!,.,二、用goto语句和if语句构成循环,例:计算10!并输出结果。,main()inti=1,sum=1;loop:if(i=10)sum=sum*i;i+;gotoloop;printf(“10!=%dn”,sum);,运行结果:10!=24320,本应是:10!=3628800,main()inti=1;longsum=1;loop:if(i=10)sum=sum*i;i+;gotoloop;printf(“10!=%ldn”,sum);,.,4.4.2while语句,.,例:将上面计算10!并输出结果的程序用while语句写出:,main()inti=1;longintsum=1;while(i=10)sum=sum*i;i+;printf(“10!=%ldn”,sum);,main()inti=1;longintsum=1;loop:if(i=10)sum=sum*i;i+;gotoloop;printf(“10!=%ldn”,sum);,.,循环结构的术语,1.循环条件:是循环结构中的测试表达式。,如:while(i=10),2.循环体:是在每个循环周期均要执行一次的语句。语句可以是任何语句,简单语、复合语句、空语句均可以。,如:上例while语句中用花括号括起来的复合语句。,3.循环控制变量:是在循环条件中控制条件是真是假的变量。,如:上例while语句中使用的变量i。,.,注意:循环条件中的表达式一般是逻辑表达式和关系表达式,也可以是算数表达式(非0为真,0为假)。一般表达式中应含有循环控制变量。while(3)和while(0)虽然从程序设计的角度上说是不合理的,但是合法的。,while(3)语句表示无限循环while(0)语句表示不进入循环体,要写出一个正确的循环结构,对控制变量要做三方面工作:控制变量赋初值;把控制变量写入正确的循环条件;控制变量的更新、调整。,.,4.4.3do-while语句,分号不能少,.,例:将上面计算10!并输出结果的程序用do-while语句写出:,main()inti=1;longintsum=1;while(i=10)sum=sum*i;i+;printf(“10!=%ldn”,sum);,main()inti=1;longintsum=1;dosum=sum*i;i+;while(i=10);printf(“10!=%ldn”,sum);,.,我们将while和do-while循环做一下比较:,main()inti;longsum=1;scanf(“%d”,main()inti;longsum=1;scanf(“%d”,输入:9输出:90,输入:11输出:1,输入:9输出:90,输入:11输出:11,.,比较上面两个程序,虽然结构是相同的,在输入值为有效值时结果相同,但当输入无效值时输出结果是不同的。为什么?,while与do-while的主要区别:,.,4.4.4for语句,表达式1:一组初始化表达式。表达式2:循环控制条件。表达式3:在执行完循环体语句之后执行的表达式。,我们前面已经说明,要正确表达循环结构应注意三方面的问题:控制变量的初始化,循环的条件和控制变量的更新。for语句在书写形式上正好体现了这种紧密的逻辑关系。,.,执行过程:,.,例:将上面计算10!的程序用for语句写出:,main()inti;longsum;for(i=1,sum=1;i=10;i+)sum=sum*i;printf(“10!=%ldn”,sum);,main()inti;longsum;for(i=1,sum=1;i=10;sum=sum*i,i+);printf(“10!=%ldn”,sum);,空语句,.,说明:,表达式1:用于进入循环体之前给某些变量赋初值。若省略,可在for语句前给变量赋初值。,main()inti=1;longsum=1;for(;i=10;i+)sum=sum*i;printf(“10!=%ldn”,sum);,for循环的三个表达式起着不同的作用,根据需要可以省略。,.,表达式2:决定循环的条件,若省略,则为无限循环。,表达式3:用于循环一次后对某些变量进行修改。若省略,可在循环体内对变量进行修改。,main()inti;longsum=1;for(i=1;i=10;)sum=sum*i;i+;printf(“10!=%ldn”,sum);,.,for语句最为灵活,它完全可以代替的while语句。,如:i=1;while(i=10)sum=sum*i;i+;,等效于,for(i=1;i=10;i+)sum=sum*i;,for语句功能很强,其中表达式1和表达式3可以是逗号表达式,但为增强程序的可读性,一般不要把与循环无关的东西放到for语句中。,如:sum=1;for(i=1;i=10;i+)sum=sum*i;,.,三种循环语句的总结,三种循环语句共同的特点是:当循环控制条件非零时,执行循环体语句,否则终止循环。,循环语句可以是任何语句,简单语句、复合语句、空语句均可以。,while和for语句先判断循环控制条件,do-while语句后判断循环控制条件,所以,while和for语句的循环体可能一次也不执行,而do-while语句的循环体至少也要执行一次。,在循环体内或循环条件中必须有使循环趋于结束的语句,否则会出现死循环等异常情况。,.,三种循环可以处理同一问题,一般情况可以互相代替。但在实际应用中,我们要根据具体情况来选用不同的循环语句。选用的一般原则如下:,如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是根据循环体的执行情况确定的,一般用while语句或者do-while语句。,(循环次数确定例)inti;longsum=1;for(i=1;i=10;i+)sum=sum*i;,(循环次数不确定例)charcdoc=getchar();printf(“%c”,c);while(c!=q|c!=Q);,.,当循环体至少执行一次时,用do-while语句;反之,如果循环体可能一次也不执行时,用while语句。,(循环体至少执行一次)/*只有当用户键入q或Q,才结束循环*/charcdoc=getchar();printf(“%c”,c);while(c!=q|c!=Q);,(循环体可能一次不执行)/*只有不是q或Q的字符才被打印*/charc;c=getchar();while(c!=q|c!=Q);printf(“%c”,c);c=getchar();,.,4.4.5循环的嵌套,例:在屏幕上打印一个8行7列的星号矩阵。,#includemain()inti;for(i=0;i7;i+)printf(*);/*打印第1行星号*/printf(n);for(i=0;i7;i+)printf(*);/*打印第2行星号*/printf(n);for(i=0;i7;i+)printf(“*”);/*打印第8行星号*/,.,什么叫循环嵌套?,一个循环的循环体中套有另一个循环叫循环嵌套。这种嵌套过程可以一直重复下去。,一个循环外面包围一层循环称为二重循环。一个循环外面包围二层循环称为三重循环。一个循环外面包围多层循环称为多重循环。,while、do-while、for可以互相嵌套自由组合。,.,例:将上例(打印8行7列的星号矩形)用二重循环实现。,#includemain()inti,k;for(i=0;i8;i+)for(k=0;k=.000001)sum=sum+t;n=n+2;s=-s;t=s/n;pi=sum*4;printf(pi=%fn,pi);,运行结果:=3.141594,.,第几个月小兔子对数中兔子对数老兔子对数总数1100120101310124111352125.,例6.7斐波纳契数列:1,1,2,3,5,8,.,例6.7求斐波纳契数列:1,1,2,3,5,8的前20个数。,(该数列特点:第1、2两个数是1、1,从第3个数开始,该数是其前两个数之和。),main()intf1=1,f2=1,i;for(i=1;i=10;i+)printf(%6d%6dn,f1,f2);f1=f1+f2;f2=f1+f2;,运行结果:11235813213455891442333776109871597258441816765,.,例6.7求斐波纳契数列:1,1,2,3,5,8的前40个数。,main()longintf1=1,f2=1,i;for(i=1;i=a,China!,ABCDEFGVWXYZ,Glmre!,.,已知:一位数码a和要组成的最大重码数tn的位数n。求:各重码数的累加和sn。,算法:对给定的a和n,从i=1n依次作:求第i个重码数tntn*10+a。(其中t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科干班模拟教学课件
- 【9历第一次月考】安徽省合肥市五十中学东校2024-2025学年九年级上学期质量调研历史试卷
- 2025年河南省辅警招聘考试试题带解析及参考答案(黄金题型)
- 常州智慧物流培训课件
- 企业采购申请审批流程规范文档
- 年产4100万支样品瓶运输托盘项目可行性研究报告
- 年产11.4万台精密折射仪项目可行性研究报告
- 小马过河生字教学课件
- 2025年外贸英语考试指南高频词汇与实-用句型
- 导尿教学示范课件
- 人教部编版语文八年级上册第一单元分层作业设计12
- 康复诊疗指南与规范
- 人教版小学一至六年级英语单词汇总表
- 北京客运从业资格证考试
- 2019人教版高中英语必修三单词表带音标
- 一例臀部巨大脓肿切开引流患者的个案护理汇报课件
- JCT2199-2013 泡沫混凝土用泡沫剂
- 创业的励志格言80句
- 加油站主要生产设备清单
- 初中英语2022版新课程标准测试卷及答案
- 《货物运输实务》课件-铁路货物运输
评论
0/150
提交评论