第4章-选择结构程序设计
第4章 选择结构程序设计

(2)switch语句,实现多分支的选择结构
4.1 选择结构和条件判断
例4.1 在例3.5的基础上对程序进行改进。题目要求
2 求 ax bx c 0 方程的根。
由键盘输入a,b,c。假设a,b,c的值任意,并不保证
b2 4ac 0
b2 4ac 0 。需要在程序中进行判别,如果
例4.3 输入3个数a,b,c,要求按由小到大的顺序输出。
解题思路:可以先用伪代码写出算法: if a>b,a和b对换 if a>c,a和c对换 if b>c,b和c对换 顺序输出a,b,c (a是a、b中的小者) (a是三者中最小者) (b是三者中次小者)
#include <stdio.h> int main() { float a,b,c,t; scanf("%f,%f,%f",&a,&b,&c); if(a>b) { { { if(a>c) if(b>c) 如果 a>b,将a和b对换 } } } a是a、b中的小者 t=a; a=b; b=t; t=a; a=c; c=t; t=b; b=c; c=t;
a>b ? printf(“%d”,a): printf(“%d”,b);
4.5 条件运算符和条件表达式
例4.4 输入一个字符,判别它是否大写字母,如果是, 将它转换成小写字母;如果不是,不转换。然后输出最 后得到的字符。 解题思路:用条件表达式来处理,当字母是大写时,转 换成小写字母,否则不转换
if (disc<0) printf("This equation hav't real roots\n");
C语言程序设计第4章选择结构程序设计ppt课件

8
printf("grade is E" );
9 else if (score >=60 && score<70 )
10
printf( "grade is D");
11 else if (score >=70 && score<80 )
12
printf( "grade is C");
13 else if (score>=80 && score<90 )
printf("a,b="); scanf("%d,%d",&a,&b); if (a>b) max=a; else max=b; printf("max=%d\n",max); }
结束
8
3.if-else if-else语句
(1)语句格式:
if (表达式1) 语句1
else if (表达式2) 语句2
不再判断,顺序执 行下面的语句
21
4.2 switch语句
switch (表达式) {case 常量表达式1:语句1 case 常量表达式2:语句2 …… case 常量表达式n:语句n [default:语句n+1] }
注意:
1. <表达式>可以是整型或字 符型表达式; 2. case后面必须是常量表达 式,不能包含变量; 3. 每个常量表达式的值应互 不相同; 4. case语句先后顺序随意; 5.若从上至下没有找到与表 达式的值相匹配的case,含有 default子句时,执行语句n+1。
C语言第四章.选择结构程序设计

case 常量表达式n: 语句n; default : 语句n+1; }
语句的执行过程:
先计算表达式的值,并逐个与其后的常量表达式值相 比较; 当表达式的值与某个常量表达式的值相等时,即执行
其后的语句;
然后不再进行判断,继续执行后面所有case后的语句;
如表达式的值与所有case后的常量表达式均不相同时,
a+b>c && x+y<b 等价于 ((a+b)>c) && ((x+y)<b)
2)逻辑运算的值: 逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”
来表示。
反过来在判断一个量是为“真”还是为“假”时,以“0” 的数值代表“假”,以非“0”的数值代表“真”。
3)逻辑运算的规则:
(1)与运算&&
条件运算符和条件表达式
条件表达式通常用于赋值语句之中。 例如条件语句:
if(a>b) max=a;
else max=b; 可用条件表达式写为 max=(a>b)?a:b;
执行该语句的语义是:如a>b为真,则把a 赋予max, 否则把b 赋予max。
注意以下几点:
条件运算符的运算优先级 低于关系运算符和算术运算符,高于赋值符。 因此 max=(a>b)?a:b可以去掉括号而写为 max=a>b?a:b
注意:
(3) 在if 语句的三种形式中,所有的语句应为单个语句,
如果要想在满足条件时执行一组(多个)语句,则必须
把这一组语句用{ } 括起来组成一个复合语句。 例如:交换两个变量 if (a>b) { t= a; a=b; b=t; }
第4章_选择结构程序设计

