第4章 选择结构程序设计pptConvertor.docx
《第4章 选择结构程序设计pptConvertor.docx》由会员分享,可在线阅读,更多相关《第4章 选择结构程序设计pptConvertor.docx(32页珍藏版)》请在冰豆网上搜索。
第4章选择结构程序设计pptConvertor
第4章选择结构程序设计
4.1选择结构和条件判断
4.2用if语句实现选择结构
4.3关系运算符和关系表达式
4.4逻辑运算符和逻辑表达式
4.5条件运算符和条件表达式
4.6选择结构的嵌套
4.7用switch语句实现多分支选择结构
4.8选择结构程序综合举例
4.1选择结构和条件判断
在现实生活中,需要进行判断和选择的情况是很多的
如果你在家,我去拜访你
如果考试不及格,要补考
如果遇到红灯,要停车等待
周末我们去郊游
70岁以上的老年人,入公园免票
4.1选择结构和条件判断
在现实生活中,需要进行判断和选择的情况是很多的
处理这些问题,关键在于进行条件判断
由于程序处理问题的需要,在大多数程序中都会包含选择结构,需要在进行下一个操作之前先进行条件判断
4.1选择结构和条件判断
C语言有两种选择语句:
(1)if语句,实现两个分支的选择结构
(2)switch语句,实现多分支的选择结构
4.1选择结构和条件判断
例4.1在例3.5的基础上对程序进行改进。
题目要求是求方程的根。
由键盘输入a,b,c。
假设a,b,c的值任意,并不保证。
需要在程序中进行判别,如果,就计算并输出方程的两个实根,否则就输出“方程无实根”的信息。
解题思路:
输入a,b,c
计算disc
disc<0
计算x1,x2
输出无实根
输出x1,x2
真
假
#include
#include
intmain()
{
doublea,b,c,disc,x1,x2,p,q;
scanf("%lf%lf%lf",&a,&b,&c);
disc=b*b-4*a*c;
计算b2-4ac,disc的值变为-15
if(disc<0)
printf(“hasnotrealroots\n”);
else
{p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;
x2=p-q;
printf(“realroots:
\nx1=%7.2f\n
x2=%7.2f\n”,x1,x2);
}
return0;
}
-15<0为真
#include
#include
intmain()
{
doublea,b,c,disc,x1,x2,p,q;
scanf("%lf%lf%lf",&a,&b,&c);
disc=b*b-4*a*c;
计算b2-4ac,disc的值变为8
if(disc<0)
printf(“hasnotrealroots\n”);
else
{p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;
x2=p-q;
printf(“realroots:
\nx1=%7.2f\n
x2=%7.2f\n”,x1,x2);
}
return0;
}
8<0为假
p的值变为-1
q的值变为0.71
x1的值变为-0.29
x2的值变为-1.71
if(disc<0)
printf(“hasnotrealroots\n”);
else
{p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;
x2=p-q;
printf(“realroots:
\nx1=%7.2f\n
x2=%7.2f\n”,x1,x2);
}
return0;
}
选择结构,用if语句实现的
if(disc<0)
printf(“hasnotrealroots\n”);
else
{p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;
x2=p-q;
printf(“realroots:
\nx1=%7.2f\n
x2=%7.2f\n”,x1,x2);
}
return0;
}
复合语句
4.2用if语句实现选择结构
4.2.1用if语句处理选择结构举例
4.2.2if语句的一般形式
4.2.1用if语句处理选择结构举例
例4.2输入两个实数,按代数值由小到大的顺序输出这两个数。
解题思路:
只需要做一次比较,然后进行一次交换即可
用if语句实现条件判断
关键是怎样实现两个变量值的互换
★
●
A
B
互换前
●
★
A
B
互换后
4.2.1用if语句处理选择结构举例
★
●
A
B
C
★
4.2.1用if语句处理选择结构举例
★
●
A
B
C
★
●
4.2.1用if语句处理选择结构举例
A
B
C
★
●
★
4.2.1用if语句处理选择结构举例
●
#include
intmain()
{floata,b,t;
scanf("%f,%f",&a,&b);
if(a>b)
{t=a;
a=b;
b=t;
}
printf("%5.2f,%5.2f\n",a,b);
return0;
}
将a和b的值互换
如果a>b
#include
intmain()
{floata,b,t;
scanf("%f,%f",&a,&b);
if(a>b)
{t=a;
a=b;
b=t;
}
printf("%5.2f,%5.2f\n",a,b);
return0;
}
选择结构,用if语句实现的
例4.3输入3个数a,b,c,要求按由小到大的顺序输出。
解题思路:
可以先用伪代码写出算法:
ifa>b,a和b对换(a是a、b中的小者)
ifa>c,a和c对换(a是三者中最小者)
ifb>c,b和c对换(b是三者中次小者)
顺序输出a,b,c
#include
intmain()
{floata,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}
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);
return0;
}
如果a>b,将a和b对换
a是a、b中的小者
#include
intmain()
{floata,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}
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);
return0;
}
如果a>c,将a和c对换
a是三者中的小者
#include
intmain()
{floata,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}
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);
return0;
}
如果b>c,将b和c对换
b是三者中的次小者
4.2.2if语句的一般形式
if(表达式)语句1
[else语句2]
关系表达式
逻辑表达式
数值表达式
方括号内的部分为可选的
4.2.2if语句的一般形式
if(表达式)语句1
[else语句2]
简单的语句
复合语句
另一个if语句等
最常用的3种if语句形式:
1.if(表达式)语句1(没有else子句)
2.if(表达式)语句1
else语句2(有else子句)
3.if(表达式1)语句1
elseif(表达式2)语句2
elseif(表达式3)语句3
┆
elseif(表达式m)语句m
else语句m+1
(在else部分又嵌套了多层的if语句)
if(number>500)cost=0.15;
elseif(number>300)cost=0.10;
elseif(number>100)cost=0.075;
elseif(number>50)cost=0.05;
elsecost=0;
if(number>500)cost=0.15;
else
if(number>300)cost=0.10;
else
if(number>100)cost=0.075;
else
if(number>50)cost=0.05;
elsecost=0;
等价于
分号不能丢
说明:
(1)整个if语句可写在多行上,也可写在一行上
但都是一个整体,属于同一个语句
(2)“语句1”…“语句m”是if中的内嵌语句
内嵌语句也可以是一个if语句
(3)“语句1”…“语句m”可以是简单的语句,也可以是复合语句
4.3关系运算符和关系表达式
4.3.1关系运算符及其优先次序
4.3.2关系表达式
4.3.1关系运算符及其优先次序
关系运算符:
用来对两个数值进行比较的比较运算符
C语言提供6种关系运算符:
①<(小于)②<=(小于或等于)
③>(大于)④>=(大于或等于)
⑤==(等于)⑥!
=(不等于)
优先级相同(高)
优先级相同(低)
4.3.1关系运算符及其优先次序
关系、算术、赋值运算符的优先级
4.3.1关系运算符及其优先次序
c>a+b等效于c>(a+b)
a>b==c等效于(a>b)==c
a==ba=b>c等效于a=(b>c)
4.3.2关系表达式
关系表达式
用关系运算符将两个数值或数值表达式连接起来的式子
关系表达式的值是一个逻辑值,即“真”或“假”
在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”
4.4逻辑运算符和逻辑表达式
4.4.1逻辑运算符及其优先次序
4.4.2逻辑表达式
4.4.3逻辑型变量
4.4.1逻辑运算符及其优先次序
3种逻辑运算符:
&&(逻辑与)||(逻辑或)!
(逻辑非)
&&和||是双目(元)运算符
!
是一目(元)运算符
逻辑表达式
用逻辑运算符将关系表达式或其他逻辑量连接起来的式子
4.4.1逻辑运算符及其优先次序
判断年龄在13至17岁之内?
age>=13&&age<=17
判断年龄小于12或大于65?
age<12||age>65
4.4.1逻辑运算符及其优先次序
a
b
!
a
!
b
a&&b
a||b
真
真
假
假
真
真
真
假
假
真
假
真
假
真
真
假
假
真
假
假
真
真
假
假
逻辑运算的真值表
4.4.1逻辑运算符及其优先次序
逻辑运算符的优先次序
!
→&&→||(!
为三者中最高)
与其他运算符的优先次序
!
(高)
算术运算符
关系运算符
&&和||
赋值运算符(低)
4.4.2逻辑表达式
逻辑表达式的值应该是逻辑量“真”或“假”
编译系统在表示逻辑运算结果时
以数值1代表“真”,以0代表“假”
但在判断一个量是否为“真”时
以0代表“假”,以非0代表“真”
注意:
将一个非零的数值认作为“真”
4.4.2逻辑表达式
(1)若a=4,则!
a的值为0
(2)若a=4,b=5,则a&&b的值为1
(3)a和b值分别为4和5,则a||b的值为1
(4)a和b值分别为4和5,则!
a||b的值为1
(5)4&&0||2的值为1
4.4.2逻辑表达式
修改后的逻辑运算真值表
a
b
!
a
!
b
a&&b
a||b
非0
非0
0
0
1
1
非0
0
0
1
0
1
假
非0
1
0
0
1
假
0
1
1
0
0
4.4.2逻辑表达式
判别某一年是否闰年,用逻辑表达式表示
闰年的条件是符合下面二者之一:
①能被4整除,但不能被100整除,如2008
②能被400整除,如2000
(year%4==0&&year100!
=0)
||year%400==0
如果表达式值为1,则闰年;否则为非闰年
4.4.3逻辑型变量
这是C99所增加的一种数据类型
可以将关系运算和逻辑运算的结果存到一个逻辑型变量中,以便于分析和运算
4.5条件运算符和条件表达式
a
b
!
a
!
b
a&&b
a||b
非0
非0
0
0
1
1
非0
0
0
1
0
1
假
非0
1
0
0
1
假
0
1
1
0
0
a
b
!
a
!
b
a&&b
a||b
非0
非0
0
0
1
1
非0
0
0
1
0
1
假
非0
1
0
0
1
假
0
1
1
0
0
a
b
!
a
!
b
a&&b
a||b
非0
非0
0
0
1
1
非0
0
0
1
0
1
假
非0
1
0
0
1
假
0
1
1
0
0
a
b
!
a
!
b
a&&b
a||b
非0
非0
0
0
1
1
非0
0
0
1
0
1
假
非0
1
0
0
1
假
0
1
1
0
0
a
b
!
a
!
b
a&&b
a||b
非0
非0
0
0
1
1
非0
0
0
1
0
1
假
非0
1
0
0
1
假
0
1
1
0
0
a
b
!
a
!
b
a&&b
a||b
非0
非0
0
0
1
1
非0
0
0
1
0
1
假
非0
1
0
0
1
假
0
1
1
0
0
a
b
!
a
!
b
a&&b
a||b
非0
非0
0
0
1
1
非0
0
0
1
0
1
假
非0
1
0
0
1
假
0
1
1
0
0
有一种if语句,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值
如:
if(a>b)
max=a;
else
max=b;
条件运算符
4.5条件运算符和条件表达式
有一种if语句,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值
如:
if(a>b)
max=a;
else
max=b;
max=(a>b)?
a:
b;
条件表达式
4.5条件运算符和条件表达式
条件表达式的一般形式为
表达式1?
表达式2:
表达式3
4.5条件运算符和条件表达式
条件运算符的执行顺序:
求解表达式1
若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值
若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值
4.5条件运算符和条件表达式
条件运算符优先于赋值运算符
条件运算符的结合方向为“自右至左”
以下为合法的使用方法:
a>b?
(max=a):
(max=b);
a>b?
printf(“%d”,a):
printf(“%d”,b);
4.5条件运算符和条件表达式
例4.4输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。
然后输出最后得到的字符。
4.5条件运算符和条件表达式
解题思路:
用条件表达式来处理,当字母是大写时,转换成小写字母,否则不转换
4.5条件运算符和条件表达式
#include
intmain()
{
charch;
scanf("%c",&ch);
ch=(ch>='A'&&ch<='Z‘)?
(ch+32):
ch;
printf("%c\n",ch);
return0;
}
4.6选择结构的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套
一般形式:
if()
if()语句1
else语句2
else
if()语句3
else语句4
内嵌if
else总是与它上面最近的未配对的if配对
4.6选择结构的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套
if()
{
if()语句1
}
else语句2
内嵌if
{}限定了内嵌if范围
4.6选择结构的嵌套
例4.5有一函数:
编一程序,输入一个x值,要求输出相应的y值。
4.6选择结构的嵌套
解题思路:
用if语句检查x的值,根据x的值决定赋予y的值
由于y的可能值不是两个而是三个,因此不可能只用一个简单的(无内嵌if)的if语句来实现
4.6选择结构的嵌套
解题思路:
方法1
(1)先后用3个独立的if语句处理:
输入x
若x<0,则y=-1
若x=0,则y=0
若x>0,则y=1
输出x和y
scanf("%d",&x);
if(x<0)y=-1;
if(x==0)y=0;
if(x>0)y=1;
printf("x=%d,y=%d\n",x,y);
4.6选择结构的嵌套
解题思路:
方法2
(2)用一个嵌套的if语句处理:
输入x
若x<0,则y=-1
否则
若x=0,则y=0
否则y=1
输出x和y
scanf("%d",&x);
if(x<0)y=-1;
else
if(x==0)y=0;
elsey=1;
printf("x=%d,y=%d\n",x,y);
4.6选择结构的嵌套
解题思路:
方法2
(2)用一个嵌套的if语句处理:
输入x
若x<0,则y=-1
否则
若x=0,则y=0
否则y=1
输出x和y
scanf("%d",&x);
if(x<0)y=-1;
else
if(x==0)y=0;
elsey=1;
printf("x=%d,y=%d\n",x,y);
scanf("%d",&x);
if(x>=0)
if(x>0)y=1;
elsey=0;
elsey=-1;
printf("x=%d,y=%d\n",x,y);
提倡内嵌if放在else中
4.7用switch语句实现多分支选择结构
switch语句用来实现多分支选择结构
学生成绩分类
85分以上为’A’等
70~84分为’B’等
60~69分为’C’等
……
人口统计分类
按年龄分为老、中、青、少、儿童
4.7用switch语句实现多分支选择结构
例4.6要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70~84分,C等为60~69分,D等为60分以下。
成绩的等级由键盘输入。
4.7用switch语句实现多分支选择结构
解题思路:
判断出这是一个多分支选择问题
根据百分制分数将学生成绩分为4个等级
如果用if语句,至少要用3层嵌套的if,进行3次检查判断
用switch语句进行一次检查即可得到结果
#include
intmain()
{chargrade;
scanf("%c",&grade);
printf("Yourscore:
");
switch(grade)
{case'A':
printf("85~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("enterdataerror!
\n");
}
return0;
}
值为A
#include
intmain()
{chargrade;
scanf("%c",&grade);
printf("Yourscore:
");
switch(grade)
{case'A':
printf("85~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("enterdataerror!
\n");
}
return0;
}
不能少
#include
intmain()
{chargrade;
scanf("%c",&grade);
printf("Yourscore:
");
switch(grade)
{case'A':
printf("85~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("enterdataerror!
\n");
}
return0;
}
值为C
#include
intmain()
{chargrade;
scanf("%c",&gra