流程控制——语句尹存燕刘奇志本章内容流程控制概述顺序控制选择控制循环控制无条件转移控制程序设计风格流程控制概述表达式构成了数据处理的基本单位。当程序中有多个表达式时,就会面临:先计算哪一个表达式根据不同的情况计算不同的表达式一个或几个表达式需要重复计算多次以上属于程序执行的流程控制,用语句来实现,包括:顺序执行语句:按书写次序依次执行。选择执行语句:根据条件选择执行。循环执行语句:重复执行直到某个条件不满足。无条件转移语句:无条件转移到程序某个位置。C++语句的分类本章内容流程控制概述顺序控制表达式语句复合语句空语句选择控制循环控制无条件转移控制程序设计风格顺序流程顺序流程是没有控制语句控制的流程,即按源程序的语句从上到下逐句执行,每条语句执行一次。A6编程序,输入两个实数,输出它们的乘积。7计算乘积输入两个实数输出结果开始结束顺序执行顺序执行的C++语句有:表达式语句复合语句空语句表达式语句在C++表达式的后面加上一个分号“;”就可以构成表达式语句,其格式为:表达式;例如:a+b*c;ab?a:b;a++;x=a|b&c;一个表达式语句执行完后将执行紧接在后面的下一个语句。较常使用的表达式语句赋值自增/自减无返回值的函数调用,等输入/输出例如x=a+b;//赋值x++;//自增f(a);//函数调用cina;//输入coutb;//输出复合语句复合语句是由一对花括号括起来的一条或多条语句,又称为块(block)。其格式为:{语句序列}语句序列中的语句可以是任何的C++语句;复合语句中的语句序列一般按照书写次序执行。语法上,复合语句可看作是一个语句。复合语句一般作为函数体和结构语句(选择和循环)的成分语句。复合语句举例{inta,b;cinab;intmax;max=(a=b)?a:b;coutmaxendl;}空语句根据程序设计的需要,在程序中的某些地方有时需要加上一些空操作,以方便其它流程控制的实现。空语句的格式为:;空语句的作用是用于语法上需要一条语句的地方,而该地方又不需做任何事情。空语句常常作为结构语句的子句。例如:inti,sum;for(sum=0,i=1;i=100;sum+=i,i++);其中,循环体为一条空语句换一种书写方式:for(sum=0,i=1;i=100;sum+=i,i++);本章内容流程控制概述顺序控制选择控制if语句switch语句循环控制无条件转移控制程序设计风格选择执行在程序中,常常需要根据不同的情况来从一组语句中选择一个来执行(分支),这是通过选择语句来完成的。C++的选择语句包括:if语句switch语句if语句if语句(又称条件语句)是根据一个条件满足与否来决定是否执行某个语句或从两个语句中选择一个语句执行。if语句有两种格式:if(表达式)语句if(表达式)语句1else语句2–其中,表达式可以是任意的C++表达式,通常为关系或逻辑表达式;–语句、语句1、语句2必须是一个语句!(复合语句算一个语句。)if语句的含义if(表达式)语句if(表达式)语句1else语句2例:从键盘输入三个整数,计算其中的最大值并将其输出#includeiostreamusingnamespacestd;intmain(){inta,b,c,max;cout请输入三个整数:endl;cinabc;if(ab)max=a;elsemax=b;if(cmax)max=c;cout最大者为:maxendl;return0;}if语句的锯齿格式为了提高程序的易读性,在写if语句时,最好采用“锯齿”格式,即把成分语句往后缩进几列。当if语句的成分语句也是if语句时,为了减少文本的缩进量,可以把这样的if语句按下面的格式书写:if(...)...elseif(...)...elseif(...)...elseif(...)...else...if(...)...elseif(...)...elseif(...)...elseif(...)...else...等价于:例子:从键盘输入一个三角形的三条边,判断其为何种三角形intmain(){inta,b,c;cinabc;if(a+b=c||b+c=a||c+a=b)cout不是三角形;elseif(a==b&&b==c)cout等边三角形;elseif(a==b||b==c||c==a)cout等腰三角形;elseif(a*a+b*b==c*c||b*b+c*c==a*a||c*c+a*a==b*b)cout直角三角形(非等腰);elsecout其它三角形;coutendl;return0;}避免不必要的测试if(score=90)cout优;if(score=80&&score90)cout良;if(score=70&&score80)cout中;if(score=60&&score70)cout及格;if(score60)cout不及格;当score为95时,上述程序中的每个if语句的条件都要测试一遍,程序效率不高!if语句的歧义问题下面的if语句的含义是什么?if(表达式1)if(表达式2)语句1else语句21.if(表达式1)if(表达式2)语句1else语句22.if(表达式1)if(表达式2)语句1else语句2C++规定:else子句与它前面最近的、没有else子句的if配对。因此,上面的if语句解释为:if(表达式1)if(表达式2)语句1else语句2若要按2来解释,则需要加上花括号(复合语句):if(表达式1){if(表达式2)语句1}else语句2下面程序的结果是什么?doubleaverage;average=100.0;if(average=60.0)if(average70.0)cout“MarginalPASS”;elsecout“FAIL”;缩进书写只是书写方式而已,不具有改变语义的能力switch语句程序中有时需要从两个(组)以上的语句中选择一个(组)来执行。C++提供了一条多路选择语句:switch语句(又称开关语句),它能根据某个表达式的值在多组语句中选择一组语句来执行。格式为:switch(整型表达式){case整型常量表达式1:语句序列1case整型常量表达式2:语句序列2:case整型常量表达式n:语句序列n[default:语句序列n+1]}每一组语句的最后一个语句往往是break语句。例子、从键盘输入一个星期的某一天(0:星期天;1:星期一;...),然后输出其对应的英语单词intmain(){intday;cinday;switch(day){case0:coutSunday;break;case1:coutMonday;break;case2:coutTuesday;break;case3:coutWednesday;break;case4:coutThursday;break;case5:coutFriday;break;case6:coutSaturday;break;default:coutInputerror;}coutendl;return0;}switch语句中使用break语句在执行switch语句的某个分支时,需要用break语句结束该分支的执行。在switch语句的一个分支的执行中,如果没有break语句(最后一个分支除外),则该分支执行完后,将继续执行紧接着的下一个分支中的语句序列。C++中的switch语句比其它一些语言中的多路选择语句更具有灵活性。在其它一些语言(如:Pascal)的多路选择语句中,一个分支执行完后将自动结束多路选择语句的执行。当若干个分支具有部分重复功能时,C++的switch语句可以节省代码量。switch(...){...case整型常量表达式1://分支1Acase整型常量表达式2://分支2Bcase整型常量表达式3://分支3Cbreak;...}上面的语句中,假设A、B中没有break语句匹配到表达式1,将执行A、B和C;匹配到表达式2,将执行B和C;匹配到表达式3,将执行C。运用switch语句的注意事项:每个case后面的语句最多执行一次。switch后面圆括号中的操作结果与case后面的内容必须保证为一个整数或一个字符。必须保证case后面的值各不相同,否则无法进行匹配。switch语句可以嵌套,这时,内层switch语句里的“break;”语句只能将程序的流程转向内层switch语句的结束处,不能控制外层switch语句的流程。29本章内容流程控制概述顺序控制选择控制循环控制while语句do-while语句for语句无条件转移控制程序设计风格循环执行如何编程计算n!(n是变量)?n!=n*(n-1)*(n-2)*...*2*1问题:–表达式中不允许有“...”–没有简单的计算公式上面的问题需要用重复操作来解决:对相同的操作重复执行多次,每一次操作的数据有所不同。f=1,对i=2~n,重复执行:f=f*i;(或,f*=i;)循环语句为解决重复操作提供了一种途径。循环一般由四个部分组成:循环初始化循环条件循环体下一次循环准备C++提供了三种实现重复操作的循环语句:while语句do-while语句for语句while语句while语句具有如下的格式:while(表达式)语句其中,表达式可以为任意表达式,一般为关系或逻辑表达式;语句为任意一条语句。用while语句求n!intmain(){intn;cinn;inti=2,f=1;//循环初始化while(i=n)//循环条件{f*=i;i++;//下一次循环准备}//循环体coutfactorialofn=fendl;return0;}do-while语句do-while语句的格式如下:do语句while(表达式);其中,表达式可以为任意表达式,一般为关系或逻辑表达式;语句为任意一条语句。用do-while语句求n!intmain(){intn;cinn;inti=1,f=1;//循环初始化do//循环体{f*=i;i++;//下一次循环的准备}while(i=n);//循环条件coutfactorialofn=fendl;return0;}i为什么从1开始?while语句和do...while语句的书写多写或少写分号如果条件成立时要执行多个语句,则一定要用花括号把这些语句写成复合语句的形式,否则,编译错/或结果不正确/甚至出现死循环,因为缩进并不改变程序的逻辑。37while(i=N)sum+=i;i++;{}while(i=N);//死循环{sum+=i;//该行不属于循环体i++;//该行不属于循环体}do{sum+=i;i++;}while(i=100)//语法错误dosum+=i;i++;while(i=100);{}for语句for语句的格式如下:for(表达式1;表达式2;表达式3)语句•其中,表达式1、表达式2和表达式3为任意表达式。通常情况下,表达式1为赋值表达式,表达式2为表示条件的关系或逻辑表达式,表达式3为自增/自减的算术表达式。•语句是一个任意的语句。intmain(){intn,i,f;cinn;for(i=2,f=1//循环初始化;i=n//循环条件;i++)//下一次循环准备f*=i;//循环体coutfactorialofn=fendl;return0;}用for语句求n!在for语句中,表达式1、表