语句1
语句2
语句3
语句4
2013-5-19
图4-9 多分支选择结构
19
例4.5 :体型判断
按“体指数”对肥胖程度进行划分: 体指数t = w / h2 (体重w单位为公斤,身高h单位为米) – 当t < 18时,为低体重; – 当18 ≤ t < 25时,为正常体重; – 当25 < t < 27时,为超重体重; – 当t ≥ 27时,为肥胖。 编程从键盘输入你的身高h和体重w,根据给定公式计算体指 数t,然后判断你的体重属于何种类型。 用3种方法编程: – 算法1:用不带else子句的if语句编程 – 算法2:用在if子句中嵌入if 语句的形式编程 – 算法3:用在else子句中嵌入if 语句的形式编程
}
思考题
语句 if (0 == data2)的必要性 – 1998年11月《科学美国人》杂志,描述了美国导弹巡
洋舰约克敦号上的一起事故,除零错导致军舰推进系统 的关闭
取绝对 值函数 2013-5-19
如果要求程序能进行浮点数的算术运算,语句 if (0 == data2)还能用于比较实型变量data2和 常数0的大小吗? – if (fabs(data2) <= 1e-7) 如果要求输入的算术表达式中的操作数和运算符之 间可以加入任意多个空格符,那么程序如何修改? – scanf("%d%c%d", &data1, &op, &data2); – scanf("%d%1s%d", &data1, &op, &data2);
2013-5-19
13
if-else
第4章 选择结构程序设计《C语言程序设计(第三版)》-电子教案

【注意】
switch后跟的"表达式"允许为任何类型的表达式,其 后跟的"表达式"允许为任何类型的表达式, 后跟的 数据类型和case后面的常量表达式的数据类型一致. 后面的常量表达式的数据类型一致. 数据类型和 后面的常量表达式的数据类型一致 每一个case后的各常量表达式的值不允许重复,否则 后的各常量表达式的值不允许重复, 每一个 后的各常量表达式的值不允许重复 会报错. 会报错. 每一个case后允许有多条语句 可以不用花括号" 后允许有多条语句, 每一个case后允许有多条语句,可以不用花括号"{}" 括起来. 括起来. case和default子句出现的先后顺序可以变动,不会影 子句出现的先后顺序可以变动, 和 子句出现的先后顺序可以变动 响程序的执行结果. 子句也可以省略不用. 响程序的执行结果.default子句也可以省略不用. 子句也可以省略不用 多个case可以共用一组执行语句.例如: 可以共用一组执行语句. 多个 可以共用一组执行语句 例如: … case 'A': case 'B': case 'C':printf("Pass\n");break;
3<5 || ++b
【例4-2】测试短路现象 】
#include <stdio.h> void main() { int a,b; a=b=0; a || ++b; printf("%d,%d\n",a,b); a=b=1; a || ++b; printf("%d,%d\n",a,b); a=b=0; a && ++b; printf("%d,%d\n",a,b); a=b=1; a && ++b; printf("%d,%d\n",a,b); }
C语言 第4章 选择结构程序设计

#include <stdio.h> int main() { float a,b,c,t; scanf("%f,%f,%f",&a,&b,&c); if(a>b) 如果 a>b,将a和b对换 , 和 对换 是 、 中的小者 { t=a; a=b; b=t; } a是a、b中的小者 if(a>c) { t=a; a=c; c=t; } if(b>c) { t=b; b=c; c=t; } printf("%5.2f,%5.2f,%5.2f\n",a,b,c); return 0; }
if (disc<0) 8<0为假 为假 printf(“has not real roots\n”); else 的值变为-1 的值变为 { p=-b/(2.0*a); p的值变为 的值变为0.71 的值变为 q=sqrt(disc)/(2.0*a); q的值变为 x1=p+q; x1的值变为 的值变为-0.29 的值变为 x2=p-q; x2的值变为 的值变为-1.71 的值变为 printf(“real roots:\nx1=%7.2f\n x2=%7.2f\n”,x1,x2); } return 0; }
if (disc<0) printf(“has not real roots\n”); else { p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:\nx1=%7.2f\n x2=%7.2f\n”,x1,x2); } return 0; 复合语句 }
C语言有两种选择语句: 语言有两种选择语句: 语言有两种选择语句 (1)if语句,实现两个分支的选择结构 语句, 语句 (2)switch语句,实现多分支的选择结构 语句, 语句
《C语言程序设计(第五版)》第4章选择结构程序的设计 PPT课件

