二级C语言110.docx
《二级C语言110.docx》由会员分享,可在线阅读,更多相关《二级C语言110.docx(16页珍藏版)》请在冰豆网上搜索。
![二级C语言110.docx](https://file1.bdocx.com/fileroot1/2022-11/27/ff8dee77-9770-4114-9546-94675e153944/ff8dee77-9770-4114-9546-94675e1539441.gif)
二级C语言110
二级C语言-110
(总分:
100.00,做题时间:
90分钟)
一、选择题(总题数:
41,分数:
100.00)
1.以下选项中,当x为大于1的奇数时,值为0的表达式是______。
(分数:
1.00)
A.x%2==0 √
B.x/2
C.x%2!
=0
D.x%2==1
解析:
[解析]算术运算符的优先级高于关系运算符的优先级,所以当x为大于1的奇数时,A选项的值为假,即0。
B选项的值为不定值,但绝对不是0。
C选项的值为真,即1。
D选项的值为真,即1。
2.以下叙述中正确的是______。
(分数:
2.00)
A.在C语言中,逻辑真值和假值分别对应1和0
B.关系运算符两边的运算对象可以是C语言中任意合法的表达式 √
C.对于浮点变量x和y,表达式:
x==y是非法的,会出编译错误
D.分支结构是根据算术表达式的结果来判断流程走向的
解析:
[解析]A选项中,在C语言中,逻辑真值对应非0;C选项中,表达式:
x==y是合法的;D选项中,分支结构的流程走向是根据表达式的值,并不仅仅是算数表达式的值。
因此B选项正确。
3.若变量已正确定义,以下选项中非法的表达式是______。
(分数:
2.00)
A.a!
=4||"b"
B."a"=1/2*(x=y=20,x*3) √
C."a"%4
D."A"+32
解析:
[解析]A选项中"a"即表示a为字符常量,再给"a"赋值1/2*(x=y=20,x*3),是不正确的。
因此B选项正确。
4.与数学表达式x≥y≥z对应的C语言表达式是______。
(分数:
2.50)
A.(x>=y)||(y>=x)
B.(x>=y>=z)
C.(x>=y)!
(y>=z)
D.(x>=y)&&(y>=z) √
解析:
[解析]本题考查关系表达式和逻辑表达式。
y大于等于x同时y小于等于z,因此x<=y和y<=z是逻辑与的关系。
因此D选项正确。
5.若a是数值类型,则逻辑表达式(a==1)||(a!
=1)的值是______。
(分数:
2.50)
A.1 √
B.0
C.2
D.不知道a的值,不能确定
解析:
[解析]逻辑或“||”要求只要两边的运算对象有一个非零,结果就为真,虽然不知道a的值,但是若a为1,则左边运算对象为1,若a的值不是1,则右边运算对象的值为1,所以总能保证一边非零,所以结果为真,即1。
6.当变量c的值不为2、4、6时,值也为“真”的表达式是______。
(分数:
2.50)
A.(c>=2&&c<=6)&&(c%2!
=1)
B.(c==2)||(c==4)||(c==6)
C.(c>=2&&c<=6)&&!
(c%2)
D.(c>=2&&c<=6)||(c!
=3)||(c!
=5) √
解析:
[解析]逻辑或运算符中只要有一个运算量为真结果就是真,当c>=2&&c<=6条件不成立时c的值肯定不是2、3、4、5、6,所以c!
=3,与c!
=5均成立。
所以D选项的结果一定为真。
7.有以下程序:
#include<stdio.h>
main()
{inta=1,b=2,c=3,d=0;
if(a==1&&b++==2)
if(b!
=2||c--!
=3)
printf("%d,%d,%d/n",a,b,c);
elseprintf("%d,%d,%d/n",a,b,c);
elseprintf("%d,%d,%d/n",a,b,c);
}
程序运行后的输出结果是______。
(分数:
2.50)
A.1,3,2
B.1,3,3 √
C.1,2,3
D.3,2,1
解析:
[解析]在if语句中,else总是和最近的if配对,所以进入第一个if语句中条件判断时,因为是逻辑与操作需要两边运箅对象的值均为非零值,才为真,所以需要逐个执行判断的结果为1,进入第二个if语句条件判断,因为b!
=2条件成立所以整个条件表达式的值为真,所以不再执行逻辑或的第二个运算对象(c--!
=3)c的值不变,也不再执行第一个else语句。
打印a的值1,b的值3,c的值3。
8.若有以下程序:
#include<stdio.h>
main()
{inta=1,b=2,c=3,d=4;
if((a=2)||(b=1))c=2;
if((c==3)&&(d=-1))a=5;
printf("%d,%d,%d,%d/n",a,b,c,d);
}
则程序的输出结果是______。
(分数:
2.50)
A.1,2,3,4
B.2,1,2,-1
C.5,1,2,-1
D.2,2,2,4 √
解析:
[解析]第一个if语句的判断条件是逻辑或表达式,所以只要有一个运算对象为真结果就为真,且如果前面的已经为兵,后面的表达式不再进行执行判断。
执行第一个if判断条件时a的值为2,整个表达式的值为真,b的值不变,c的值为2。
判断第二个if条件为逻辑与表达式,只有两个运算对象均非零,才为真,第一个表达式c==3,不成立,不再判断第二个运算对象,所以不执行d=-1操作和a=5操作。
所以结果为选项D。
9.若有以下程序:
#include<stdio.h>
main()
{inta=1,b=2,c=3,d=4;
if((a=2)&&(b=1))c=2;
if((c==3)||(d=-1))a=5;
printf("%d,%d,%d,%d/n",a,b,c,d);
}
则程序的输出结果是______。
(分数:
2.50)
A.2,2,2,4
B.2,1,2,-1
C.5,1,2,-1 √
D.1,2,3,4
解析:
[解析]第一个if语句的判断条件是逻辑与表达式,只有运算对象均非零结果才为真,执行第一个if判断条件,均为赋值表达式,第一个运算对象a=2非零,判断第二个表达式b=1也非零,所以条件成立执行c=2的赋值操作。
执行第二个if判断条件中的逻辑或表达式,只要有一个对象非零结果就是真,本条件中c==3运算对象为假,所以需要判断第二个运算对象d=-1,结果为非零,所以条件成立,执行a=5,的操作,所以a值为5,b值为1,c值为2,d值为-1。
10.以下关于逻辑运算符两侧运算对象的叙述中正确的是______。
(分数:
2.50)
A.可以是任意合法的表达式 √
B.只能是整数0或非0整数
C.可以是结构体类型的数据
D.只能是整数0或1
解析:
[解析]C语言的逻辑运算符比较特别,它的操作数没有明确的数据类型,可以是任意合法的表达式,所以选择A。
11.设有宏定义:
#defineIsDIV(k,n)((k%n==1)?
1:
0)
且变量m已正确定义并赋值,则宏调用:
IsDIV(m,5)&&IsDIV(m,7)
为真时所要表达的是______。
(分数:
2.50)
A.判断m是否能被5和7整除
B.判断m被5和7整除是否都余1 √
C.判断m被5或者7整除是否余1
D.判断m是否能被5或者7整除
解析:
[解析]本题考查逻辑运算符的相关概念。
逻辑与若要为真,那么两边都要为真,需要m能被5和7整除,且都余1,所以选项B正确。
12.表示关系式x≤y≤z的C语言表达式的是______。
(分数:
2.50)
A.(x<=y)&&(y<=x) √
B.(x<=y)||(y<=x)
C.(x<=y<=z)
D.x<=y)!
(y<=x)
解析:
[解析]本题考察关系表达式和逻辑表达式,y大于等于x同时y小于等于z,因此x<=y和y<=z是逻辑与的关系。
因此A选项正确。
13.if语句的基本形式是:
if(表达式)语句,以下关于“表达式”值的叙述中正确的是______。
(分数:
2.50)
A.必须是逻辑值
B.必须是整数值
C.必须是正数
D.可以是任意合法的数值 √
解析:
[解析]if语句中的表达式可以是任意合法的数值,如常量,变量表达式。
所以D选项正确。
14.有以下计算公式:
若程序前面已在命令行中包含math.h文件,不能够正确计算上述公式的程序段是______。
(分数:
2.50)
A.if(x>=0)y=sqrt(x);if(x<0)y=sqrt(-x);
B.if(x>=0)y=sqrt(x);elsey=sqrt(-x);
C.y=sqrt(x);if(x<0)y=sqrt(-x); √
D.y=sqrt(x>=0?
x:
-x);
解析:
[解析]公式的要求是无论x大于等于0还是小于0,y的值都为x绝对值的开方。
选项C中如果x值小于0,则y=sqrt(x)就要出错。
本题重点考察的知识点是:
sqrt()函数。
sqrt()函数的作用是开方计算,要求输入的参数x必须大于等于0。
选项C一开始调用了sqrt(x)而没有判断x的正负,所以是错误的。
15.下列条件语句中,输出结果与其他语句不同的是______。
(分数:
2.50)
A.if(a!
=0)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)printf("%d/n",x);elseprintf("%d/n",y);
解析:
[解析]A、B、D选项的含义均为a的值如果为0时打印y的值,否则打印x的值。
但是C选项的含义是:
a的值为0时打印x的值,不为0时打印y的值,与其他选项正好相反。
16.若有以下程序:
#include<stdio.h>
main()
{inta=1,b=2,c=3,d=4,r=0;
if(a!
=1);elser=1;
if(b==2)r+=2;
else;if(c!
=3)r+=3;
else;if(d==4)r+=4;
printf("%d/n",r);
}
则程序的输出结果是______。
(分数:
2.50)
A.10
B.7 √
C.6
D.3
解析:
[解析]else总是和与之最近的if配对,执行第一个if,判断条件不成立,执行elser=1;语句。
再执行第二个if语句中的判断条件,成立,左移执行r+=2,r的值为3,再执行第三个if的判断条件,不成立,执行第7行else后面的空语句“;”。
再执行第四个if的判断条件d==4成立,执行r+=4,r的值为7。
然后打印输出。
17.若有以下程序:
#include<stdio.h>
main()
{inta=1,b=2,c=3,d=4,r=0;
if(a!
=1);elser=1;
if(b==2)r+=2;
if(c!
=3);r+=3;
if(d==4)r+=4;
printf("%d/n",r);
}
则程序的输出结果是______。
(分数:
2.50)
A.3
B.7
C.6
D.10 √
解析:
[解析]第一个if语句a!
=1条件为假,所以执行elst后的语句r=1。
第二个if语句b==2条件成立,执行r+=2,r的值变为3,第三个if语句c!
=3条件为假,所以不做任何操作。
执行下面的r+=3操作,r的值变为6。
判断第四个if条件,d==4条件成立,执行r+=4操作,结果为10。
18.以下叙述中正确的是______。
(分数:
2.50)
A.对于逻辑表达式:
a++||b++,设a的值为1,则求解表达式的值后,b的值会发生改变
B.对于逻辑表达式:
a++&&b++,设a的值为0,则求解表达式的值后,b的值会发生改变
C.else不是一条独立的语句,它只是if语句的一部分 √
D.关系运算符的结果有三种:
0,1,-1
解析:
[解析]B选项和A选项中,&&、||都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式的值。
而且&&、||的优先级比++高,所以题中只需判断a的值即可知道符号表达式的真假;D选项中,关系运算符的结果有“真”和“假”两种。
因此C选项正确。
19.有以下程序:
#include<stdio.h>
main()
{intx=1,y=0,a=0,b=0;
switch(x)
{case1:
switch(y)
{ease0:
a++;break;
case1:
b++;break;
}
ease2:
a++:
b++:
break;
case3:
a++;b++;
printf("a=%d,b=%d/n",a,b);
}
程序的运行结果是______。
(分数:
2.50)
A.a=2,b=2
B.a=2,b=1 √
C.a=1,b=1
D.a=1,b=0
解析:
[解析]case常量表达式只是起语句标号作用,并不是在该处进行条件判断。
在执行switch语句时,根据switch的表达式,找到与之匹配的ease语句,就从此case子句执行下去,不在进行判断,直到碰到break或函数结束为止。
所以执行内层switch(y)时只执行了a++,此时a的值为1。
然后执行外层case2语句的a++;b++;a为2,b为1。
所以结果为B。
20.有以下程序段:
#include<stdio.h>
inti,n;
for(i=0;i<8;i++)
{n=rand()%5;
switch(n)
{case1:
case3:
printf("%d/n",n);break;
case2:
case4:
printf("%d/n",n);continue;
case0:
exit(0);
}
printf("%d/n",n);
}
以下关于程序段执行情况的叙述,正确的是______。
(分数:
2.50)
A.for循环语句固定执行8次
B.当产生的随机数n为4时结束循环操作
C.当产生的随机数n为1和2时不做任何操作
D.当产生的随机数n为0时结束程序运行 √
解析:
[解析]case常量表达式只是起语句标号作用,并不是在该处进行条件判断。
在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不再进行判断,直到碰到break或函数结束为止。
简单的说break是结束整个循环体,而continue是结束单次循环。
B选项中当产生的随机数n为4时要执行打印操作。
C选项中当产生的随机数为1和2时分别执行case3与case4后面语句的内容。
由于存在break语句所以for循环不是固定执行8次,执行次数与产生的随机数n有关系。
21.若有定义:
floatx=1.5;inta=1,b=3,c=2;则正确的switch语句是______。
(分数:
2.50)
A.switch(a+b){case1:
printf("*/n");case2+1:
printf("**/n");} √
B.switch((int)x);{case1:
printf("*/n");case2:
printf("**/n");}
C.switch(x){case1.0:
printf("*/n");case2.0:
printf("**/n");}
D.switch(a+b){case1:
printf("*/n");casec:
printf("**/n");}
解析:
[解析]B选项中switch((int)x);语句不应该有最后的分号。
switch(expr1),中的expr1不能用浮点类型或long类型,也不能为—个字符串,所以C错误。
case后面常量表达式的类型必须与switch后面表达式的类型一致,所以D错误。
22.有以下程序:
#include<stdio.h>
main()
{inta[]={2,3,5,4},i;
for(i=0;i<4;i++)
switch(i%2)
{case0:
switch(a[i]%2)
{case0:
a[i]++;break;
case1:
a[i]--;
}break;
case1:
a[i]=0;
}
for(i=0:
i<4;i++)printf("%d",a[i]);printf("/n");
}
程序运行后的输出结果是______。
(分数:
2.50)
A.0304
B.2050
C.3344
D.3040 √
解析:
[解析]第一次循环i为0,i%2为0,执行switch(a[0]%2)中的case0语句,a[0]++,a[0]的值变成3;第二次循环i的值为1,i%2为1,执行case1:
a[i]=0;所以a[1]的值变成0;第三次循环i的值为2,i%2为0,执行switch(a[2]%2)中的case1语句,a[2]--,a[2]的值变成4;第四次循环i的值为3,i%2为1,执行case1:
a[i]=0;所以a[3]的值变成0。
23.下列叙述中正确的是______。
(分数:
2.50)
A.在switch语句中,不一定使用break语句 √
B.在switch语句中必须使用default
C.break语句必须与switch语句中的case配对使用
D.break语句只能用于switch语句
解析:
[解析]default语句在switch语句中可以省略,所以B错误;switch语句中并非每个case后都需要使用break语句,所以C错误;break语句还可以用于for等循环结构中,所以D错误。
24.有以下程序:
#include<stdio.h>
main()
{inty=10;
while(y--);printf("y=%d/n",y);
}
程序执行后的输出结果是______。
(分数:
2.50)
A.y=0
B.y=-1 √
C.y=1
D.while构成无限循研
解析:
[解析]执行y--直到值为0,由于y--是先用再减,所以退出循环时,y的值为-1。
25.有以下程序:
#include<stdio.h>
main()
{intk=5;
while(--k)printf("%d",k-=3);
printf("/n");
}
执行后的输出结果是______。
(分数:
2.50)
A.1 √
B.2
C.4
D.死循环
解析:
[解析]--k先自减再使用,所以第一次判断条件即为while(4),条件为真,打印k的值,k=4-3,结果为1;第二次判断条件即为while(0),条件为假,结束循环,打印回车换行符。
所以选择A选项。
26.关于“while(条件表达式)循环体”,以下叙述正确的是______。
(分数:
2.50)
A.循环体的执行次数总是比条件表达式的执行次数多一次
B.条件表达式的执行次数总是比循环体的执行次数多一次 √
C.条件表达式的执行次数与循环体的执行次数一样
D.条件表达式的执行次数与循环体的执行次数无关
解析:
[解析]while循环是先判断条件,满足条件后执行循环体,执行完后接着判断条件,再执行,直到最后一次判断条件后不成立,跣出循环,所以最后一次执行了条件表达式,但是没有执行循环体,所以选择B选项。
27.有以下函数:
intfun(char*s)
{char*t=s;
while(*t++);
return(t-s);
}
该函数的功能是______。
(分数:
2.50)
A.计算s所指字符串的长度 √
B.比较两个字符串的大小
C.计算s所指字符串占用内存字节的个数
D.将s所指字符串复制到字符串t中
解析:
[解析]首先char*s接受一个字符型数组的首地址,并将这个首地址赋给另—个字符型指针char*t,while(*t++)不断循环直到*t为“/0”,再将t-1,这时字符指针t指向字符串的最后一个字符,又因为s指向字符数组的首地址,即字符串的首地址,所以return(t-s)便是返回字符数组中字符串的长度。
28.有以下程序:
#include<stdio.h>
main()
{inta=7;
while(a--);
printf("%d/n",a);
}
程序运行后的输出结果是______。
(分数:
2.50)
A.0
B.-1 √
C.1
D.7
解析:
[解析]a--的含义是先使用后减1,所以当a的值为0时,跳出循环,但是仍要执行a--,a的值变为-1。
29.有以下函数:
intaaa(char*s)
{char*t=s;
while(*t++);
t--;
return(t-s);
}
以下关于aaa函数功能叙述正确的是______。
(分数:
2.50)
A.将串s复制到串t
B.比较两个串的大小
C.求字符串s的长度 √
D.求字符串s所占字节数
解析:
[解析]本题重点考查的知识点while循环语句的应用。
aaa()函数中,首先定义了一个字符指针t指向形参s,然后通过一个while循环让指针t不断递增,直到t指向字符串结束标识处。
当t指向结束标识处时,由于后缀++运算符的原因,它还会被再递增1,所以接下来的t--;语句让它回到结束标识处。
最后返回t-s,s还是指向字符串第1个字符处,而t指向了字符串结尾,故返回值为字符串的长度值。
因此C选项正确。
30.在以下给出的表达式中,与while(E)中的(E)不等价的表达式是______。
(分数:
2.50)
A.(E>0||E<0)
B.(E==0) √
C.(!
E==0)
D.(E!
=0)
解析:
[解析]while语句中条件表达式E的值不为0即为真,认为满足条件,所以与B选项中表达式的含义正好相反,因此选择B选项。
31.有以下程序:
#include<stdio.h>
intfun(chars[])
{intn=0;
while(*s<="9"&&*s>="0"){n=10*n+*s-"0";s++;}
return(n);
}
main()
{chars[10]={"6","1","*","4","*","9","*","0","*"};
printf("%d/n",fun(s));
}
程序的运行结果是______。
(分数:
2.50)
A.5
B.9
C.61 √
D.61490
解析:
[解析]在fun函数中,while循环的功能是:
逐个取字符数组s中的字符,并判断其是否是数字。
若是则将其作为