全国计算机二级c语言考试真题详细解答系列一9文档格式.docx
《全国计算机二级c语言考试真题详细解答系列一9文档格式.docx》由会员分享,可在线阅读,更多相关《全国计算机二级c语言考试真题详细解答系列一9文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
其中关系T由关系R和S通过某种操作得到,该操作为(D)
A)
选择
B)
投影
C)
交
D)
并
(11)以下叙述中正确的是
A)程序设计的任务就是编写程序代码并上机调试
B)程序设计的任务就是确定所用数据结构
C)程序设计的任务就是确定所用算法
D)以上三种说法都不完整
解析:
选D。
原文见高教版二级教程P2,程序设计的任务包括A、B、c及相关文档。
(12)以下选项中,能用作用户标识符的是
A)void
B)8_8
C)_0_
D)unsigned
解析:
选C.标识符由字母或下划线开头,关键字不能用作标识符。
A、D为关键字,B以数字开头,所以都是错误的。
(13)阅读以下程序
#include<
stdio.h〉
main()
{intcase;
floatprintF;
printf(“请输入2个数:
”);
scanf(“%d%f”,&
case,&pjrintF);
printf(“%d%f\n”,case,printF);
}
该程序编译时产生错误,其出错原因是
A)定义语句出错,case是关键字,不能用作用户自定义标识符
B)定义语句出错,printF不能用作用户自定义标识符
C)定义语句无错,scanf不能作为输入函数使用
D)定义语句无错,printf不能输出case的值
选A。
case是关键字,关键字不能用作标识符。
C语言关键字见教材附录.
(注:
标识符区分大小写,printf是关键字,可用作标识符,当然printF也可以)
(14)表达式:
(int)((double)9/2)-(9)%2的值是
A)0
B)3
C)4
D)5
选B。
考点为运算符的优先级.
括号〉强制类型转换int>
乘除〉加减
(int)((double)9/2)一(9)%2=(int)(9。
0/2)-(9)%2=(int)(4。
5)—1=3
(15)若有定义语句:
intx=10;
,则表达式x-=x+x的值为
A)—20
B)—10
C)0
D)10
考点为复合的赋值运算符。
(注意x+x作为一个整体)
x-=x+x→x=x—(x+x)→x=-x=-10
(16)有以下程序
#include<
stdio.h>
{inta=1,b=0;
printf(“%d,”,b=a+b);
printf(“%d\n”,a=2*b);
程序运行后的输出结果是
A)0,0
B)1,0
C)3,2
D)1,2
考点为赋值表达式的使用,赋值表达式的值和变量的值是一样的。
printf在输出赋值表达式的值时,先赋值再输出。
b=a+b=l+0=1
a=2*b=2
17)设有定义:
inta=1,b=2,c=3;
,以下语句中执行效果与其它三个不同的是
A)if(a〉b)c=a,a=b,b=c;
B)if(a>
b){c=a,a=b,b=c;
}
C)if(a〉b)c=a;
a=b;
b=c;
D)if(a〉b){c=a;
a=b;
b=c;
选C。
考点为if句和逗号表达式的使用。
逗号运算符也称为顺序求值运算符,依次执行逗号表达式中的每个表选式.逗号表达式是一个整体,复合语句也是一个整体,当a>
b时,A、B、D中if后的语句可以作为整体被执行,把a、b的值交换.C的等价语句形式为:
if(a〉b)
c=a;
不能实现a、b的值交换。
(18)有以下程序
#include<
{intc=0,k;
for(k=1;
k<
3;
k++)
switch(k)
{default:
c+=k
case2:
c++;
break;
case4:
c+=2;
break;
printf(“%d\n”,c);
A)3
B)5
C)7
D)9
考点为switch语句的使用。
switch语句中case和default的顺序可以任意,不影响程序结果。
switch语句在循环中被执行2次。
k=l时,
c+=k
c=0+1=1
无break,继续执行
c++
c=2
有break,终止switch
k=2时,c++
c=3
有break,终止switch,循环结束,输出c。
(19)以下程序段中,与语句:
k=a〉b?
(b>
c?
1:
0):
0;
功能相同的是
A)if((a〉b)&
&
c))k=1;
elsek=0;
B)if((a〉b)||(b>
c)k=1;
elsek=0;
C)if(a〈=b)k=0;
elseif(b〈=c)k=1;
D)if(a>
b)k=1;
elseif(b〉c)k=1;
选A.考点为条件表达式的使用.
语句的功能为:
a〉b且b>
c时,k=l
a>
b且b〈=e时,k=0
a<
=b时,k=0
符合语句功能的只有A。
20)有以下程序
#include〈stdio。
h>
{chars[]={“012xy”};
inti,n=0;
for(i=0;
s[i]!
=0;
i++)
if(s[i]>
=’a’&&s[i]〈='
z’)n++;
printf(“%d\n”,n);
A)0
B)2
C)3
考点为字符数组的使用。
C语言用字符数组存放字符串,用\O作为结束标志.(\0是ASCII码值为0的字符,也即数值0)程序的功能为统计字符数组s中小写字符的个数,n为计数器。
(21)有以下程序
{intn=2,k=0;
while(k++&&n++>
2);
printf(“%d%d\n"
k,n);
A)02
B)13
C)57
D)12
考点为while语句的使用。
该while(k++&&n++〉2);
的循环体为空语句,所以程序是输出退出while循环后k、n的值.k++为先使用k的值再增1.先使用k的值,k=0,逻辑与结果为。
第一次执行while循环时条件就不成立,直接退出循环,k的值增1,n的值没有任何改变。
(22)有以下定义语句,编译时会出现编译错误的是
A)chara=’a’;
B)chara=’\n’;
C)chara=’aa’;
D)chara=’\x2d’;
选C.考点为字符型变量的赋值和基本概念。
字符型为单引号括起的一个字符.
A为标准的字符型赋值方法,
B为把一个转义字符赋值给字符变量,也是正确的。
C为单引号括起的两个字符,不符合字符型定义。
D表面看上去是错误的,其实是正确的,也是一个转义字符.
‘/x2d’表示ASCII码值为16进制数2d的字符,即‘—’号。
(23)有以下程序
main()
{charc1,c2;
c1='
A’+’8’-‘4’;
c2=’A'
+’8’—‘5’;
printf(“%c,%d\n"
,c1,c2);
已知字母A的ASCII码为65,程序运行后的输出结果是
A)E,68
B)D,69
C)E,D
D)输出无定值
考点为字符型数据的使用和基本知识.字符型数据在内存中存放的是字符的ASCII码值,可以作为整型数据来处理。
英文字符和数字在ASCII码表中是按顺序排列的。
c1=‘A'
+‘8’—‘4’=‘A’+‘4’=E
c2=‘A’+‘8’-‘5’=‘A’+3=‘D'
(24)有以下程序
#include〈stdio.h>
voidfun(intp)
{intd=2;
p=d++;
printf(“%d”,p);
}
{inta=1;
fun(a);
printf(“%d\n”,a);
A)32
B)12
C)21
D)22
考点为函数参数的传递.c语言中函数参数的传递是值传递,是把实参的值传给形参,是单向传递,形参的改变不会影响到实参的值。
程序中,把实参a的值传给形参p,p=1,然后p=d++,再次赋值后p=2.输出p的值2.返回到主程序中,输出a的值1。
(形参p的改变不会影响到实参a的值,a的值仍为1)
(25)以下函数findmax拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功能
#defineMIN—2147483647
intfindmax(intx[],intn)
{inti,max;
i〈n;
{max=MIN;
if(max〈x[i])max=x[i];
returnmax;
}
造成错误的原因是
A)定义语句inti,max;
中max未赋初值
B)赋值语句max=MIN;
中,不应给max赋MIN值
C)语句if(max〈x[i])max=x[i];
中判断条件设置错误
D)赋值语句max=MIN;
放错了位置
考点为求最大值的算法。
max=MIN.不应该放在循环内,而应该放到for循环的前面.先让max取最小的整数,这样第1次循环时max就可以取得第1个数组元素的值,然后在循环中把后面的数组元素依次和max比较,让max取大值。
(26)有以下程序
{intm=1,n=2,*p=&
m,*q=&
n,*r;
r=p;
p=q;
q=r;
printf(“%d,%d,%d,%d\n”,m,n,*p,*q);
A)1,2,1,2
B)1,2,2,1
C)2,1,2,1
D)2,1,1,2
考点为指针的基本概念。
p、q为指针,初始化时p指向m,q指向n。
执行r=p;
p:
q;
q:
r;
后,p和q的值交换,从而p指向n,q指向m。
指针的改变不会影响m、n的值,最后*p和*q的值为n、m的值。
(27)若有定义语句:
inta[4][10],*p,*q[4];
且0≤i<
4,则错误的赋值是
A)p=a
B)q[i]=a[i]
C)p=a[i]
D)p=&
a[2][1]
考点为指向二维数组的指针的用法。
p为基类型为int的指针,指向一个整型数据,也就可咀指向一个数组元素,所以D正确。
a是二维数组名,存放二维数组的首地址,但二维数组名是一个行指针,其基类型为具有10个元素的一维数组。
所以A错误,二者基类型不一致(p+1指向下一个元素,而a+l指向二维数组的下一行)。
如果p定义为int(*p)[10],才可以赋值p=a。
在C语言中,二维数组a[4][10]可以看做是由4个元素组成的一维数组,这4个元素为a[0]、a[l]、a[2]、a[3],而其中每个元素又是由10个元素组成的维数组。
在这里,a[i]也是一个数组名,可以表示一维数组的首地址,但a[i]是一个列指针,基类型为int.指向一维数组的第1个元素。
同时,指针数组q的每个数组元素q[i]的基类型也为int,所以p、a[i]、q[i]的基类型一致,选项B、C是正确的。
(28)有以下程序
#include〈stdio。
h〉
#include<
string.h>
{charstr[][20]={“One*World”,“One*Dream!
”},*p=str[1];
printf(“%d,”,strlen(p));
printf(“%s\n”,p);
A)9,One*World
B)9,One*Dream
C)10,One*Dream
D)10,One*World
选C.考点为二维字符数组的使用和strlen()函数的使用.
初始化p=str[l]后,p指向第二个字符串“One*Dream!
"
。
strlen()函数计算字符串的长度时不包括结束标志,所以strlen(p)=10。
(29)有以下程序
stdio。
{inta[]={2,3,5,4},i;
i<
4;
switch(i%2)
{case0:
switch(a[i]%2)
{case0:
a[i]++;
case1:
a[i]-—;
}break;
a[i[=0;
for(i=0;
i++)printf(“%d”,a[i]);
printf(“\n”);
A)3344
B)2050
C)3040
D)0304
考点为switch语句。
外部switch语句在循环中被执行4次.i=0时,执行case0.
内部switch语句也执行case0,
a[i]++
a[0]=3
i=1时,执行case1,a[l]=0
排除法,只有C正确。
i=2时,执行case0.
内部switch语句执行case1.
a[i]——
a[2]=4
i=3时,执行case1,a[3]=0
最后依次输出为:
3040
(30)有以下程序
#include〈string.h〉
{chara[10]=”abcd”;
printf(“%d,%d\n"
strlen(a),sizeof(a));
程序运行后的输出结果是
A)7,4
B)4,10
C)8,8
D)10,10
选B.考点为strlen()函数和sizeof()运算符的使用。
strlen()函数计算字符串的长度时,遇到结束标志为止,且长度不包括结束标
志,所以strlen(a)=4,排除法选B。
sizeof()运算符的操作数可以是类型名或变量名、数组名等,当操作数是数组名时,其结果是数组的总字节数,所咀sizeof(a)=10。
(31)下面是有关C语言字符数组的描述,其中错误的是
A)不可以用赋值语句给字符数组名赋字符串
B)可以用输入语句把字符串整体输入给字符数组
C)字符数组中的内容不一定是字符串
D)字符数组只能存放字符串
字符数组名是数组首地址,是常量,不能被重新赋值,所以A正确。
可以用scanf(“%s"
,str)对字符串整体输入,str可以是字符数组名或者字符指针,所以B正确.C和D说法对立,必定有一个正确,用排除法A、B选项根本不用看。
字符数组的所有元素可以只存放普通字符,不存放结束标志.所以D错误。
(32)下列函数的功能是
fun(char*a,char*b)
{while((*b=*a)!
=’\0'
){a++,b++;
}}
A)将a所指字符串赋给b所指空间
B)使指针b指向a所指字符串
C)将a所指字符串和b所指字符串进行比较
D)检查a和b所指字符串中是否有’\0’
考点为指针的概念及while循环。
While循环条件为:
(*b=*a)!
=’\0’,执行时先把指针a所指向的字符赋给指针b所在内存单元,如果该字符不是结束标志“\0”,执行循环体a++;
b++;
指针a、b分别指向下一个字符单元.再判断循环条件,如果成立,继续把指针a所指向的字符赋给指针b所在内存单元,直到遇到结束标志为止.所以正确答案为A.
(33)设有以下函数
voidfun(intn,char*s){……}
则下面对函数指针的定义和赋值均是正确的是
A)void(*pf)();
pf=fun;
B)viod*pf();
C)void*pf();
*pf=fun;
D)void(*pf)(int,char);
pf=&fun;
选A.考点为指向函数的指针的用法。
函数名代表函数的入口地址。
指向函数的指针应该定义为void(*pf)()。
如果定义为void*pf(),则表示函数pf返回值为一个基类型为void的指针。
综上,所以正确答案为A。
(34)有以下程序
intf(intn);
{inta=3,s;
s=f(a);
s=s+f(a);
printf(“%d\n”,s);
intf(intn)
{staticinta=1;
n+=a++;
returnn;
程序运行以后的输出结果是
A)7
B)8
C)9
D)10
选C.考点为静态局部变量的使用。
主函数和f函数中的a都为局部变量,作用域都在本函数之内,互不影响。
f函数中的a为静态局部变量,占用固定的内存单元,下一次调用时仍可保留上次调用时的值。
也就是说,如果多次调用f函数,a的定义只在第一次调用时有效,从第二次调用开始,a的定义相当于不存在,直接使用a的值。
主函数中调用了2次f(a),第一次调用,s=f(a)=f(3)
f函数:
n=3
a=l
n=n+(a++)=4
a=2
返回n,主函数s=4.第二次调用,s=s+f(a)=4+f(3)(a值为主函数中的a值)
f函数n=3
n=n+(a++)=5
a=3
返回n,主函数s=4+f(3)=4+5=9
最后输出s的值为9。
(35)有以下程序
#definef(x)x*x*x
{inta=3,s,t;
s=f(a+1);
t=f((a+1));
printf(“%d,%d\n’,s,t);
A)10,64
B)10,10
C)64,10
D)64,64
选A.考点为带参数的宏定义。
宏定义中的参数授有类型,仅为字符序列,不能当作表达式运算.宏展开时,把实参字符串原样写在替换文本中。
s=f(a+l)=a+l*a+l*a+l=10
t=f((a+1))=(a+1)*(a+1)*(a+1)=64
(36)下面结构体的定义语句中,错误的是
A)structord{intx;
inty;
intz;
};
structorda;
B)structord{intx;
inty;