►(b*b-4*a*c)>=0
b*b-4*a*c>=0
►z= (x>y+3)
z= x>y+3
►(a>b)= = c
a>b= =c
►a=(b!=c)
a=b!=c
当然为提高程序的可读性、可维护性你不妨多使用 括号,因为C语言中的有些优先级很容易让你不小心犯 错。
C语言程序设计
第4章 选择结构程序设计
第10页
“>”的结果为“假”,即条件不成立。
C语言程序设计
第4章 选择结构程序设计
第5页
4.1 关系运算及关系表达式
4.1.1 关系运算符及其优先次序
运算符
含义
> 大于
优先级
结合性
>= 大于或等于 这些关系运算符等优
< 小于
先级,但比下面的优 先级高
左结合性
<= 小于或等于
== 等于 != 不等于
这些关系运算符等优 先级,但比上面的优 先级低
C语言程序设计
第4章 选择结构程序设计
第4页
4.1 关系运算及关系表达式
所谓“关系运算”实际上就是“比较运算”, 即将两个数据进行比较,判定两个数据是否符合 给定的关系。例如,
► “x>y+3”中的“>”表示一个大于关系运算。 ➢如果a的值是5,b的值是1,则大于关系运算
“>”的结果为“真”,即条件成立; ➢如果a的值是2,b的值是1,则大于关系运算
因为按照自左至右的结合方向,先执行关系运算
“a>b”得值为1(“真”),再执行关系运算“1>c”, 得值为0(“假”),因此y为0。
C语言程序设计
C程序设计(第五版)-第4章选择结构程序设计课后习题答案

