04第四章 选择结构.docx
《04第四章 选择结构.docx》由会员分享,可在线阅读,更多相关《04第四章 选择结构.docx(12页珍藏版)》请在冰豆网上搜索。
![04第四章 选择结构.docx](https://file1.bdocx.com/fileroot1/2023-1/24/81e8997d-e3d7-4067-ab2f-a4d1e6ac7c8b/81e8997d-e3d7-4067-ab2f-a4d1e6ac7c8b1.gif)
04第四章选择结构
第四章选择结构
引言:
分支结构,根据逻辑判断的结果决定程序的不同流程。
(根据不同的条件执行不同的分支)
1.关系运算和逻辑运算
C语言中的逻辑值:
真:
非0表示真1-11.5‘a’1
假:
00
(1)关系运算符和关系表达式
比较运算,进行两个数的比较,判断比较的结果是否符合条件
①>>=<<===!
=
注:
双目运算;
同一级里边自左向右;
②表达式的结果值为1或0,若为真用1表示,若为假用0.
inta=10,b=12,c=8;
a>=b0
(a=3)>(b=4)0
a>c==c0
(a++)‘a’==971
注:
关系运算符两边值类型不一致时,系统自动进行类型转换;
‘a’==97
若x,y定义为double.避免使用x==y来判断两个数是否相等。
因为存放在内存中的浮点数是有误差的,x==y结果总为0.可用:
fabs(x-y)<1e-6
doublex,y;
x==y1相等
1不等
x=1;1.00000001
y=1;1.00000002
x==y0
x=1;
x=2;
x==y0
x,y
x-y>0x>y
x-y<0xx-y=0x=y
fabs(x-y)<1e-6math.h
(2)逻辑运算符和逻辑表达式
①&&||!
注:
&&和||是双目运算符,!
是单目运算(!
a)
优先级!
&&||
&&:
两个都为真则结果为真-1&&0
||:
有一个为真则结果为真0||’0’
!
:
真变假,假变真!
0!
-2
②&&:
两边都为真时,结果为真。
有一个为假则结果为假。
(左为假短路右边)。
inta=1,b=0;a++&&b++b==?
1
inta=0,b=0;a++&&b++b==?
0
||:
有一个真,则结果为真。
(左为真短路右边)。
inta=1,b=0;a++||b++b==?
0
inta=0,b=0;a++||b++b==?
1
短路:
出现在特定情况下,此时不可以用一般的思维方式按优先级考虑。
&&:
左为假短路右边。
左为真必须看右边
||:
左为真短路右边。
左为假必须看右边。
#include
main()
{inta=0,b=5,c;
c=a>b||++b;
printf(“%d%d\n”,c,b);
}
③数学式:
0C语言:
01<101
0<101
0<-5<101
0<5<101
0<15<101
x>0&&x<10
x>=’a’&&x<=’z’1
x>=’A’&&x<=’Z’
x>=’0’&&x<=’9’1
(3)优先级
单目:
(+-++--!
)右—左
算术:
(*/%)(+-)
关系:
(>>=<<=)(==!
=)
逻辑:
(&&)(||)
条件:
?
:
赋值:
=
逗号:
1.if语句和用if语句构成的选择结构
(1)if语句
1不含else子句的if语句
形式:
if(表达式)if子句;
if是关键字
表达式可以是:
关系表达式,逻辑表达式,算术表达式等(C语言中任意合法的表达式);也可以是任意类型的数据
1>21&&21+211.0‘1’0
语法上只能是一条语句,若该if子句包含多条语句,则必须用复合语句
{t=a;a=b;b=t;}
代码:
if(a>b){t=a;a=b;b=t;}
printf(“ok”);
执行过程:
if(表达式)if子句;
其它语句;
举例:
输入两个数,分别放入x和y中,若两个数不相等,则输出其中的大数;若两数相等,则输出字符串x==y和y的值。
#include
main()
{intx,y;
scanf(“%d%d”,&x,&y);
if(x>y)printf(“%d\n”,x);
if(xif(x==y)printf(“x==y%d\n”,y);
}
输入三个数,分别放在变量a,b,c中,然后把输入的数据重新按由小到大的顺序放在变量a,b,c中,最后输出a,b,c中的值。
#include
main()
{inta,b,c,t;
scanf(“%d%d%d”,&a,&b,&c);
312
if(a>b){t=a;a=b;b=t;}132
if(a>c){t=a;a=c;c=t;}
if(b>c){t=b;b=c;c=t;}123
printf(“%d%d%d\n”,a,b,c);
}
2含else子句的if语句
语句形式:
if(表达式)if子句;
elseelse子句;
注:
if子句与else子句语法上只能是一条语句,若有多条则应用复合语句。
else是if语句的一部分,是一个整体。
else不可以单独出现。
if---else
代码:
if(a>b){printf(“%d”,a);a++;}
else{prinf(“%d”,b);b++;}
printf(“ok”);
执行过程:
举例:
编写程序,输入一个数,打印它是偶数(even)还是奇数(odd)。
3关于if语句的一些说明
表达式:
C语言中任意一个合法的表达式或任意类型的数据,但括号里不可为空
分号
(2)嵌套的if语句
if子句和else子句可以是任意合法的C语句,故当然可以是if语句。
所以if语句可以内嵌在if子句中也可以内嵌在else子句中。
①
在if子句中嵌套if—else语句
if(表达式)if(表达式)if子句;
elseelse子句;
elseelse子句;
inta=3,b=2,c=1;
if(a
if(a>c)printf(“*”);
elseprintf(“&”);
elseprintf(“%”);
printf(“end”);
在if子句中嵌套不含else子句的if语句
if(表达式)
{if(表达式)if子句;}
elseelse子句;
注:
括号不可省,因为c语言中规定else总是与前边最近的且不带else的if结合,与它的书写格式无关。
inta=3,b=2,c=1;
if(a
{if(a>c)printf(“*”);}
elseprintf(“&”);
printf(“end”);
②
在else子句嵌套if—else
if(表达式)外层if子句;
else
if(表达式)里层if子句;
else里层else子句;
inta=3,b=2,c=1;
if(a
else
if(aelseprintf(“%”);
printf(“end”);
在else子句中嵌套不含else的if语句
if(表达式)外层的if子句
else
if(表达式)if子句;
inta=3,b=2,c=1;
if(a
else
if(aprintf(“end”);
注:
写程序时若要含嵌套最好写在else子句中,此时一般不会引起if—else配对的混乱
多层嵌套形式:
if(表达式)if子句;
elseif()…..
elseif()…
elseif()…..
else…
其它语句;
if(表达式1)语句1
elseif(表达式2)语句2
elseif(表达式3)语句3
elseif(表达式4)语句4
else语句5
其它语句;
多层嵌套执行过程:
从上向下逐一对if语句后的表达式进行检测,当某一个表达式值为真时,执行与此表达式有关的语句,其它的语句全部跳过。
若所有表达式值都为假,执行最后的else子句,若最后没else子句,则结束了本次嵌套的if语句。
多层嵌套程序举例:
根据输入的学生成绩给出相应的等级,90分以上(包括90)输出“A”,60分以下输出”E”,中间成绩10分为一个等级。
0----100
>=90A
<60E
60—8980---89B
70---79C
60---69D
#include
main()
{intscore;
scanf(“%d”,&score);
if(score>=90)printf(“%dA”,score);
elseif(score>=80)
printf(“%dB”,score);
elseif(score>=70)
printf(“%dC”,score);
elseif(score>=60)
printf(“%dD”,score);
else
printf(“%dE”,score);
}
2.条件表达式构成的选择结构
根据不同的条件使用不同的运算对象参与运算。
条件运算符:
?
:
唯一三目运算符
格式:
表达式1?
表达式2:
表达式3
优先级:
倒数第三
结合方向:
自右向左
执行:
表达式1真表达式2
假表达式3
inta=5,b=4,c=2,d=2,e=1;
a
a:
b4
if(a
elseprintf(“%d”,b);
a
c:
dd:
e1
a
c:
1
3.switch语句(switch---case构成选择分支)
语句形式:
switch(表达式)
{
case常量表达式4:
语句4;a++;
case常量表达式2:
case常量表达式3:
语句3;
case常量表达式1:
语句1;
default:
语句;
}
注:
(1)switch后圆括号中表达式:
表达式可以是整型表达式或字符型表达式。
表达式的值为整数。
inta=1,b=2;
1+21>2a&&b!
aa‘a’
1.0+2非法
(2)常量表达式:
可以是一个整数,一个整数常量表达式或一个字符型常量。
其类型必须与switch后圆括号中表达式值的类型保持一致。
inta=1,b=2;
11+2‘a’‘\0’合法
aba+b非法
(3)case语句标号:
各case语句标号值不可重复。
各case语句和default语句的书写顺序无先后限制。
有时switch语句体中也可以没有default语句。
(4)case语句标号后的语句:
可以是零条一条或多条。
(5)case与常量表达式间要有空格case0:
case10:
(6)内嵌
语句举例:
inta=1,b=2,c=3;
switch(a)
{case1:
switch(a&&b)
{case0:
printf(“A”);
case1:
printf(“B”);break;
}
break;
case2:
printf(“#”);
case3:
case4:
switch(c)
{case0:
printf(“a”);
case1:
printf(“b”);
default:
printf(“c”);
}
}
执行过程:
(1)计算switch后表达式的值
(2)在switch语句体中与该值相同的case标号,若有相同的case标号则从该标号开始执行各语句直到switch结束;若无相同的case标号再看有无default标号,若有则从default标号开始直到switch结束,若无default标号则跳过switch语句体到其后的语句。
程序举例:
根据输入的学生成绩给出相应的等级,90分以上为A,其它成绩10分为一个等级,60分以下为E.(成绩为整型数)
0----100
>=90A910
<60Edefault
60-------89
80---89B8
70---79C7
60---69D6
#include
main()
{intx;
scanf("%d",&x);
switch(x/10)
{case10:
case9:
printf("%dA\n",x);break;
case8:
printf("%dB\n",x);break;
case7:
printf("%dC\n",x);break;
case6:
printf("%dD\n",x);break;
default:
printf("%dE\n",x);
}
}
switch语句中使用break语句:
间断语句,break可出现在switch中的任何位置,当执行break语句时,立即跳出了它所在的switch语句体
4.语句标号和goto语句
概念:
标号为任意合法的标识符
形式:
标识符:
flag1:
12:
作用:
标号用作goto语句的转向目标
概念:
goto语句叫无条件转向
形式:
goto语句标号;
作用:
把程序的执行语句转向标号所在的位置,一般情况下,goto语句和语句标号在同一个函数内
……
stop:
printf(“end\n”);
….
….
gotostop;
………..
……….
………