选择结构程序设计方案.ppt
第5章 选择结构程序设计,第5章 选择结构程序设计,关系运算符和关系表达式逻辑运算符和逻辑表达式if语句switch语句选择结构程序举例,5.1 关系运算符和关系表达式,所谓“关系运算”实际上就是“比较运算”,即将两个数据进行比较,判定两个数据是否符合给定的关系。,其中操作数可以是变量、常量或表达式。,操作数,关系运算符,操作数,关系运算符,关系运算符,!=,=,=,=,操作数1,操作数2,5.1 关系运算符和关系表达式,1、关系运算符(比较两个量关系的运算符)C语言提供6种关系运算符:(大于)=(大于或等于)=(等于)!=(不等于)注意:在语言中,“等于”关系运算符是双等号“=”,而不是单等号“=”(赋值运算符)。,2关系运算符的优先级,(1)在关系运算符中,前4个优先级相同,后2个也相同,且前4个高于后2个。(2)与其它种类运算符的优先级关系,算术运算符(高),关系运算符,赋值运算符(低),5.1 关系运算符和关系表达式,关系运算符都是双目运算符,其结合性均为左结合(多个优先级相同的关系运算符同时出现时,运算方向为从左至右)。例如:a+bc 等价于(a+b)cabc 等价于(ab)c/*左结合*/,5.1 关系运算符和关系表达式,3关系运算符的结合性,由于语言没有逻辑型数据,所以用整数“”表示“逻辑真”,用整数“”表示“逻辑假”。,5.1 关系运算符和关系表达式,4关系表达式的概念,所谓关系表达式是指,用关系运算符将两个表达式连接起来,进行关系运算的式子。例如,下面的关系表达式都是合法的:ab,a+bc-d,(a=3)=b,(ab)=(bc),5关系表达式的值,例如,假设num1=3,num2=4,num3=5,则:(1)num1num2的值(2)(num1num2)!=num3的值(3)num1num2num3的值 思考题:任意改变num1或num2的值,会影响整个表达式的值吗?(4)(num1num2)+num3 再次强调:C语言用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。所以,关系表达式的值还可以参与其它种类的运算,例如算术运算、逻辑运算等。,例 int a=3,b=2,c=1,d,f;ab(ab)=c b+cb f=abc,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,5.1 关系运算符和关系表达式,关系运算注意:,例 若a=0;b=0.5;x=0.3;则 a=x=b的值为,0,例 5278在C中是允许的,值为,0,例 int i=1,j=7,a;a=i+(j%4!=0);则a=,2,例 a0 结果为 A100 结果为,1,0,5.1 关系运算符和关系表达式,例 注意区分“=”与“=”int a=0,b=1;if(a=b)printf(“a equal to b”);else printf(“a not equal to b”);,例 应避免对实数作相等或不等的判断如 1.0/3.0*3.0=1.0 结果为可改写为:fabs(1.0/3.0*3.0-1.0)1e-6,关系运算注意:,5.1 关系运算符和关系表达式,0,逻辑运算符,逻辑运算符用于连接一个或多个条件,判断这些条件是否成立逻辑运算符的类型为:,5.2 逻辑运算符和逻辑表达式,逻辑“与”运算符&,所有学科及格,考勤率达到 75%,留级,留级,留级,升级,Yes,No,No,No,No,Yes,Yes,Yes,逻辑“与”运算符&,逻辑“或”运算符|,无法支付,可支付,可支付,可支付,Yes,No,No,No,No,Yes,Yes,Yes,购物帐单,信用卡,逻辑“或”运算符|,逻辑“非”运算符!,天气 NOT 阴天,逻辑运算符总结,&,只有当两个条件都为真时才执行操作,只要任何一个条件为真时就执行操作,对原条件取反,即:如果原条件为假时就执行操作,|,!,5.2 逻辑运算符和逻辑表达式,1.逻辑运算符及运算规则,下面的逻辑表达式哪个是合法的:(x=0)&(x5)(x=10)!(x=0),(1)C语言提供三种逻辑运算符:&逻辑与(相当于“同时”)|逻辑或(相当于“或者”)!逻辑非(相当于“否定”),(2)运算规则 1)&:当且仅当两个运算量的值都为“真”时,运算结果为“真”,否则为“假”。(全真既真)2)|:当且仅当两个运算量的值都为“假”时,运算结果为“假”,否则为“真”。(一真既真)3)!:当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时,运算结果为“真”。(取反),5.2 逻辑运算符和逻辑表达式,1.逻辑运算符及运算规则,例如,假定x=5,则(x=0)&(x5)的值,2逻辑运算符的优先级,(1)逻辑非的优先级最高,逻辑与次之,逻辑或最低.即:!(非)&(与)|(或)(2)与其它种类运算符的优先关系!算术运算符 关系运算符&|赋值运算符 逗号运算符,5.2 逻辑运算符和逻辑表达式,例 ab&xy a=b|x=y!a|ab,/(a=x)&(x=b),/(ab)&(xy),/(a=b)|(x=y),/(!a)|(ab),用逻辑运算符将1个或多个关系表达式或逻辑量(真或假)连接起来的式子。,5.2 逻辑运算符和逻辑表达式,3逻辑表达式的概念,在C语言中,用逻辑表达式表示多个条件的组合。例如,要判断某一年year是否是闰年。闰年的条件是符合二者之一:能被4整除,但不能被100整除。能被4整除,又能被400整除。,(year%4=0)&(year%100!=0)|(year%400=0),逻辑表达式的值也是一个逻辑值(非“真”即“假”)。,5.2 逻辑运算符和逻辑表达式,4逻辑表达式的值,例如,假设num=12,则:!num的值 num=1 num31的值1。,C语言中,运算量:0表示“假”,非0表示“真”,运算结果:0表示“假”,1表示“真”,例 a=4;b=5;!a a&b a|b!a|b 4&0|2 53&2|84-!0 c&d,值为1,值为0,值为1,值为1,值为1,值为1,/(53)&2|(8(4-(!0)值为1,5.2 逻辑运算符和逻辑表达式,(1)逻辑运算符两侧的操作数,除可以是和非的整数外,也可以是其它任何类型的数据,如实型、字符型等。a&b(2)在计算逻辑表达式时,并不是所有的表达式都被求解,只有在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。,5.2 逻辑运算符和逻辑表达式,5说明,短路特性,例 a(m=ab)&(n=cd),/结果m=0,n=1,例如:执行以下语句后,x,y,z的值分别为()int x=0,y=0,z=0;+x|+y,5.3 简单条件结构,用if语句可以构成分支结构。它对给定的条件进行判断,根据判断的结果(真或假)来决定执行某个分支程序段。,单选择:格式:if(expression)statement执行过程:,例:if(xy)printf(“%d”,x);,表达式,真,假,语句,#include main()int num1,num2,sum;printf(n请输入两个数:);scanf(%d%d,简单if语句的示例,56,78,134,请输入两个数:56 78,两数的和大于 100,双选:格式:if(expression)statement1 else statement2执行过程:,例:if(xy)printf(%d,x);else printf(%d,y);,表达式,真,假,语句1,语句2,修改上例#include main()int num1,num2,sum;printf(n请输入两个数:);scanf(%d%d,#include main()int num;printf(n请输入一个整数:);scanf(%d,if-else语句的示例,57,请输入一个整数:57,57 是一个奇数。,问题描述:要求用户输入一个字符,用程序判断该字符是否为小写字母,并输出相应的信息。,#include main()char a;printf(n请输入一个字符:);scanf(%c,使用&运算符的示例,T,请输入一个字符:T,您输入的字符不是小写字母,问题描述:接受用户输入的三种商品的价格。如果购买的三种商品中至少有一种商品的价格大于 50 或者三种商品的总额大于 100,则折扣率为15,否则折扣率为,计算并显示用户应付的钱数。,#include main()float rate1,rate2,rate3;double discount,total;printf(n请输入第一种商品的价格:);scanf(%f,使用|运算符的示例,if(rate150)|(rate250)|(rate350)|(total100),输出:请输入第一种商品的价格:34请输入第二种商品的价格:42请输入第三种商品的价格:38折后总价为:96.90,问题描述:确定用户输入的数字是否可以被5整除,并输出相应的消息。,#include main()int num;printf(n 请输入一个数:);scanf(%d,使用!运算符的示例,请输入一个数:90,该数能被 5 整除,问题描述:判定给定的年份是否为闰年。提示:闰年的判定规则为:能被 4 整除但不能被 100 整除的年份,或能被 400 整除的年份。,#include main()int year;printf(n 请输入年份:);scanf(%d,综合示例1,请输入年份:2005,2005 年不是闰年,问题描述:输入一个5位数,判断它是不是回文数。例如:12321是回文数,个位与万位相同,十位与千位相同。,#include main()long ge,shi,qian,wan,x;printf(n 请输入一个五位整数:);scanf(%ld,综合示例2,输出:请输入一个五位整数:45654这个数是回文数,如:if(a=b,说明:if后面的表达式类型任意,if(x)if(x!=0)if(!x)if(x=0)if和else后面只含一个语句,也可以是复合语句(用括起来)else不能作为语句单独,它必须与if配对使用,例 考虑下面程序的输出结果:#include main()int x,y;scanf(“%d,%d”,编译错误!,有胡萝卜吗?,有黄瓜吗?,制作胡萝卜沙拉,有,多重条件判断,有,制作黄瓜沙拉,制作黄瓜沙拉,没有,没有,多重if(阶梯式),要处理多重条件判断的情况,需要使用多重条件结构,多重条件结构,嵌套 if,switch结构,if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;.else 语句n;,多重 if 结构是if-else 的另一种形式,这种形式也称为阶梯式 if-else-if,多重 if 结构,真,假,真,假,真,假,表达式1,真,假,语句1,语句2,表达式2,表达式3,语句3,语句4,真,假,真,假,多重 if 结构示例,问题描述:编写一个程序,根据用户输入的期末考试成绩,输出相应的成绩评定信息。成绩大于等于90分输出“优”;成绩大于等于80分小于90分输出“良”;成绩大于等于60分小于80分输出“中”;成绩小于60分输出“差”。,#include main()float grade;printf(n 请输入期末考试成绩:);scanf(%f,59,请输入期末考试成绩:59,差,嵌套 if 结构就是将整个 if 块插入另一个 if 块中,嵌套 if 结构,if(表达式1)if(表达式2)if(表达式3)语句m;else语句n;,真,真,真,假,if(x 0)if(y 1)z=1;else/*这个 else 部分属于哪个 if?*/z=2;,嵌套 if 结构,C语言规定,每个 else 部分总属于前面最近的那个缺少对应的 else 部分的 if 语句。提倡使用大括号括起来以避免看起来有二义性。,?,if else 配对原则:缺省 时,else总是和它上面离它最近的未配对的if配对,#includemain()int a,b;printf(n 请输入 A 和 B 的值:);scanf(%d%d,嵌套 if 结构的示例,68,93,输出:AB,例: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 正确配对方法:加,考虑下面程序输出结果:main()int x=100,a=10,b=20;int v1=5,v2=0;if(ab)if(b!=15)if(!v1)x=1;else if(v2)x=10;x=-1;printf(“%d”,x);,结果:-1,switch 结构,printf(“这是迈克尔,身高 180cm,加利福尼亚第 12 大街”);,printf(“这是丹尼尔,身高 193cm,现居住地不明,1998 年 12 月 12 日在佛罗里达被捕”);,printf(“这是吉姆,身高 175cm,墨西哥州海鸥路弗罗拉公寓,于 2003 年 11 月 1 日在新泽西因抢银行被捕”);,default:,printf(“未发现匹配项。对不起!”);,停止搜索,停止搜索,停止搜索,停止搜索,警察记录,不是,这是吉姆,身高 175cm,墨西哥州海鸥路弗罗拉公寓,于 2003 年 11 月 1 日在新泽西因抢银行被捕,不是,是,switch-case 语句是多路判断语句switch 语句计算条件表达式并对照多个常数值进行检查,switch 结构,switch(表达式)case 常量 1:语句;break;case 常量 2:语句;break;default:语句;,计算表达式的值,如果等于常量1,如果等于常量2,如果没有找到匹配的值,阅读程序,分析结果 main()int score;scanf(“%d”,运行结果:score为5时,输出:Very good!Good!Pass!Fail!data error!,switch 结构,在使用switch结构时应注意以下几点:在case后的各常量表达式的值不能相同,否则会出现错误;在case后,允许有多个语句,可以不用括起来;每个case语句后都必须有一个break语句,否则会出现错误;各case和default子句的先后顺序可以变动,而不会影响程序执行结果;default子句可以省略;,switch 结构示例,问题描述:要求用户输入一个字符值并检查它是否为元音字母。,char in_char;printf(n 请输入一个小写字母:);scanf(%c,e,请输入一个小写字母:e,您输入的是元音字母 e,多重if结构和switch结构都可以用来实现多路分支多重if结构用来实现两路、三路分支比较方便,而switch结构实现三路以上分支比较方便在使用switch结构时,应注意分支条件要求是整型表达式,而且case语句后面必须是常量表达式有些问题只能使用多重if结构来实现,例如要判断一个值是否处在某个区间的情况,比较多重 if 和 switch 结构,示例,问题描述:要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII码值小于32的为控制字符。在09之间的为数字,在AZ之间为大写字母,在az之间为小写字母,其余则为其它字符。,main()char c;printf(n 请输入一个字符:);c=getchar();if(c=0,E,请输入一个字符:E,该字符是一个大写字母,示例,问题描述:编写一个简单的计算器,实现两个整型数的四则运算。,int a,b;char op;printf(n 输入操作数1,运算符,操作数2:);scanf(%d,%c,%d,输入操作数1,运算符,操作数2:45,*,2,452=90,45,2,*,switch说明:E1,E2,En是常量表达式,且值必须互不相同语句标号作用,必须用break跳出case后可包含多个可执行语句,且不必加 switch可嵌套多个case可共用一组执行语句,如:case A:case B:case C:printf(“score60n”);break;.,分析结果#include”stdio.h”main()int a=15,b=21,m=0;switch(a%3)case 0:m+;break;case 1:m+;switch(b%2)default:m+;case 0:m+;break;printf(”%dn”,m);,A1 B2 C3 D4,分析结果 void main()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;case 3:a+;b+;printf(“na=%d,b=%d”,a,b);,运行结果:a=2,b=1,#include main()int c;printf(Enter m or n or h or other:);c=getchar();switch(c)case m:printf(nGood morning!n);break;case n:printf(nGood night!n);break;case h:printf(nHello!n);break;default:printf(n?n);break;,根据输入字母输出字符串,条件运算符,?,?,条件表达式,考试是否及格?,是,不是,真,表达式 1,假,表达式 2,条件运算符,if(num100)value=y;else value=n;,使用“if-else”的等同代码,假设 num=200,value=num 100,;,?,y,:,n,200,value,=,y,一般形式:expr1?expr2:expr3执行过程功能:相当于条件语句,但不能取代一般if语句,例 求 a+|b|printf(“a+|b|=%dn”,b0?a+b:a-b);,例(a=b)?Y:N(x%2=1)?1:0(x=0)?x:-x(c=a&c=z)?c-a+A:c,条件运算符可嵌套 如 x0?1:(x0?-1:0)优先级:13,结合方向:自右向左 如 ab?a:cd?c:d ab?a:(cd?c:d)expr1、expr2、expr3类型可不同,表达式值取较高的类型,例 x?a:b/x=0,表达式值为b;x0,表达式值为a xy?1:1.5/xy,值为1.0;xy,值为1.5,5.3.3 条件运算符和条件表达式,条件运算符示例,问题描述:个人所得税收取规定:工资大于1000元的部分将扣除5的个人所得税。小于1000元的部分不扣除个人所得税。要求用户输入基本工资,计算税后工资。,#include void main()double sal;double rate;printf(n 请输入基本工资:);scanf(%lf,请输入基本工资:1500,税后工资为:1475.00,总结,多重if结构就是在主if块的else部分中还包含其他if块嵌套if结构是在主if块中还包含另一个if 语句C语言规定,嵌套if结构中每个else部分总是属于前面最近的那个缺少对应的else部分的if语句switch结构也可以用于多分支选择。用于分支条件是整型表达式,而且判断该整型表达式的值是否等于某些值(可以罗列的),然后根据不同的情况,执行不同的操作条件运算符是 ifelse 语句的另一种表现形式,练习,从键盘输入的三角形的三条边长,编程判定是该三边 可以组成何种三角形。从键盘任意输入年、月,编程输出该年份该月的天数。商店卖西瓜,10斤以上的每斤0.15元,8斤以上的每斤0.3元,6斤以上的每斤0.4元,4斤以上的每斤0.6元,4斤以下的每斤0.8元,从键盘输入西瓜的重量和顾客所付钱数,输出应付款和应找钱数。某服装批发商店经营套服,也单件出售。若买的不少于50套,每套80元;不足50套的每套100元;只买上衣每件60元;只买裤子每条45元。从键盘任意输入顾客所买的上衣和裤子的件数,输出应付款。,给出一百分制成绩,要求输出成绩等级A、B、C、D、E。90分以上为A,80到89分为B,70到79分为C,60到69分为D,60分以下为E。有3个整数a、b、c,由键盘输入,输出其中最大的数。通过键盘输入字符,判断其为控制、数字、大写字母、小写字母和其他字母的哪一类。根据如下函数关系,从键盘任意输入一个数(x),计算出相应的y值。x y x0 0 0=x10 x 10=x20 10 20=x40-0.5x+20,