1、1本章要点:本章要点:正确使用关系表达式和逻辑表达式正确使用关系表达式和逻辑表达式 掌握用掌握用ifif语句和语句和switchswitch语句实现选择结构语句实现选择结构 掌握条件运算符的使用掌握条件运算符的使用2 选择语句是控制程序执行选择结构的语句选择语句是控制程序执行选择结构的语句 是程序实现逻辑判断的唯一形式是程序实现逻辑判断的唯一形式 根据学生分数判断是否及格根据学生分数判断是否及格 根据学生分数如何进行分级根据学生分数如何进行分级 一元二次方程求解一元二次方程求解自然语言:自然语言:如果如果 那么那么 否则否则C语言:语言:分支语句分支语句如何解决如何解决?34.4.关系运算符和
2、关系表达式关系运算符和关系表达式.1.1.1.1 关系运算符关系运算符 1.1.关系运算符关系运算符 关系运算是进行比较大小的运算,并产生运算结果关系运算是进行比较大小的运算,并产生运算结果1 1(真)或(真)或 0 0(假)。(假)。语言中的关系运算符有种语言中的关系运算符有种:、!、!优先次序:前种同级,高于后种(后种同级)优先次序:前种同级,高于后种(后种同级)关系运算符的结合性为从左到右;关系运算符的结合性为从左到右;算术运算符算术运算符 (高高)关系运算符关系运算符赋值运算符赋值运算符 (低低)如:如:32 ab)(bb)(bc)、ab ay xy、s+fds+fd 关系表达式的值为
3、逻辑值关系表达式的值为逻辑值“真真”或或“假假”.注意注意:语言没有逻辑型数据,语言没有逻辑型数据,关系表达式关系表达式的真、假的真、假 是以数值是以数值“”代表代表“真真”,以以“”代表代表“假假”。例例:设:设 a=3,b=2,c=1 a=3,b=2,c=1 ,求下列表达式的值?,求下列表达式的值?cb值为值为0(假)(假)(a-b)=1值为值为1(真)(真)(b+c)34 a的值为的值为051.1.设有变量定义设有变量定义 intint z;z;2.2.分析分析z%2=0 z%2=0 的值?的值?3.3.如果如果z z为偶数,则为偶数,则 z%2=0z%2=0的值为的值为1 1;4.4.
4、否则否则z z为奇数,则为奇数,则 z%2=0z%2=0的值为的值为0 0;5.5.因此,因此,z%2=0z%2=0是断言是断言“z z是偶数是偶数”的的c c语言判断语言判断式。式。6.6.2.x2.x与与y y的个位数字相同的个位数字相同7.7.x%10=y%10 x%10=y%10 如何判断十位数上数字相如何判断十位数上数字相同同?64.2.1 4.2.1 逻辑运算符逻辑运算符 C C语言提供三种逻辑运算符:语言提供三种逻辑运算符:&(&(逻辑与逻辑与)、|(|(逻辑或逻辑或)、!(!(逻辑非逻辑非)说明说明:(1 1)“&”&”和和“|”|”是是“双目(元)运算符双目(元)运算符”,它
5、要它要求有两个操作数。求有两个操作数。(2 2)“!”!”是是“单目(元)运算符单目(元)运算符”,只要求有一个,只要求有一个运算量。运算量。(3 3)优先级次序:)优先级次序:!&|!&|4.24.2 逻辑运算符和逻辑运算符和逻辑表达式逻辑表达式 a&ba&b a a、b b均为真均为真,则则a&ba&b为为1 1(真)。(真)。a|ba|b a a、b b之一为真之一为真,则,则a|ba|b为为1 1(真)。(真)。!a !a 若若a a为真为真,则则!a!a为假。为假。7!(非)!(非)(高高)算术运算符算术运算符 关系运算符关系运算符&和和|赋值运算符赋值运算符 (低低)84.2.2
6、4.2.2 逻辑表达式逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子用逻辑运算符将关系表达式或逻辑量连接起来的式子.规定:判断一个逻辑量为规定:判断一个逻辑量为“真、假真、假”的方法:的方法:“非非”代表代表“真真”,“”代表代表“假假”例例:写出写出1x101x1&x10 1x1&x10 1x3&2|83&2|84!0!0 例例:a+ba+b n+3n+3 例例:(m=a(m=ab)&(nb)&(n=c-dc-d)若若a=3,b=2,c=6,d=5,n=8a=3,b=2,c=6,d=5,n=8 例例:a|b|ca|b|c 如果如果a a为真,就不再判断为真,就不再判断b b和和c
7、c了了 强调:在逻辑表达式的求解过程中强调:在逻辑表达式的求解过程中,只要能确定只要能确定表达式的值表达式的值,就不继续向下求解其他的值了就不继续向下求解其他的值了.(a+b)(n+3)(53)&2|(8b)x=a;if(ab)x=a;1.单选择单选择if语句语句 语句语句零零表达式表达式非零非零表达式表达式可以是关系式或逻辑式可以是关系式或逻辑式4.3 选择语句选择语句4.3.1 if 语句语句112.双选择双选择if语句语句语句格式语句格式:if(if(表达式表达式)语句组语句组1;1;else else 语句组语句组2;2;功能功能:计算表达式的值,当表达式值为计算表达式的值,当表达式值
8、为非零时执行非零时执行语句组语句组1,否则执行否则执行语语句组句组2。APB非零非零零零123.3.控制条件的表示控制条件的表示#include“#include“stdio.hstdio.h”main()main()intint a,b,ca,b,c=25;=25;a=10c;a=10c;b=a=a;b=a=a;printf(“aprintf(“a=%=%d,bd,b=%=%d,”,a,bd,”,a,b););if(cif(c)printf(“cprintf(“c=%=%d”,cd”,c););运行结果:运行结果:a=0,b=1,c=2513控制条件的几种形式:控制条件的几种形式:if(ai
9、f(a=0)k=1;=0)k=1;if(aif(a=0)k=1;=0)k=1;if(aif(a!=0)k=1;!=0)k=1;if(aif(a)k=1;)k=1;if(1)k=1;if(1)k=1;思考思考a取不同的值时,语句的执行情况?取不同的值时,语句的执行情况?提示:不要用提示:不要用“=“比较两个浮点数是否相等。比较两个浮点数是否相等。可使用如下方式:可使用如下方式:if(fabs(a-bif(fabs(a-b)1.e-6)1.e-6)fabs(xfabs(x)是库函数,表示求是库函数,表示求x x的绝对值的绝对值14#include“#include“stdio.hstdio.h”m
10、ain()main()intint a,b,sa,b,s;scanf(“%d%d”,&a,&bscanf(“%d%d”,&a,&b););s=a;s=a;if(aif(ab)s=b;50)if(a50)printf(%d,aprintf(%d,a););if(a40)if(a40)printf(%d,aprintf(%d,a););if(a30)if(a30)printf(%d,aprintf(%d,a););程序运行程序运行:输入输入5858,输出输出?585858?585858 输入输入3030,输出?输出?16if printf(“及格及格n”);else printf(“不及格不及格n
11、”);main()int a;scanf(“%d”,&a);if(ab)max=a;else max=b;printf(The max of a and b is:%dn,max);ab?max=bmax=a非非00求求a a和和b b两数中较大的一个。两数中较大的一个。18#include“stdio.h”main()int a,b,t;printf(Input a and b=);scanf(%d%d,&a,&b);if(ab)t=a;a=b;b=t;printf(“%d,%dn,a,b);按由小到大的顺序输出两个数。按由小到大的顺序输出两个数。19有关有关if语句的说明语句的说明l 表达
12、式后面不加分号表达式后面不加分号l 语句之后有分号语句之后有分号l else不是语句,不能单独使用不是语句,不能单独使用l 当当if后有多个执行语句时,必须用后有多个执行语句时,必须用 将多将多 个语句括起来,构成一个复合语句,个语句括起来,构成一个复合语句,之之 外不必有分号。外不必有分号。204.3.2 if语句的嵌套语句的嵌套格式:格式:if(表达式)表达式)if(表达式表达式1)语句语句11;else 语句语句12;else if(表达式表达式2)语句语句21;else 语句语句22;在在ifif语句的语句的“语句语句1 1”或或“语句语句2 2”中又包含着中又包含着ifif语句语句判
13、断表达式的值,若为非判断表达式的值,若为非0,再判断,再判断表达式表达式1的的值,非值,非0执行语句执行语句11,否则执行语句,否则执行语句12若表达式的值为若表达式的值为0,再判断,再判断表达式表达式2的值,非的值,非0执行语句执行语句21,否则执行语句,否则执行语句22功能功能:外if内嵌if21下列程序段表示的数学式下列程序段表示的数学式子子?y y=-1;=-1;if(x!=0)if(x!=0)if(x0)y=2 if(x0)y=2*sin(xsin(x);else y=0;else y=0;程序段表示的数学式程序段表示的数学式1:1:0 (0 (x0)x0)2sinx (x0)讨论讨
14、论:给第二个给第二个ifif行加行加 后表示的数学式?后表示的数学式?程序段表示的数学式程序段表示的数学式2:2:-1 (-1 (x0)x0)2sinx (x0)数学式数学式1 1程序可表示为程序可表示为:y=-1;y=-1;if(x!=0)if(x!=0)if(x0)y=2if(x0)y=2*sin(xsin(x););else y=0;else y=0;思考22 if 语句的常用格式:语句的常用格式:if(表达式表达式1)语句语句 1 else if(表达式表达式2)语句语句 2 else if(表达式表达式3)语句语句 3 else if(表达式表达式m)语句语句 m else 语句语句
15、 n仅仅执行表达式为真的执行表达式为真的else if后的内嵌语句后的内嵌语句,若所有的若所有的表达式值都为表达式值都为0,则执行最后一个则执行最后一个else后的内嵌语句后的内嵌语句.23 已知已知 编写程序,输入一个编写程序,输入一个x x的值,输出的值,输出y y值。值。010001)(xxxxy程序为:程序为:#include“stdio.h”main()int x,y;scanf(“%d”,&x);if(x0)y=-1;else if(x=0)y=0;else y=1;printf(“x=%d,y=%dn”,x,y);24switchswitch语语句句 该语句为开关语句,适合解决多
16、分支的情况。该语句为开关语句,适合解决多分支的情况。格式:格式:switch(switch(表达式)表达式)case case 常量表达式:语句常量表达式:语句序列序列;case case 常量表达式:语句常量表达式:语句序列序列;case case 常量表达式常量表达式n n:语句序列语句序列n;n;default default:语句序列语句序列n+1;n+1;说明说明:执行顺序如下:执行顺序如下:4.3.2 switch 语句语句问题问题:为什么引出为什么引出switch语句?语句?可以是一条语句,也可可以是一条语句,也可以是多条语句。多条语以是多条语句。多条语句不必用括号括起来。句不必
17、用括号括起来。起语句标号的作用,不进行条起语句标号的作用,不进行条件判断,在执行完某个件判断,在执行完某个 case后的语句序列后,将自动转移后的语句序列后,将自动转移到下一个到下一个case继续执行。继续执行。可以是整型、可以是整型、字符型。字符型。25 a.a.计算表达式的值;计算表达式的值;b.b.找到与表达式的值相同的找到与表达式的值相同的casecase常量表达式,执行该常量表达式,执行该casecase后边的语句序列,之后后边的语句序列,之后依次往下执行语句块依次往下执行语句块。表达式语句序列1语句序列2语句序列n语句序列n+1 26每个语句序列的最后一条语句后增加每个语句序列的最
18、后一条语句后增加break语句,执行流程为:语句,执行流程为:表达式语句序列1语句序列n语句序列n+1语句序列227 根据考试成绩的等级打印出百分制分数段。根据考试成绩的等级打印出百分制分数段。采用多分支情况程序段:采用多分支情况程序段:switch(grade )case A:printf(“85100n”);break;case B:printf(“7084n”);break;case C:printf(“6069n”);break;case D:printf(“60n”);break;default:printf(“error”);若若 grade=A时,输出结果为时,输出结果为?当当
19、grade=B时,输出结果为?时,输出结果为?28流程图为:流程图为:grade输出 “85100”输出 “b?a:bmax=ab?a:b 若若 a=3,b=2,a=3,b=2,则则 max=?max=?说明说明:(1)(1)条件运算符优于赋值运算符条件运算符优于赋值运算符。(2)(2)条件运算符的结合方向为条件运算符的结合方向为“自自右右向向左左”。如:如:当当a=1,b=2,c=3,d=4 a=1,b=2,c=3,d=4 时,时,表达式表达式 ab?a:cd?c:d,ab?a:cd?c:d,值为:值为:?如:如:若若 x=1,y=0,a=3,b=-3x=1,y=0,a=3,b=-3 表达式
20、表达式 (yx?a:b)&a+b (yx?a:b)&a+b 值为:值为:?404.4 条件运算符条件运算符32(3)条件表达式中的表达式的类型可以与表达式条件表达式中的表达式的类型可以与表达式和表达式的类型不同。条件表达式值的类和表达式的类型不同。条件表达式值的类型为二者中较高的类型型为二者中较高的类型。如:如:xy?1.2:6,当当xy成立时成立时条件表达式条件表达式的的值为值为1.2,否则为实型数据,否则为实型数据6.0。c=xy?1:s ,当当xy成立时成立时c=1,否则否则c=s。33if (y0)x=-y;elsex=y;(y0)?x=-y:x=y;等价等价等价等价x=(y=A&=A
21、&chch=Z)?(ch+32):ch;=Z)?(ch+32):ch;printf(“%cprintf(“%c”,”,chch)输入输入 输出输出 a a35 判别某一年判别某一年year是否闰年。是否闰年。闰年条件:能被整除,但不能被闰年条件:能被整除,但不能被100整除整除,或能被整或能被整 除,又能被除,又能被400整除。整除。判断闰年的逻辑表达式为:判断闰年的逻辑表达式为:(year%4=0&year%100!0)|year%400=0)判断非闰年的逻辑表达式为:判断非闰年的逻辑表达式为:(year%4!=0)|(year%100=0&year%400!=0)36 main()/*输入
22、今天的日期,显示明天的日期。输入今天的日期,显示明天的日期。*/int year,month,day;scanf(%d%d%d,&year,&month,&day);switch(month)case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(day31)day=day+1;else if(month=12)year=year+1;month=1;day=1;else month=month+1;day=1;break;case 4:case 6:case 9:case 11:if(day30)day=day+1;else month=m
23、onth+1;day=1;break;case 2:if(day28)day=day+1;else if(year%4=0&year%100!=0)|(year%400=0)if(day=29)month=month+1;day=1;else day=day+1;else if(day=28)month=month+1;day=1;break;default:printf(error!n);month=-1;break;if(month!=-1)printf(tomorrow is:%d%d%dn,year,month,day);37 ifif语句实现单分支语句实现单分支 if-elseif-else语句实现两个分支语句实现两个分支 switch-breakswitch-break语句实现多分支语句实现多分支 嵌套嵌套ifif语句可以实现复杂的分支结构语句可以实现复杂的分支结构(注意注意elseelse与最近的与最近的ifif结合结合)38