1、1,第 四 章,选择结构程序设计,2,第四章 选择结构程序设计,一、关系运算符和关系表达式 二、逻辑运算符和逻辑表达式 三、使用if语句实现的选择结构 四、条件运算符和条件表达式 五、switch语句 六、选择结构程序举例,主要内容,3,关系运算符, = = != (6种),第四章 选择结构程序设计,优先级,赋值 关系( 后2前4 ) 算术,关系表达式,用关系运算符将两个表达式连接起来的式子.,算术、关系、逻辑、赋值、字符。,值,真(1) 假(0),53,一、关系运算符和关系表达式,4,ab 比较两个变量的大小5=5 比较变量和常量的大小a+b=c*d 比较表达式的值的大小abc 比较表达式的
2、值的大小a!=bc 比较表达式的值的大小,举例,5,21,9,举例,已知 a=5,b=4,c=3,d=7 求下列表达式的值,a+b=c*d,abc,a!=bc,a+b=c*d,0,abc,1,0,a != b c,0,1,算术运算符的优先级高于关系运算符,不能用于判断b的值是否在a 与c 之间,“”运算符的优先级高于“!=”,6,逻辑运算符,!(逻辑非) &(逻辑与) |(逻辑或),运算规则,优先次序,赋值 | & 关系 算术 !,第四章 选择结构程序设计,(1) !: 取逻辑值的相反值。 (2) &: 参加运算的两个逻辑值都为真时,结果为真(1)。 (3) |: 参加运算的两个逻辑值都为假时
3、,结果为假(0)。,逻辑表达式,用逻辑运算符将关系表达式和逻辑量连接起来的式子。,举例,已知: (a= b=),1,a | b & 0,! a & (53) | b,0,双目,单目,二、逻辑运算符和逻辑表达式,7,第四章 选择结构程序设计,二、逻辑运算符和逻辑表达式,第五章 选择结构程序设计,举例,53 & 8 4- !0,0,(53) & (8 (4- !0),4 & 53 | (a=6),1,逻辑运算符两侧的运算对象不但可以是和,也可以是或非的整数,也可是任何类型的数据。系统判定标准:为假;非为真。,例4.2 已知:a=1,b=0,求逻辑表达式!a&(53)|b的值。,!a & (53)
4、| b,不再求解表达式“53”,0,0,8,例4.3 求逻辑表达式4&53|2的值。,4 & 53 | 2,1,1,不再求解表达式“2”,1,思考,#include void main() int a=1,b=1;if (a1 ,1,1,短路问题,9,选择结构,单分支,双分支,if (表达式) 语句,多分支,if (表达式) 语句 else 语句,if (表达式1) 语句 else if (表达式) 语句 else 语句n,if 语句的嵌套,switch语句,第四章 选择结构程序设计,选择结构的总类,10,格式,流程图,第四章 选择结构程序设计,if (表达式) 语句,三、if语句实现选择结构
5、 单分支,if (xy) printf(“%d”,x);,举例,11,例4.5,第四章 选择结构程序设计,#include “stdio.h“ int main( ) int num1,num2,max; printf(“input two numbers: n “); scanf(“%d%d“, ,56 41 max=56,三、if语句实现选择结构 单分支,输入两个整数,输出其中较大的数。,12,例4.6,第四章 选择结构程序设计,#include int main() float a,b,t=0;scanf(“%f,%f”, ,3,43.00, 4.00, if (ab)t=a; a=b;
6、 b=t; , if (ab)t=a; a=b; b=t; ,3,44.00, 0.00,当某些语句作为一个整体出现的时候,必须是复合语句的形式。,三、if语句实现选择结构 单分支,输入两个实数,按由小到大的数序输出它们。,13,格式,if (xy) printf(“%d”,x); else printf(“%d”,y);,第四章 选择结构程序设计,if (表达式) 语句 else 语句,三、if语句实现选择结构 双分支,举例,流程图,14,第四章 选择结构程序设计,#include int main() float a,b,c,p,s;scanf(“%f,%f,%f”, ,输入三角形的三边,
7、求三角形的面积。,3,4,5 s= 6.00,3,4,8 Not a triangle!,三、if语句实现选择结构 双分支,例4.9,15,格式,举例,第四章 选择结构程序设计,if (cost3000) cash=500; else if (cost2000) cash=300; else if (cost1500) cash=200; else if (cost1000) cash=100; else cash=0;,if (表达式1) 语句 else if (表达式) 语句 else if (表达式n) 语句n else 语句n+1,语句本身含分号,三、if语句实现选择结构 多分支,(1
8、)ifelse if形式,16,编程实现分段函数。,问题分析: (1)判断条件x0.0是否成立,如果成立y=0.0 (2)判断条件x10.0是否成立,如果成立y=1.0/x; (3)判断条件x20.0是否成立,如果成立y=2*x+1; (4)以上条件都不成立 y=5*x-1;,例4.11,17,#include “stdio.h“ int main( ) float x,y;scanf(“%f“, ,第一次运行:,5 x=5.00,y=0.20,15 x=15.00,y=31.00,第二次运行:,21.67 x=21.67, y=107.35,第三次运行:,程序如下:,18,if语句的嵌套,第
9、四章 选择结构程序设计,在if语句中又包含一个或多个if语句。,被嵌套的条件语句和嵌套进去的条件语句既可是单分支,也可是双分支。,if (表达式)if (表达式) 语句else 语句 else if (表达式3) 语句3else 语句4,注意,if与else的配对原则: else总是与它上面的最近的未配对的if配对。,分析方法,1、主句是单分支还是双分支的。 2、嵌套进来的子句是双分支还是单分支的,嵌套在if后面还是else后面。,三、if语句实现选择结构 多分支,(2)if语句嵌套结构,19,例4.12,第四章 选择结构程序设计,已知a=3 b=4 c=5 d=0, d=?,if (ab)
10、d=a; else if (cb) d=c;else d=b;,if (ab)if (cb) d=c; else d=b ;,if (ab)if (cb) d=c; else d=b ;,if (ab) if (cb) d=c;else d=b; else d=a;,d=5,d=3,d=0,d=4,20,使用if语句中应注意的问题,在if关键字之后的括弧内为表达式,该表达式通常是逻辑表达式或关系表达式,但也可以是其它任何合法的C表达式 条件判断表达式必须用括弧括起来,后面没有分号。但在语句之后必须加分号。 如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用 括起来组成一个复合语句,
11、#include int main() float a,b,c,p,s;scanf(“%f,%f,%f”, ,21,条件运算符 条件表达式,举例,if (ab) max=a; else max=b;,第四章 选择结构程序设计,表达式?表达式:表达式,max= (ab)? a : b;,说明,取值,表达式1为真,则取值为表达式2的值; 表达式1为假,则取值为表达式3的值。,四、条件运算符和条件表达式,P69,22,使用条件表达式求两个数的较大值。,#include “stdio.h“ int main( ) float num1,num2,max=0;scanf(“%f,%f“, ,例4.14,
12、第一次运行:,3.2,4 4.00,第二次运行:,4,3.2 4.00,23,例题:输入字符,判断是否大写字母,是则转小写,否则不转换;然后输出。,#include “stdio.h” Void main() char ch;scanf(“%c”,*/,运行结果: A a,24,开关语句,第四章 选择结构程序设计,switch (表达式) case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;case 常量表达式3:语句3;break;case 常量表达式n:语句n;break;default: 语句n+1 ,当分支较多时,使用嵌套的if语句层数多,程序冗长而
13、且可读性降低。此时可以考虑使用switch语句(开关语句)来处理多分支。,五、switch 语句实现多分支,25,例4.17,#include void main() char grade; printf(“请输入考试等级AD:”);scanf(“%c”, ,B 7079 6069 60 Error,根据输入的考试成绩等级打印出百分制分数段。 A: 80100 B: 7079 C: 6069 D: 60,第四章 选择结构程序设计,26,#include void main() char grade; printf(“请输入考试等级AD:”);scanf(“%c”, ,B 7079,最后一行的b
14、reak可以省略。,第四章 选择结构程序设计,例4.17,根据输入的考试成绩等级打印出百分制分数段。 A: 80100 B: 7079 C: 6069 D: 60,27,设计简单计算器程序,要求根据用户从键盘输入的表达式:操作数1 运算符op 操作数 2 计算表达式的值,指定的运算符为 ,/ 用if 及 switch实现程序运行举例: Please enter the expression: 22.12+12.1022.12+12.10=34.22,程序输出,屏幕提示,键盘输入,28,float num1,num2,result; char op; printf(“please enter t
15、he expression:n“); scanf(“%f%c%f“,29,思考 (例4.18),#include void main() int score; printf(“请输入考试成绩0100:”);scanf(“%c”, ,根据输入的考试成绩(百分制整数)打印出等级水平。(使用ifelse语句实现) A: 80100 B: 7079 C: 6069 D: 60,思考:使用switch语句如何实现?,程序,第四章 选择结构程序设计,30,#include void main() int score; printf(“请输入考试成绩0100:”);scanf(“%d”, ,根据输入的考试成
16、绩(百分制整数)打印出等级水平。(使用switch语句实现) A: 80100 B: 7079 C: 6069 D: 60,思考:本程序有问题么?,程序,思考 (例4.18),31,#include void main() int score; printf(“请输入考试成绩0100:”);scanf(“%d”, ,太麻烦了 有没有简单的办法呢?,改进程序1,101种情况,思考 (例4.18),根据输入的考试成绩(百分制整数)打印出等级水平。(使用switch语句实现) A: 80100 B: 7079 C: 6069 D: 60,32,#include void main() int sco
17、re, p; printf(“请输入考试成绩0100:”);scanf(“%c”, ,改进程序2,11种情况,思考:不同case值时执行相同的操作,是否可以合并?,第四章 选择结构程序设计,33,#include void main() int score, p; printf(“请输入考试成绩0100:”);scanf(“%c”, ,改进程序3,注意:多个case共用一组执行语句时,共用的执行语句写在最后一个case的后面。,第四章 选择结构程序设计,34,第四章 选择结构程序设计,例4.10,求方程 ax2+bx+c=0 的解。(各种形式),六、选择结构程序设计举例,35,第四章 选择结构
18、程序设计,#include #include void main() float a,b,c,disc,x1,x2,p,q;scanf(“%f%f%f“,3 4 1 该方程有两个不等的实根: -0.3333 and -1.0000,4 3 1 该方程有两个复根:-0.3750 + 0.3307 i-0.3750 + 0.3307 i,例4.10,求方程 ax2+bx+c=0 的解。(各种形式),第一次运行:,第二次运行:,36,第四章 选择结构程序设计,例4.13,输入三角形的三边,判断能否构成三角形。如果能,说明所组成的三角形是等腰、等边、直角还是一般三角形。 (假定边长均为整数),#inc
19、lude void main() int a,b,c;int f1=0,f2=0;printf(“输入三角形的三边:”);scanf(“%d%d%d”,else if(f1=1) printf(“等腰三角形”);else if(f2=1) printf(“直角三角形”);else printf(“一般三角形”); elseprintf(“不构成三角形!”); ,输出“一般三角形”,判断的顺序是否可以任意调整?,37,作 业,第四章 习题 1、2、3、4(1)/(2),38,#include “stdio.h“ void main() int a=3,b=2,c=1,d=0; printf(“%
20、d,“,d=ab+c); printf(“%dn“,d=ab+c); ,答案是:1,0,d=ab+c 按照书运算优先级第1步b+c;第2步a3;第3步d=0 d=ab+c 第1步b+c;第2步a3;第3步d=0,39,int x=1,y=0,a=0,b=0; switch(x)case 1:switch(y)case 0: a+;break; case 1:b+;break;case 2:a+;b+;break; printf(“a=%d,b=%dn“,a,b);,答案是:a=2,b=1,第1步:判断x,从case 1入口进 第2步:判断y,从case 0入口进a=1 第3步:由于switch(x)中case 1结束后没有break,导致继续执行case 2,