资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第五部分 程序语句与程序流程控制,statements&flow control of program,计算机软件架构,数据,功能,学习了数据基本知识,数据类型,简单数据类型,复杂数据类型,学习了简单的运算,调用现成函数的方法,如何写出更复杂、功能更强大的程序?,我们已经可以写出一些简单的程序,对程序机制要求,现实中要求,描述更为复杂的计算过程,描述复杂的业务逻辑,使程序有一定通用性,能解决一类问题,完成对不同数据的类似计算,因此需要有更多的程序机制。,本部分主要内容,语句及其类别,赋值语句,复合语句,空语句,函数调用语句;,函数定义与调用初步,表达式与运算符,关系与关系运算符;逻辑运算符;用逻辑表达式描述用自然语言表示的问题;自增自减运算;复合运算符;逗号运算符;位运算;,运算符优先级,本部分主要内容,结构化程序的三种基本流程结构,顺序、分支、循环结构;流程图画法;,各种分支与循环结构,if,语句、,switch case,多分支语句,while,循环,for,循环,do while,循环,其它流程控制语句,break;continue;goto;,一、语句及其类别,1.,语句、语法和语义,语句,程序的基本单位,语法,语法是语言表达的规则,语句的形式必须符合语言要求。,语义,形式合法的语句表达了某种含义(程序执行时的效果),称为语句的语义。,2.,已经出现过的语句,赋值语句,赋值表达式加分号,Variable=Expression,;,如,n=10;,a=b;,函数调用语句,函数调用表达式加分号,函数名,(,参数表,);,如,printf(,);,scanf(,);,a=sin(x);,3.,空语句,在许多语言中都有空语句,空语句表示没有任何操作,多数情况下是为了凑齐语法结构,比如为了省事不想调整程序流程。,C,语句的空语句,只有一个分号,;,注意,有时会因不小心多打一个分号,导致多了一个空语句,使程序出现语法错误或流程错误。,PASCAL,的空语句,NOP;/No Operation,4.,复合结构(复合语句),语法,一对花括号,其中可有,0,个或多个语句。,语义,顺序执行其中的各个语句。,空复合结构中没有语句,执行时立即结束。,PASCAL,的复合语句,BEGIN END,5.,程序中的注释,注释,帮助人阅读和理解程序而写在程序里起注解作用的说明性文字。,注释对程序意义(执行)没有影响。,形式:,/*,任何字符的序列*,/,程序里的注释相当于一个空格。,程序中加入必要注释是一种好的编程习惯。对于复杂的大程序,注释的意义更大。,见编程规范要求,6.,简单计算程序,#include,/*,要引用其它库函库,则要写入其它头文件*,/,/*,如用数学函数,要写,#include */,int,main(),/*,若干变量定义(及可能的初始化)*,/,/*,若干计算和赋值语句*,/,/*,若干输出语句*,/,return,0;,二、函数定义与调用初步,如何定义和调用一个函数?,1.,函数定义,函数,可看作是对,C,语言基本功能的扩充,是特定计算过程的抽象。,C,可以允许将一段可能会被重复使用的计算代码抽象成函数,,函数,可以通过,参数,接收数据(函数输入),,返回,计算,结果,。,函数的类型特征,函数名,参数表及类型,返回值类型,这三者可以看成是函数的类型特征,如标准函数,sin,,,类型特征是,double sin(double),例,求一些圆盘的面积,圆盘半径分别为,3.24,、,2.13,、,0.865,、,3.746,、,12.3364,、,8.421,设圆周率用,3.1416,,可写出下面程序:,#include,int main(),printf(radius:%f,area:%fn,3.24,3.24*3.24*3.1416);,printf(radius:%f,area:%fn,2.13,2.13*2.12*3.1415);,这个程序很繁琐,很容易弄错,用函数改进程序,如果有以半径为参数计算圆盘面积的函数,double c_area(double),;,程序就可简化。如第一个语句可写为,printf(radius:%f,area:%fn,3.24,c_area(3.24);,如有打印圆盘面积的函数,pc_area,,只需写,pc_area(3.24);,pc_area(2.13);,函数能使程序变短,变得,易写,易理解,易修改,函数定义与调用示例,定义函数,c_area,的程序片段,double c_area(double r),return r*r*3.1416;,定义后就可以在任何需要的地方通过名字调用函数,如,用函数,c-area,求半径,3.24,高,2.4,的圆锥体积,2.4*c_area(3.24)/3.0,用函数,c-area,求外半径,5.3,,内半径,3.07,,高,4.2,的空心圆柱的体积,(c_area(5.3)-c_area(3.07)*4.2,/*,定义函数,重写程序*,/,#include,double c_area(double r),return r*r*,3.1416,;/*,很容易,修改圆周率近似值,*,/,int main(),printf(Radius:%f,area:%fn,3.24,c_area,(3.24);,printf(Radius:%f,area:%fn,2.13,c_area,(2.13);,printf(Radius:%f,area:%fn,0.865,c_area,(0.865);,printf(Radius:%f,area:%fn,3.746,c_area,(3.746);,printf(Radius:%f,area:%fn,12.3364,c_area,(12.3364);,printf(Radius:%f,area:%fn,8.421,c_area,(8.421);,return 0;,程序大为简化,且不容易出错,2.,函数与加工机器的比较,完成某种的函数,可以看成是一个具有加工功能的机器,进料口:函数参数,材料:数据,进料口数目:,0,或多个,规格口径:由参数类型确定,返回值:出料口,产品:数据,规格口径:由类型确定,数目:,0,或,1,个,加工过程:准备好材料,找到加工机器,加入材料,按下开关,开始加工,加工完成,输出产品。,函数执行:准备好数据,找到函数,给入参数,调用,进入函数执行,处理完毕,返回结果。,3.,函数定义形式,函数头部,函数体,函数返回值类型 函数名,(,参数表,),double DoSomething(,double x,),int i;,double sum;,sum=x;,return sum;,参数和函数体内定义的变量都称为内部变量或局部变量,特殊语句,return,:计算表达式值,结束函数的执行,返回表达式结果。,4.,函数调用、执行,函数调用,函数名,(,实际参数表,),多个参数之间用逗号分隔,函数的执行过程,先计算各个参数的值,进入函数体顺序执行函数体语句,直到碰到,return,语句或执行到最后一条语句。,函数的调用、执行与返回,t,调用者程序执行,函数调用点,控制权转移到被调用函数,原程序等待,函数执行完毕,控制返回主程序,原程序继续,被调用函数执行,5.,具有多个参数的函数,参数表里写多对,类型 参数,对,用逗号分隔。,例,定义已知三角形三边长度求面积的函数。,t_area,,,3,个,double,参数,返回,double,。,类型特征,double t_area(,double,double,double,),函数定义可写为,double t_area(,double a,double b,double c,),double s=(a+b+c)/2.0;,return sqrt(s*(s-a)*(s-b)*(s-c);,6.,无返回值的函数,语法:返回值类型处写,void,执行到达作为函数体末尾时或碰到,return,语句时函数结束,无返回值的函数中可写,return,语句,但不能返回结果表达式,无返回值的函数不能用在表达式中,例,根据半径计算并输出圆盘面积的函数,void pc_area(double r),printf(Radius:%f,area:%fn,r,3.1416*r*r);,#include,void pc_area(double r),printf(Radius:%f,area:%fn,r,3.1416*r*r);,/*,很容易修改输出格式,圆周率等*,/,int main(),pc_area(3.24);,pc_area(2.13);,pc_area(0.865);,pc_area(3.746);,pc_area(12.3364);,pc_area(8.421);,return 0;,思考:把输出和计算混在一起了,有什么不好?,7.,函数与程序,完整程序必须有一个名为,main,的函数,程序开始,从,main,的函数体开始执行,程序结束,直到,main,函数体复合结构结束(语句执行完或者退出)。,程序中的函数调用,main,在程序启动时被自动调用(由运行系统调用)。,其它函数不经调用就不会执行。,程序里不允许写调用,main,的代码。,8.,函数与类型,定义时的类型问题,头部定义的返回值类型与返回语句中表达式的类型可能不一致,返回语句中表达式的值必须能转换到函数返回值类型,语句执行时将计算结果转换后作为返回值。,例,int fun(int m),return 3.2*m+5;,做了哪些转换?,类型转换的各种情况,计算,赋值,参数传递,返回函数返回值,9.,函数调用时的类型问题,调用时的类型问题,实参个数应符合函数定义的要求,各实参应能转换到对应形参的类型,当实参类型与形参类型不同时,先转换为所需类型的值后再传给形参,int fun(int m),return 3.2*m+5;,问题,设,x,是双精度变量,执行语句,x=fun(2.5+6);,会发生哪几次类型转换?,10.,包含一个或多个函数定义的程序模式,#include,/*,函数定义写在这里*,/,int main(),/*,主程序体,包含函数调用*,/,现在建议写程序时采用这种形式,更一般的形式后面介绍,三、表达式与运算符,Expressions&Operators,表达复杂的计算,将现实中的问题用计算语言描述,一些程序功能,某监控程序,如果出现告警信息,则发出告警。,QQ,程序收到消息时的大致流程:收到一个消息,如果不是系统消息,判定消息发送者的号码,如果接受者与发送者不处于聊天形式,则在任务条闪对应用户的头像,如果处于已经打开聊天窗口,则聊天窗口里显示聊天信息。,手机来电后处理:如果用户按了接听键,则,,如果用户没按任何键,,,如果按了拒绝键,则,一个小例子,全班同学排成,6,排,,A,、,B,、,C,、,D,、,E,、,F,等,6,人分别站在第,1,排到第,6,排;,已知,A,不在第,1,排;,A,与,B,前后相邻;,C,在,D,前面;,E,在,B,的前两排;,C,在,F,后的第,4,排,问他们各在哪一排?,另外一个例子,A,、,B,、,C,、,D,、,E,、,F,共,6,人参加程序竞赛。,已知,A,和,B,中至少一人获奖;,A,、,C,、,D,中至少二人获奖;,A,和,E,中至多一人获奖;,B,和,F,或者同时获奖,或者都未获奖;,C,和,E,的获奖情况也相同;如果,E,未获奖,则,F,也不可能获奖;并且,C,、,D,、,E,、,F,中至多,3,人获奖。,问哪些人获了奖。,问题,事物之间是有关系的,事物状态会发生变化,一个业务会有复杂的流程,经常需要对某件事情或状态进行判断,经常需要根据当前状态做相应的操作。,问题,如何描述事物之间的关系?,如何描述逻辑判断?,判断的结果如何确定?,怎样利用逻辑判断结果控制计算过程?,1.,关系运算符和关系表达式,Relational Operators&Expressions,小例子,设需要写一个函数,返回两参数中的较大值,double dmax(double,double),;,需要做的工作,比较数据大小(判断),根据判断结果决定做什么(分情况处理),1),关系运算符,关系运算符,relational operator,确定数据间是否存在某种关系。,关系运算符共,6,个,=,大于、大于等于,=,小于等于、小于,=!=,等于,/,不等于,关系运算符可用于算术类型,如果被比较对象的类型不同,按算术运算规则转换后再做判断。,2),关系表达式,关系表达式,relational expression,具有关系运算符的表达式,结果可用于控制计算过程。,关系表达的结果,关系成立与否(逻辑值,真,TRUE,、假,FALSE,),3.2=2.9 y!=x+1,计算结果表示,结果为,int,,成立、不成立时值分别是,1,、,0,(3.24=3=2,结果?,2.,条件运算符,C,语言中一种特殊的运算符:,?:,条件表达式,条件运算符,“,?:,”,条件表达式的语法形式,表达式,1?,表达式,2:,表达式,3,语义,先计算表达式,1,(条件);,条件成立时计算表达式,2,,以其结果作为条件表达式的值,条件不成立计算表达式,3,,以其值作为条件表达式的值,例:符号函数,sign,double sign(double x),return x 0,?,1,:,(x=0,?,0:,-1);,例:函数,dmax,double dmax(double x,double y),return x y,?,x,:,y;,z=dmax(2,3),条件运算符的优先级高于赋值,低于关系运算符,每个,:,与前面最近的没有匹配的,?,匹配,3.,逻辑值、逻辑运算符和表达式,Logic Value,Logic Operators and Expressions,1),逻辑与逻辑值,Logic,The non-arithmetic operations performed by a computer,such as sorting,comparing,and matching,that involve yes-no decisions,关系表达式与逻辑判断,关系式的结果是成立或不成立。用于描述逻辑判断或逻辑性质,其结果称为逻辑值;,关系成立,所描述的关系,“,真,”,,逻辑值,“,真,”,;,不成立时该关系,“,假,”,,逻辑值,“,假,”,。,2),逻辑值(真假值)的表示,在许多语言中,有,BOOL,或,BOOLEAN,类型来表示真(成立)与假(不成立)。,C,语言中,所有基本类型的值都可当作逻辑值用,,C,规定,值,等于,0,表示逻辑值,“,假,”,非,0,值,都作为逻辑值,“,真,”,一些,C+,中也定义了,bool,或,BOOL,类型,但实际上是,int,的别名。,3),逻辑表达式,Logical Expression,现实中有许多复杂关系需要表示,如,3x5,时,z,取值,2,,否则取值,1,。,可用关系表达式和条件表达式描述,z=(x=3?(x=3,&,和,|,的计算方式,自左往右,如果计算过程中可以确定某部分表达式的值,则该表达右边不再计算。,例,x!=0.0,&y/x 1.0,为什么要这么做?,7),计算方式与顺序,8),优先级问题,优先级,priority,否定的优先级同其他一元运算符;,&,优先级高于,|,,低于关系运算符。,设逻辑表达式,(x+3)(y+z)&(y 12),写为下面形式意义不变。,x+3 y+z&y 12,4.,从自然语言到逻辑表达式,1),逻辑表达式举例,例,1,,判断变量,year,表示的年是否为闰年,year,%4=0&year%100!=0|year%400=0,判断年份是否闰年的函数:,int intercalary(int year);,常在程序里定义进行某种判断的函数,返回逻辑值,以表示被判断的事实与否成立,这种判断函数常被称为,“,谓词,”,int intercalary(int year),return (year%4=0&year%100!=0|,year%400=0?1:0);,因逻辑表达式的值就是,1,和,0,,函数可简写为:,int intercalary(int year),return(year%4=0&year%100!=0|,year%400=0);,使用实例,输出二月天数:,printf(Days of Feb.is%d.n,intercalary(year)?29:28);,2),判断获奖,A,、,B,、,C,、,D,、,E,、,F,共,6,人参加程序竞赛,判断谁获奖,用,a,f,共,6,个取真假值的变量代表对应的人是否获奖,也可以用一个数组表示,A,和,B,中至少一人获奖,a|b,A,、,C,、,D,中至少二人获奖,(a&c)|(a&d)|(c&d),A,和,E,中至多一人获奖,!(a&e),B,和,F,或者同时获奖,或者都未获奖,(b&f)|(!b&!f),C,和,E,或者同时获奖,或者都未获奖,(c&e)|(!c&!e),如果,E,未获奖,则,F,也不可能获奖,e|!f,C,、,D,、,E,、,F,中至多,3,人获奖,c+d+e+f=3,注意:描述方法并不是唯一的,3),谁站哪一排,全班同学排成,6,排,,A,、,B,、,C,、,D,、,E,、,F,等,6,人分别站在第,1,排到第,6,排,用,6,个,int,变量表示,A,F,的位置,A,不在第,1,排,a!=1,A,与,B,前后相邻,(a=b+1)|(a=b-1),C,在,D,前面,c=d-1,E,在,B,的前两排,e=b-2,C,在,F,后的第,4,排,c=f+4,a,f,取值范围,1,6,,取值不能相同,如何表示?,用上述类似的逻辑表示,也可以通过程序流程控制手段来表达,赋值运算符,|,(或),&,(与),运算符的优先级,关系运算符,算术运算符,高,低,!,(,非,),!(非),算术运算符,关系运算符,&,|,赋值运算符,各种运算符优先级:,高,低,例:,1.,xy&mn,等效于,(,xy,),&,(,mc,等效于,(,!a,),&,(,bc,),4.,5 3&4|8 3,)&4),|,(8 b,的值为,0(m=ab),值为,0,表达式,(m=ab)&(n=cd),的值为,0,运算就此结束,不再进行,(n=cd),的运算,结果:,m,为,0,,,n,为,1,例,3.10:,假设,a=5,、,b=10,、,c=15,、,d=20,,求逻辑表达式的结果,!a|(ab)+1&cb)+1&cb)+1&c10)+1&cd,0|0+1&cd 0|1&cd,0|1&15b)&(n=cd),后,m,和,n,的值各为多少?,!(非),算术运算符,关系运算符,&,|,赋值运算符,四、,C,语言其它特色运算符,C,语言的特色运算符,自增、自减运算符,逗号运算符,实现二元运算符操作的赋值运算符,条件运算符,1.,自增、自减运算符,1),增量和减量运算符,自增自减运算符,+,,,-,增、减量运算将变量值加、减,1,。,有前、后置写法,将,x,的值加,1+x x+,将,x,的值减,1-x x-,以增量为例,两种写法在给变量加,1,方面相同,但整个表达式的值不同,表达式,+x,的值,是,x,增量后的值,;,表达式,x+,的值,是,x,增量前的值,。,自增,(+),和自减运算,(-),+,和,-,可以写在变量的左侧或右侧;而且其意义不同。,“,+,变量名,”,和,“,-,变量名,”,:,先做运算,后取值,“,变量名,+,”,和,“,变量名,-,”,:,先取值,后做运算,2),说明,语句,x+;,和语句,x=x+1;,有所不同,x,可以是实数类型,计算中做类型转换;,自增、自减运算符只对变量和数组元素起作用,自增,(+),和自减运算,(-),举例,N=I+,变量,N,0,10,变量,I,变量,N,?,?,变量,I,N=+I,变量,N,0,10,变量,I,变量,N,?,?,变量,I,11,10,11,11,68,若,k,和,j,为,int,型变量,运算表达式,j=3;,k=+j;,j+;,执行后,变量,k,的值为,_,,变量,j,的值为,_,。,4,5,练习,3),示例,例,1,x=2;y=x+2;z=+x+2;,例,2,int a5=0,1,2,3,4,*p;,a0=a1+;,a1=-a2;,p=/,将,a3,的地址存到变量,p,中,(*p)+;/,对,p,将指向的整型单元,a3,的值做自减运算,p+;/,该操作执行以后,有什么效果?,执行完三条语句后,,x,、,y,、,z,的值分别为:,4,,,4,,,6,执行完上述语句后:数组中的五个数为:,1,,,1,,,1,,,4,,,4,;,p,指向,a4,2.,逗号运算符,逗号运算符,表达式,1,表达式,2,表达式,n,求值过程,顺序求表达式,1,表达式,n,的值,整个逗号表达式值为表达式,n,的值,逗号表达式优先级最低,如,a=3*5,a*4;,再如,x=(a=3,6*3);,x=a=3,6*a;,并不是任何地方的逗号都是逗号表达式,函数参数表和变量说明表都不是,计算表达式,1,计算表达式,2,计算表达式,n,整个表达式的值,3.,复合赋值运算符,1),复合赋值运算符,凡是二元运算符,都可以与赋值符一起组合成复合的赋值符,+=,-=,*=,/=,%=,=,&=,=,|=,如,:i=1;j=3;i+=j;,好处,简化程序,提高代码效率,“,sum=sum+n;,”,形式的赋值,可以写成,sum+=n;,五、语句与控制结构,1.,高级语言流程控制概述,1),语句与流程,基本语句,赋值、,return、,复合、空等语句,完成基本操作,复杂计算,包含许多基本操作,有许多不同执行流程,执行流程的描述,高级语言提供执行流程的描述机制(控制结构),硬件层次的流程控制机制,采用顺序加转移指令的方法:低级流程控制,缺点:随意性太大,程序难以理解,2),三种基本流程模式,程序设计实践总结出三种基本流程模式,顺序,分支,分叉,循环,只有一个开始点,程序控制流程的三种基本模式,只有一个结束点,结构化程序流程模式,具有层次性,易分解,意义较易把握,已证明,这三种模式对写任何程序都够了,3),结构嵌套,操作,1,条件,条件,操作,3,操作,2,整体可作为抽象操作嵌入各种模式中,形成更复杂的流程。,4)C,的流程控制机制,C,提供了很丰富的程序流程控制机制,对应于各种模式的结构化控制结构。,控制语句,由控制结构组成的语句,可以写在任何能写语句的地方。,复合结构是一种控制结构,实现顺序执行。,5),顺序结构示例,交换两个变量的值,int a=3,b=4;,a=b;,b=a;,int a=3,b=4,c;,c=a;,a=b;,b=c;,3,4,?,a,b,c,3,4,3,4,4,3,4,3,3,3,4,a,b,4,4,4,4,2.C,语言的分支结构,if,语句,1),条件语句,if,语句,if,语句的两种形式,if(),if()else,条件表达式的值作为控制执行的逻辑值。,语义,形式一:求条件表达式的值,若不为,0,,则执行语句;否则结束,形式二:求值条件,条件时执行语句,1,;否则执行语句,2,条件语句中的语句常常用复合结构,也可以是条件语句,例,输入两个数,按从大到小的顺序将它们输出。,#include,void main,(),float a,,,b,,,t,;,/,定义三个变量,a,、,b,、,t,scanf,(“,%f,%f”,&a,&b,);,/,输入两个数到,a,、,b,中,if,(,ab,),/,如果,a,小于,b,,则将,a,的值与,b,的值交换,t=a,;,a=b,;,b=t,;,printf,(“,a=%5.2f,,,b=%5.2fn”,,,a,,,b,);,复合语句,例,改造,pc_area,,增加错误参数的处理。,参数值为负时输出一个错误提示信息,void pc_area(double r),if(,r 0),if(y 1),z=1;,else z=2;/*,属于哪个,if,?*,/,规定,缺省,时,,else,部分属于前面最近的无对应,else,的,if,语句。上例的形式易引起误解。,if(),if(),if(),else.,else.,else.,要使,else,部分属于外层,if,,可用:,if(x 0),if(y 1),z=1;,else z=2;,3,),当有嵌套的,if,语句时的两种书写形式,if(expr1),xxxxxxxxxxxx,xxxxxxxxxxxx,else if(expr2),xxxxxxxxxxxx,xxxxxxxxxxxx,else if(expr3),xxxxxxxxxxxx,xxxxxxxxxxxx,else if,if(expr1),xxxxxxxxxxxx,xxxxxxxxxxxx,else,if(expr2),xxxxxxxxxxxx,xxxxxxxxxxxx,else,if(expr3),xxxxxxxxxxxx,xxxxxxxxxxxx,else,if,4),例,:,求方程,ax,2,+bx+c=0,的根,分析:方程,ax,2,+bx+c=0,的解的情况:,a=0:,b!=0:,唯一根,,c/b;,b=0:,c=0:,无穷多个根;,c!=0,:无解;,a!=0:,b,2,-4ac=0:,两个相同的实根,,-b/,(,2*a,),b,2,-4ac0:,两个不同的实根,(,-b+sqrt,(,b,2,-4ac,),/,(,2*a,)、(,-b-sqrt,(,b,2,-4ac,),/,(,2*a,),b,2,-4ac 0.),d=sqrt(d);,printf(Two real roots:%f,%fn,(-b+d)/2./a,(-b-d)/2./a);,else if(d=0.),printf(One real root:%fn,-b/2./a);,else,printf(No real rootn);,判断条件,嵌套分支,实现多分支,计算判别式,5),空语句与,if,形式上是一个分号,语义是什么也不做。,通常用做填充,将语法结构补充完整。例:,if(x 0),if(y 1)z=1;,else;,else z=2;,写,if,语句的一个常见错误:,if(xxxxx),.;,else,.,3.,多分支语句,switch,语句,1),多分支语句,-switch,多分支结构,根据一个整型值选择不同的分支执行,语法,switch(,expression,),case,const-expr,1,:,statements,case,const-expr,2,:,statements,case,const-expr,n,:,statements,default:,statements,表达式值必须为整型、,字符型或枚举类型,每个,case,表达式,的值必须互不相同,说明,1.Expression,必须为整型表达式,;,2.,常量表达式常用整数、字符等,;,3.default,部分可缺,语句序列可缺,可含多个语句;,4.case,整型常量表达式,:,看作标号;,5.,整型常量表达式的值必须各不相同;,2)switch,执行过程,求值整型表达式的值,将值顺序与各整型常量表达式比较,遇到相等时转入执行,,直到碰到一个,break,为止,,如果后面没有,break,,则一直执行到,switch,语句结束;,如果找不无匹配的整数,但有,default,则从,default:,处继续;没有,default,时结束。,例,例,按,x,的值确定分支,,1,和,2,分别处理,其他统一处理,switch(x),case 1:.,break;,case 2:.,break;,default:.,break;,关于,break,习惯在各分支最后写,break,,包括最后分支。,如果某分支之后无,break,,则该分支后的语句序列执行完后顺序进入下一分支的语句序列执行。,一般认为,除非几个分支的语句相同,否则不提倡共享。因为这导致程序段之间相互依赖,对程序修改不利。,例 根据月份判断季节,switch(month),case 2:case 3:case 4:,printf(,“,Month%d is Springn,”,month);,break;,case 5:case 6:case 7:,printf(,“,Month%d is Summern,”,month);,break;,case 8:case 9:case 10:,printf(,“,Month%d is Autumnn,”,month);,break;,case 11:case 12:case 1:,printf(,“,Month%d is Wintern,”,month);,break;,default:,printf(,“,Month%d is not validn,”,month);,break;,例,:,根据分数评定等级,#include,void main(),int score,grade;,printf(Input a score(0100):);,scanf(%d,grade=score/10;,/,将成绩整除,10,,转化成,switch,语句中的,case,标号,switch(grade),case 10:,case 9:printf(grade=An);break;,/,标号,10,和,9,,都执行本行的这条语句,case 8:printf(grade=Bn);break;,case 7:printf(grade=Cn);break;,case 6:printf(grade=Dn);break;,case 5:,case 4:,case 3:,case 2:,case 1:,case 0:printf(grade=En);break;,/,标号,5,、,4,、,3,、,2,、,1,和,0,都执行本行的这条语句,default,:printf(The score is out of range!n);,/,成绩超出范围时,提示出错,4.,循环语句,while,语句,需要重复做的工作,用循环语句来解决,1),循环语句,-while,语句,循环控制结构实现特定条件下某些操作的重复执行。,语法,while(,条件表达式,),语句,语义,(1),求值条件表达式,将它的值作为逻辑值,(2),若第,1,步得到值,0,则循环结束;否则,(3),执行作为循环体的语句,而后回到,(1),特点,先判断表达式,再执行循环体,条件,循环体,假,,0,真,非,0,while,while,语句执行流程:,0,非,0,表达式,=?,循环体外语句,循环体语句,循环入口,循环结束!,开始下一次循环,特点:先判断,后执行;若条件不成立,则有可能一次也不执行。,适合的情况:,知道控制循环的条件为某个逻辑表达式的值,而且在循环中该表达式的值会被改变。,例,求,1.100,的平方和,sum=0;,n=1;,while(,n=100,),sum=sum+n*n;,n=n+1;,初始化累加变量和循环变量,循环条件,累加操作,改变循环变量,关于循环,典型形式,循环前给一些变量初值;,循环中修改某些变量;,用包含不断变化的变量的条件控制循环是否结束。,循环体可能多次执行,引起很长计算,甚至无限长。,如何分析问题、写出循环很重要,例:写程序从摄氏,0,度到,300,度,每,20,度一项,输出摄氏温度与华氏温度的对照表。,简单想法:,#include,int main(),printf(C:0,F:%fn,0.0);,printf(C:20,F:%fn,20.0*9/5+32);,printf(C:40,F:%fn,40.0*9/5+32);,/*,还有,13,行类似代码*,/,每项写一个输出语句不理想。,10000,项怎么办?,重复性工作应当通过循环处理!,用循环手段来解决问题,考虑写循环,需要对一系列摄氏温度求对应的华氏温度。,这些温度可以按统一的规律一个个算出来。,解决办法,用一个变量保存摄氏温度值,循环前赋初始值,0,,每次循环加,20,,直到,300,每次输出一行,显示当时摄氏华氏温度对照,这形成了一套解决问题的方案。,摄氏,华氏温度转换公式,F=C*9/5+32,临时变量取名,c,,结果用双精度类型表示。,#include,int main(),int c=0;,while(c=300),printf(C=%d,F=%fn,c,c*9.0/5.0+32.0);,c=c+20;,return 0;,程序产生,16,行输出,其中第一行是:,C=0,F=32.000000,改变循环变量,反映循环进展,循环条件,初始状态,110,例:求满足,1+2+3+n500,中最大的,N,,并求其和,编写程序实现。,分析,本题还是一个累加求和的问,题,当累加和,sum,500,时反,复执行循环,否则结束循环,步骤,定义变量:,sum,,,n,;,sum,和,n,分别赋初值;,n=0,;,sum=0,;,当,sum,500,时反复执行循环,,否则结束循环。,语句为,:,While(sum500),+n,;,sum+=n,;,#include,void main(),int n=0,,,sum=0,;,while(sum500),+n,;,sum+=n,;,printf(n=%d,,,sum=%dn,,,n-1,,,sum-n),;,Why?,为什么不是,n,,,sum,?,结果,n=31,,,sum=496,程序,1+2+3+n=n),;,设,r,表示,m,除以,n,的余数;,即:,r=m%n;,如果,,r=0,则,n,中的值为,m,和,n,的最大公约数;否则执行:,m=n;,n=r;,转回,“,如果,”,处,继续执行。,最小公倍数,m,和,n,的乘积,除以最大公约数,#include,void main(),int m,n,GCD,LCM,r,p,;,scanf(“%d,%d”,,,&m,&n),;,/*(mn)*/,r=m%n;,p=m*n;,while(r),m=n,;,n=r,;,r=m%n,;,GCD=n;,LCM=p/GCD;,printf(“the greatest common division=%dn”,,,GCD);,printf(“the lease common multiple=%d n”,,,LCM);,while(r!=0),例:,分析,读入第一个字符;,当其不是,“,!,”,时,进入循环;,判断其是否为字母,如果是则,将其翻译成该字母的后继;,如果读入的字符不是字母,原,样输出;,再读入下一个字符,返回,2,步;,当输入字符为,“,!,”,时结束。,用户输入多个字符,要求按以下规律进行翻译:,将用户输入的每一个英文字母变为它后面的字母输出,,如:将,A,变成,B,,,B,变成,C,,,,,Z,变成,A,。,用户输入的非字母的字符原样输出。,!,作为用户输入结束的标志。,#include,void main(),char ch;,scanf,(%c,while(ch!=!),if(ch=a&ch=A&ch=Z),if(ch=z)ch=a;,else if(ch=Z)ch=A;,else ch=ch+1;,printf,(%c,ch);,scanf,(%c,printf,(,字符串结束,n);,5.,循环语句,for,语句,1),循环语句,-for,语句,最常见的循环模式,1),变量赋初值;,2),检查循环条件;,3),成立时执行循环体;,4),更新变量并继续,for,结构是这种常见模式的规范化。,for,也是最常用的循环。,形式,for(expr1;expr2;expr3),循环体,2)for,循环的执行过程,执行(语义),1,)求值表达式,1,(
展开阅读全文