二级C语言-268 (1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二级C语言-268
(总分:105.00,做题时间:90分钟)
一、选择题(总题数:46,分数:105.00)
1.以下不能将s所指字符串正确复制到t所指存储空间的是______。
(分数:2.00)
A.do{*t+ +=*s+ +;}while(*s); √
B.for(i=0;t[i]=s[i];i+ +);
C.while( *t = * s){t+ +;s+ +}
D.for(i=0,j=0;t[i+ +]=s[j+ +]; );
解析:[解析] do{*t++=*s++;}while(*s);不能因为当*s="/0"时,while(*s)跳出循环,这样字符串结束标志“/0”没有复制给*t,造成*t不完整。
注意:*t++=*s++是先执行t=*s,然后才进行t=t+1,s=s+1。
B、C和D都能将“/0”复制过去。
2.设有定义:
int k=0;
以下选项的4个表达式中与其他3个表达式的值不相同的是______。
(分数:2.00)
A.+ +k
B.k+ =1
C.k+ + √
D.k+1
解析:[解析] ++k是先使k的值自增1后再使用;k++是先取得k的值,再将k的值自增1,所以C选项中表达式的值为0,而其他三个表达式的值均为1,所以选择C。
3.若有定义语句:
int year=2009, *p=&year;
以下不能使变量year中的值增至2010的语句是______。
(分数:2.00)
A.(*p)+ +;
B.*p+ +; √
C.+ +(*p);
D.*p+ =1;
解析:[解析] 由于自加运算符++的运算级别高于间接运算*的运算级别,所以B选项的表达式*p++不能使变量year中的值增至2010。
因此B选项正确。
4.若有以下程序:
#include <stdio.h>
int f(int m)
{ static int n=0;
int a=2;
n+ +; a+ +; return n+m+a;
}
main( )
{ int k;
for.(k=0; k<4; k+ +) printf("%d,", f(k));
}
则程序的输出结果是______。
(分数:2.00)
A.3,5,7,9,
B.4,7,10,13,
C.4,5,6,7,
D.4,6,8,10, √
解析:[解析] 本题考查静态局部变量以及自增运算符,静态局部变量在函数凋用结束后,并不释放,仍然保留它的值,本题中,k为0时,return n+m+a之前,n为1,a为局部变量,值为3,m为0,所以第一个返回值为4。
k为1,在函数返回值之前,静态局部变量为2,局部变量a仍然为3,m为1,所以结果是6,依此类推答案为D。
5.有以下程序:
#include <stdio.h>
int fun(int a, intB)
{ return a+b; }
main( )
{ int x=6, y=7, z=8, r;
r = fun (fun(x,y), z- -);
printf("%d/n", r);
}
程序运行后的输出结果是______。
(分数:2.00)
A.21 √
B.15
C.20
D.31
解析:[解析] 函数fun的功能是返回两个形参的和。
调用函数fun(x,y)时,将变量x=6和y=7的值分别传送变量a和b,并且通过语句return a+b;将13返回给主函数。
继续调用函数fun(13,z--),这里z--指将z的值参与运算后,再将z的值减1操作;将13和8分别传送变量a和b,且通过语句retuln a+b;将21返回给主函数。
因此A选项正确。
6.若有定义:double a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是______。
(分数:2.00)
A.i=(a+k)<=(i+k);
B.i=a%11; √
C.a=a+ +,i+ +
D.i=! a;
解析:[解析] 取模运算符“%”,是二元运算符,具有左结合性,参与运算的量均为整型。
选项B中的a 变量是double实型,所以B不符合规定。
7.若变量x、y已正确定义并赋值,以下符合C语言语法的表达式是______。
(分数:2.00)
A.x+1=y
B.++x,y=x-- √
C.x=x+10=x+y
D.double(x)/10
解析:[解析] A选项中不能将变量y赋给表达式,C选项中的错误与A选项一样,D选项中强制类型转换表达式应写成(double)x/10。
8.若变量均已正确定义并赋值,以下合法的C语言赋值语句是______。
(分数:2.00)
A.x=y= =5; √
B.x=n%2.5;
C.x+n=i;
D.x=5=4+1;
解析:[解析] B选项中运算符“%”的前后必须为整数,C选项中不能将变量赋给表达式x+n,D选项中不能将表达式4+1赋给常量5。
9.以下选项中正确的定义语句是______。
(分数:2.00)
A.double, a, b;
B.double a=b=7;
C.double a; b;
D.double a=7,b=7; √
解析:[解析] A选项中变量类型符double后面不能有逗号。
B选项中变量b不能先使用再定义,应该写成选项D中的格式。
C选项中变量a后面应该是逗号而不是分号。
10.若有定义语句:
int a=3,b=2,c=1;
以下选项中错误的赋值表达式是______。
(分数:2.00)
A.a=(b=4)=3; √
B.a=b=c+1;
C.a=(b=4)+c;
D.a=1+(b=c=4);
解析:[解析] 不能将变量或常量赋给一个表达式,所以A选项中(b=4)=3是错误的。
11.表达式a+ =a - = a=9的值是______。
(分数:2.00)
A.18
B.-9
C.0 √
D.9
解析:[解析] 首先计算a=9,然后计算a-=9,即a=a-9,结果为0,然后计算a+=0,即a=a+0,所以最终结果为0。
12.有以下程序:
#inelude <stdio.h>
main( )
{ int a=3;
printf("%d/n",(a+ =a- =a*a));
}
程序运行后的输出结果是______。
(分数:2.00)
A.3
B.9
C.0
D.-12 √
解析:[解析] 本题考查目的是运算符的结合性和优先级,首先计算a*a,结果为9,然后执行a=a-9,即3-9,结果为-6,然后执行a=(-6)+(-6),即a=的值为-12。
所以选择D。
13.有以下程序:
#include <stdio.h>
main( )
{ int a=1,b=0;
printf("%d,",b=a+b);
printf("%d/n",a=2*b);
(分数:2.00)
A.1,2 √
B.1,0
C.3,2
D.0,0
解析:[解析] 首先打印b=a+b=1+0=1的值1,此时已给b赋值为1。
然后打印a=2*b=2*1=2的值2。
所以结果是1,2。
14.以下叙述中正确的是______。
(分数:2.00)
A.a是实型变量,a=10在C语言中是允许的,因此可以说:实型变量中可以存放整型数
B.在赋值表达式中,赋值号的右边可以是变量,也可以是任意表达式√
C.若有int a=4,b=9;执行了a=b后,a的值已由原值改变为b的值,b的值变为0
D.若有int a=4,b=9;执行了a=b;b=a;之后,a的值为9,b的值为4
解析:[解析] A选项中a是实型变量,a=10在C语言中是允许的,但是实型变量中不可以存放整型数。
C 选项中执行a=b后,a的值变为b的值,为9,b的值不变,仍为9。
D选项中执行a=b后,a的值为9,b 的值为9,执行b=a后,a的值为9,b的值也为9,所以选择B。
15.以下叙述中正确的是______。
(分数:2.00)
A.由printf输出的数据都隐含左对齐
B.scanf和printf是C语言提供的输入和输出语句
C.赋值语句是一种执行语句,必须放在函数的可执行部分√
D.由printf输出的数据的实际精度是由格式控制中的域宽和小数的域宽来完全决定的
解析:[解析] scanf和printf是C语言提供的输入输出函数,所以B错误。
由printf输出的数据都隐含右对齐,所以A错误。
printf输出数据所占的宽度由系统决定,所以D错误。
16.若有以下程序:
#include <stdio.h>
main( )
{ int b=10, a=-11;
a%=b%=4;
printf("%d%d/n", a, b);
}
则程序的输出结果是______。
(分数:2.00)
A.1 2
B.-1 2 √
C.-1 -2
D.1 -2
解析:[解析] 先计算b%=4,即b=b%4,结果为2,然后计算a%=2,结果为-1,最后a的值为-1,b的值为2,所以选择B选项。
17.若有以下程序:
#include <stdio3.h>
main( )
{ int a=-11, b=10;
a/=b/=-4;
printf("%d%d/n", a, b);
}
则程序的输出结果是______。
(分数:2.00)
A.4 -3
B.-1 -2
C.5 -2 √
D.5 -3
解析:[解析] 先执行b/=-4,即b=h/-4,结果为-2,然后执行a/=-2,即a=a/-2,结果为5。
所以选择C。
18.有以下程序:
# include <stdio.h>
main( )
{ unsigned char a=8, c;
c=a>>3;
printf("%d/n", c);
}
程序运行后的输出结果是______。
(分数:2.00)
A.16
B.1 √
C.32
D.0
解析:[解析] 无符号整型变量a的值为8,二进制表示为00001000,右移3位后为00000001,即十进制的1,所以输出1。
19.有以下程序:
# include <stdio.h>
main( )
{unsigned char a=2, b=4, c=5, d;
d=a | b; d&=c; printf("%d/n", d); }
程序运行后的输出结果是______。
(分数:2.00)
A.3
B.4 √
C.5
D.6
解析:[解析] &代表按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
|代表按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。
2的二进制为00000010,4的二进制为00000100,所以做或运算结果为00000110,该数与5即00000101做与操作结果为00000100,即4。
20.设有以下语句:
int a=1,b=2, c;
c=a^(b<<2);
执行后,c的值为______。
(分数:2.00)
A.7
B.9 √
C.8
D.6
解析:[解析] b为2,二进制为00000010,执行左移两位操作后为00001000,然后与a 00000001做异或操作结果为00001001,即十进制的9。
21.若有以下程序段:
int r=8;
printf("%d/n",r>>1);
则输出结果是______。
A.16 B.8 C.4 D12
(分数:2.00)
A.
B.
C. √
D.
解析:[解析] 本题考查位运算,属于基础知识。
题目中将整型变量8二进制表达为00001000,右移一位为00000100,即4,故选项C正确。
22.有以下程序:
#include <stdio.h>
main( )
{
int a=1, b=2, c=3, x;
x=(a^b)&c;
printf("%d/n",x);
}
程序的运行结果是______。
(分数:2.00)
A.3 √
B.1
C.2
D.0
解析:[解析] 本题考查位运算符以及相关运算。
^按位异或,&为按位与,那么a^b为3,再与c按位与仍然为3,所以答案为A选项。
23.有以下程序:
#include <stdio.h>
main( )
{ int a=2, b;
b=a<<2;
printf("%d/n", b);
}
程序运行后的输出结果是______。
(分数:2.00)
A.2
B.4
C.6
D.8 √
解析:[解析] 本题考查位运算符。
题目中将a向左移两位,左移两位表示乘以4,所以答案为8,选项D 正确。
24.有以下程序:
#include <stdio.h>
main( )
{
char a=4;
printf("%d/n",a=a<<1);
}
程序的运行结果是______。
(分数:2.00)
A.16
B.8 √
C.40
D.4
解析:[解析] 本题考查位运算。
题目中将4向左移一位然后重新赋值给a,4左移一位为8,程序运行结果为8,选项B正确。
25.有以下程序:
#include <stdio.h>
main( )
{
int a=5, b=1, t;
t=(a<<2)|b;
printf("%d/n",t);
}
程序运行后的输出结果是______。
(分数:2.00)
A.1
B.11
C.6
D.21 √
解析:[解析] 本题考查位运算以及按位或操作。
将a左移二位相当于是将a乘以了4,所以a<<2等于20,二进制表示为00010100,与b按位或得到00010101,即21,所以选项D正确。
26.若变量已正确定义,则以下语句的输出结果是______。
s=32;
s^=32;
printf("%d",s);
(分数:2.00)
A.-1
B.0 √
C.1
D.32
解析:[解析] 本题考查逻辑异或运算。
异或运算只有在两个比较的位不同时其结果是1,否则结果为0,题目中两个值相同,所以结果为0。
27.若有以下程序:
#include <stdio.h>
main( )
{int c;
c=10^5;
printf("%d/n", c);
}
则程序的输出结果是______。
(分数:2.00)
A.5
B.15 √
C.10000
D.105
解析:[解析] 本题考查位运算中的按位异或运算符。
异或运算只有在两个比较的位不同时其结果是1,否则结果为0,10用二进制表示为00001010,5用二进制表示为00000101,异或运算后结果为00001111,即15,选项B正确。
28.若有以下程序:
#nclude <stdio.h>
main( )
{ int c;
c=13|15;
printf("%d/n",c);
则程序的输出结果是______。
(分数:2.00)
A.13 √
B.15
C.18
D.5
解析:[解析] 本题考查位运算中的按位或运算符。
或运算只要两个比较的位中有一个为1,其结果是1,否则结果为0,13用二进制表示为00001101,5用二进制表示为00000101,或运算后结果为00001101,即13,选项A正确。
29.有以下程序:
#include <stdio.h>
main( )
{int i=0;
i= ~ i;
printf("%d/n",i);
}
程序运行后的输出结果是______。
(分数:2.00)
A.8
B.0
C.1
D.-1 √
解析:[解析] 本题考查按位取反运算。
0按位取反就是-1,所以选项D正确。
30.有以下程序:
#include <stdio.h>
main( )
{int i=1;
i = i^i;
printf("%d/n",i);
}
程序运行后的输出结果是______。
(分数:2.00)
A.1
B.-1
C.0 √
D.7
解析:[解析] 本题考查按位异或运算。
异或运算只有在两个比较的位不同时其结果是1,否则结果为0,i^i运算符两边相同,所以结果为0,选项C正确。
31.下面选项中关于位运算的叙述正确的是______。
(分数:2.00)
A.位运算的对象只能是整型或字符型数据√
B.位运算符都需要两个操作数
C.左移运算的结果总是原操作数的2倍
D.右移运算时,高位总是补0
解析:[解析] 本题考查位运算。
按位取反只需要一个操作数,所以B选项错误,左移一位是原操作数的2倍,其他情况不是,比如左移两位就是原操作数的4倍,所以C选项错误,右移运算时,高位在某些情况下不是补0。
32.若变量已正确定义并赋值,以下不能构成C语句的选项是______。
(分数:2.00)
A.B+ +;
B.A=a+b;
C.a=a+b √
D.A?a:b;
解析:[解析] C语言中规定,C语句必须以分号“;”结束。
C选项中没有结束符号,所以错误。
33.以下叙述中正确的是______。
(分数:2.00)
A.复合语句在语法上包含多条语句,其中不能定义局部变量
B.花括号对{}只能用来表示函数的开头和结尾,不能用于其他目的
C.空语句就是指程序中的空行
D.当用scanf从键盘输入数据时,每行数据在没按下回车键(Enter键)前,可以任意修改√
解析:[解析] 复合语句可以包含多条语句,在其中可以定义局部变量,所以A错误。
花括号对{}不仅用来表示函数的开头和结尾,也可以用于表示复合语句,所以B错误。
C语言只有分号“;”组成的语句称为空语句,空语句是什么也不执行的语句,显然空语句不是空行。
所以C错误。
34.有以下程序:
#include <stdio.h>
main( )
{
char c1, c2, c3, c4, c5, c6;
scanf("%c%c%c%c", &c1, &c2, &c3, &c4);
c5=getchar();
c6=getchar();
putchar(c1);
putchar(c2);
printf("%c%c/n",c5,c6);
}
程序运行后,若从键盘输入(从第1列开始)
123<回车>
45678<回车>
则输出结果是______。
(分数:2.00)
A.1245 √
B.1256
C.1278
D.1267
解析:[解析] scanf按照格式字符进行输入,所以123与回车的值分别送入了c1、c2、c3、c4变量的存储空间。
getchar()函数的功能是从键盘输入的字符串中读入一个字符,所以4送入了变量c5的存储空间,5送人了变量c6的存储空间。
所以打印时结果为1245。
35.若有以下程序:
#include <stdio.h>
char f(char x)
{return x*x+"a"; }
main( )
{ char a, b=0;
for(a=0; a<4; a+ =1)
{b=f(a); putchar(b); }
}
则程序的输出结果是______。
(分数:2.00)
A.abcd
B.ABEJ
C.abcj √
D.ABCD
解析:[解析] 该题目首先初始化变量a和b,通过for循环语句使a取值为0、1、2、3,f函数的功能是将a*a++"a"的值返回给b,即b为a、b、e、j。
最后通过字符输出函数putchar()将b输出。
因此C选项正确。
36.若有以下程序:
#include <stdio.h>
char f(char x)
{ return x*x%10+ "0"; }
main( )
{ char a; int b=0;
for(a=0; a<5; a+ =1)
{b=f(a); putchar(b); }
}
则程序的输出结果是______。
(分数:2.00)
A.014916
B.01234
C.01496 √
D.00000
解析:[解析] 该题目中x*x%10表示x和x相乘后,结果再对10求余操作。
主函数中通过for语句使变量a从0到4进行取值;当a=0时,调用函数f后,返回值为0赋给b,并且进行字符输出;当a=1时,返回值为1赋给b,并且进行字符输出;当a=2时,返回值为4赋给b,并且进行字符输出;当a=3时,返回值为9赋给b,并且进行字符输出;当a=4时,返回值为6赋给b,并且进行字符输出。
因此C选项正确。
37.有以下程序:
#include <stdio.h>
main( )
{ char a,b,c,d;
scanf("%c%c",&a, &b);
c=getchar(); d=getchar();
printf("%c%c%c%c/n",a,b,c,d);
}
当执行程序时,按下列方式输入数据(从第1列开始,<CR>代表回车,注意:回车也是一个字符)
12<CR>
34<CR>
则输出结果是______。
(分数:2.00)
A.1234
B.12
C.1234
D.123 √
解析:[解析] 按照从键盘输入的数据可以判断字符1给了变量a,字符2给了变量b,字符<CR>即回车给了变量c,字符3给了变量d。
所以打印输出的结果为D选项。
38.以下叙述中错误的是______。
(分数:2.00)
A.gets函数用于从终端读入字符串
B.getchar函数用于从磁盘文件读入字符√
C.fputs函数用于把字符串输出到文件
D.fwrite函数用于以二进制形式输出数据到文件
解析:[解析] 本题考查字符处理函数和文件操作函数,属于基础知识,其中B选项getchar是用于从终端读入字符。
39.要求通过while循环不断读入字符,当读入字母N时结束循环。
若变量已正确定义,以下正确的程序段是______。
(分数:2.00)
A.while(ch=getchar() ="N")printf("%c",ch);
B.while((ch=getchar())! ="N") printf("%c",ch); √
C.while(ch=getchar()= ="N")printf("%c",ch);
D.while((ch=getchar())= ="N")printf("%c",ch);
解析:[解析] 在C语言中等于号用“==”表示。
一个“=”表示赋值,所以A错误。
C、D选项的含义都是如果输入的字符为“N”,则打印输出,所以正好和题意相反。
40.以下不能输出字符A的语句是(注:字符A的ASCII码值为65,字符a的ASCII码值为97)______。
(分数:4.00)
A.printf("%c/n", "a"-32);
B.printf("%d/n", "A"); √
C.printf("%c/n",65);
D.printf("%c/n", "B"-1);
解析:[解析] B选项输出的格式为%d,即为整型格式,所以输出字符A的ASCII码值65,而不是字符A。
由于大写字母比其对应的小写字母的ASCII码值小32,所以A正确。
字符A的ASCII码值就是65,所以%c 格式可以输出字符A,所以C正确。
由于字符A的ASCII码值比字符B的小1,所以D正确。
41.已知字符"A"的ASCII代码值是65,字符变量c1的值是"A",c2的值是"D",则执行语句
printf("%d,%d", c1, c2-2);
的输出结果是______。
(分数:2.00)
A.65,68
B.A,68
C.A,B
D.65,66 √
解析:[解析] 打印时以%d整型格式打印输出,所以字符变量c1的值打印出来就是65,c2-2即68-2,打印出来就是66。
所以选择D。
42.有以下程序:
#inelude <stdio.h>
main( )
{int x=1, y=0,a=0,b=0;
switch( x )
{ case 1: switch( y )
{case 0: a+ +; break;
case 1: b+ +; break;
case 2: a+ +; b+ +; break;
}
printf("a=%d,b=%d/n",a,b);
}
程序运行后的输出结果是______。
(分数:4.00)
A.a=1,b=0
B.a=1,b=1
C.a=2,b=1 √
D.a=2,b=2
解析:[解析] 本题重点考查switch语句。
switch语句中case分支后面如果没有break,那么就会顺序执行下面的case,直到遇到break跳出。
由于变量a和变量b均赋初值为0,当程序执行完第二层switch的语句case 0: a++,break后,第二层switch结束,a的值为1,继续执行第一层switch的语句case 2: a++; b++; break; a的值为2,b的值为1。
因此C选项正确。
43.有以下程序:
#include <stdio.h>
main( )
{ int k, j, s;
for(k=2; k<6; k+ +,k+ + )
{ s=1;
for(j=k; j<6; J+ +) s+ =j;
}
printf("%d/n",s);
}
程序运行后的输出结果是______。
(分数:4.00)
A.6
B.10 √
C.24
D.40
解析:[解析] 本题重点考查for语句循环嵌套。
首先k=2,进行一次循环后,k自增两次,变成4,这时s 为1,即当k=4的时候,s=1,j=4,执行内层循环,s=1+4,j自增1后等于5,s=5+5,j再自增1后即为6,跳出内层循环。
k自增两次后等于6,不成立,跳出外层循环。
最后输出s的值,即为10。
因此B选项正确。
44.有以下程序:
#include <stdio.h>
main( )
{ char c1,c2;
c1="A"+"8"-"4";
c2="A"+"8"-"5";
printf("%c,%d/n",c1,c2);
}
已知字母A的ASCII码为65,程序运行后的输出结果是______。
(分数:4.00)
A.E,68 √
B.D,69
C.E,D
D.输出无定值
解析:[解析] 本题目中字符变量c1是字符"A"的ASCII码加上4,即69所对应的字符为"E"。
字符变量c2是字符"A"的ASCII码加上3,即68所对应的字符为"D"。
但是打印输出时,c1以%c的格式输出,所以是E,c2以%d的格式输出,所以是68。
45.有如下程序段:
int x=12;
double y=3.141593;
printf("%d%8.6f", x, y);
其输出结果是______。
(分数:4.00)
A.123.141593 √
B.12 3.141593
C.12, 3.141593
D.123.1415930
解析:[解析] printf函数中格式字符“%8.6”的含义是:变量y的输出宽度为8(包括小数点),小数点后面保留6位小数。
且右对齐。
所以选择A。
46.若变量已正确定义为int型,要通过语句
scanf("%d,%d,%d",&a,&b,&c);
给a赋值1、给b赋值2、给c赋值3,以下输入形式中错误的是(注:□代表一个空格符)______。
(分数:5.00)
A.1,2,3<回车>
B.□□□1,2,3<回车>
C.1,□□□2,□□□3<回车>
D.1□2□3<回车>√
解析:[解析] scanf()的格式控制串可以使用其他非空白字符,如本题中的逗号,但在输入时必须输入这些字符,以保证匹配。
所以逗号必须输入。