《c语言课件第四章.ppt》由会员分享,可在线阅读,更多相关《c语言课件第四章.ppt(38页珍藏版)》请在三一办公上搜索。
1、共 39 页 第 1 页,第四章,选择结构,C语言程序设计,共 39 页 第 2 页,本章要点:正确使用关系表达式和逻辑表达式掌握用if语句和switch语句实现选择结构掌握条件运算符的使用,共 39 页 第 3 页,选择语句是控制程序执行选择结构的语句 是程序实现逻辑判断的唯一形式,根据学生分数判断是否及格 根据学生分数如何进行分级 一元二次方程求解,自然语言:如果 那么 否则C语言:分支语句,如何解决?,为什么要用选择结构?,问题,共 39 页 第 4 页,4.关系运算符和关系表达式,.1.1 关系运算符 1.关系运算符 关系运算是进行比较大小的运算,并产生运算结果1(真)或 0(假)。语
2、言中的关系运算符有种:、!优先次序:前种同级,高于后种(后种同级)关系运算符的结合性为从左到右;,算术运算符(高)关系运算符赋值运算符(低),如:32 ab,注意!,共 39 页 第 5 页,4.1.2 关系表达式 定义:用关系运算符将两个表达式连接起来的式子。形式:表达式1 关系运算符 表达式2 如:(ab)(by、s+fd 关系表达式的值为逻辑值“真”或“假”.注意:语言没有逻辑型数据,关系表达式的真、假 是以数值“”代表“真”,以“”代表“假”。例:设 a=3,b=2,c=1,求下列表达式的值?,cb,值为0(假),(a-b)=1,值为1(真),(b+c)a,值为0(假),a=534,a
3、的值为0,共 39 页 第 6 页,练 习,设有变量定义 int z;分析z%2=0 的值?如果z为偶数,则 z%2=0的值为1;否则z为奇数,则 z%2=0的值为0;因此,z%2=0是断言“z是偶数”的c语言判断式。2.x与y的个位数字相同 x%10=y%10 如何判断十位数上数字相同?,共 39 页 第 7 页,4.2.1 逻辑运算符 C语言提供三种逻辑运算符:&(逻辑与)、|(逻辑或)、!(逻辑非)说明:(1)“&”和“|”是“双目(元)运算符”,它要求有两个操作数。(2)“!”是“单目(元)运算符”,只要求有一个运算量。(3)优先级次序:!&|,4.2 逻辑运算符和逻辑表达式,a&b
4、a、b均为真,则a&b为1(真)。a|b a、b之一为真,则a|b为1(真)。!a 若a为真,则!a为假。,共 39 页 第 8 页,运算符的优先级,!(非)(高)算术运算符 关系运算符&和|赋值运算符(低),共 39 页 第 9 页,4.2.2 逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子.规定:判断一个逻辑量为“真、假”的方法:“非”代表“真”,“”代表“假”例:写出11&x3&2|8n+3例:(m=ab)&(n=c-d)若a=3,b=2,c=6,d=5,n=8 例:a|b|c 如果a为真,就不再判断b和c了,强调:在逻辑表达式的求解过程中,只要能确定表达式的值,就不继续向下求
5、解其他的值了.,(a+b)c)&(c=d),(a-(!d)|(m(n+3),(53)&2|(8(4(!0),共 39 页 第 10 页,逻辑运算真值表,共 39 页 第 11 页,根据给定的表达式决定要执行的操作。,执行过程:计算表达式的值,判断表达式值为真时执行语句组,否则跳过语句继续执行后续语句。,单选择,语句格式:if(表达式)语句组;例:if(ab)x=a;,1.单选择if语句,表达式可以是关系式或逻辑式,4.3 选择语句,4.3.1 if 语句,共 39 页 第 12 页,2.双选择if语句,语句格式:if(表达式)语句组1;else 语句组2;,双选择,功能:计算表达式的值,当表达
6、式值为非零时执行语句组1,否则执行语句组2。,共 39 页 第 13 页,3.控制条件的表示#include“stdio.h”main()int a,b,c=25;a=10c;b=a=a;printf(“a=%d,b=%d,”,a,b);if(c)printf(“c=%d”,c);,运行结果:a=0,b=1,c=25,共 39 页 第 14 页,控制条件的几种形式:if(a=0)k=1;if(a=0)k=1;if(a!=0)k=1;if(a)k=1;if(1)k=1;,思考a取不同的值时,语句的执行情况?,提示:不要用“=“比较两个浮点数是否相等。可使用如下方式:if(fabs(a-b)1.e
7、-6)fabs(x)是库函数,表示求x的绝对值,共 39 页 第 15 页,#include“stdio.h”main()int a,b,s;scanf(“%d%d”,例1,运行时输入:3 4,输出:16,共 39 页 第 16 页,指出下列程序的输出结果:#include“stdio.h”main()int a;scanf(%d,程序运行:输入58,输出?585858 输入30,输出?,例2,共 39 页 第 17 页,if(a=60)printf(“及格n”);else printf(“不及格n”);,main()int a;scanf(“%d”,输出不及格的成绩,例3,共 39 页 第
8、18 页,#include“stdio.h”main()int a,b,max;printf(Input a and b=);scanf(%d%d,求a和b两数中较大的一个。,例4,共 39 页 第 19 页,#include“stdio.h”main()int a,b,t;printf(Input a and b=);scanf(%d%d,按由小到大的顺序输出两个数。,例5,共 39 页 第 20 页,有关if语句的说明,表达式后面不加分号 语句之后有分号 else不是语句,不能单独使用 当if后有多个执行语句时,必须用 将多 个语句括起来,构成一个复合语句,之 外不必有分号。,共 39 页
9、 第 21 页,4.3.2 if语句的嵌套,格式:if(表达式)if(表达式1)语句11;else 语句12;else if(表达式2)语句21;else 语句22;,在if语句的“语句1”或“语句2”中又包含着if语句,判断表达式的值,若为非0,再判断表达式1的值,非0执行语句11,否则执行语句12若表达式的值为0,再判断表达式2的值,非0执行语句21,否则执行语句22,功能:,共 39 页 第 22 页,下列程序段表示的数学式子?y=-1;if(x!=0)if(x0)y=2*sin(x);else y=0;,程序段表示的数学式1:0(x0),讨论:给第二个if行加 后表示的数学式?,程序段
10、表示的数学式2:-1(x0),数学式1程序可表示为:y=-1;if(x!=0)if(x0)y=2*sin(x);else y=0;,思考,强调:if和else可成对出现,也可不成对出现,每个else都与距其最近的if配对。,共 39 页 第 23 页,if 语句的常用格式:if(表达式1)语句 1 else if(表达式2)语句 2 else if(表达式3)语句 3 else if(表达式m)语句 m else 语句 n,仅执行表达式为真的else if后的内嵌语句,若所有的表达式值都为0,则执行最后一个else后的内嵌语句.,共 39 页 第 24 页,已知 编写程序,输入一个x的值,输出
11、y值。,程序为:#include“stdio.h”main()int x,y;scanf(“%d”,例6,共 39 页 第 25 页,switch语句 该语句为开关语句,适合解决多分支的情况。格式:switch(表达式)case 常量表达式:语句序列;case 常量表达式:语句序列;case 常量表达式n:语句序列n;default:语句序列n+1;说明:执行顺序如下:,4.3.2 switch 语句问题:为什么引出switch语句?,可以是一条语句,也可以是多条语句。多条语句不必用括号括起来。,起语句标号的作用,不进行条件判断,在执行完某个 case后的语句序列后,将自动转移到下一个case
12、继续执行。,可以是整型、字符型。,共 39 页 第 26 页,a.计算表达式的值;b.找到与表达式的值相同的case常量表达式,执行该case后边的语句序列,之后依次往下执行语句块。,表达式,语句序列1,语句序列2,语句序列n,语句序列n+1,共 39 页 第 27 页,每个语句序列的最后一条语句后增加break语句,执行流程为:,共 39 页 第 28 页,根据考试成绩的等级打印出百分制分数段。采用多分支情况程序段:switch(grade)case A:printf(“85100n”);break;case B:printf(“7084n”);break;case C:printf(“60
13、69n”);break;case D:printf(“60n”);break;default:printf(“error”);若 grade=A时,输出结果为?当 grade=B时,输出结果为?,例7,共 39 页 第 29 页,流程图为:,共 39 页 第 30 页,说明:case和default 的次序可以交换。例:#include“stdio.h”main()int c=3;switch(c)case 1:c+;default:c+;case 2:c+;printf(c=%dn,c);,case 3:c+;,共 39 页 第 31 页,多个case可以执行同一个语句序列。switch(c
14、=getchar()case y:case Y:printf(“You are right.n”);,共 39 页 第 32 页,条件运算符:唯一的三目操作符,要求有三个操作对象。格式:表达式?表达式:表达式功能:判断表达式的值,该值为“非0”,则取表达式2的值,为“0”时,取表达式3的值。如:max=ab?a:b 若 a=3,b=2,则 max=?说明:(1)条件运算符优于赋值运算符。(2)条件运算符的结合方向为“自右向左”。如:当a=1,b=2,c=3,d=4 时,表达式 ab?a:cd?c:d,值为:?如:若 x=1,y=0,a=3,b=-3 表达式(yx?a:b)&a+b 值为:?,4
15、,0,4.4 条件运算符,共 39 页 第 33 页,(3)条件表达式中的表达式的类型可以与表达式和表达式的类型不同。条件表达式值的类型为二者中较高的类型。如:xy?1.2:6,当xy成立时条件表达式的值为1.2,否则为实型数据6.0。c=xy?1:s,当xy成立时c=1,否则c=s。,共 39 页 第 34 页,if(y0)x=-y;elsex=y;,(y0)?x=-y:x=y;,等价,等价,x=(y0)?-y:y;,说明:if else可以完成与条件 运算符(?:)完全相同 的任务,并且可以进行 相应的转换。,共 39 页 第 35 页,将输入的大写字母转换为小写字母.main()char
16、 ch;scanf(“%c”,printf(“%c”,ch)输入 输出 a,例8,共 39 页 第 36 页,判别某一年year是否闰年。闰年条件:能被整除,但不能被100整除,或能被整 除,又能被400整除。判断闰年的逻辑表达式为:(year%4=0&year%100!0)|year%400=0)判断非闰年的逻辑表达式为:(year%4!=0)|(year%100=0&year%400!=0),共 39 页 第 37 页,main()/*输入今天的日期,显示明天的日期。*/int year,month,day;scanf(%d%d%d,共 39 页 第 38 页,小 结,if语句实现单分支if-else语句实现两个分支switch-break语句实现多分支嵌套if语句可以实现复杂的分支结构(注意else与最近的if结合),