《第5部分选择结构程序设计方案教案.ppt》由会员分享,可在线阅读,更多相关《第5部分选择结构程序设计方案教案.ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第5部分选择结构程序设计方案 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望第第5章章 选择结构程序设计选择结构程序设计w关系运算符和关系表达式关系运算符和关系表达式w逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式wif语句语句wswitch语句语句w选择结构程序举例选择结构程序举例5.1 关系运算符和关系表达式关系运算符和关系表达式 所谓所谓“关系运算关系运算”实际上就是实际上就是“比较运算比较运算”,即,即将两个数据进行比较,判定两个数据是否符合给定的将两个数据
2、进行比较,判定两个数据是否符合给定的关系。关系。其中操作数可以是变量、常量或表达式。其中操作数可以是变量、常量或表达式。操作数操作数关系运算符关系运算符操作数操作数关系运算符关系运算符关系运算符操作数操作数1 1操作数操作数2 25.1 关系运算符和关系表达式关系运算符和关系表达式1、关系运算符、关系运算符(比较两个量关系的运算符)C语言提供语言提供6种关系运算符:种关系运算符:(小于小于)(大于大于)=(大于或等于大于或等于)=(等于等于)!=(不等于不等于)注意:注意:在语言中,在语言中,“等于等于”关系运算符是双等号关系运算符是双等号“=”,而不是单等号,而不是单等号“=”(赋值运算符)
3、。(赋值运算符)。优先级相同(高)优先级相同(高)优先级相同(低)优先级相同(低)2关系运算符的优先级关系运算符的优先级(1)在关系运算符中,前)在关系运算符中,前4个优先级相同,后个优先级相同,后2个也相同,且前个也相同,且前4个高于后个高于后2个。个。(2)与其它种类运算符的优先级关系)与其它种类运算符的优先级关系算术运算符(高)算术运算符(高)关系运算符关系运算符赋值运算符(低)赋值运算符(低)5.1 关系运算符和关系表达式关系运算符和关系表达式关系运算符都是关系运算符都是双双目运算符,其目运算符,其结合性结合性均为均为左左结合结合(多个优先级相同的关系运算符同时出现时,运算方向(多个优
4、先级相同的关系运算符同时出现时,运算方向为从左至右)。例如:为从左至右)。例如:a+bc 等价于等价于(a+b)cab!=c 等价于等价于(ab)!=c a=bc 等价于等价于a=(bc)a=b=c 等价于等价于a=(bbc 等价于等价于(ab)c /*左结合左结合*/5.1 关系运算符和关系表达式关系运算符和关系表达式3关系运算符的结合性关系运算符的结合性 由于语言没有逻辑型数据,所以用整数由于语言没有逻辑型数据,所以用整数“”表示表示“逻辑真逻辑真”,用整数,用整数“”表示表示“逻辑假逻辑假”。5.1 关系运算符和关系表达式关系运算符和关系表达式4关系表达式的概念关系表达式的概念所谓关系表
5、达式是指,用关系运算符将两个所谓关系表达式是指,用关系运算符将两个表表达式达式连接起来,进行关系运算的式子。连接起来,进行关系运算的式子。例如,下面的关系表达式都是合法的:例如,下面的关系表达式都是合法的: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)(num
6、1b (ab)=c b+cb f=abc/表达式值1/表达式值1/表达式值0/d=1/f=05.1 关系运算符和关系表达式关系运算符和关系表达式n关系运算注意:关系运算注意:例 若a=0;b=0.5;x=0.3;则 a=x278在C中是允许的,值为0例 int i=1,j=7,a;a=i+(j%4!=0);则a=2例 a0 结果为 A100 结果为105.1 关系运算符和关系表达式关系运算符和关系表达式例例 注意区分注意区分“=”与与“=”int a=0,b=1;if(a=b)printf(“a equal to b”);else printf(“a not equal to b”);例例 应
7、避免对应避免对实数实数作相等或不等的判断作相等或不等的判断如如 1.0/3.0*3.0=1.0 结果为结果为可改写为:可改写为:fabs(1.0/3.0*3.0-1.0)=0)&(x=0)&(x10)&(x10)&(x10)(x5)(x5)(x=10)!(x=0)(x=10)!(x=0)(1 1)C C语言提供三种逻辑运算符:语言提供三种逻辑运算符:&逻辑与(相当于逻辑与(相当于“同时同时”)|逻辑或(相当于逻辑或(相当于“或者或者”)!逻辑非(相当于逻辑非(相当于“否定否定”)(2)运算规则)运算规则 1)&:当当且且仅仅当当两两个个运运算算量量的的值值都都为为“真真”时时,运运算算结结果果
8、为为“真真”,否则为,否则为“假假”。(全真既真)(全真既真)2)|:当当且且仅仅当当两两个个运运算算量量的的值值都都为为“假假”时时,运运算算结结果为果为“假假”,否则为,否则为“真真”。(一真既真)(一真既真)3)!:当当运运算算量量的的值值为为“真真”时时,运运算算结结果果为为“假假”;当运算量的值为当运算量的值为“假假”时,运算结果为时,运算结果为“真真”。(取反)(取反)5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式1.1.逻辑运算符及运算规则逻辑运算符及运算规则a ab b!a!a!b!ba&ba&ba|ba|b真真假假真真假假假假假假真真真真真假假假假假真真假假真真真假真真
9、例如,假定例如,假定x=5,则,则 (x=0)&(x10)的值的值 (x5)的值的值2逻辑运算符的优先级逻辑运算符的优先级(1)逻辑非的优先级最高,逻辑与次之,逻辑或最低)逻辑非的优先级最高,逻辑与次之,逻辑或最低.即:即:!(非)!(非)&(与)(与)|(或)(或)(2)与其它种类运算符的优先关系)与其它种类运算符的优先关系!算术运算符算术运算符 关系运算符关系运算符&|赋值运算符赋值运算符 逗号运算符逗号运算符5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式例例 a=x&xb&xy a=b|x=y !a|ab/(a=x)&(xb)&(xy)/(a=b)|(x=y)/(!a)|(ab)用
10、用逻逻辑辑运运算算符符将将1个个或或多多个个关关系系表表达达式式或或逻逻辑辑量量(真或假)连接起来的式子。(真或假)连接起来的式子。5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式3逻辑表达式的概念逻辑表达式的概念 在C语言中,用逻辑表达式表示多个条件的组合。例如,要判断某一年year是否是闰年。闰年的条件是符合二者之一:能被4整除,但不能被100整除。能被4整除,又能被400整除。(year%4=0)&(year%100!=0)|(year%400=0)逻辑表达式的值也是一个逻辑值(非“真”即“假”)。5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式4逻辑表达式的值逻辑表达式的值例如
11、,假设例如,假设num=12,则:,则:!num的值的值 num=1 num31的值的值1。nC C语言中语言中,运算量运算量:0 0表示表示“假假”,非非0 0表示表示“真真”,”,运算结果运算结果:0 0表示表示“假假”,1 1表示表示“真真”,”,例例 a=4;b=5;!a a&b a|b !a|b 4&0|2 53&2|83)&2|(8b)&(n=cd)/结果结果m=0,n=1例如:执行以下语句后,x,y,z的值分别为()int x=0,y=0,z=0;+x|+y&+z;5.3 简单条件结构简单条件结构 用用if语句可以构成分支结构。它对给定的条件进语句可以构成分支结构。它对给定的条件
12、进行判断,根据判断的结果(真或假)来决定执行某个行判断,根据判断的结果(真或假)来决定执行某个分支程序段。分支程序段。n单选择单选择:v格式:格式:if(expression)statementv执行过程:执行过程:例:例:if(xy)printf(“%d”,x);表达式表达式真真假假语句语句#include main()int num1,num2,sum;printf(n请输入两个数:);scanf(%d%d,&num1,&num2);sum=num1+num2;if(sum 100)printf(n两数的和大于 100 n);简单if语句的示例内存内存num1num2sum5678134请
13、输入两个数:56 78两数的和大于 100l双选双选:v格式格式:if(expression)statement1 else statement2v执行过程:执行过程:例:例:if(xy)printf(%d,x);else printf(%d,y);表达式表达式真真假假语句语句1语句语句2修改上例#include main()int num1,num2,sum;printf(n请输入两个数:);scanf(%d%d,&num1,&num2);sum=num1+num2;if(sum 100)printf(n两数的和大于 100 n);else printf(“n两数的和小于100n”);#in
14、clude main()int num;printf(n请输入一个整数:);scanf(%d,&num);if(num%2)=0)printf(%d 是一个偶数。n,num);elseprintf(%d 是一个奇数。n,num);if-else语句的示例内存内存num57请输入一个整数:5757 是一个奇数。问题描述:要求用户输入一个字符,用程序判断该字符是否为小写字母,并输出相应的信息。#include main()char a;printf(n请输入一个字符:);scanf(%c,&a);if(a=a&a=z)printf(您输入的字符是小写字母n,a);elseprintf(您输入的字符
15、不是小写字母n,a);使用&运算符的示例内存内存numT请输入一个字符:T您输入的字符不是小写字母问题描述:接受用户输入的三种商品的价格。如果购买的三种商品中至少有一种商品的价格大于 50 或者三种商品的总额大于 100,则折扣率为15,否则折扣率为,计算并显示用户应付的钱数。#include main()float rate1,rate2,rate3;double discount,total;printf(n请输入第一种商品的价格:);scanf(%f,&rate1);printf(n请输入第二种商品的价格:);scanf(%f,&rate2);printf(n请输入第三种商品的价格:);
16、scanf(%f,&rate3);total=rate1+rate2+rate3;if(rate150)|(rate250)|(rate350)|(total100)discount=0.15*total;total=total-discount;printf(n折后总价为:%6.2fn,total);else printf(n总价为:%6.2fn,total);使用|运算符的示例 if(rate150)|(rate250)|(rate350)|(total100)输出:请输入第一种商品的价格:34请输入第二种商品的价格:42请输入第三种商品的价格:38折后总价为:96.90问题描述:确定用户
17、输入的数字是否可以被5整除,并输出相应的消息。#include main()int num;printf(n 请输入一个数:);scanf(%d,&num);if(!(num%5)printf(n 该数能被 5 整除 n);else printf(n 该数不能被 5 整除 n);使用!运算符的示例请输入一个数:90该数能被 5 整除问题描述:判定给定的年份是否为闰年。提示:闰年的判定规则为:能被 4 整除但不能被 100 整除的年份,或能被 400 整除的年份。#include main()int year;printf(n 请输入年份:);scanf(%d,&year);if(year%4=
18、0&year%100!=0)|(year%400=0)printf(n%d 年是闰年 n,year);else printf(n%d 年不是闰年 n,year);综合示例1请输入年份:20052005 年不是闰年问题描述:输入一个5位数,判断它是不是回文数。例如:12321是回文数,个位与万位相同,十位与千位相同。#include main()long ge,shi,qian,wan,x;printf(n 请输入一个五位整数:);scanf(%ld,&x);wan=x/10000;/分解出万位数qian=x%10000/1000;/分解出千位数shi=x%100/10;/分解出十位数ge=x%
19、10;/分解出个位数if(ge=wan&shi=qian)/*个位等于万位并且十位等于千位*/printf(n 这个数是回文数n);elseprintf(n 这个数不是回文数n);综合示例2输出:请输入一个五位整数:45654这个数是回文数如:if(a=b&x=y)printf(“a=b,x=y”);int x=3,y;if(x=5)y=3;if(3)printf(“OK”);if(a)printf(“%d”,a);l说明:uif后面的表达式类型任意uif(x)if(x!=0)if(!x)if(x=0)uif和else后面只含一个语句,也可以是复合语句(用括起来)uelse不能作为语句单独,它
20、必须与if配对使用 例例 考虑下面程序的输出结果考虑下面程序的输出结果:#include main()int x,y;scanf(“%d,%d”,&x,&y);if(xy)x=y;y=x;else x+;y+;printf(“%d,%dn”,x,y);编译错误!不能不能上菜上菜有胡萝卜吗?有黄瓜吗?制作胡萝卜沙拉有多重条件判断有可以可以上菜上菜制作黄瓜沙拉制作黄瓜沙拉没有没有开始做黄瓜沙拉做胡萝卜沙拉有没有不能不能上菜上菜可以可以上菜上菜是否有胡萝卜有没有是否有黄瓜?结束多重if(阶梯式)要处理多重条件判断的情况,需要使用多重条件结构多重条件结构嵌套 ifswitch结构多重条件结构多重条件结
21、构多重条件结构多重条件结构if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;.else 语句n;多重 if 结构是if-else 的另一种形式,这种形式也称为阶梯式 if-else-if 多重 if 结构真真 假 真真假真真 假 expr1statemnt1非0=0expr2expr3statemntnstatemnt3statemnt2非0非0=0=0表达式表达式1真真假假语句语句1语句语句2表达式表达式2表达式表达式3语句语句3语句语句4真真假假真真假假多重 if 结构示例问题描述:编写一个程序,根据用户输入的期末考试成绩,输出相应的成绩评定信息。
22、成绩大于等于90分输出“优”;成绩大于等于80分小于90分输出“良”;成绩大于等于60分小于80分输出“中”;成绩小于60分输出“差”。#include main()float grade;printf(n 请输入期末考试成绩:);scanf(%f,&grade);if(grade=90)printf(n 优);else if(grade=80)&(grade=60)&(grade 0)if(y 1)z=1;else/*这个 else 部分属于哪个 if?*/z=2;嵌套 if 结构C语言规定,每个 else 部分总属于前面最近的那个缺少对应的 else 部分的 if 语句。提倡使用大括号括起
23、来以避免看起来有二义性。uif else 配对原则:配对原则:缺省缺省 时,时,else总是和它总是和它上面离它最近的未配对的上面离它最近的未配对的if配对配对if()if()if()else.else.else.#includemain()int a,b;printf(n 请输入 A 和 B 的值:);scanf(%d%d,&a,&b);if(a!=b)if(ab)printf(n ABn);elseprintf(n ABn);elseprintf(n A=Bn);嵌套 if 结构的示例内存内存ab6893输出:AB例:if(a=b)if(b=c)printf(“a=b=c”);else p
24、rintf(“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);结果:结果:-1switch 结构printf(“这是迈克尔,身高 180cm,加利福尼亚第 12 大街”);printf(“这是丹尼尔,身高 193cm,现居住地不明,1998 年
25、 12 月 12 日在佛罗里达被捕”);printf(“这是吉姆,身高 175cm,墨西哥州海鸥路弗罗拉公寓,于 2003 年 11 月 1 日在新泽西因抢银行被捕”);printf(“未发现匹配项。对不起!”);停止搜索停止搜索停止搜索停止搜索警察记录嫌疑犯照片不是这是吉姆,身高 175cm,墨西哥州海鸥路弗罗拉公寓,于 2003 年 11 月 1 日在新泽西因抢银行被捕不是是switch-case 语句是多路判断语句switch 语句计算条件表达式并对照多个常数值进行检查switch 结构switch(表达式)case 常量 1:语句;break;case 常量 2:语句;break;de
26、fault:语句;计算表达式的值如果等于常量1 如果等于常量2 如果没有找到匹配的值 阅读程序,分析结果 main()int score;scanf(“%d”,&score):switch(score)case 5:printf(“Very good!”);case 4:printf(“Good!”);case 3:printf(“Pass!”);case 2:printf(“Fail!”);default :printf(“data error!”);运行结果:运行结果:score为为5时,输出:时,输出:Very good!Good!Pass!Fail!data error!switch
27、结构在使用switch结构时应注意以下几点:n在case后的各常量表达式的值不能相同,否则会出现错误;n在case后,允许有多个语句,可以不用括起来;n每个case语句后都必须有一个break语句,否则会出现错误;n各case和default子句的先后顺序可以变动,而不会影响程序执行结果;ndefault子句可以省略;switch 结构示例问题描述:要求用户输入一个字符值并检查它是否为元音字母。char in_char;printf(n 请输入一个小写字母:);scanf(%c,&in_char);switch(in_char)case a:printf(n 您输入的是元音字母 an);bre
28、ak;case e:printf(n 您输入的是元音字母 en);break;case i:printf(n 您输入的是元音字母 in);break;case o:printf(n 您输入的是元音字母 on);break;case u:printf(n 您输入的是元音字母 un);break;default:printf(n 您输入的不是元音字母 n);内存内存in_chare请输入一个小写字母:e您输入的是元音字母 e 多重if结构和switch结构都可以用来实现多路分支多重if结构用来实现两路、三路分支比较方便,而switch结构实现三路以上分支比较方便在使用switch结构时,应注意分支
29、条件要求是整型表达式,而且case语句后面必须是常量表达式有些问题只能使用多重if结构来实现,例如要判断一个值是否处在某个区间的情况比较多重 if 和 switch 结构示例问题描述:要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII码值小于32的为控制字符。在09之间的为数字,在AZ之间为大写字母,在az之间为小写字母,其余则为其它字符。main()char c;printf(n 请输入一个字符:);c=getchar();if(c=0&c=A&c=a&c60n”);break;.分析结果#include”stdio.h”main()int
30、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;
31、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;value=num 100?y:n;(1)(0)条
32、件表达式使用使用“if-else”的等同代码的等同代码 假设 num=200 value=num 100;?y:n200value=yn一般形式:一般形式:expr1?expr2 :expr3w执行过程执行过程w功能:相当于条件语句,但不能取代一般功能:相当于条件语句,但不能取代一般if语句语句例例 if(ab)printf(“%d”,a);else printf(“%d”,b);printf(“%d”,ab?a:b);例例 求求 a+|b|printf(“a+|b|=%dn”,b0?a+b:a-b);expr1取取expr2值值取取expr3值值非非0=0例例 (a=b)?Y:N (x%2=
33、1)?1:0 (x=0)?x:-x (c=a&c0?1:(xb?a:cd?c:d ab?a:(cd?c:d)wexpr1、expr2、expr3类型可不同,表达式值取较类型可不同,表达式值取较高的类型高的类型例例 x?a:b /x=0,表达式值为表达式值为b;x0,表达式值为表达式值为a xy?1:1.5 /xy ,值为值为1.0;xy ,值为值为1.55.3.3 条件运算符和条件表达式条件运算符和条件表达式条件运算符示例问题描述:个人所得税收取规定:工资大于1000元的部分将扣除5的个人所得税。小于1000元的部分不扣除个人所得税。要求用户输入基本工资,计算税后工资。#include voi
34、d main()double sal;double rate;printf(n 请输入基本工资:);scanf(%lf,&sal);rate=(sal=1000)?0:0.05;sal=sal-(sal-1000)*rate;printf(n 税后工资为:%7.2f n,sal);请输入基本工资:1500税后工资为:1475.00总结多重if结构就是在主if块的else部分中还包含其他if块嵌套if结构是在主if块中还包含另一个if 语句C语言规定,嵌套if结构中每个else部分总是属于前面最近的那个缺少对应的else部分的if语句switch结构也可以用于多分支选择。用于分支条件是整型表达式
35、,而且判断该整型表达式的值是否等于某些值(可以罗列的),然后根据不同的情况,执行不同的操作条件运算符是 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
限制150内