1、第5章 选择结构程序设计,5.1 关系运算符及表达式 5.2 逻辑运算符及表达式 5.3 if语句 5.4 switch语句 5.5选择结构程序设计举例,问题与说明,【问题】 1、从键盘输入一个数,如果该数为正,打印,否则不打印; 2、解一元二次方程,求出相应的实根或复根。,解决办法: 1、引入新的程序结构:选择结构,又称之为分支结构 2、为了配合分支结构相,需引入逻辑表达式的概念。 3、有三种形式可进行分支结构的程序设计A、 if 结构(三种具体形式)B、多重选择结构(switch语句,即情形结构)C、无条件转移结构(goto语句,不要求),5.1 关系运算符及表达式,1)进行比较运算 2)
2、连接的运算对象:都是双目运算符号。可以 连接整型、实型、字符型、枚举型数据;,5.1 关系运算符,3)运算结果结果为数值型,用0表示假,1表示真。(关系表达式的值, 可以参与其它种类的运算,例如算术运算、逻辑运算等) 4)优先级别:低于算术运算,高于赋值运算。例:int x=2,y=3,z; z=3-1=x+14521 结果为0,5.1 关系表达式实例,用关系运算符将两个算术表达式或两个字符串表达式联起来的式子,其值为逻辑值。,例5101 #include main()int a,b;a=10=56;b=(10=5)6;printf(“%d,%dn”,a,b); 输出结果:,例5102 #in
3、clude main()int a,b;a=6*77+8;b=7!=73;printf(“%d,%dn”,a,b); 输出结果:,0,1,1,1,1)C语言提供三种逻辑运算符: & 逻辑与(相当于“同时”) | 逻辑或(相当于“或者”) ! 逻辑非(相当于“否定”) 2)运算规则1)&:当且仅当两个运算量的值都为“真”时,运算结果为“真”,否则为“假”。2)| :当且仅当两个运算量的值都为“假”时,运算结果为“假”,否则为“真”。3)! :当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时,运算结果为“真”。,5.2 逻辑运算及其表达式,5.2 逻辑运算符,例如,假定x=5,则
4、(x=0) & (x5) 的值为“假”。3)运算结果为数值型:0表示假,1表示真。4)结合方向:从左到右(&、|); 从右到左(!)。例: f=!(34) 结果为15)优先级别: (高) !, &、| (低),5.2 逻辑表达式中的优先级图示,2、逻辑表达式,逻辑运算的特殊规则,1)a&b&c: 只有a 为非0时才计算b 的值;只有a和b 都为非0时才计算c 的值; 2)a|b|c: 只要a 为非0时就不必计算b 和c;只有a为0时才计算b 的值; 只有a和b 都为0时才计算c 的值; 3)a|b&c: 当a的值为0时才计算b;只有当a的值为0,且b的值为真(非0)时才计算c; 4)a&b |
5、c: 当a的值为真(非0)时才计算b;当(a&b)运算后的值为假时才计算c;,逻辑运算的特殊规则实例,例:写出程序运行结果 main()int a=0,b=1,c=-1;a+|-b ,输出结果: 1 0 -1 0 1 0 1 1 0 分析: a+|-b 中,先判断a(为0),然后a在自加边为1;要执行-b;b 变为0;则c+不被执行,所有c的值不变。第一次输出结果为: 1 0 -1,5. 3 if 语句,5.3.1 简单if语句 一般格式:if(表达式) 语句体 【说明】 1)表达式可以是任意类型的值,具体形式有:常量、变量、函数调用、表达式(包括算术表达式、赋值表达式、逗号表达式、关系表达式
6、、逻辑表达式、条件运算表达式、 ) 2)表达式必须加()括起来。 3)语句体中的语句可以是:一条语句;多条语句(当语句体包含多个语句时,语句体要用括起来。可以单独占一行)。,4)执行过程:当表达式的值为非0时,执行语句体的语句 5)一个if语句总体上只算一条语句 注意: (1)c中对“真”、“假”的表示:只要表达式的值为非0则认为是“真”,否则是“假”; (2)“假”(0值)的几种具体形式:0、0.0、0、NULL (3)关系、逻辑运算的结果(的表示)与“真”、“假”值的区别与联系。,5. 3 if 语句,例5.2输入任意三个数a、b、c,按从小到大的顺序排序输出。 分析:if (ab) a和
7、b交换,另a为a,b中较小值if (ac) a和c交换,另a为a,b,c中最小值if (bc) b和c交换,另b为次大值,c为最大值,例5.2输入任意三个数a、b、c,按从小到大的顺序排序输出。main() int a,b,c,t;printf(“input three numbers:“);scanf(“%d,%d,%d“, input three numbers:11,22,18 11,18,22,5.3.2 复合ifelse语句,1复合if语句的一般格式if(表达式) 语句组1;else 语句组2; 【说明】 (1)表达式可以是任意类型的值,具体形式有:常量、变量、表达式 (2)if语句
8、中的“表达式”必须用“(”和“)”括起来。 (3)else子句(可选)是if语句的一部分,必须与if配对使用,不能单独使用。 (4)if语句允许嵌套,但嵌套的层数不宜太多。(5)“语句组1”和“语句组2”,可以只包含一个简单语句,也可以是复合语句。,if 逻辑表达式“真”复合语句 1 else复合语句 2,不管是简单语句,还是复合语句中的各个语句,每个语句后面的分号必不可少!例如: if (ab) max=a;else max=b;,5.3.2 ifelse if语句,1符合if语句的一般格式if(表达式1) 语句组1 else if (表达式2) 语句组2 else if (表达式3) 语句
9、组3 else if (表达式4) 语句组4 else if (表达式n) 语句组n else 语句组n+1 【注意】 if语句嵌套时,else子句与在它上面、距它最近、 且尚未匹配的if配对。,Ifelse配对规则可能产生的“副作用”,例5.3:有符号函数,要求输入不同的x的值能输出正确的符号数。 算法思路1:先可以用简单的if语句实现,用三个if 语句就可以。 算法思路2:要求用简单的ifelse语句实现,分析以下几个程序。,程序1: 程序2: if(x=0) if(x0) y=1; else if(x=0) y=0;else y=0; else y=1;else y=-1;程序3: 程序
10、4:y=-1; y=0; if(x!=0) if(x=0)if(x0) y=1; if(x0) y=1;else y=0; else y=-1;,输入x=0验证,输入x=-5验证,if语句嵌套时,else子句 与在它上面、距它最近、且尚未匹配的if配对。,选择结构之IF语句应用实例分析,有如下实例,要求用简单if语句、ifelse语句、 ifelse if语句分别实现。,算法之一:用if语句实现,main()float x,y;printf(“x=?“);scanf(“%f“, ,算法之二:用ifelse语句实现,main() float x,y; printf(“x=?“);scanf(“%
11、f“, ,算法之三:用ifelse if语句实现,main() float x,y;printf(“x=?“);scanf(“%f“, ,1一般格式: 表达式1?表达式2:表达式33个表达式的类型可以各不相同。 2运算规则 如果“表达式1”的值为非0, 则运算结果等于“表达式2”的值;否则, 等于“表达式3”的值。 例:int max(int a,int b) int m;if(ab) m=a; else m=b; 与条件运算等价: m=(ab?a:b);,5.3.3 条件运算符,例5.4 从键盘上输入一个字符,如果它是大写字母,则把它转换成小写字母输出;否则,直接输出。 main() cha
12、r ch;printf(“Input a character: “); scanf(“%c“, ,5.3.3 条件运算符,条件运算的嵌套 例1:ab? a: b+1 相当于: ab? a: (b+1)例2: ab? a: cd? c: d 相当于: ab? a: (cd? c: d)设:int a=1,b=2,c=3,d=4;则上述表达式的结果为4,5.3.3 条件运算符,输入星期中的某一天,显示对应的英文,#include main() int i;printf(“Input 1- 7: ”); scanf(“%d”, ,此例 似显 复杂, 是否 有更 好的 办法?,5.4 switch语句
13、的结构及其执行过程,1switch语句的一般形式 switch(表达式) case 常量表达式1:语句组1;break;case 常量表达式2:语句组2;break;case 常量表达式:语句组n;break;default:语句组;break; ,2执行过程 (1)首先计算switch后的条件表达式的值, (2) 找到与表达式的值相同的case, 执行该case后面的语句组(包括之后的各个case和default情形,并不再对之后的各case进行判断);(3)如果没有任何一个case 匹配,则执行default 后面的语句组( 若存在default情形时 )。 (4) break语句的功能:
14、跳出switch结构。(通常在case语句执行完 后添加break,结束分支结构 ),5.4 switch语句的结构及其执行过程,3说明 (1)switch后面的“表达式” 一般是:int、char和枚举型中的一种也可以是不含变量与函数的常量表达式。例: case 3+4:/* 正确*/case x+y: /*错误 设int x=3,y=4;*/ (2)多个case子句,可共用同一语句(组)。 例如: case 10:case 9: printf(“grade=An“); break; (3)default情形可以省略;每个case后面的语句有多条语句时不必加括起来。,5.4 switch语句
15、的结构及其执行过程,main() int i; printf( “Input 1- 7: ”); scanf(“%d”, ,输入星期中的某一天,显示对应的英文,break; break; break; break; break; break;,5.5 选择结构程序设计举例,例5.6 求一元二次方程ax2+bx+c=0的解(a0)。 #include “math.h“ main() float a,b,c,disc,x1,x2,p,q; scanf(“%f,%f,%f”, ,else p=-b/(2*a); /*求出两个共轭复根*/ q=sqrt(fabs(disc)/(2*a); printf
16、(“x1=%7.2f + %7.2f in“, p, q); printf(”x2=%7.2f - %7.2f in“, p, q); 说明:由于实数在计算机中存储时,经常会有一些微小误差,所以本案例判断disc是否为0的方法是:判断disc的绝对值是否小于一个很小的数(例如10-6)。 思考题: 如果将系数a、b、c定义成整数,能否直接判断disc是否等于0?,5.5 选择结构程序设计举例,例:从键盘上输入一个百分制成绩score,按下列原则输出其等级:score90,等级为A;80score90,等级为B;70score80,等级为C;60score70,等级为D;score60,等级为E。,分析:1)可以用最简单的switch分支结构实现,将成绩转化为十个分数段(score/10):0-10;每个值分别对应于每个成绩段。再分10种情形处理。 2)将问题划分为6种情形,106,default;再分6种情形处理。,5.5 选择结构程序设计举例,main() int score; printf(“Input a score(0100): ”); scanf(“%d”, ,一下为参考部分,第5章 作业及上机练习,作业:5.2, 5.3;5.5 上机练习:1)练习例题5.2,5.4,5.7;2)上机编程作业题,