1、第四章第四章 选择结构选择结构回顾:1、输入的命令是什么?2、输出的命令是什么?3、输出一个如下结果:例:已知a=3.1415927;保留3位小数,前面带2空格的。printf(“%7.3f”,a);4、scanf在输入数据数据的时候必须用间隔符(空格、回车,Tab)隔开目标 熟练使用关系运算符 熟练使用逻辑运算符 熟练使用if 结构 熟练使用嵌套 if 结构 熟练使用 switch 结构 理解条件运算符的用法4.1关系运算和逻辑运算关系运算和逻辑运算一、一、C语言中的逻辑值语言中的逻辑值语言中规定:语言中规定:(1)用)用0、1 表示逻辑假和真值;语言没有专门的逻辑值,而是用来表示表示逻辑假
2、和真值;语言没有专门的逻辑值,而是用来表示“真真”,用,用表示表示“假假”。(2)任何基本类型的值都可作为逻辑值使用。所有非)任何基本类型的值都可作为逻辑值使用。所有非0的值被当作的值被当作“真真”使用,而使用,而0值被值被当作当作“假假”使用使用二、关系运算符和关系表达式二、关系运算符和关系表达式 1.C语言的关系运算符共种:语言的关系运算符共种:(大于)(大于)=(大于等于)(大于等于)(小于)(小于)(num3 num4)num=40;num/10!=2gender =m真假=如果 gender =f如果 gender =m三、逻辑运算符和逻辑表达式三、逻辑运算符和逻辑表达式1)C语言提
3、供了三种逻辑运算符,分别是:&逻辑与|逻辑或 !逻辑非结合性结合性:自左至右优先级次序优先级次序:!高于&高于|逻辑表达式的值:逻辑表达式的值:0,1小总结:小总结:算术运算符+-*/%(第二章)赋值运算符=+=-+*=/=%=(第二章)关系运算符 =!=逻辑运算符!&|优先级(高到低)!、算术运算符、关系运算符、优先级(高到低)!、算术运算符、关系运算符、&、|、赋值运算符、赋值运算符逻辑运算符 运算运算运算符运算符表达式表达式逻辑“与”&operand1&operand2逻辑“或”|operand1|operand2逻辑“非”!operand1 逻辑运算符用于连接一个或多个条件,判断这些条
4、件是否成立 逻辑运算符的类型为:逻辑“与”运算符&所有学科及格考勤率达到 75%留级留级留级升级YesNoNoNoNoYesYesYes逻辑“与”运算符&表达式表达式 1 1表达式表达式 2 2结果结果000010100111所有学科及格考勤率达到 75%留级留级NoNo升级YesYes留级NoYes留级留级NoYes 例如:已知a=2;b=4;c=4;d=6(ab)&(cb)&(cd)(ad)(ab)&(cd)逻辑“或”运算符|无法支付可支付可支付可支付YesNoNoNoNoYesYesYes购物帐单信用卡现金信用卡逻辑“或”运算符|表达式 1表达式 2结果000011101111无法支付N
5、oNo可支付NoYes可支付NoYes可支付YesYes 例如:已知a=2;b=4;c=4;d=6(ab)|(cb)|(cd)(ad)(ab)|(cd)逻辑“非”运算符!表达式结果1001天气 NOT 阴天真真假带伞操作不带伞逻辑“非”运算符!(真)的值为0!(假)的值为1!(非零)的值0!(零)的值为1例如:a=2;b=4;c=0 !(ab)!(ab)!(a)!(0)逻辑运算符总结所有学科所有学科及格及格考勤率达到考勤率达到 75%&只有当两个两个条件都为真真时结果才为真只要任何任何一个条件为真真时结果就为真对原条件取反取反,即:如果原条件为假时结果就为真|!优先次序:!(非)&(与)|(或
6、)逻辑运算符中的&和|低于关系运算符,!高于算术运算符一、数学上一、数学上0 x0&xc&b=c2、a|b+c&b-c3、!(ab)&c|1 答案:1、0 2、1 3、1已知a=1,b=0;则y=a|b+;4.2条件结构 条件结构就是需要根据条件进行判断,然后执行不同的操作一、简单 if 语句的一般形式为:if()说明:说明:必须是一条语句,若是必须是一条语句,若是 多条,用花括号括起来多条,用花括号括起来 如果条件为真,if 语句执行一个语句或一组语句;如果条件为假,则执行 if 语句后面的语句(如果有)。二、if-else 语句的一般形式为:语句的一般形式为:(if-else必须成对出现必
7、须成对出现)if()else 如果条件为真,执行 if 后面的一个语句或一组语句;如果条件为假,则执行 else 后面的语句。三、三、if语句的执行过程语句的执行过程 首先判定if后面圆括号中表达式的值。如果为真,则执行其后的if子句,然后执行if语句后的下一条语句;若果表达式的值为假,则跳过if子句,直接执行if语句的下一条语句例题例题4.1:输入两个数,分别放入:输入两个数,分别放入x和和y中,若两数不相等,则输出大数;中,若两数不相等,则输出大数;若相等,则输出字符串若相等,则输出字符串x=y和和x的值的值#include void main()int x,y;printf(“Enter
8、 x&y:n”);scanf(“%d%d”,&x,&y);printf(“x,y:%d%dn”,x,y);if(xy)printf(“x=%dn”,x);if(yx)printf(“y=%dn”,y);if(x=y)printf(“x=y%d:n,x);例例4.2 main()int a,b,c,t;printf(“input a,b,c”):scanf(“%d%d%d”,&a,&b,&c);printf(“a=%d,b=%d,c=%dn”,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(“%d,%d,%d
9、n”,a,b,c);例例 输入两个值给变量输入两个值给变量a、b,然后输,然后输出比较大的数出比较大的数 main()int a,b,max;scanf(“%d%d”,&a,&b);max=ab?a:b;printf(“max=%d,max);#include void main()int num;printf(n请输入一个整数:);scanf(%d,&num);if(num%2)=0)printf(%d 是一个偶数。n,num);elseprintf(%d 是一个奇数。n,num);if-else语句的示例内存内存num57请输入一个整数:5757 是一个奇数。问题描述:判定给定的年份是否为
10、闰年。提示:闰年的判定规则为:能被 4 整除但不能被 100 整除的年份,或能被 400 整除的年份。#include void main()int year;printf(n 请输入年份:);scanf(%d,&year);if(year%4=0&year%100!=0)|(year%400=0)printf(n%d 年是闰年 n,year);else printf(n%d 年不是闰年 n,year);综合示例1请输入年份:20052005 年不是闰年由于由于if和和else子句中可以是任意合法的子句中可以是任意合法的C语句,因此自然也可语句,因此自然也可以是以是if语句,称此为嵌套的语句,
11、称此为嵌套的if语句。语句。4.2.2嵌套的if语句1.if子句中嵌套具有子句中嵌套具有else子句的子句的if语句语句 if(表达式1)if(表达式2)语句1 else 语句2 else 语句32.在在if子句中嵌套不含子句中嵌套不含else子句的子句的if语句语句 if(表达式1)if(表达式2)语句1else 语句2if(x 0)if(y 1)z=1;else/*这个 else 部分属于哪个 if?*/z=2;C语言规定,每个 else 部分总属于前面最近的那个缺少对应的 else 部分的 if 语句。提倡使用大括号括起来以避免看起来有二义性。3.在在else子句中嵌套子句中嵌套if语句
12、语句 if(表达式1)语句1 else if(表达式2)语句2 else 语句3 或写成 if(表达式1)语句1 else if(表达式2)语句2 else 语句3例题例题4.5 编写程序,根据输入的学生成绩给出相应的等级,大于或等于编写程序,根据输入的学生成绩给出相应的等级,大于或等于90分以上的等级为分以上的等级为A,60分以下的等级为分以下的等级为E,其余每,其余每10分为一个等级。分为一个等级。程序如下:程序如下:#includemain()int g;printf(“Enter g:”);scanf(“%d”,&g);printf(“g=%d:”,g);if(g=90)printf(
13、“An”);else if(g=80)printf(“Bn”);else if(g=70)printf(“Cn”);else if(g=60)printf(“Dn”);else printf(“En”);#include main()int g;printf(Enter g:);scanf(%d,&g);printf(g=%d:,g);if(g=90)printf(An);if(g=80)printf(Bn);if(9=70)printf(Cn);if(g=60)printf(Dn);if(g100)value=50;else value=100;value=num 100?50:100;(1
14、)(0)条件表达式使用使用“if-else”的等同代码的等同代码 假设 num=200 value=num 100;?50:100200value=50条件运算符示例问题描述:个人所得税收取规定:工资大于1000元的部分将扣除5的个人所得税。小于1000元的部分不扣除个人所得税。要求用户输入基本工资,计算税后工资。#include void main()double sal;double rate;printf(n 请输入基本工资:);scanf(%lf,&sal);rate=(sal=1000)?0:0.05;sal=sal-(sal-1000)*rate;printf(n 税后工资为:%7
15、.2f n,sal);请输入基本工资:1500税后工资为:1475.00运用一次运用一次if或或if-else,只有两种选择。若是多重选择,只有两种选择。若是多重选择,需要多次嵌套,程序复杂,此时引入需要多次嵌套,程序复杂,此时引入switch语句。语句。例题例题4.5#includemain()int g;printf(“Enter g:”);scanf(“%d”,&g);printf(“g=%d:”,g);if(g=90)printf(“An”);else if(g=80)printf(“Bn”);else if(g=70)printf(“Cn”);else if(g=60)printf(
16、“Dn”);else printf(“En”);switch 结构 3-1printf(“这是迈克尔,身高 180cm,加利福尼亚第 12 大街”);printf(“这是丹尼尔,身高 193cm,现居住地不明,1998 年 12 月 12 日在佛罗里达被捕”);printf(“这是吉姆,身高 175cm,墨西哥州海鸥路弗罗拉公寓,于 2003 年 11 月 1 日在新泽西因抢银行被捕”);printf(“未发现匹配项。对不起!”);停止搜索停止搜索停止搜索停止搜索警察记录嫌疑犯照片不是这是吉姆,身高 175cm,墨西哥州海鸥路弗罗拉公寓,于 2003 年 11 月 1 日在新泽西因抢银行被捕不
17、是是 switch-case 语句是多路判断语句 switch 语句计算条件表达式并对照多个常数值进行检查switch 结构 3-2switch(表达式)case 常量 1:语句;break;case 常量 2:语句;break;default:语句;计算表达式的值如果等于常量1 如果等于常量2 如果没有找到匹配的值 switch 结构 3-3 在使用switch结构时应注意以下几点:在case后的各常量表达式的值不能相同,否则会出现错误;case和常量表达式之间一定要有空格。例如case 0:各case和default子句的先后顺序可以变动,而不会影响程序执行结果;default子句可以省略
18、;遇到break则跳出整个循环,没有继续往下执行。1、用、用switch语句改写例题语句改写例题4.5程序如下:程序如下:(演示:没有演示:没有break)#includemain()int g;printf(“Enter g:”);scanf(“%d”,&g);printf(“g=%d:”,g);switch(g/10)case 10:case 9:printf(“An”);case 8:printf(“Bn”);case 7:printf(“Cn”);case 6:printf(“Dn”);default:printf(“En”);2、用、用switch语句改写例题语句改写例题4.5程序如
19、下:程序如下:(演示:带有演示:带有break)#includemain()int g;printf(“Enter g:”);scanf(“%d”,&g);printf(“g=%d:”,g);switch(g/10)case10:case9:printf(“An”);break;case8:printf(“Bn”);break;case7:printf(“Cn”);break;case6:printf(“Dn”);break;default:printf(“En”);switch 结构示例问题描述:要求用户输入一个字符值并检查它是否为元音字母。char in_char;printf(n 请输入
20、一个小写字母:);scanf(%c,&in_char);switch(in_char)case a:printf(n 您输入的是元音字母 an);break;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结构和swit
21、ch结构都可以用来实现多路分支 多重if结构用来实现两路、三路分支比较方便,而switch结构实现三路以上分支比较方便 在使用switch结构时,应注意分支条件要求是整型表达式,而且case语句后面必须是常量表达式 有些问题只能使用多重if结构来实现,例如要判断一个值是否处在某个区间的情况比较多重 if 和 switch 结构总 结 多重if结构就是在主if块的else部分中还包含其他if块 嵌套if结构是在主if块中还包含另一个if 语句 C语言规定,嵌套if结构中每个else部分总是属于前面最近的那个缺少对应的else部分的if语句 switch结构也可以用于多分支选择。用于分支条件是整型表达式,而且判断该整型表达式的值是否等于某些值(可以罗列的),然后根据不同的情况,执行不同的操作 条件运算符是 ifelse 语句的另一种表现形式4.5语句标号和goto语句一、语句标号 在C语言中,标号就是任意合法的标识符,当在标识符后面加一个冒号,就构成了一个语句标号。例如:flag:或者stop:标号的作用,用于goto语句的转向目标;例如:goto stop;stop:printf(“ENDn”);(C语言中任何语句前都可以加上语句标号)二、goto语句 goto语句称为无条件转向语句,表示如下:goto 语句标号;(对于初学者尽量不用)