第4章选择结构.docx
《第4章选择结构.docx》由会员分享,可在线阅读,更多相关《第4章选择结构.docx(18页珍藏版)》请在冰豆网上搜索。
![第4章选择结构.docx](https://file1.bdocx.com/fileroot1/2022-12/7/5b7156cf-7fc4-4f0e-a0ab-7d7af4428d74/5b7156cf-7fc4-4f0e-a0ab-7d7af4428d741.gif)
第4章选择结构
第四章选择结构
考核知识点
●if语句的实现选择结构
●用switch语句实现多分支选择结构
●选择结构的嵌套
●goto语句和语句标号的使用
重要考点提示
●选择语句的简单操作
●if语句的嵌套操作
●switch语句的使用
4.1关系运算符和关系表达式
关系运算是逻辑运算中较简单的一种。
所谓“关系运算”其实就是“比较运算”,对两个值进行比较,判断其比较后的结果是否符合指定,从而执行不同的程序段。
1.关系运算符及其优先次序
C语言提供了6种关系运算符,见表4-1
表4-1关系运算符
关系运算符
名称
<
小于
<=
小于或等于
>
大于
>=
大于或等于
==
等于
!
=
不等于
小提示:
由两个字符组成的运算符之间不可以加空格,关系运算符都是双目运算符。
(1)结合性:
自左向右。
(2)优先次序:
前4种关系运算符的优先级别相同,后两种优先级相同,且前4种的优先级高于后两种;关系运算符的优先级低于算术运算符,高于赋值运算符。
2.关系表达式
由关系运算符连接而成的表达式(可以是算术表达式、关系表达式或其他表达式)称为关系表达式。
当关系运算符两边值的类型不一致时,若一边是整型,一边是实型,系统将自动把整型数转化为实型数,然后进行比较。
4.2逻辑运算符和逻辑表达式
1.逻辑运算符及其优先级
C语言提供了3种逻辑运算符,见表4-2
表4-2逻辑运算符
符号
名称
&&
逻辑与
||
逻辑或
!
软软非
“&&”和“||”是双目运算符,要求要有两个操作数,而“!
”是单目运算符,只要求一个操作数即可,以上逻辑运算符的优先级是:
“!
”级别最高,其次是“&&”,“||”级别最低,逻辑运算符中的“&&”和“||”低于关系运算符,而“!
”高于关系运算符。
2.逻辑表达式
逻辑表达式是由逻辑运算符和运算对象组成,其中,参与逻辑运算的对象可以是一个具体的值,还可以是C语言中任意合法的表达式,逻辑表达式的运算结果为1。
若a=5,则!
a的值为0。
因为a的值为5,被认做是“真”,对它进行“非”运算后,结果为“假”,即结果为0.当A和B的值结合方式不同时,各种逻辑运算所得到的结果是不同的。
见表4-3
表4-3逻辑运算表
A
B
!
A
!
B
A&&B
A||B
1
1
0
0
1
1
1
0
0
1
0
1
0
1
1
0
0
1
0
0
1
1
0
0
值得注意的是:
在数学中,关系式0但在C语言中却不能用0如
(1)x&&y&&z,只有当x为真时,才需要判别y的值;只有当x和y都为真时,才需要去判别z的值;只要x为假就不必判别y和z,整个表达式的值为0.。
(2)x||y||z,只要z的值为真,就不必差别y和z的值,整表达式的值为1.。
只有x的值为假时才需要差别y的值,只有x和y的值同时为假才需要判别z的值,因此,如有逻辑表达式(m=x>y)&&(n=c>d),其中x=1,y=2,c=3,d=4若m和n的原值为1,由于“x>y”的值为0,因为m=0,而不执行“n=c>d”,所以n的值不是0而是原值1。
4.3IF语句和用IF语句构成的选择结构
if语句用来对所给定的条件进行判定,判断其表达式的值是否满足某种条件,并根据判定的结果决定执行给出的两种操作中的哪一种。
1.if语句的几种形式
(1)if(表达式)语句
例如:
if(a>b)
printf(“Theanswerisright!
\n”);
其中,if是C语言关系字,a>b是条件判断表达式。
表达式两侧的括号不可少,并且只能是圆括号,不能用其他括号替代。
紧跟着的是一条输出语句,称为if子句。
如果在if子句中需要多个语句,则应该使用大括号({})把一组语句括起来构成复合语句,这样在语法上满足“一条语句”的要求。
(2)if(表达式)语句1
else语句2
例如:
if(a>b)printf(“Theanswerisright.\n”);
elseprintf(“Theansweriswrong.\n”);
(3)if(表达式)语句1
elseif(表达式2)语句2
…
elseif(表达式m)语句1
else语句n
“语句1”是if子句,“语句2…语句m”是else子句。
这些子句在语法上要求是一条语句,但需要执行多条语句时,则应该使用花括号({})把这些语句括起来组成复合语句。
小提示:
else不能独立成为一条语句,它只是if语句的一部分,不允许单独出现在程序中。
else 必须与if配对,共同组成if…else语句。
2.if语句的嵌套
在if语句中又包含一个或多个if语句结构,称为if语句的嵌套,一般形式如下:
if()
if()语句1
else语句2
else
if()语句3
else语句4
应当注意:
else总是与它上面的最近的没有与else配对的if配对。
3.条件运算符构成的选择结构
有如下语句:
if(xmin=x;/*求两数中较小的一个*/
elsemin=y;
可以用min=(xx:
y来替换,其中(xx:
y是一个条件表达式,“?
:
”就是条件运算符。
该表达式是这样执行的:
如果(x优先级:
条件运算符高于赋值运算符,但低于逻辑运算符、关系运算符和算术运算符。
4.4switch和goto语句
1.switch语句
switch语句是C语言提供的多分支选择结构语句,用来实现多分支选择结构。
它的一般形式如下:
switch(表达式)
{
case常量表达式1:
语句1
case常量表达式2:
语句2
…
case常量表达式n:
语句n
default:
语句n+1
}
说明:
(1)switch是关键字,switch后面用花括号括起来的部分是switch语句体。
(2)switch后面括号内的“表达式”,可以是C语言中任意合法表达式,但表达式两侧的括号不能省略。
(3)case也是关键字,与其后面的常量表达式合称case语句标号,常量表达式的类型必须与switch后面的表达式类型相匹配,且各case语句标号的值各不相同,不能重复。
(4)default也是关键字,起标号作用,代表了以上所有case标号之外的那些标号,default标号可以出现在语句体中任何标号位置上,当然,也可以没有。
(5)case语句标号后的语句1、语句2等,可以是一条语句,也可以是若干条,在必要时,case语句标号后的语句可以省略不写。
小提示:
case和常量表达式之间一定要有空格。
2.语句标号
语句标号用标识符表示,它的命名规则与变量名相同,即由字母、数字和下划线组成,在标识符后加一个冒号,就成了一个语句标号。
在C语言中可以在任何语句前加上语句标号。
3.goto语句
goto语句为无条件转向语句,goto语句的一般形式如下:
goto语句标号;
goto语句的作用:
把程序的执行转向语句标号所在的位置,这个语句标号必须与此goto语句同在一个函数内,滥用goto语句将使程序的流程毫无规律,可读性差,因此初学者应慎用。
一、选择题:
1.下列错误的语句是()。
A.if(a>b)printf(“%d”,a);B.if(&&);a=m;
C.if
(1)a=m;elsea=n;D.if(a>0);{eldea=n;}
2.读下列程序:
#include
main()
{
floata,b,t;
scanf(“%f,%f”,&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
printf(“%5.2f,%5.2f”,a,b);
}
运行时从键盘输入3.8和则正确的输出结果是()。
A.-3.40,-3.80B.-3.40,3.80
C.-3.4,3.8D.3.80,-3.40
3.读下列程序:
#include
main()
{
intx,y;
scanf(“%d”,&x);
y=0;
if(x>=0)
{if(x>0)y=1;}
elsey=-1;
printf(“%d”,y);
}
当从键盘输入32时,程序的输出结果为()
()
A.0B.-1C.1D.不确定值
4.对下述程序,()是正确判断。
#include
main()
{
intx,y;
scanf(“%d,%d”,&x,&y);
if(x>y)
x=y;y=x;
elsex++;y++;
printf(“%d,%d”,x,y);
}
A.有语法错误,不能通过编译B.若输入数据3和4,则输出4和5
C.若输入数据4和3,则输出3和4D.若输入数据4和3,则输出4和4
5.以下程序的输出结果是()。
#include
main()
{
intx=1,y=0,a=0,b=0;
switch(x)
{
case1:
switch(y)
{
case0:
a++p;break;
case1:
b++;break;
}
case2:
a++;b++;break;
case3:
a++,b++;
}
printf(“\na=%d,b=%d”,a,b);
}
A.a=2,b=0B.a=2,b=1C.a=1,b=1D.a=2,b=2
6.这表示关系:
x≥y≥z,应使用的C语言表达式是()。
A.(x>=y)&&(y>=z)B.(x>=y)AND(Y>=Z)
C.(x>=y>=z)D.(x>=y)&(y>=z)
7.以下程序正确的输出结果是()
#include
main()
{
inta=2,b=-1,c=2;
if(a
if(b<0)c=0;
elsec+=1;
printf(“%d\n”,c);
}
A.0B.2C.3D.4
8.以下程序的输出结果是()。
#include
main()
{
intw=4,x=3,y=2,z=1;
printf(“%d\n”,(ww:
zz}
A.1B.2C.3D.4
9.以下程序的运行结果是()。
#include
main()
{
intk=2;
switch(k)
{
case1:
printf(“%d\n”,k++);break;
case2:
printf(“%d”,k++);
case3:
printf(“%d\n”,k++);break;
case4:
printf(“%D\n”,k++);
defaulf:
printf(“Full!
\n”);
}
}
A.13B.23C.22D.32
10.下列程序的运行结果是()
#include
main()
{
inta=2,c=5;
printf(“a=%d,b=%d\n”,a,c);
}
A.a=%2,b=%5B.a=2,b=5
C.a=d,b=dD.a=%d,b=%d
11.语句printf(”a\bre\’hi\’y\\\bou\n”);的输出结果是()。
A.a\bre\’hi\’y\\bouB.a\bre\’hi\y’\bou
C.re’hi’youD.abre’hi’\bou
12.如下程序的输出结果是()
#include
main()
{
intx=1,a=0,b=0;
switch(x)
{
case0:
b++;
case1:
a++;
case2:
a++;b++;
}
printf(“a=%d,b=%d\n”,a,b);
}
A.a=2,b=1B.a=1,b=1C.a=1,b=0D.a=2,b=2
13.如下程序的输出结果是()。
#include
main()
{floatx=2.0,y;
if(x<0.0)y=0.0;
elseif(x<10.0)y=1.0/x;
elsey=1.0.;
printf(“%f\n”,y);
}
A.0.B.0.C.0.D.1.
14.如下程序的输出结果是()
#include
main()
{
inta=12,b=5,c=-3;
if(a>b)
if(b<0)c=0;elsec++;
printf(“%d\n”,c);
}
A.0B.1C.-2D.-3
15.阅读以下程序:
#include
main()
{
intx;
scanf(“%d”,&x);
if(x--<5)printf(“%d”,x);
elseprintf(“%d”,x++);
}
程序运行后,如果从键盘输入5,则输出结果是()。
A.3B.4C.5D.6
16.以下程序的输出结果是()。
#include
main()
{
inta=15,b=21,m=0;
switch(a%3)
{
case0:
m++;break;
case1:
m++;
switch(b%2)
{
default:
m++;
case0m++;break;
}
}
printf(“%d\n”,m);
}
A.1B.2C.3D.4
17.下面的程序()。
#include
main()
{
intx=3,y=0,z=0;
if(x=y+z)printf(“****”);
elseprintf(“####”);
}
A.有语法错误不能通过编译
B.输出****
C.可以通过编译,但是不能通过连接,因而不能运行
D.输出####
18.两次运行下面的程序,如果从键盘上输入6和4,则输出结果是()。
#include
main()
{
intx;
scanf(“%d”,&x);
if(x++>5)printf(“%d”,x);
elseprintf(“%d\n”,x--);
}
A.7和5B.6和3C.7和4D.6和4
19.以下程序的输出结果的是()。
#include
main()
{
inta=-1,b=4,k;
k=(++a<0)&&!
(b--<=0);
printf(“%d%d%d”,k,a,b);
}
A.104B.103C.003D.004
20.能正确表示a≥10或a≤0的关系表达式是()。
A.a>=10ora<=0B.a>=10|a<=0
C.a>=10&&a<=0D.a>=10||a<=0
21.假定所有变量均已正确说明,下列程序段运行后x的值是()。
a=b=c=0;x=35;
if(!
a)x--;
elseif(b);
if(c)x=3;
elsex=4;
A.34B.4C.35D.3
22.表示关系X≤Y≤Z的C语言表达式()。
A.(X<=Y)&&(Y<=Z)B.(X<=Y)and(Y<+Z)
C.(X<=Y<=Z)D.(X<=Y)&(Y<=Z)
23.如下程序的输出结果是()。
#include
main()
{
inta,b,c=246;
a=c/100%9;
b=(-1)&&(-1)
printf(“%d,%d\n”,a,b);
}
A.2,1B.3,2C.4,3D.2,-1
24.当a=1、b=3、c=5、d=5时,执行下面的程序段后,x的值为()。
if(a
if(celseif(aif(belsex=3;
elsex=6;
elsex=7;
A.1B.2C.3D.6
25.能正确表示a和b同时为正或同时为负的逻辑表达式是()。
A.(a>=0||b>=0)&&(a<0||b<0)B.(b>=0&&b>=0)&&(a<0&&b<0)
C.(a+b>0)&&(a+b<=0)D.a*b>0
26.以下程序的输出结果是()。
#include
main()
{
inta=-1,b=1,k;
if(++a<0)&&!
(b--<=0)
printf(“%d%d\n”,a,b);
else
printf(“%d%d\n”,b,a);
}
A.-11B.01C.10D.00
27.下列关于switch语句和break语句的结论中,正确的是()。
A.break语句是switch语句中的一部分
B.在switch语句中可以根据需要使用或不使用break语句
C.在switch语句中必须使用break语句
D.break语句只能用于switch语句中
28.设有说明语句“inta=1,b=0;”,则执行了下列语句后,输出为()。
switch(a)
{
case1:
switch(b)
{
case0:
printf(“**0**”);break;
case1:
printf(“**1**”)
}
case2:
printf(“**2**”);break;
}
A.**0**B.**0****2**
C.**0******1****2**D.主语法错误
29.以下关于运算符优先顺序的描述中正确的是()。
A.关系运算符<算术运算符赋值运算符<逻辑运算符
B.逻辑运算符<关系运算符<算术运算符<赋值运算符
C.赋值运算符<逻辑运算符<关系运算符<算术运算符
D.算术运算符<关系运算符<赋值运算符<逻辑运算符
30.为了避免在嵌套的条件语句if...else中产生二义性,C语言规定:
else子句总是与()配对。
A.缩排位置相同的ifB.其之前最近的if
C.其之后的最近的ifD.同一行上的if
二、填空题:
1.若有定义:
inta=10,b=9,c=8;接着顺序执行下列语句后,变量b中的值是3。
c=(a-=(b-5));
c=(a%11)+(b=3);
2.表示“整数x的绝对值大于5”时值为“真”的C语言表达式是x>5||x<-5。
3.下列程序的输出结果是16.00,请填空。
#include
main()
{
inta=9,b=2;
floatx=6.6。
y=1.1,z;
z=a/2+b*x/y+1/2;
printf(“%5.2f\n”,z);
}
4.若从键盘输入58,则以下程序输出的结果是。
#include
main()
{
inta;
scanf(“%d”,&a);
if(a>50)printf(“%d”,a);
if(a>40)printf(“%d”,a);
if(a>30)printf(“%d”,a);
}
5.以下程序输出的结果是0。
#include
main()
{
inta=5,b=4,c=3,d;
d=(a>b>c);
printf(“%d\n”,d);
}
6.以下程序运行后的输出结果是20,0。
main()
{
intx=0,y=20,t=0;
if(x==y)t=x;x=y;y=t;
printf(“%d,%d\n”,x,y);
}
7.设a,b,c为整数,且a=2,b=3,c=4,且执行完语句a*=16+(b++)-(++c);后,a的值是28。
8.2020)&&(x<30))||(x<-100)。
9.若inti=10;,则执行下列程序后,变量i的正确结果是13。
switch(i)
{
case9:
i+=1;
case10:
i+=1;
case11:
i+=1;
default:
i+=1;
}
10.以下程序的输出结果是2。
#include
main()
{
intx=2,y=-1,z=2;
if(xif(y<0)z=0;
elsez+=1;
printf(“%d\n”,z);
}
11.若运行时输入12,则以下程序的运行结果是0。
#include
main()
{
intx,y;
scanf(“%d”,&x);
y=x>12?
x+10:
x-12;
printf(“%d\n”,y);
}
12.设x,y,z均为int型变量,请写出描述“x或y中至少有一个小于z”的表达式x13.已知A=7.5,B=2,C=3.6,表达式A>B&&C>A||A
C的值是0。
14.在C语言中,关系运算符的优先级别是<、>、<=、>=、==、!
=。
15.在C语言中,逻辑运算符的优先级别是!
、&&、||。
16.请写出以下程序的输出结果1。
#include
{
inta=100;
if(a>100)
printf(“%d\n”,a>100);
else
printf(“%d\n”,a<=100);
}
17.请写出以下表达式的等价的表达式x<=01。
!
(x>0)!
0
18.当a=1,b=2,c=3时,以下语句执行后,a、b、c中的值分别为3、2、2。
if(a>c)
b=a;a=c;c=b;
19.若变量已正确定义,以下语句段的输出结果是*#。
x=0;y=2;z=3;
switch(x)
{
case0:
switch(y==2)
{
case1:
print(“*”);break;
case2:
print(“%”);break;
}
case1:
switch(z)
{
case1:
print(“$”);
case2:
print(“*”);break;
defailt:
printf(“#”);
}
}