第五章选择结构a表达式语句组1满足不满足语句组2语句1语句2满足不满足判断表达式b选择结构选择结构的作用是,根据所指定的条件是否满足,决定从给定的两组操作中选择其一。5.1if语句构成的选择结构一、if语句if(表达式){语句组1;}[else{语句组2;}]if语句的一般形式:其中方括号[]中的项为可选项。1.不含else子句的if语句不含else子句的if语句也称为单分支选择语句,它的语句形式如下:if(表达式){语句组;}功能:当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,否则直接转向执行下一条。如下图所示。表达式语句组1假(0)真(非0)if语句中的“表达式”必须用“(”和“)”括起来。表达式除常见的关系表达式或逻辑表达式外,也允许是其它类型的数据,如整型、实型、字符型等,只要表达式的值非0即为真。其中:if是C语言的关键字,不能用作标识符。当if语句下面的语句组,仅由一条语句构成时,也可不使用复合语句形式(即去掉花括号)。【例5-1】输入3个实数,按从小到大的顺序输出。#includestdio.hmain(){floata,b,c,t;printf(“请输入三个数:”);scanf(“%f,%f,%f”,&a,&b,&c);if(ab){t=a;a=b;b=t;}if(ac){t=a;a=c;c=t;}if(bc){t=b;b=c;c=t;}printf(“三个数按从小到大的排序后是:%.2f%.2f%.2f\n“,a,b,c);}【例5-2】输入3个实数,根据要求输出最大值或者最小值。#includestdio.hmain(){floata,b,c,t;printf(请输入三个数:);scanf(%f%f%f,&a,&b,&c);if(ab){t=a;a=b;b=t;}if(ac){t=a;a=c;c=t;}if(bc){t=b;b=c;c=t;}printf(三个数按从小到大的排序后是:%.2f%.2f%.2f\n,a,b,c);printf(请输入一个整数,程序根据其正负判断输出:\n);scanf(%d,&t);if(t=0)printf(最大数为:%.2f\n,c);if(t0)printf(最小数为:%.2f\n,a);}2.含else子句的if语句含else子句的if语句也称为双分支选择语句,它的语句形式如下:if(表达式){语句组1;}else{语句组2;}功能:当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,然后转向下一条语句;否则,执行语句组2。如图所示。下一个语句真假表达式语句组1语句组2其中:if、else都是C语言的关键字,不能用作标识符。“语句组1”称为if子句,”语句组2”称为else子句。若语句组仅由一条语句构成时,也可不使用复合语句形式(即去掉花括号)。务必牢记:不管是简单语句,还是复合语句中的各个语句,每个语句后面的分号必不可少!如将5-2改为:if(t=0)printf(最大数为:%.2f\n,c);←此处的分号不能省略elseprintf(最小数为:%.2f\n,a);else子句不是一条对立的语句,它是if语句的一部分,必须与if配对使用,不能单独使用。如:elseprintf(“***”);←错误语句【例5-3】用if-else语句求三角形的面积。#includestdio.h#includemath.hmain(){floata,b,c,area,s;printf(“请输入三角形的三条边的长度:”);scanf(“%f%f%f”,&a,&b,&c);if(a+bc&&b+ca&&a+cb){s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf(“这个三角形的面积是:%f\n”,area);}elseprintf(“这不是一个三角形,不能计算面积!\n”);}【例5-4】将5-2用if-else语句改写。原题是输入3个实数,根据要求输出最大值或者最小值。#includestdio.hmain(){floata,b,c,t;printf(请输入三个数:);scanf(%f%f%f,&a,&b,&c);if(ab){t=a;a=b;b=t;}if(ac){t=a;a=c;c=t;}if(bc){t=b;b=c;c=t;}printf(三个数按从小到大的排序后是:%.2f%.2f%.2f\n,a,b,c);printf(请输入一个整数,程序根据其正负判断输出:\n);scanf(%d,&t);if(t=0)printf(最大数为:%.2f\n,c);elseprintf(最小数为:%.2f\n,a);}【例5-5】输入一个整数,判断它是奇数还是偶数#includestdio.hvoidmain(){intx;printf(“请输入一个整数:”);scanf(“%d”,&x);if(x%2==0)printf(“%d是偶数\n”,x);elseprintf(“%d是奇数\n”,x);}【例5-6】输入一个数值,求出它的平方根,若为负数时,求出它的复数平方根。#includestdio.h#includemath.hmain(){intn;floatroot;printf(请输入数据:);scanf(%d,&n);if(n=0){root=sqrt(n);printf(sqrt(%d)=%.2f\n,n,root);}else{root=sqrt(abs(n));printf(sqrt(%d)=%.2fi\n,n,root);}}二、嵌套的if语句if和else子句中可以是任意合法的C语句,因此当然也可以是if语句,通常称为嵌套的if语句。内嵌的if语句可以嵌套在if子句中,也可以嵌套在else子句中。1.一般表达形式:if(表达式1)语句1;elseif(表达式2)语句2;……elseif(表达式n)语句n;else语句n+1;从上向下逐一对if后的表达式进行检测。当某一个表达式的值为真时,就执行与此有关子句中的语句,阶梯形中的其他部分就被越过去。如果所有表达式的值都为0,则执行最后的else子句;此时,如果程序中最内层的if语句没有else子句,既没有最后的那个else子句,那么就不进行任何操作。2.功能:3.流程图语句组2语句组n语句组n+1表达式1语句组1表达式2表达式n真(非0)假(0)真(非0)假(0)假(0)真(非0)注意:(1)当if语句中出现多个“if”与“else”的时候,要特别注意它们之间的匹配关系,否则就可能导致程序逻辑错误。“else”与“if”的匹配原则是“就近一致原则”,即“else”总是与与在它上面、距它最近、且尚未匹配的if配对。(2)if语句允许嵌套,但嵌套的层数不宜太多。在实际编程时,应适当控制嵌套层数(2~3层)。(3)if语句中条件的写法应尽量简单。(4)为明确匹配关系,避免匹配错误,强烈建议:将内嵌的if语句,一律用花括号括起来。【例5-7】编写程序,完成求分段函数的值,使用if语句嵌套else子句实现。#includestdio.hmain(){intx,y;printf(请输入自变量x:);scanf(%d,&x);if(x15){if(x6){y=x-12;printf(x=%d,y=%d\n,x,y);}else{y=3*x-1;printf(x=%d,y=%d\n,x,y);}}else{y=5*x+9;printf(x=%d,y=%d\n,x,y);}}【例5-8】将5-7改为用在else中嵌套if语句的if语句实现分段函数的求值。#includestdio.hmain(){intx,y;printf(请输入自变量x:);scanf(%d,&x);if(x6){y=x-12;printf(x=%d,y=%d\n,x,y);}elseif(x15){y=3*x-1;printf(x=%d,y=%d\n,x,y);}else{y=5*x+9;printf(x=%d,y=%d\n,x,y);}}【例5-9】编写程序,计算成人输血量。即根据输血人的性别和体重,计算输血人应该输入鲜血的数量。输血者为男性,体重大于等于120斤,输血量为200ml,体重小于120斤,输血量为180ml;若输血者为女性,体重小于100斤,输血量为120ml,否则输血量在150ml。#includestdio.hvoidmain(){/*sex代表输血者的性别,weight代表输血者的体重,cubage代表输血量*/intsex,weight,cubage;printf(请给出输血者的性别和体重(1表示男性,-1为女性):);scanf(%d%d,&sex,&weight);if(sex=0){if(weight=120){cubage=200;printf(此人应该输血:%d毫升\n,cubage);}else{cubage=180;printf(此人应该输血:%d毫升\n,cubage);}}else{if(weight=100){cubage=150;printf(此人应该输血:%d毫升\n,cubage);}else{cubage=120;printf(此人应该输血:%d毫升\n,cubage);}}}【例5-10】编写程序,其功能为根据个人工资计算应缴个人所得税的数目。征缴个人所得税的计算方法为:应纳税额=(工资薪金所得-“五险一金”-扣除数)×适用税率-速算扣除数。根据我国2012年现在实行的7级超额累进个人所得税税率表(表5-1),个税起征点是3500元。级数全月应纳税所得额(含税级距)税率(%)速算扣除数1不超过1,500元302超过1,500元至4,500元的部分101053超过4,500元至9,000元的部分205554超过9,000元至35,000元的部分251,0055超过35,000元至55,000元的部分302,7556超过55,000元至80,000元的部分355,5057超过80,000元的部分4513,505#includestdio.hmain(){floatsum=0,m,t=0;printf(请输入你税前月收入:);scanf(%f,&m);t=m-3500;if(t0&&t=1500){sum=t*0.03;printf(应缴税为:%.2f,税后月收入为:%.2f\n,sum,m-sum);}elseif(t1500&&t=4500){sum=t*0.1-105;printf(应缴税为:%.2f,税后月收入为:%.2f\n,sum,m-sum);}elseif(t4500&&t=9000){sum=t*0.2-555;printf(应缴税为:%.2f,税后月收入为:%.2f\n,sum,m-sum);}elseif(t9000&&t=35000){sum=t*0.25-1005;printf(应缴税为:%.2f,税后月收入为:%.2f\n,sum,m-sum);}elseif(t35000&&t=55000){sum=t*0.3-2775;printf(应缴税为:%.2f,税后月收入为:%.2f\n,sum,m-sum);}elseif(t55000&&t=80000){sum=t*0.35-5505;printf(应缴税为:%.2f,税后月收入为:%.2f\n,sum,m-sum);}elseif(t80000){sum=t*0.45-13505;printf(应缴税为:%.2f,税后月收入为:%.2f\n,sum,m-sum);}elseprintf(你的工资不需要缴个人所得税!\n);}5.2switch语句以及用switch语句和break语句构成的选择结构一、switch语句1.switch语句的一般格式:switch(表达式){case常量表达式1:语句组1;case常量表达式2:语