C程序设计(第五版)-第4章选择结构程序设计课后习题答案1. 什么是算术运算?什么是关系运算?什么是逻辑运算?【答案解析】算熟运算:算术运算即“四则运算”,是加法、减法、乘法、除法、乘⽅、开⽅等⼏种运算的统称。
其中加减为⼀级运算,乘除为⼆级运算,乘⽅、开⽅为三级运算。
在⼀道算式中,如果有多级运算存在,则应先进⾏⾼级运算,再进⾏低⼀级的运算。
C语⾔中的算熟运算符包括:+、-、*、/、++、--、%等种类。
如果只存在同级运算;则从左⾄右的顺序进⾏;如果算式中有括号,则应先算括号⾥边,再按上述规则进⾏计算。
⽰例:$ (1 + 1)^{2} * 4+5 * 3$解析:1. 先进⾏括号内运算1+1,然后进⾏乘⽅运算得到结果4.2. 接下来与4相乘,得到结果163. 因为乘法优先级⼤于加法,因此先进⾏5*3,得到结果154. 最终相加得到结果31结果:31关系运算:关系的基本运算有两类:⼀类是传统的集合运算(并、差、交等),另⼀类是专门的关系运算(选择、投影、连接、除法、外连接等),⽽在C语⾔中,关系运算通常被认为是⽐较运算,将两个数值进⾏⽐较,判断⽐较结果是否符合给定的条件。
常见的关系运算符包括:<、<=、>、>=、==、!=等种类。
其中,前4种关系运算符(<、<=、>、>= )的优先级别相同,后2种(==、!=)也相同。
⽽前4种⾼于后2种。
例如, >优先于==。
⽽>与<优先级相同。
并且,关系运算符的优先级低于算术运算符,关系运算符的优先级⾼于赋值运算符(=)。
逻辑运算:在逻辑代数中,有与、或、⾮三种基本逻辑运算。
表⽰逻辑运算的⽅法有多种,如语句描述、逻辑代数式、真值表、卡诺图等。
⽽在C语⾔中,逻辑运算通常⽤于使⽤逻辑运算符将关系表达式或其它逻辑量连接起来组成逻辑表达式⽤来测试真假值。
常见的逻辑运算符包括:&&、||、!等种类&&:与是双⽬运算符,要求有两个运算对象,表⽰两个运算对象都成⽴,则结果为真,否则结果为假。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(5) 执行完一个case后面的语句后,流程控制转移到 下一个case继续执行。“case常量表达式”只是起 语句标号作用。在执行Switch语句时,根据Switch 后面表达式的值找到匹配的入口标号,就从此标 号开始执行下去,不再进行判断。例如,上面的 例子中,若grade的值等于‘A‟,则将连续输出: 84~100 70~84 60~69 <60 error
4.3 Switch 语 句
Switch语句是多分支选择语句。用来实现如多分 支选择结构。if语句只有两个分支可供选择,而实际 问题中常常需要用到多分支的选择。例如,学生成绩 分类(90分以上为‘a‟等,80~89分为‘b‟等,70~79 分为‘c‟等……);人口统计分类(按年龄分为老、中、 青、少、儿童);工资统计分类;银行存款分类……。 当然这些都可以用嵌套的if语句来处理,但如果 分支较多,则嵌套的if语句层数多,程序冗长而且可 读性降低。
因此,应该在执行一个case分支后,使流程跳出Switch 结构,即终止Switch语句的执行。可以用一个break语句来 达到此目的。将上面的Switch结构改写如下:
char grade; switch(grade) { case 'A':printf("84-100\n"); break; case 'B':printf("70-84\n");break; case 'C':printf("60-69\n");break; case 'D':printf("<60\n");break; default:printf("error\n"); }
(3) 在if和else后面可以只含一个内嵌的操作语句(如上例),也 可以有多个操作语句,此时用花括号“{}”将几个语句 括起来成为一个复合语句。如: if (a+b>c && b+c>a && c+a>b) { s=0.4*(a+b+c); area=sqrt(S*(S-a)*(S-b)*(S-c)); printf(“area=%6.2f”,area); } else printf("it is not a trilateral"); 注意在第5行的花括号“}”外面不需要再加分号。因为 {}内是一个完整的复合语句,不需另附加分号。
程序如下:
# include main() { float x,y,z,min;/*变量定义*/ printf(“输入三个单精度浮点数”); scanf(“%f%f%f”, &x,&y,&z); min =x; if(min>y) min= y; if(min>z) min=z; printf(“浮点数%f,%f,%f中的最小值是%f\n”, x,y,z,min); }
2、有如下程序 main() { int a=2,b=-1,c=2; if(a<b) if(b<0) c=0; else c++; printf(“%d\n”,c); } 该程序的输出结果是 A) 0 B) 1 C) 2
D) 3
3、有以下程序 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(“%d\n”,m); } A) 1 B) 2
第4章
选择结构程序设计
大多数程序中都会包含选择结构。它的作用是,根据所 指定的条件是否满足,决定从给定的两组操作选择其一。 4.1 if语句
if语句是用来判定所给定的条件是否满足,根据 判定的结果(真或假)决定执行给出的两种操作之一。 4.1.1 if语句的三种形式 C语言提供了三种形式的if语句: 1. if(表达式) 语句; 例如: if(x>y) printf("%d",x); 这种if语句的执行过程见图4.1(a)。
2.见图4.1(b) if(表达式) 语句1; else 语句2; 例如: if (x>y) printf("%d",x); else printf("%d",y);
图4.1
3. if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; … else if(表达式m) 语句m; else 语句n; 流程图见图4.2。
C) 3
D) 4
上机作业: 运输公司对用户计算运费,距离越远,每公里运费越 低。设每公里每吨货物的基本运费为p,货物重为w,距离 为s,折扣为d,则总运费f计算公式为f=p*w*s(1-d),编 写程序。公里数s与折扣率d的标准如下: s<250km d=0 250≤s<500 d=0.05 500≤s<1000 d=0.075 1000≤s<2000 d=0.1 2000≤s<3000 d=0.15 3000≤s d=0.2
说明: (1) switch后面括弧内的“表达式”, ANSI标准允许 它为表达式的值 相等时,就执行此case后面的语句,若所有的case中的 常量表达式的值都没有与表达式的值匹配的,就执行 default后面的语句。 (3) 每一个case的常量表达式的值必须互不相同,否则 就会出现互相矛盾的现象 . (4) 各个case和default的出现次序不影响执行结果。例 如,可以先出现“default:…”,再出现“case „D‟:…”,然后是“case „A‟:…”。
3、以下程序的输出结果是(答案:100 ) main( ) { int a=100,x=10,y=20,ok1=5,ok2=0; if(x<y) if(y!=10) if (!ok1) a=1; else if(ok2) a=10; printf(“%d\n”,a); }
4、分析以下程序,结论是【 】。 main( ) { int x=5,a=0,b=0; if(x=a+b) printf("****\\n"); else printf("####\\n"); } A) 有语法错,不能通过编译 B) 能通过编译,但不能连接 C) 输出**** D) 输出 ####
(2) 第二、第三种形式的if语句中,在每个else前面有一 分号,整个语句结束处有一分号。例如: if (x>0) print ("%f",x); else 各有一个分号 printf("%f",-x); 这是由于分号是c语句中不可缺少的部分,这个分号 是if语句中的内嵌语句所要求的。如果无此分号,则 出现语法错误。
C语言提供Switch语句直接处理多分支选择。 它的一般形式如下: switch(表达式) { case 常量表达式1:语句1; case 常量表达式2:语句2; … case 常量表达式n:语句n; default :语句n+1; }
例如,要求按照考试成绩的等级打印出百分制分数 段,可以用Switch语句实现: char grade; switch(grade) { case 'A':printf("84-100\n"); case 'B':printf("70-84\n"); case 'C':printf("60-69\n"); case 'D':printf("<60\n"); default:printf("error\n"); }
条件运算符要求有3个操作对象,称三目(元)运 算符,它是c语言中唯一的一个三目运算符。条件 表达式的一般形式: 表达式1?表达式2∶表达式3。 它的执行过程见图4.1。
图4.1
注意: 条件运算符的结合方向为“自右至左”。如 果有以下条件表达式: a>b?a∶c>d?c∶d 相当于 a>b?a∶(c>d?c∶d)
练习题 1、若执行下面的程序时从键盘上输入 5 ,则输出是【 B 】 A) 7 B) 6 C) 5 D) 4 main() { int x; scanf("%d",&x); if(x++>5) printf("%d\n",x); else printf("%d\n",x--); }
2、以下不正确的if语句形式是( C )。 A)if(x>y&&x!=y); B)if(x==y) x+=y; C)if(x!=y) scanf(“%d”,&x) else scanf(“%d”,&y); D)if(x<y) {x++;y++;};
4.2 条件表达式
若在if语句中,在表达式为“真”和“假”时,且都只执行一 个赋值语句给同一个变量赋值时,可以用简单的条件运算符 来处理。例如,若有以下if语句: if (a>b) max=a; else max=b; 可以用下面的条件运算符来处理: max=(a>b)?a∶b; 其中“(a>b)?a∶b”是一个“条件表达式”。它是这样 执行的:如果(a>b)条件为真,则条件表达式取值a,否则取 值b。 条件运算符优先于赋值运算符,因此上面赋值表达式的 求解过程是先求解条件表达式,再将它的值赋给max。
最后一个分支(default)可以不加break语句。
如果grade的值为‘B‟,则只输出“70~84”。 流程图见图4.3。
图4.3
例2:见书P49 。
练 习 题 请 读 程 序 写 出 程 序 的 输 出 结 果