C程序设计讲师:徐红波Email:x_h_b@tom.com第5章选择结构程序设计选择结构是三种基本结构之一。在大多数程序中都会包含选择结构。它的作用是,根据所指定的条件是否满足,决定从给定的两组操作选择其一。在本章中介绍如何用C语言实现选择结构。在C语言中选择结构用if语句实现。if语句最常用的形式如下:if(关系表达式)语句1else语句2例如:if(x0)y=1;elsey=-1;其中x0是一个关系表达式。“”是一个关系运算符。5.1关系运算符和关系表达式关系运算是逻辑运算中比较简单的一种。“关系运算”就是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。例如a3是一个关系表达式。5.1.1关系运算符及其优先次序C语言提供6种关系运算符:====!=关于优先次序:(1)前4种关系运算符的优先级别相同,后两种也相同。前4种高于后2种。(2)关系运算符的优先级低于算术运算符。(3)关系运算符的优先级高于赋值运算符。5.1.2关系表达式用关系运算符将两个表达式(可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”。C语言没有逻辑型数据,以1代表“真”,以0代表“假”5.2逻辑运算符和逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。5.2.1逻辑运算符及其优先次序C语言提供三种逻辑运算符:(1)&&逻辑与(2)||逻辑或(3)!逻辑非逻辑运算的“真值表”ab!aa&&ba||b真真假真真真假假假真假真真假真假假真假假在一个逻辑表达式中如果包含多个逻辑运算符,如!a&&b||xy&&c按以下的优先次序:(1)!(非)-&&(与)-||(或),即“!”为三者中最高的。(2)逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。5.2.2逻辑表达式逻辑表达式的值应该是一个逻辑量“真”或“假”。C语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即将一个非零的数值认作为“真”。在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。(1)a&&b&&c(2)a||b||c5.3if语句if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。5.3.1if语句的3种形式C语言提供了3种形式的if语句。1、if(表达式)语句例如:if(xy)printf(“%d”,x);2、if(表达式)语句1else语句2例如:if(xy)printf(“%d”,x);elseprintf(“%d”,y);3、if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3……elseif(表达式m)语句melse语句n说明:(1)三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表达式。(2)第二、第三种形式的if语句中,在每个else前面有一个分号,整个语句结束处有一个分号。(3)在if和else后面可以只含一个内嵌的操作语句,也可以有多个操作语句,此时用花括号将几个语句括起来成为一个复合语句。[5.1]输入两个实数,按代数值由小到大的顺序输出这两个数#includestdio.hvoidmain(){floata,b,t;scanf(“%f,%f”,&a,&b);if(ab){t=a;a=b;b=t;}printf(“%5.2f,%5.2f\n”,a,b);}[例5.2]输入3个数a、b、c,要求按由小到大的顺序输出#includestdio.hvoidmain(){floata,b,c,t;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;}}5.3.2if语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:if()if()语句1else语句2elseif()语句3else语句4[例5.3]编程,输入x值,输出y值,函数:-1(x0)y=0(x=0)1(x0)#includestdio.hvoidmain(){intx,y;scanf(“%d”,&x);if(x0)y=-1;elseif(x==0)y=0;elsey=1;printf(“x=%d,y=%d\n”,x,y);}5.3.3条件运算符若在if语句中,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值时,可以用一个条件运算符来处理。条件运算符要求有3个操作对象,称三目(元)运算符。条件表达式的一般形式为表达式1?表达式2:表达式3说明:(1)条件运算符的执行顺序:先求解表达式1,若为非0则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0,则求解表达式3,表达式3的值就是整个条件表达式的值。(2)条件运算符优先于赋值运算符。(3)条件运算符的结合方向为自右至左。(4)表达式不仅可以是数值表达式,还可以是赋值表达式或函数表达式。(5)条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。[例5.4]输入一个字母,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符#includestdio.hvoidmain(){charch;scanf(“%c”,&ch);ch=(ch=‘A’&&ch=‘Z’)?(ch+32):ch;printf(“%c\n”,ch);}5.4switch语句switch语句是多分支选择语句。一般形式:switch(表达式){case常量表达式1:语句1case常量表达式2:语句2…case常量表达式n:语句ndefault:语句n+1;}说明:(1)switch后面括号内的表达式,ANSI标准允许它为任何类型。(2)当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。(3)每一个case的常量表达式的值必须互不相同;否则就会出现相互矛盾的现象。(4)各个case和default的出现次序不影响执行结果。(5)执行完一个case后面的语句后,流程控制转移到下一个case继续执行。(6)多个case可以共用一组执行语句。5.5程序举例[例5.5]写程序,判断某一年是否闰年[例5.6]求ax2+bx+c=0方程的解(1)a=0(2)b2-4ac=0(3)b2-4ac0(4)b2-4ac0[例5.7]运输公司对用户计算运费路程越远,每吨每千米运费越低。标准如下:s250没有折扣250≤s5002%折扣500≤s10005%折扣1000≤s20008%折扣2000≤3300010%折扣3000≤s15%折扣设每吨每千米货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为f=p*w*s(1-d)习题5.3写出下面各逻辑表达式的值。设a=3,b=4,c=5。(1)a+bc&&b==c(2)a||b+c&&b-c(3)!(ab)&&!c||1(4)!(x=a)&&(y=b)&&0(5)!(a+b)+c-1&&b+c/25.4有3个整数a、b、c,由键盘输入,输出其中最大的数。5.5有一个函数:xx1y=2x-11≤x103x-1110≤x5.6给出一百分制成绩,要求输出成绩等级A、B、C、D、E。90分以上为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E。5.9输入4个整数,要求按由小到大的顺序输出。5.10有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1。这4个塔的高度为10m,塔以外无建筑物。今输入任意点的坐标,求该点的建筑高度(塔外的高度为零)。0x22-2-2y