C语言基础 四 选择结构程序设计.docx
《C语言基础 四 选择结构程序设计.docx》由会员分享,可在线阅读,更多相关《C语言基础 四 选择结构程序设计.docx(29页珍藏版)》请在冰豆网上搜索。
C语言基础四选择结构程序设计
四、选择结构程序设计
本章概述:
本章主要考查选择结构设计方法,其中包括关系运算符、逻辑运算符、条件运算符以及最常见的if条件判断语句。
选择结构程序属于3种基本的程序设计方法之一。
通过对历年试卷内容的分析,本章考核内容约占6%,属于一般考查内容。
年份
2007.4
2007.9
2008.4
2008.9
分值
7
2
6
7
大纲要求:
1.用if语句实现选择结构。
2.用switch语句实现多分支选择结构。
3.选择结构的嵌套。
重点难点:
1.逻辑运算符的短路原理
2.if语句的嵌套
3.switch语句的使用
考点分析:
关系运算符及其优先次序
关系运算是逻辑运算中比较简单的一种,“关系运算”就是“比较运算”。
将两个值进行比较,判断是否符合或满足给定的条件。
如果符合或满足给定的条件,则称关系运算的结果为“真”;如果不符合或不满足给定的条件,则称关系运算的结果为“假”。
C语言提供6种关系运算符:
【特别提醒】:
关系运算符是双目运算符,由两个字符组成的关系运算符之间不能有空格。
关于优先次序和结合性:
(1)前4种关系运算符的优先级别相同,后两种也相同。
前4种高于后两种。
(2)关系运算符的优先级低于算术运算符,高于赋值运算符。
(3)结合性是自左向右。
●试题解析
1.已有定义:
charc;,程序前面已在命令行中包含ctype.h文件,不能用于判断c中的字符是否为大写字母的表达式是()[2007年9月第23题]
A.isupper(c) B.’A’<=c<=’Z’
C.’A’<=c&&c<=’Z’ D.c<=(‘2’-32)&&(‘a’-32)<=c
解析:
答案A是利用库函数,C和D分别用关系运算符来判断是否是大小写,B不能判
断,应为’A’<=c的结果只能是0或1,永远小于’Z’,答案永远为真,不能判断是否为大小写。
答案为B。
关系表达式
用关系运算符将两个表达式(算术、关系、逻辑、赋值表达式等)连接起来所构成的表达式,称为关系表达式。
关系表达式的值是一个逻辑值,即“真”或“假”。
C语言没有逻辑型数据,以1代表“真”,以0代表“假”。
【特别提醒】:
当关系运算符的两边的类型不一致时,系统自动会进行类型转换。
●试题解析
1.已知字母A的ASCⅡ代码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是()[2008年4月第17题]
A.kk>='A'&&kk<='Z'B.!
(kk>='A'‖kk<='Z')
C.(kk+32)>='a'&&(kk+32)<='z'D.isalpha(kk)&&(kk<91)
解析:
答案A和C都是利用关系运算符来判断是否是大小写,B中如果满足了kk>='A'就不会判断后面的kk<='Z'(短路),所以不能判断,D利用函数。
答案为B。
逻辑运算符及其优先
级
C语言提供三种逻辑运算符:
(1)&&逻辑与(相当日常生活中:
而且,并且,只在两条件同时成立时为“真”)
(2)||逻辑或(相当日常生活中:
或,两个条件只要有一个成立时即为“真”)
(3)!
逻辑非(条件为真,运算后为假,条件为假,运算后为真)
a
b
a&&b
a||b
真
真
真
真
真
假
假
真
假
真
假
真
假
假
假
假
a
!
a
真
假
假
真
【特别提醒】:
“&&”,“||”是双目运算符,“!
”是单目运算符。
关于优先次序和结合性:
(1)!
(非)-&&(与)-||(或),“!
”为三者中最高。
(2)逻辑运算符中的&&和||低于关系运算符,!
高于算术运算符。
(3)结合性是自左向右。
●试题解析
1.当变量c的值不为2、4、6时,值也为“真”的表达式是()[2008年4月第18题]
A.(c==2)‖(c==4)‖(c==6)B.(c>=2&&c<=6)‖(c!
=3)‖(c!
=5)
C.(c>=2&&c<=6)&&!
(c%2)D.(c>=2&&c<=6)&&(c%2!
=1)
解析:
逻辑与&&所有的表达式都为真,才为真。
,逻辑或||只要有一个为真值即为真。
答案为B。
逻辑表达式
用逻辑运算符(逻辑与、逻辑或、逻辑非)将关系表达式或逻辑量连接起来构成逻辑表达式。
逻辑表达式的值是一个逻辑值“真”或“假”。
逻辑运算结果,以1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”(即认为一个非0的数值是“真”)。
【特别提醒】:
在数学中关系式
是可以使用的,但是在C语言中不可以用,必须用
&&
。
由&&和||组成的逻辑表达式,在某种情况下可以发生“短路现象”:
(1)
,只有当x为真时,才需要判别y的值,只有x和y都为真时,才要判别z的值;只要x为假,y和z不必判别,整个表达式的值就为0。
(2)
,只要x的值为真,就不必判别y和z的值,整个表达式的值为1,只有x的值为假,才需要判别y的值,只有x和y的值同时为假,才需要判别z的值。
●试题解析
1.已有定义:
charc=’‘;inta=1,b;(此处c的初值为空格字符),执行b=!
c&&a;后b的值为。
[2008年4月填空第6题]
解析:
空格的ASCII码值为32,!
c为假,故整个表达式的值为0.答案为0。
2.执行以下程序段后,w的值为()[2008年9月第18题]
intw=’A’,x=14,y=15;
w=((x||y)&&(w<’a’));
A.-1B.NULLC.1D.0
解析:
(x||y)的值为真,’A’<’a’为真,答案为真,答案为C。
3.已定义charch=”$”;inti=1,j;执行j=!
ch&&i++以后,i的值为。
1[2007年4月填空第11题]
解析:
此题考的是逻辑运算符的短路原理。
由于!
ch已经是假,故第二个表达式没有判别到,故没有执行,i没有自增,故答案为1。
if语句的几种形式
if语句用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
if语句三种形式:
1、if(表达式)语句。
例如:
if(x>y)printf(“%d”,x);
2、if(表达式)语句1else语句2。
例如:
if(x>y)printf(“%d”,x);elseprintf(“%d”,y);
3、if(表达式1)语句1
elseif(表达式2)语句2
elseif(表达式3)语句3
…
elseif(表达式m)语句m
else语句m+1
(实际是else子句中嵌套if语句)。
【特别提醒】:
(1)三种形式的if语句中的“表达式”一般为关系表达式或逻辑表达式,但不限于这两种表达式。
C语言中需要逻辑值的地方,只有0代表“假”,非0(其它)均代表“真”。
(2)else子句不能单独使用,必须是if语句的一部分,与if配对使用。
(3)在if和else后面可以只含一个内嵌的操作语句,也可以有多个操作语句构成的语句块(复合语句)。
语句块用{}括起来,语句块后面不要“;”号。
●试题解析
1.设变量x和y均已正确定义并赋值,以下if语句中,在编译时将产生错误信息的是()[2007年4月第20题]
A.if(x++); B.if(x>y&&y!
=0);
C.if(x>y)x-- D.if(y<0){;}
elsey++; elsex++;
解析:
在if和else后面可以只含一个语句,但是语句必须有分号作为结束标志。
答案选C。
2.若变量已正确定义,有以下程序段
inta=3,b=5,c=7;
if(a>b)a=b;c=a;
if(c!
=a)c=b;
printf("%d,%d,%d\n",a,b,c);
其输出结果是()。
[2008年4月第19题]
A.程序段有语法错B.3,5,3C.3,5,5D.3,5,7
解析:
在if和else后面可以只含一个内嵌的操作语句,如果有多个操作语句,则必须用用{}括起来构成复合语句。
题目中没有用{},所以只有a=b;是a>b真是执行的;c=a;a>b是真还是假都要执行。
答案为B。
3.有以下程序段
inta,b,c;
a=10;b=50;c=30;
if(a>b)a=b;b=c;c=a;
printf(“a=%db=%dc=%d\n”,a,b,c);
程序输出结果是()[2008年9月第20题]
A.a=10b=50c=10B.a=10b=50c=30
C.a=10b=30c=10D.a=50b=30c=50
解析:
同上。
答案选C。
if语句的嵌套
if语句的嵌套:
if语句的if块或else块中,由包含一个if语句。
一般形式:
if(…)
if(…)语句1;
else语句2;
else
if(…)语句3;
else语句4;
【特别提醒】:
应当注意if与else的配对关系。
else总是与它上面的最近的未配对的if配对。
特别是if/else子句数目不一样时(if子句数量只会大于或等于else子句数量)。
可以用下面两种方法解决匹配问题:
(1)利用“空语句”,使if子句数量与else子句数量相同。
(2)利用{}确定配对关系。
将没有else子句的if语句用{}括起来。
●试题解析
1.有以下程序
#include
main()
{intx=1,y=2,z=3;
if(x>y)
if(yelseprintf(“%d”,++y);
printf(“%d”,x++);
}
程序结果是()[2008年9月28题]
A.331B.41C.2D.1
条件运算符构成的选择结构
在if语句中,在表达式为“真”和“假”时,都只执行一个赋值语句给同一个变量赋值时,可以使用简单的条件运算符来处理。
例如:
if(a>b)max=a;
elsemax=b;
可以使用条件运算符来处理:
max=a>b?
a:
b;(注:
a>b关系运算有没有()都一样)。
它这样执行,a>b为“真”吗?
如果为“真”,条件表达式为a,否则为b。
条件表达式的一般形式:
表达式1?
表达式2:
表达式3
【特别提醒】:
(1)条件运算符的执行顺序:
先求解表达式1,若为非0(真)则求解表达式2,表达式2的值就是整个条件表达式的值。
若表达式1的值为0(假),则求解表达式3,此时表达式3的值就是整个条件表达式的值。
(2)条件运算符的优先级高于赋值运算符,低于关系运算符和算术运算符。
(3)条件运算符的结合性“自右向左”。
(4)表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式,函数表达式。
(5)表达式1,表达式2,表达式3的类型都可以不同。
条件表达式值的类型是表达式2,表达式3中类型较高的类型。
●试题解析
1.有以下计算公式
若程序前面已在命令行中包含math.h文件,不能够正确计算上述公式的程序段是()。
[2007年9月第20题]
A.if(x>=0)y=sqrt(x); B.y=sqrt(x)
elsey=sqrt(-x); if(x<0)y=sqrt(-x);
C.if(x>=0)y=sqrt(x); D.y=sqrt(x>=0?
x:
-x);
if(x<0)y=sqrt(-x);
解析:
A和C比较简单是正确的,D使用的条件表达式也是正确的,B当x<0时,先计算再判断是错误的。
答案为B。
switch语句
多分支可以使用嵌套的if语句处理,但如果分支较多,嵌套的if语句层数多,程序冗长,降低可读性。
C语言中switch语句是多分支选择语句。
其一般形式:
switch(表达式)
{
case常量表达式1:
语句1
case常量表达式2:
语句2
………
case常量表达式n:
语句n
[default:
语句n+1]
}
switch语句case中语句的终止可以使用break.
说明:
(1)switch括号后面的表达式,允许为任何类型。
(2)当“表达式”的值与某个case后面的常量表达式的值相等时,就执行此case后面的语句。
如果表达式的值与所有常量表达式都不匹配,就执行default后面的语句(如果没有default就执行跳出switch,执行switch语句后面的语句)。
(3)各个常量表达式的值必须互不相同,否则出现矛盾。
(4)各个case,default出现的顺序不影响执行结果。
(5)执行完一个case后面的语句后,流程控制转移到下一个case中的语句继续执行。
此时,“case常量表达式”只是起到语句标号的作用,并不在此处进行条件判断。
在执行一个分支后,可以使用break语句使流程跳出switch结构,即终止switch语句的执行(最后一个分支可以不用break语句)。
(6)case后面如果有多条语句,不必用{}括起来。
(7)多个case可以共用一组执行语句。
(注意break使用的位置)
【特别提醒】:
常量表达式一般为整型常量或字符型常量(字符型常量别忘记用单引号括起来);如果没有break,则执行完一个case后面的语句后,流程控制转移到下一个case中的语句继续执行。
●试题解析
1.有以下程序
main()
{intk=5,n=0;
do
{switch(k)
{case1:
case3:
n+=1;break;
default;n=0;k--;
case2:
case4:
n+=2;k--;break;
}
printf(“%d”,n);
}while(k>0&&n<5);
}
程序运行后的输出结果是()[2007年4月第23题]
A.235B.0235C.02356D.2356
解析:
第一次循环,k为5,执行default;n=0;k--;n=0,k=4;后面没有break故继续执行n+=2;k--;break;,n=2,k=3,排除B和C;第二次循环k为3,执行n+=1;break;n=3,后面有break,故输出3;第三次循环k还是为3,n变成4,第三次循环k还是3,n变成5,此时循环条件结束。
答案选A。
2.以下程序的运行结果是。
[2007年4月填空第9题]
main()
{inta=2,b=7,c=5;
switch(a>0)
{case1:
switch(b<0)
{case1:
switch(“@”);break;
case2:
printf(“!
”);break;
}
case0:
switch(c==5)
{case0:
printf(“*”);break;
case1:
printf(“#”);break;
case2:
printf(“$”);break;
}
default:
printf(“&”);
}
printf(“\n”);
}
解析:
a>0为真,值取1,b<0值为0,由于case1后没有break,转而执行下面的语句,
c==5为1,首先输出#,case0后面没有break,转而执行default输出&。
结果为#&。
3.有以下程序
#include
main()
{intx=1,y=0,a=0,b=0;
switch(x)
{case1:
switch(y)
{case0:
a++;break;
case1:
b++;break;
}
case2:
a++;b++;break;
case3:
a++;b++;
}
printf(“a=%d,b=%d\n”,a,b);
}
程序的运行结果是()[2008年4月第20题]
A.a=1,b=0B.a=2,b=2C.a=1,b=1D.a=2,b=1
解析:
如果case语句后面没有break是执行下一个语句,如果有break就跳出switch
语句。
答案为D。
相关习题
一、选择题
1.当把以下四个表达式用作if语句的控制表达式时,有一个选项与其它三个选项含义不同,这个选项是
A.k%2 B.k%2==1 C.(k%2)!
=0 D.!
k%2==1
2.设有定义:
int k=1,m=2; float f=7;,则以下选项中错误的表达式是
A.k=k>=k B.-k++ C.k%int(f) D.k>=f>=m
3.设有定义:
int a=2,b=3,c=4;,则以下选项中值为0的表达式是
A.(!
a==1)&&(!
b==0) B.(a
c||1
C.a&&b D.a||(b+b)&&(c-a)
4.有以下程序
main()
{
int a,b,d=25;
a=d/10%9;
b=a&&(-1);
printf("%d,%d\n",a,b);
}
程序运行后的输出结果是
A.6,1 B.2,1 C.6,0 D.2,0
5.有以下程序
main()
{ int i=1,j=2,k=3;
if(i++==1&&(++j==3||k++==3))
printf("%d %d %d\n",i,j,k);
}
程序运行后的输出结果是
A.1 2 3 B.2 3 4 C.2 2 3 D.2 3 3
6.若x和y代表整型数,以下表达式中不能正确表示数学关系|x-y|<10的是
A.abs(x-y)<10 B.x-y>-10&&x-y<10
C.@(x-y)<-10||!
(y-x)>10 D.(x-y)*(x-y)<100
7.有以下程序
main()
{
inta=3,b=4,c=5,d=2;
if(a>b)
if(b>c)
printf("%d",d+++1);
else
printf("%d",++d+1);
printf("%d\n",d);
}
程序运行后的输出结果是
A.2 B.3 C.43 D.44
8.下列条件语句中,功能与其他语句不同的是
A.if(a)printf("%d\n",x);elseprintf("%d\n",y);
B.if(a==0)printf("%d\n",y);elseprintf("%d\n",x);
C.if(a!
=0)printf("%d\n",x);elseprintf("%d\n",y);
D.if(a==0)printf("%d\n",x);elseprintf("%d\n",y);
9.以下4个选项中,不能看作一条语句的是
A.{;} B.a=0,b=0,c=0; C.if(a>0); D.if(b==0)m=1;n=2;
10.以下程序段中与语句k=a>b?
(b>c?
1:
0):
0;功能等价的是
A.if((a>B)&&(b>C))k=1; B.if((a>B)||(b>C)) k=1
else k=0;
C.if(a<=B) k=0; D.if(a>B) k=1;
elseif(b<=C) k=1; elseif(b>C) k=1;
elsek=0;
11.有以下程序
main()
{int a=1,b=2,m=0,n=0,k;
k=(n=b>a)||(m=a
printf("%d,%d\n",k,m);
}
程序运行后的输出结果是
A.0,0 B.0,1 C.1,0 D.1,1
12.有定义语句:
int a=1,b=2,c=3,x; 则以下选项中各程序段执行后,x的值不为3的是
A.if(c elseif(b elsex=3; elsex=1;
C.if(a<3)x=3; D.if (a
if(a<2)x=2; if (b if(a<1)x=1; if (c13.有以下程序
main()
{ int i=1,j=1,k=2;
if((j++‖k++)&&i++)printf("%d,%d,%d\n",i,j,k);
}
执行后输出结果是
A.1,1,2 B.2,2,1 C.2,2,2 D.2,2,3
14.有以下程序
main()
{ int a=5,b=4,c=3,d=2;
if(a>b>c)
printf("%d\n",d);
elseif((c-1>=d)==1)
printf("%d\n",d+1);
else
printf("%d\n",d+2)
}
执行后输出结果是
A.2 B.3 C.4 D.编译时有错,无结果
15.已有定义:
intx=3,y=4,z=5;,则表达式!
(x+y)+z-1&&y+z/2的值是
A.6 B.0 C.2 D.1
16.有一函数, ,以下程序段中不能根据x值正确计算出y值的是
A.if(x>0)y=1; B.y=0;
elseif(x==0)y=0; if(x>0)y=1;
elsey=-1; elseif(x<0)y=-1;
C.y=0; D.if(x>=0)
if(x>=0); if(x>0)y=1;
if(x>0)y=1 ; elsey=0;
elsey=-1; elsey=-1;
17.有以下程序
ma