C++程序设计主讲:王金湘wangjx@seu.edu.cnhwangjx@seu.edu.cn2第三章流程控制语句结构化程序设计的特点是任何程序都可由三种基本结构及其组合来描述。本章将介绍C++选择结构结构和循环结构的设计方法。这两种结构分别用C++提供的两类流程控制语句选择结构语句和循环语句来实现。所谓流程控制语句,是专门用来控制程序执行流程的语句,也称为过程化语句。在介绍选择结构语句、循环语句及其程序设计的同时,还将介绍一些常用算法,并通过实例实践结构化程序设计的方法。VC++程序设计hwangjx@seu.edu.cn3选择结构程序设计对程序的运行流程进行控制,主要通过执行专门用来控制流程的语句来实现。流程控制语句也称为过程化语句。选择结构语句是三种基本流程控制语句之一。C++提供以下三种分支语句:if语句条件运算符“?:”swith语句VC++程序设计hwangjx@seu.edu.cn4if语句if语句有两种基本格式为:1、if(表达式)语句12、if(表达式)语句1else语句2VC++程序设计hwangjx@seu.edu.cn5if语句【例】输入一个年份,判断是否闰年。算法分析:假定年份为year,闰年的条件是:year%4==0&&year%100!=0||year%400==0。#includeiostream.hvoidmain(){intyear;cout“输入年份:”endl;cinyear;if(year%4==0&&year%100!=0||year%400==0)coutyear“是闰年”endl;elsecoutyear“不是闰年”endl;}VC++程序设计hwangjx@seu.edu.cn6分析:读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数。#includeiostream.hvoidmain(){inta,b,c,max;cout“输入三个正数:”;cinabc;couta=a'\t'b=b'\t'c=cendl;if(ab)max=a;elsemax=b;//先求出两个数的较大者if(cmax)cout“最大数为:”cendl;//与第三个数比较elsecout“最大数为:”maxendl;}if语句【例】从键盘上输入三个整数,输出其中的最大数。VC++程序设计hwangjx@seu.edu.cn7if语句中,如果内嵌语句又是if语句,就构成了嵌套if语句。if语句可实现二选一分支,而嵌套if语句则可以实现多选一的多路分支情况。嵌套有两种形式:第一种是嵌套在else分支中:if(表达式1)语句1elseif(表达式2)语句2elseif…else语句n第二种是嵌套在if分支中为:if(表达式1)if(表达式2)语句1else语句2if语句——嵌套VC++程序设计hwangjx@seu.edu.cn8//方法1:采用else中嵌套形式#includeiostream.hvoidmain(){inta,b,c,max;cout输入三个正数:;cinabc;couta=a'\t'b=b'\t'c=cendl;if(ab&&ac)max=a;elseif(ba&&bc)max=b;elsemax=c;cout最大数为:max=max;}if语句【例】用嵌套if语句完成【上例】的任务。VC++程序设计hwangjx@seu.edu.cn9//方法2:采用if中嵌套形式#includeiostream.hvoidmain(){inta,b,c,max;cout输入三个正数:;cinabc;couta=a'\t'b=b'\t'c=cendl;if(ab)if(ac)max=a;//ab且acelsemax=c;//ab且acelseif(bc)max=b;//a=b且bcelsemax=c;//a=b且bccout最大数max=max;}if语句【例】用嵌套if语句完成【上例】的任务。VC++程序设计hwangjx@seu.edu.cn10C++规定了if和else的“就近配对”原则,即相距最近且还没有配对的一对if和else首先配对。按上述规定,上例第二种嵌套形式中的else应与第二个if配对。如果根据程序的逻辑需要改变配对关系,则要将属于同一层的语句放在一对“{}”中。例如第二种嵌套形式中,如果要让else和第一个if配对,语句必须写成:if(表达式1){if(表达式2)语句1}else语句2else和if的配对关系注意:第二种嵌套形式较容易产生逻辑错误,而第一种形式配对关系则非常明确,因此从程序可读性角度出发,建议尽量使用第一种嵌套形式。VC++程序设计hwangjx@seu.edu.cn11请看以下两个语句://语句1:if(n%3==0)if(n%5==0)coutn″是15的倍数″endl;elsecoutn″是3的倍数但不是5的倍数″endl;//语句2:if(n%3==0){if(n%5==0)coutn″是15的倍数″endl;}elsecoutn″不是3的倍数″;两个语句的差别只在于一个“{}”,但表达的逻辑关系却完全不同。else和if的配对关系VC++程序设计hwangjx@seu.edu.cn12【例】某商场优惠活动规定,某种商品单价为80元,一次购买5件以上(包含5件)10件以下(不包含10件)打9折,一次购买10件以上(包含10件)打8折。设计程序根据客户的购买量计算总价。if语句VC++程序设计hwangjx@seu.edu.cn13算法输入购买件数count,设置单价price=80(元)根据count值确定折扣discount;实际售价amount=price*count*discount;输出amount的值。算法细化:if(count5)discount=1;if(count=5&&count10)discount=0.9;if(count=10)discount=0.8;VC++程序设计hwangjx@seu.edu.cn14#includeiostream.hvoidmain(){floatprice=80,discount,amount;//单价、折扣、总价intcount;//购买件数cout输入购买件数:endl;cincount;if(count5)discount=1;elseif(count10)discount=0.9;elsediscount=0.8;amount=price*count*discount;cout购买件数:countendl;cout单价:price'\t'“折扣:”discountendl;cout总价:amountendl;}请将该程序在VC++平台上运行,输入不同的件数,使程序所有分支都可以被执行一次。if语句VC++程序设计hwangjx@seu.edu.cn15【例】求一元二次方程ax2+bx+c=0的根。其中系数a(a≠0)、b、c的值由键盘输入。分析:输入系数a(a≠0)、b、c后,令delta=b2–4ac,结果有三种情况:若delta=0,方程有两个相同实根;若delta0,方程有两个不同实根;若delta0,方程无实根。if语句VC++程序设计hwangjx@seu.edu.cn16算法输入系数a(a≠0)、b、c;令delta=b2–4ac;根据delta的值求方程的根;输出方程的根;算法细化:if(delta==0)方程有两个相同实根;计算…if(delta0)方程有两个不同实根;计算…if(delta0)方程无实根;计算…VC++程序设计hwangjx@seu.edu.cn17#includeiostream.h#includemath.hvoidmain(){floata,b,c;floatdelta,x1,x2;constfloatzero=0.0001;//定义一个很小的常数cout输入三个系数a(a!=0),b,c:endl;cinabc;couta=a'\t'b=b‘\t’c=cendl;delta=b*b-4*a*c;求一元二次方程的根源程序VC++程序设计hwangjx@seu.edu.cn18if(fabs(delta)zero){//绝对值很小的数即被认为是0cout方程有两个相同实根:;coutx1=x2=-b/(2*a)endl;}elseif(delta0){delta=sqrt(delta);x1=(-b+delta)/(2*a);x2=(-b-delta)/(2*a);cout方程有两个不同实根:;coutx1=x1'\t'x2=“x2endl;}else//delta0cout方程无实根!endl;}VC++程序设计hwangjx@seu.edu.cn19条件运算符“?:”if语句在某些情况下可以用条件运算符“?:”来简化表达。“?:”是一个三元运算符,其构成的表达式格式为:表达式1?表达式2:表达式3执行逻辑:先计算表达式1,若其值为真(或非0),则计算表达式2(不计算表达式3),并将该值作为整个表达式的值;反之,即表达式1的值为假或为0,则计算表达式3(不计算表达式2),并将该值作为整个表达式的值。例如:inta=6,b=7,min=ab?a:b;min=ab?++a:++b;min=ab?a++:b++;//min=6//min=7a=7b=7//min=6a=7b=7VC++程序设计hwangjx@seu.edu.cn20switch语句用嵌套if语句可以实现多选一的情况(选项多的时候嵌套很复杂)。另外C++中还提供了一个switch语句,称为开关语句,也可以用来实现多选一:switch(表达式){case常量表达式1:《语句序列1》《break;》……case常量表达式n:《语句序列n》《break;》《default:语句序列》}//该表达式只能是字符型或整型VC++程序设计hwangjx@seu.edu.cn21switch语句格式(1)各个case(包括default)分支出现的次序可以任意,但通常将default放在最后。(2)break语句可选。如果没有break语句,每一个case分支都只作为开关语句的执行入口,执行完该分支后,还将接着执行其后的所有分支。因此,为保证逻辑的正确实现,通常每个case分支都与break语句联用。(3)每个常量表达式的取值必须各不相同,否则将引起歧义。VC++程序设计hwangjx@seu.edu.cn22(4)允许多个常量表达式对应同一个语句序列。例如:charscore;cinscore;switch(score){case′A′:case′a′:cout″excellent″;break;case′B′:case′b′:cout″good″;break;default:cout″fair″;}switch语句格式VC++程序设计hwangjx@seu.edu.cn23(5)从形式上看,switch语句的可读性比嵌套if语句好,但不是所有多选一的问题都可由开关语句完成,这是因为开关语句中限定了条件表达式的取值类型。switch语句格式VC++程序设计hwangjx@seu.