C++大学基础教程第3章C++控制语句本章学习:C++的控制语句和程序基本结构使用基本结构实现算法3.1算法的基本控制结构2020/1/18-3-3.1算法的基本控制结构流程图开始/结束执行判断联系2020/1/18-4-例:计算y=x2开始定义x,y输入x计算y=x*x输出y结束voidmain(){intx,y;cinx;y=x*x;couty;}cout“inputx:”;cinx;cout“y=”yendl;voidmain(){intx,y;cout“inputx:”;cinx;y=x*x;cout“y=”yendl;}顺序结构2020/1/18-5-例:找两个数中的最大值。开始定义x,y输入x,yxy?y输出x结束n输出y#includeiostream.hvoidmain(){intx,y;cinxy;if(xy)coutx;elsecouty;}选择结构2020/1/18-6-例:计算y=sin(x)在一个周期内的八个等间隔抽样点值。即xi=2i/8,i=0,1,…,7开始定义变量i,x,y;定义常量PI2;i=0i8x=PI2*i/8;y=sin(x);i++;y结束n#includeiostream#includecmathusingnamespacestd;voidmain(){inti;floatx,y;constfloatPI2=2*3.14;for(i=0;i8;i++){x=PI2*i/8;cout(y=sin(x))endl;}}循环结构2020/1/18-7-3.1算法的基本控制结构程序的三种基本控制结构(1)顺序结构(2)选择结构(3)循环结构2020/1/18-8-3.1算法的基本控制结构流程控制语句选择语句:if..else、switch循环语句:while、for、do..while转向语句:break、continue2020/1/18-9-3.2if选择语句2020/1/18-10-3.2if选择语句if_else1、没有else分支2、双分支3、多分支4、if语句的嵌套1表达式语句1语句22TF图3-4if-else语句流程图2020/1/18-11-3.2if选择语句1、没有else分支例如:比较x和y的大小,如果x大则输出x的值if(表达式)语句;if(xy)coutxendl;3.2if选择语句2、双分支例如:比较x,y的大小,将较大的数输出if(表达式)语句1;else语句2;if(xy)coutxendl;elsecoutyendl;2020/1/18-13-3.2if选择语句3、多分支if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;…else语句n;例子:输出学生的成绩#includeiostreamusingnamespacestd;voidmain(){intx;cinx;if(x=90)cout“优秀”endl;elseif(x=80)cout“良好”endl;elseif(x=60)cout“合格”endl;elsecout“不及格”endl;}2020/1/18-15-注意:1.如果if-else语句中的语句1或语句2不是单条语句,则必须采用复合语句形式;否则,计算机只执行其中第一条语句,出现程序运行时的逻辑错误。程序的逻辑错误,指的是编译器检查不出来的错误,也即编译时不出错,只在程序运行时才会出现。2.一般在if-else(和任何控制结构)中加上大括号,可以避免不慎疏忽,特别是if或else后边的选择体语句多于一条时。2020/1/18-16-3.2if选择语句4、if语句的嵌套if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句42020/1/18-17-注意:(1)使用嵌套if结构时,应该注意if与else的对应关系。从最内层开始,else总是与其前面最近的(未曾匹配的)if匹配。如果外层if的内嵌if语句没有对应的else分支,应该把内嵌if语句放入加花括号里,成为复合语句。例如下面的代码:2020/1/18-18-①if(…)②if(…)③语句1;④else⑤if(…)⑥语句2;⑦else⑧语句3;①if(…){②if(…)③语句1;}④else⑤if(…)⑥语句2;⑦else⑧语句3;①if(…)②if(…)③语句1;④else⑤if(…)⑥语句2;⑦else⑧语句3;2020/1/18-19-(2)编写嵌套if语句结构,最好给外层if和else的选择体加上大括号,使结构清晰,增强代码的可读性。(3)在嵌套if结构和多选择的if结构中,测试条件为真可能性较大的操作应放在if结构的开头,以便尽早满足测试条件,结束if结构的执行,提高程序运行速度。3.3switch选择语句3.3switch选择语句switch(表达式){case常量表达式1:语句1break;case常量表达式2:语句2break;┇case常量表达式n:语句nbreak;default:语句n+1}跳出switch语句2020/1/18-22-例3.4假设某个盒子里有红色、黄色、蓝色、绿色和白色球若干,每次从中取出一个球,并记录(输出)球的颜色。使用随机数产生函数rand模拟随机取球过程,设数字1,2,3,4,5分别表示上述五种球的颜色。数字0使模拟取球过程结束。统计出每种球出现的次数。//功能:模拟取球程序#includeiostream#includecstdlib#includectimeusingnamespacestd;voidmain(){intcount1(0),count2(0),count3(0),count4(0),count5(0);srand((unsigned)time(NULL));intcolor=rand()%6;while(color){switch(color){case1:coutredballendl;count1++;break;case2:coutyellowballendl;count2++;break;case3:coutblueballendl;count3++;break;case4:coutgreenballendl;count4++;break;case5:coutwhiteballendl;count5++;break;default:coutInvalidcommandendl;}color=rand()%6;}coutcountofeachcolorballs(red,yellow,blue,green,andwhite):count1,count2,count3,count4,count5endl;}2020/1/18-27-注意:(1)switch语句中表达式的值可以是字符型、整型,也可以是枚举型。通常这个表达式仅仅是个变量。(2)case的常量表达式可以是字符型、整型或枚举型,通常,也只是一个常量。各个case的常量表达式的值应该互不相同,否则,相同的值造成矛盾的语句标识。各个case的先后顺序不影响执行结果,由编程者合理安排。2020/1/18-28-(3)break语句本不是switch语句原有的,但由于各个“case常量表达式”只起语句标号的作用,并不进行条件判断,switch语句每当找到匹配的常量表达式,则从此标号开始执行下去,不再进行判断,即将此后的其它case下的语句也都执行。这显然不是我们希望的。因此,在每个case的执行语句结束处,应该加上break语句。(4)几个case可以共用一组执行语句。例如,输入考试成绩grade,输出是否通过:switch(grade/10){case9:case8:case7:case6:cout”pass”;break;defaultcout”fail”;break;}2020/1/18-30-(5)在switch语句中应该提供default情况,可以提醒编程者需要处理异常条件;而且习惯上default被放在switch结构的最后。2020/1/18-31-switch语句和多分支if语句都能实现多分支的选择问题。但switch语句只能处理测试表达式与case常量表达式值相等的情况,即要求表达式的值只能取整型、字符型和枚举型;多分支的if语句可以处理测试表达式为任何c++允许类型的问题。尽管如此,只要问题类型合适,switch语句通常比多分支的if语句的执行效率高,因为前者直接执行匹配的语句,而后者要逐一比较至测试表达式为真。故合理安排多分支的if语句各分支的顺序,有利于提高程序运行速度,特别是当选择语句内嵌于循环结构中时。3.4循环语句2020/1/18-33-3.4循环语句三种基本语法1、while语句2、do…while语句3、for语句2020/1/18-34-3.4循环语句主要包括3个部分:1、循环控制条件:判断循环操作是否进行的条件;2、循环体:重复进行的操作;3、循环控制变量:记录循环体执行的次数,或控制循环的结束条件。2020/1/18-35-3.4循环语句while循环语句while(表达式)循环体语句;2020/1/18-36-//功能:计算1~n个整数平方和的均值。#includeiostreamusingnamespacestdvoidmain(){intk=1,sum=0,n;coutinputn:;cinn;nkkn1212020/1/18-37-while(k=n){sum=sum+k*k;k++;}intmean;if(n0)//防止被0除mean=sum/n;elsemean=0;coutmean=meanendl;}2020/1/18-38-利用循环结构实现迭代求和时,表示和的变量的初值必须赋为0。另外还要注意执行除法操作之前,检验除数是否为0,以增强程序的稳健性。2020/1/18-39-注意:(1)循环体如果多于一句,必须采用复合语句形式,否则只有循环体的第一句能够被执行,其它循环体语句不能被执行。(2)一般while语句的循环控制变量在while语句前被赋值,并在循环体内被修改,使循环语句能够正常结束。循环结构的循环体中应该有使循环趋于结束的语句(修改循环控制变量的语句)。如果while语句的条件一开始就不满足,则其循环体语句就会一次也不执行。所以,我们在选择循环语句要清楚这一点。2020/1/18-40-3.4循环语句do..while循环语句do{循环体语句;}while(表达式);2020/1/18-41-//功能:计算1~n个整数平方和的均值。#includeiostreamusingnamespacestd;voidmain(){intk(1),n,sum(0),mean;coutinputn:;cinn;nkkn1212020/1/18-42-do{sum=sum+k*k;k++;}while(k=n);if(n0)mean=sum/n;elsemean=0;coutmean=meanendl;}2020/1/18-43-注意:(1)如果循环体语句多于一条,必须采用用复合语句形式。(2)循环体中要包含修改循环控制变量的语句,保证循环是有限循环。(3)do-while循环是先执行循环体语句,后判断表达式真假。所以循环体至少要执行一次。(4)while语句和do-while语句都能处理重复操作问题,如前面的求均值()问题。但while语句的循环体有可能一次也不执行,所以,在选择使用循环语句时,要合理利用它们各自的特点。2020/1/18-44-3.4循环语句for循环语句循环结