全国计算机等级考试二级c语言试题分析文档格式.docx
《全国计算机等级考试二级c语言试题分析文档格式.docx》由会员分享,可在线阅读,更多相关《全国计算机等级考试二级c语言试题分析文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
A.3B.4C.1D.2
【解析】Co在标准C(ANSI-C)中,ch孔类型数据占1个字节。
1&
下列关系表达式中,结果为“假”的是()。
A.(3+4)>
6B.(3!
二4)>
2
C.3〈二4II3D.(3<
4)=1
【解析】Bo在一个表达式中,括号的优先级高,先计算3!
二4,为真即是1,1>
2为假。
19.若以下选项中的变量全部为整型变量,且已正确定义并赋值,则语法正确的switch语句是()。
A.switch(a+9)
{casecl:
y二&
-b;
casec2:
y=a+b:
}
B・switcha*b
{case10:
x=a+b;
default:
y=a-b;
C・switch(a+b)
{easel:
case3:
y=a+b;
break;
caseO:
case4:
y=a~b;
D・switch(a*a+b*b)
{default:
break;
case3:
case2:
【解析】Do选项A,switch语句中要求case后面必须是常量,不能是变量;
选项B,要用括号括起来:
选项C,case与后面的数字用空格隔开。
注意switch语句语句结束的方式:
一是见到break;
二是执行到}自然结束。
20.有以下程序:
Sinclude
main()
{inta=-2,b二0;
while(a++&
&
++b);
printf("
%d,%d\n"
a,b);
程序运行后的输出结果是()o
A.1,3B.0,2C.0,3D.1,2
【解析】Dowhile循环第一次结束后a,b取值为:
-1,1;
第二次结束后sb的值为:
0,2;
第三次没有执行循环体(空语句),只是判断了一下a++是否为真,因a为0,所以。
++为假,但a的值加1,所以&
的值变成1,但&
运算符的第一个表达式为假时,第二个表达式不计算,所以++b不执行,故b的值还是2。
所以,最终sb的值为1,2。
21.设有定义:
intx=0,和;
,立刻执行以下语句,正确的语句是()。
A.p二x;
B.*p=x;
C.p二NULL;
D.*p=XULL:
【解析】Co对于指针变量p,如果没有把p指向一个指定的值,则说明指针变量P内的值是NULL,即空值,也就是说没有存放任何存储空间的地址,所以*p是不能被赋值的。
定义指针变量不赋初始值时默认为NULLo
22.下列叙述中正确的是()。
A.可以用关系运算符比较字符串的大小
B.空字符串不占用内存,其内存空间大小是0
C.两个连续的单引号是合法的字符常量
D.两个连续的双引号是合法的字符吊常量
【解析】D。
比较两个字符串大小用函数strcomp(s,t),不能用关系运算符比较字符串的大小;
空字符串有结束符(\0),所以也要占用1字节;
两个连续的单引号是不合法,单引号中间必须有一个字符(普通字符或转义字符);
两个连续的双引号表示的是空字符串。
23.有以下程序:
#include
{rhara二’H'
;
a=(a>
=fA'
&
aU'
2'
)?
(a~,A'
+'
a'
):
a;
printf/a);
A.AB.aC.HD.h
多元运算符问号前面表达式为真,所以(a-'
A'
『)赋值给s括号里的运算是把大写字母变成小写字母,所以答案应为选项Do
24.有以下程序:
intf(intx);
{inta,b=0;
for(a=0;
a<
3;
a++)
{b=b+f(a);
putchar(*A,+b);
intf(intx)
{returnx*xl;
}
A.ABEB.BDIC.BCFD.BCD
【解析】Bo第一次循环时,b二1,输出结果为B;
第二次循环时,b二3,输出结果为D;
第三次循环时,b二8,输出结果为I。
25.设有定义:
intx[2][3];
则以下关于二维数组X的叙述错误的是()。
A.x[0]可看做是由3个整型元素组成的一维数组
B.x[0]和x[l]是数组名,分别代表不同的地址常量
C.数组X包含6个元素
D.可以用语句x[0]=0;
为数组所有元素赋初值0
对于二维数组来说,数组的名字x是一个二级指针常量;
第一维表示行地址,比如:
讥0]表示第一行的地址,而且是个地址(一级指针)常量,所以讥0]是不能赋值的。
26.设变量P是指针变量,语句P二NULL;
是给指针变量赋\ULL值,它等价于()。
A.p二"
”;
B.p二"
0"
C.p二0;
D.p二"
;
【解析】Co在C语言中NULL等价于整数0。
27.有以下程序:
#include<
stdio.h>
{inta[]={10,20,30,40},*p=a,j;
for(i=0;
i<
=3;
i++){a[i]=*p;
p++;
%d\n"
a[2]);
程序运行后的输出结果是()。
A.30B.40C.10D.20
for循环中第一次循环时,a[0]=*p,因为有故相当于a[0]=*a;
根据一维数组的定式:
a[i]二*(a+i),说明每次循环是将数组的当前元素赋值给自己,后面每次循环依此类推。
所以,for循环结束后,数组a的值并没有变化,由于数组下标是由0开始,所以&
[2]的值是30o
2&
有以下程序:
#defineN3
voidfun(inta[][N]/intb[])
{inti,j;
i<
N;
i++)
{b[i]=a[i][01;
for(j=0;
j<
j++)
if(a[i][j]>
b[i])b[i]=a[i][j];
{intx[N][N]二{1,2,3,4,5,6,乙8,9},y[N],i;
fun(x,y);
printf("
%d,"
y[i]);
A.2/4/89B.3/6/9/
C.3/5/7/D.1/3/5
fun函数功能是把数组a的每一行的最大值赋给b,a的第一行的最大值是3,第二行的最大值是6,第三行的最大值是9,所以答案是3,6,9o
29.有以下程序(strcpy为字符串复制函数,strcat为字符串连接函数):
#include〈stdio.h>
string.h>
{chara[10]二"
abc〃,b[10]="
012"
c[10]=〃xyz"
strcpy(a+1/b+2);
puts(strcac+1)):
A.al2xyzB.12yzC.a2yzD.bc2yz
第一次执行字符串的复制函数后,字符串a中的值是
2,第二次执行的是字符串的连接函数,连接后,&
字符串变成了a2yz,再输出,所以运行结果为a2yzo本题最主要的是了解字符串名加一个整型常量所代表的字符串是什么,比如:
有chara[10]二冷be"
定义,则字符串&
的值是abc;
而字符吊a+1的值是be;
字符串a+2的值是c:
字符串b+3的值是\0,即不空串。
30.以下选项中,合法的是()。
A.charstr3[]={*d'
'
e'
b'
u'
g°
'
\0'
};
B.charstr4;
str4二"
helloworld"
C.charname[10];
name二"
china"
D.charstr1[5]二"
pass"
str2[6];
str2二strl;
【解析】Ao选项B不能把一个字符串赋值给一个字符变量str4;
选项C和D犯了同样的错误是把字符串赋给了数组名,数组名是一个指针常量,常量是不能被赋值的。
31.有以下程序:
#include〈stdio.h>
{char*s二"
[2]34"
intk=0/a=0;
while(s[k+1]!
=*\0'
)
{k++;
if(k%2==0){a=a+(s[k]~,O'
+1):
continue:
a=a+(s[k]-'
0*);
printf(,,k=%da=%d\n,z/k,a):
A.k—6a—11B.k—3a—14
C.k=4a=12D.k二5a=15
【解析】Co输出结果:
k=la=2
k二2a=4
k=3a=7
k二4a=12
32.有以下程序:
{chara[5][10]二{"
one"
"
two"
three"
four"
five"
};
inti,j:
chart:
4;
for(j二i+1;
j〈5;
if(a[i][0]>
a[j][0])
{t=a[i][0];
a[i][0]=a[j][0];
a[j][0]=t;
puts(a[l]);
程序运行后的输岀结果是()o
A.fwoB.fixC.twoD.owo
for循环完成的功能是把二维数组a的第一列的字母按从小到大排序,其他列的字母不变。
排序方法是类冒泡排序。
33.有以下程序:
inta=l/b二2;
voidfunl(inta/intb)
{printf("
%da,b):
voidfun2()
{a=3;
b=4;
{funl(5,6);
fun2();
printf(*%d%d\n"
A.1256B.5634
C.5612D.3456
funl是输出局部变量的值,fun2是把全局变量的值改成3和4,所以输出的结果是5634。
当全局变量与局部变量同名时,在重叠的作用域中,局部变量起作用(可怜原则,即谁的作用域小谁就在重叠的作用域中起作用)。
34.有以下程序:
voidfunc(intn)
{staticintnum二1;
num二num+n;
printf(”%d"
num):
{func(3):
func(4);
\n"
);
A.48B.34C.35D.45
第一调用func函数时输出4,第二次调用func函数时num的值并不会释放,仍然是上次(第一次调用func函数时)修改后的值4,第二次调用结果为8,所以输出结果是48。
本题考的是静态局部变量的作用域与生存期(存放在静态存储区)不一致的情况,第一次调用完后,静态局部变量num的值为4,存放到静态存储区,函数func执行结束,其作用域消失,但存放在静态存储区的num变量的值4还在,但仍然不能拿出来用,只能等下次再进入作用域时,即第二次调用函数func时,乂进入静态局部变量num的作用域,此时,变量num乂可以拿岀来使用,由于已经存在静态存储区,所以不用重新定义该变量,可以直接从静态存储区取出变量num的值(4)来使用,所以第二次调用后,num的值变成了8o
35.有以下程序:
#include<
nclude〈stdlib.h>
voidfun(int*pl,int*p2,int*s)
{s=(int*)malloc(sizeof(int)):
*s=*pl+*p2;
free(s);
{inta=l,b=40,*q=&
a;
fun(&
a,&
b,q):
printf(,,%d\n,//*q);
A.42B.0C.1D.41
【解析】Cofun函数功能是新开辟内存空间(地址s)存放a和b
的值(通过血、&
b将地址复制给pl、p2),q的地址并没有变化,所以应该还是指向地址ao
36.有以下程序:
structSTU{charname[9];
charsex;
intscore[2]:
voidf(structSTUa[])
{structSTUb二{"
Zhao"
'
m'
85,90);
a[l]=b;
{structSTUc[2]二{{"
Qian"
f'
95,92},{"
Sun"
98,
99}};
f(c);
printf(”%s,%c,%d,%d,"
c[0].name,c[0].sex,c[0].score[0]/c[o].score[1]);
printf("
%s,%c,%d\n"
c[1].name,c[1].sex,c[1].score[o],
c[1].score[1]);
A.Zhao/m,85/
90,Sun,nif
98,
99
B.Zhao/m,85/
90,Qian/f
95,
92
C.Qian^f,95/
92Sun/m,
D.Qian/f,95,
92Zhao/m
85,
90
f函数是为结构体数组的第二个元素(结构体类型的元素)赋值,数组的第一个元素没有变化,所以正确答案应选D。
37.以下叙述中错误的是()。
A.可以用typedef说明的新类型名来定义变量
B.typedef说明的新类型名必须使用大写字母,否则会出编译错误
C.用typedef可以为基本数据类型说明一个新名称
D.用typedef说明新类型的作用是用一个新的标识符来代表已存在的类型名
【解析]Botypedef是用来定义新类型,或定义原有类型的别名(新名称)。
用typedef说明的类型不是必须用大写,而是习惯上用大耳。
3&
以下叙述中错误的是()。
A.函数的返回值类型不能是结构体类型,只能是简单类型
B.函数可以返回指向结构体变量的指针
C.可以通过指向结构体变量的指针访问所指结构体变量的任何成员
D.只要类型相同,结构体变量之间可以整体赋值
函数返回值类型可以是简单类型和结构体类型。
39.若有定义语句intb=2;
则表达式(b«
2)/(3IIb)的值是()。
A.4B.8C.0D.2
2的二进制数为010,移两位后的二进制数为01000,转成十制数为8,(3||2)为真即1,8/1二8,所以结果为8。
40.有以下程序:
{FILE*fp;
inti,a[6]={l,2,3,4,5,6};
fp二fopen("
d2.dat"
w+"
for=(i=0;
6;
i++)fpintf(fp,"
a[i]):
rewind(fp);
for(i=0;
i++)fscanf(fp,"
%d"
&
a[5~i]);
fclose(fp);
i%6;
i++)printf("
%d,"
a[i]);
A.4,
5/
6,
1,
2,3,
B.1,
2,
3,
2,1,
C.1,
4,
5,6,
D.6,
这个是对文件的操作,把数组的数写到文件里,然后再从文件里倒序读出。
所以输出结果为6,5,4,3,2,lo
二、基本操作题(共18分)
str是一个由数字和字母字符组成的字符串,由变量num传入字符串长度。
请补充函数Proc(),该函数的功能是:
把字符串str中的数字字符转换成数字并存放到整型数组bb中,函数返回数组bb的长度。
例如,str二"
abcl23de45f967"
结果为:
1234567。
注意:
部分源程序给出如下。
请勿改动main。
函数和其他函数中的任何内容,仅在函数proc()的横线上填入所编写的若干表达式或语句。
试题程序:
nclude<
#defineM80
intbb[M];
intproc(charstr[]/intbb[]/intnum)
{
inti/n二0;
for(i=0;
i<
num;
i++)
if([1])
bb[n]=[2];
n++;
return[3];
voidmain()
charstr[M];
intnum二0,n,i;
printf(Z,Enterastring:
\n"
gets(str);
while(str[num.)num++;
n=proc(str,bb,num):
\nbb二"
);
n;
i++)printf,bb[i]);
答案:
【l】str[i]〉二'
0*&
str[i]〈二'
9*【2】str[i]-’0*[3]
n
【解析】题LI中要求把字符审str中的数字字符转换成数字并存放到整型数组bb中。
首先,应判断字符串str中每个字符是否是数字字符。
因此,【1】处填“str[i]>
=‘0'
str[i]<
=,9'
”将每一个数字字符转化为数字放在整型数组bb中,因此,【2】处填“str[i]~,0'
由函数proc()可知,变量n中存放整型数组bb中的元素个数,最后要返回到主函数当中,因此,【3】处填'
n'
o
三、程序改错题(共24分)
下列给定程序中,函数proc()的功能是:
读入一个字符串(长度<
20),将该字符串中的所有字符按ASCII码升序排序后输出。
例如,输入opdye,则应输出deopy。
请修改程序中的错误,使它能得到正确结果。
不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序:
nclude〈string.h>
#include〈stdlib.h>
Sinclude<
sonio.h>
//****found****
intproc(charstr[])
charc;
unsignedi/j;
strlen(str)-l;
for(j=i+l;
strlen(str);
j++)if(str[i]>
str[j])
c=str[j]:
str[j]二str[i++];
str[i]=c;
charstr[81];
system("
CLS"
printf(,z\nPleaseenteracharacterstring:
”);
gets(str);
printf(,z\nknBeforesorting:
\nstr);
proc(str);
printf(,z\nAfters