1、14.1 选择结构和条件判断4.2 用if语句实现选择结构4.3关系运算符和关系表达式4.4 逻辑运算符和逻辑表达式4.5 条件运算符和条件表达式4.6 用switch语句实现多分支选择结构4.7选择结构程序综合举例2标题添加点击此处输入相关文本内容点击此处输入相关文本内容前言点击此处输入相关文本内容标题添加点击此处输入相关文本内容3主要内容: 关系运算符和关系表达式 逻辑运算符和逻辑表达式 if语句1.switch语句学习目标:掌握关系运算、逻辑运算和C语言条 件语句的使用重点 ifif语句、switchswitch语句的使用难点 i if语句的嵌套 4在现实生活中,需要进行判断和选择的情况
2、是很多的u如果你在家,我去拜访你u如果考试不及格,要补考u如果遇到红灯,要停车等待u周末我们去郊游u70岁以上的老年人,入公园免票5在现实生活中,需要进行判断和选择的情况是很多的处理这些问题,关键在于进行条件判断由于程序处理问题的需要,在大多数程序中都会包含选择结构,在进行下一个操作之前先进行条件判断6C语言有两种选择语句:(1)if语句,实现两个分支的选择结构(2)switch语句,实现多分支的选择结构7 例4.1 在例3.5的基础上对程序进行改进。题目要求是求 方程的根。 由键盘输入a,b,c。假设a,b,c的值任意,并不保证 。需要在程序中进行判别,如果 ,就计算并输出方程的两个实根,否
3、则就输出“方程无实根”的信息。 02cbxax042 acb042 acb8解题思路求x1、x2x1、x2endd=0无实根yn开 始d=b2-4aca, b, c开 始求根:x1、x2x1、x2enda, b, cd=b2-4ac9#include #include int main ( ) double a,b,c,disc,x1,x2,p,q; scanf(%lf%lf%lf,&a,&b,&c); disc=b*b-4*a*c;计算b2-4ac,disc的值变为-1510 if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a
4、); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0;-150为真11#include #include int main ( ) double a,b,c,disc,x1,x2,p,q; scanf(%lf%lf%lf,&a,&b,&c); disc=b*b-4*a*c;计算b2-4ac,disc的值变为812 if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a); q=sqrt(di
5、sc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0;80为假p的值变为-1q的值变为0.71x1的值变为-0.29x2的值变为-1.7113 if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0;选择结构,用if语句实
6、现的14 if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0;复合语句154.2.1 用if语句处理选择结构举例4.2.2 if语句的一般形式16 例4.2 输入两个实数,按代数值由小到大的顺序输出这两个数。17解题思路:u只需要做一次比较,然后进行一次交换即可u用if语句实现条件判断u关键是怎样实现两个变量值的互换AB互换前AB互换后
7、18ABC19ABC20ABC 21#include int main() float a,b,t; scanf(%f,%f,&a,&b); if(ab) t=a; a=b; b=t; printf(%5.2f,%5.2fn,a,b); return 0;将a和b的值互换如果ab22#include int main() float a,b,t; scanf(%f,%f,&a,&b); if(ab) t=a; a=b; b=t; printf(%5.2f,%5.2fn,a,b); return 0;选择结构,用if语句实现的开 始enda , bbaa,ba b非0023 例4.3 输入3个数
8、a,b,c,要求按由小到大的顺序输出。24解题思路:可以先用伪代码写出算法:uif ab,a和b对换 (a是a、b中的小者)uif ac,a和c对换 (a是三者中最小者)uif bc,b和c对换 (b是三者中次小者)u顺序输出a,b,c25#include int main() float a,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; printf(%5.2f,%5.2f,%5.2fn,a,b,c); return 0;如果 ab,将a和b
9、对换a是a、b中的小者26#include int main() float a,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; printf(%5.2f,%5.2f,%5.2fn,a,b,c); return 0;如果 ac,将a和c对换a是三者中的小者27#include int main() float a,b,c,t; scanf(%f,%f,%f,&a,&b,&c); if(ab) t=a; a=b; b=t; if(ac) t=a;
10、a=c; c=t; if(bc) t=b; b=c; c=t; printf(%5.2f,%5.2f,%5.2fn,a,b,c); return 0;如果 bc,将b和c对换b是三者中的次小者28 if (表达式) 语句1 else 语句2 关系表达式逻辑表达式数值表达式方括号内的部分为可选的29 if (表达式) 语句1 else 语句2 简单的语句复合语句另一个if语句等30最常用的3种if语句形式:1. if (表达式) 语句1 (没有else子句)2. if (表达式) 语句1 else 语句2 (有else子句)3. if(表达式) 语句 else if(表达式) 语句 else i
11、f(表达式) 语句 else if(表达式) 语句 else 语句m+1 (在else部分又嵌套了多层的if语句)31语句功能下条语句语句1语句2e非00格式1:if (e) 语句计算 e 的值并判断。 e 值非0,则执行语句;否则,执行下条语句。格式2:if (e) 语句1 else 语句2计算 e 的值并判断。 e 值非0,则执行语句1;否则,执行语句2。e语句非00下条语句32格式3:if (e ) 语句1 else if (e ) 语句2 else if (e ) 语句3 . else if (e ) 语句m else 语句n 123m计算 e1 的值并判断,其值非0执行语句1;否则,
12、判断 e2 的值,其值非0执行语句2; 否则,判断 e3 的值, 其值非0执行语句3;否则,. 判断em 的值,其值非0执行语句m ;否则,执行语句n00e1e3eme2语句1语句3语句2语句m语句n 下条语句非0非0非0非000.33说明:1 1、if if 后面的表达式类型任意。如:l if(a=b&x=y) printf(“a=b,x=y”);if(a=b&x=y) printf(“a=b,x=y”);l if(3) printf(“OK”); if(3) printf(“OK”);l if(a) printf(“%d”,a); if(a) printf(“%d”,a);2 2、else
13、else语句不能单独使用,与 if if 配对。3 3、语句可以是复合语句4 4、 if(x) if(x) if(x!=0) if(x!=0) if(!x) if(!x) if(x=0) if(x=0)34例:从键盘输入两个整型数,输出最大数。main() int a ,b ; scanf(“%d,%d”,&a,&b); if(a=b)printf(“max=%dn”,a); if(ba)printf(“max=%dn”,b);开 始enda , babaa) a=b; printf(“max=%dn”,a);开 始enda , bbaaa=b非00例: 从键盘输入两个整型数,输出最大数。36
14、 例:某运输公司吨公里基本运费为p,根据距离s的远近计费标准如下: s250km没有折扣 250 s500 2% 折扣500 s1000 5% 折扣 1000 s2000 8% 折扣 2000 s=3000) d=0.15; else if(s=2000) d=0.10; else if(s=1000) d=0.08; else if(s=500) d=0.05; else if(s=250) d=0.02; else d=0.0; f=p*w*s*(1-d); printf(“f=%15.2f ”, f); 38在if语句中又包含一个或多个if语句称为if语句的嵌套一般形式:if( ) if
15、( ) 语句1 else 语句2 else if( ) 语句3 else 语句4 内嵌ifelse总是与它上面最近的未配对的if配对39在if语句中又包含一个或多个if语句称为if语句的嵌套if () if () 语句1 else语句2内嵌if 限定了内嵌if范围40 例4.5有一函数: 编一程序,输入一个x值,要求输出相应的y值。)0(1)0(0)0(1xxxy41解题思路:u用if语句检查x的值,根据x的值决定赋予y的值u由于y的可能值不是两个而是三个,因此不可能只用一个简单的(无内嵌if)的if语句来实现42解题思路:方法1(1) 先后用3个独立的if语句处理:输入x若 x 0, 则y
16、= 1输出x和yscanf(%d,&x);if(x0) y = 1;printf(x=%d,y=%dn,x,y);43解题思路:方法2(2) 用一个嵌套的if语句处理:输入x若x 0, 则y = -1 否则 若 x = 0, 则y = 0 否则 y = 1输出x和yscanf(%d,&x);if(x0) y=-1;else if(x=0) y=0; else y=1;printf(x=%d,y=%dn,x,y);44解题思路:方法2(2) 用一个嵌套的if语句处理:输入x若x 0, 则y = -1 否则 若 x = 0, 则y = 0 否则 y = 1输出x和yscanf(%d,&x);if(
17、x=0) if (x0) y=1; else y=0;else y=-1;printf(x=%d,y=%dn,x,y);提倡内嵌if放在else中45例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);实现if else if else 正确配对方法:加 else总是与它上面最近的未配对的if配对46分析:a=0 不是二次方程。 b2-4ac=0 有两个相等实根。 b2-4ac0 有两不等实根。 b2-4ac=0求xy
18、ynnd=b -4ac2yna=0开 始a , b , c48if(fabs(a)1e-6) printf(“No!”);else d=b*b-4*a*c; if(fabs(d)0) x1=(-b+sqrt(d)/(2*a); x2=(-b -sqrt(d)/(2*a); printf(“Two real roots:%f,%f ”,x1,x2); else xr= -b/(2*a); xi=sqrt(-d)/(2*a); printf(“Complex roots:%f+%fi ”, xr,xi); printf(“Complex roots:%f-%fi ”, xr,xi); 494.3.
19、1关系运算符及其优先次序4.3.2 关系表达式50关系运算符:用来对两个数值进行比较的比较运算符语言提供种关系运算符: (小于) = (小于或等于) (大于) = (大于或等于) = (等于) != (不等于) 优先级相同 (高)优先级相同 (低)51关系、算术、赋值运算符的优先级算术运算符 (高)赋值运算符 (低)关系运算符 52ca+b 等效于 c(a+b)ab=c 等效于 (ab)=ca=bc 等效于 a=(bc 等效于 a=(bc)53关系表达式u用关系运算符将两个数值或数值表达式连接起来的式子 u关系表达式的值是一个逻辑值a+b c+d (a=3) b)=(cd)1 真0 假注意:f
20、=abc 表达式的值。如: 0 x=13 & age=17判断年龄小于12或大于65?age6557ab! a! ba & ba | b 真真假假真真真假假真假真假真真假假真假假真真假假逻辑运算的真值表58逻辑运算符的优先次序! & | (!为三者中最高)与其他运算符的优先次序 ! (高)算术运算符关系运算符 & 和 |赋值运算符 (低)591、逻辑表达式的值 1 真0 假例:设 a=4 , b=5 , 则 !a 为 0 (假) a&b-1 为 1 (真) 5 3 & 2 | 2 b)&(n=cd); printf(“k=%d,m=%d,n=%dn”,k,m,n);运行结果:k=0,m=0,n
21、=1注:(n=cd)不被执行, n 仍然为162修改后的逻辑运算真值表ab! a! ba & ba | b 非0非00011非000101假非01001假0110063判别某一年是否闰年,用逻辑表达式表示闰年的条件是符合下面二者之一:能被4整除,但不能被100整除,如2008能被400整除,如2000u(year % 4 = 0 & year 100 !=0) | year % 400 = 0u如果表达式值为1,则闰年;否则为非闰年64这是C99所增加的一种数据类型可以将关系运算和逻辑运算的结果存到一个逻辑型变量中,以便于分析和运算65有一种if语句,当被判别的表达式的值为“真”或“假” 时,
22、都执行一个赋值语句且向同一个变量赋值如:if (ab) max=a; else max=b;max = (a b) ? a : b;条件运算符66有一种if语句,当被判别的表达式的值为“真”或“假” 时,都执行一个赋值语句且向同一个变量赋值如:if (ab) max=a; else max=b;max = (a b) ? a : b;条件表达式671、条件表达式的一般形式 ? :2、运算规则先计算表达式1,若为非0,则以表达式2的值作为条件表达式的值;否则,以表达式3的值为条件表达式的值。3、优先级算术 关系 逻辑运算(!除外) 条件运算 赋值运算高低右结合68(1)输出x和y当中的最大值 z
23、=xy ? x : y ; printf(“max=%d”,z);或 printf(“max=%d”,xy?x:y); 或 xy?printf (“%d”,x) : printf (“%d”,y); 举例:(2)ab?a:b+1等价于ab?a:(b+1)而不是(ab?a:b)+1(3)ab?a:cd?c:d等价于ab?a:(cd?c:d)(4)xy?1:5.6 表达式的值的类型取高的(5)ch=(ch=A&ch=Z)?(ch+32):ch;69 例4.4 输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。70解题思路:用条件表达式来处理,当
24、字母是大写时,转换成小写字母,否则不转换71#include int main() char ch; scanf(%c,&ch); ch=(ch=A & ch=Z)?(ch+32):ch; printf(%cn,ch); return 0;72switch语句用来实现多分支选择结构u学生成绩分类85分以上为A等7084分为B等6069分为C等u人口统计分类 按年龄分为老、中、青、少、儿童73 例4.6 要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为7084分,C等为6069分 ,D等为 60分以下 。成绩的等级由键盘输入。74解题思路:u判断出这是一个多分支选择问题u根据百分
25、制分数将学生成绩分为4个等级u如果用if语句,至少要用3层嵌套的if,进行3次检查判断u用switch语句进行一次检查即可得到结果75#include int main() char grade; scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!
26、n); return 0; 值为A76#include int main() char grade; scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 不能少77#include int main() char grad
27、e; scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 值为C78#include int main() char grade; scanf(%c,&grade); printf(Your score:); switch
28、(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 值为F79#include int main() char grade; scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: pr
29、intf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 此行位置有问题,应如何修改?80switch语句的作用是根据表达式的值,使流程跳转到不同的语句switch语句的一般形式:switch(表达式) case 常量1 :语句1 case 常量2 :语句2 case 常量n :语句n default : 语句n+1整数类型(包括字符型)81switch语句的作用是根据表达式的值,使流程跳转到不同的语句swit
30、ch语句的一般形式:switch(表达式) case 常量1 :语句1 case 常量2 :语句2 case 常量n :语句n default : 语句n+1不能相同82switch语句的作用是根据表达式的值,使流程跳转到不同的语句switch语句的执行过程:u当switch后的表达式的值与某一个case后的常量表达式的值相等时,执行其后的语句;若无匹配,则执行default后的语句break 语句u使流程跳出switch结构,u终止switch语句的执行。83说明1、各case中的常量表达式值应互不相等2、各case中的常量表达式起着语句标号的作用,用来标识语句的位置3、当多个常量表达式确定
31、的操作可以用同一组语句实现,此时多个case可以共用一组语句4、若每一case及default的最后的语句为break,则各case及default在switch中出现的先后顺 序对执行结果无影响84 scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data erro
32、r!n); 85 scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); 86 scanf(%c,&grade); printf(Your score:); switch(grade) case A: case B: case C: printf
33、(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); 87 例4.7 编写程序,用switch语句处理菜单命令。解题思路:在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个A或a字符,就会执行A操作,输入一个B或b字符,就会执行B操作,等等。88#include int main() void action1(int,int),action2(int,int); char ch; int a=15,b=23; ch=getchar(); switch(ch) case a: case
34、 A: action1(a,b);break; case b: case B: action2(a,b);break; default: putchar(a); return 0;输入a或A调用action1函数,执行A操作void action1(int x,int y) printf(x+y=%dn,x+y);89#include int main() void action1(int,int),action2(int,int); char ch; int a=15,b=23; ch=getchar(); switch(ch) case a: case A: action1(a,b);br
35、eak; case b: case B: action2(a,b);break; default: putchar(a); return 0;输入b或B调用action2函数,执行B操作void action2(int x,int y) printf(x*y=%dn,x*y);90#include int main() void action1(int,int),action2(int,int); char ch; int a=15,b=23; ch=getchar(); switch(ch) case a: case A: action1(a,b);break; case b: case B
36、: action2(a,b);break; default: putchar(a); return 0;输入其他字符发出警告91这是一个非常简单的示意程序实际应用中,所指定的操作可能比较复杂: uA:输入全班学生各门课的成绩uB:计算并输出每个学生各门课的平均成绩uC:计算并输出各门课的全班平均成绩uD:对全班学生的平均成绩由高到低排序并输出可以按以上思路编写程序,把各action函数设计成不同的功能以实现各要求92例4.8 写一程序,判断某一年是否闰年。解题思路:在前面已介绍过判别闰年的方法本例用不同的方法编写程序93用变量leap代表是否闰年的信息。若闰年,令leap=1;非闰年,leap
37、=0。最后判断leap是否为(真),若是,则输出“闰年”信息参见教材图4.1394#include int main()int year,leap; printf(enter year:); scanf(%d,&year); if (year%4=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;标志变
38、量与if (leap!=0)含义相同95#include int main()int year,leap; printf(enter year:); scanf(%d,&year); if (year%4=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;采取锯齿形式96#include int mai
39、n()int year,leap; printf(enter year:); scanf(%d,&year); if (year%4=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;if(year%4!=0) leap=0;else if (year%100!=0) leap=1;else if(ye
40、ar%400!=0) leap=0;else leap=1;97#include int main()int year,leap; printf(enter year:); scanf(%d,&year); if (year%4=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;if(year%4=0
41、& year%100!=0) | (year%400=0) leap=1;else leap=0;98 例4.9 求 方程的解。02cbxax解题思路:处理以下各情况 ,不是二次方程 ,有两个相等实根 ,有两个不等实根。 ,有两个共轭复根。 应当以p+qi和p-qi的形式输出复根 其中,p=-b/2a,q=( )/2a参见教材图4.14042 acb042 acb042 acbacb4299#include #include int main() double a,b,c,disc,x1,x2,realpart, imagpart; scanf(%lf,%lf,%lf,&a,&b,&c); p
42、rintf(The equation ); if(fabs(a)=1e-6) printf(is not a quadraticn);实型不能用if (a=0)100 else disc=b*b-4*a*c; if(fabs(disc)1e-6) x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(has distinct real roots:%8.4f and %8.4fn,x1,x2); else102 realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf( has com
43、plex roots:n); printf(%8.4f+%8.4fin“ ,realpart,imagpart); printf(%8.4f-%8.4fin, realpart,imagpart); return 0; 103 realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf( has complex roots:n); printf(%8.4f+%8.4fin“ ,realpart,imagpart); printf(%8.4f-%8.4fin, realpart,imagpart); return 0; 104 realpart=-
44、b/(2*a); imagpart=sqrt(-disc)/(2*a); printf( has complex roots:n); printf(%8.4f+%8.4fin“ ,realpart,imagpart); printf(%8.4f-%8.4fin, realpart,imagpart); return 0; 105 例4.10 运输公司对用户计算运输费用。路程(s km)越远,每吨千米运费越低。标准如下: s 250 没有折扣 250s 500 2折扣 500s 1000 5折扣 1000s 2000 8折扣 2000s 3000 10折扣 3000s 15折扣106解题思路:u
45、设每吨每千米货物的基本运费为p,货物重为w,距离为s,折扣为du总运费f的计算公式为f=pws(1-d)107折扣的变化规律(参见教材图4.15):u折扣的“变化点”都是250的倍数u在横轴上加一种坐标c,c的值为s/250uc代表250的倍数u当c1时,表示s250,无折扣u1c2时,表示250s500,折扣d=2u2c4时,d=5;4c8时,d=8; 8c12时,d=10;c12时,d=15108提问与解答环节Questions and answers109添加标题添加标题添加标题添加标题此处结束语点击此处添加段落文本 . 您的内容打在这里,或通过复制您的文本后在此框中选择粘贴并选择只保留文字110感谢聆听The user can demonstrate on a projector or computer, or print the presentation and make it into a film讲师:XXXX日期:20XX.X月