计算机等级考试二级C语言笔试试题及答案解析Word下载.docx
- 文档编号:8027576
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:21
- 大小:46.26KB
计算机等级考试二级C语言笔试试题及答案解析Word下载.docx
《计算机等级考试二级C语言笔试试题及答案解析Word下载.docx》由会员分享,可在线阅读,更多相关《计算机等级考试二级C语言笔试试题及答案解析Word下载.docx(21页珍藏版)》请在冰点文库上搜索。
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)0B)3C)4D)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)-20B)-10C)0D)10
考点为复合的赋值运算符。
(注意x+x作为一个整体)
x-=x+x→x=x-(x+x)→x=-x=-10
(16)有以下程序
{inta=1,b=0;
printf(“%d,”,b=a+b);
printf(“%d\n”,a=2*b);
程序运行后的输出结果是
A)0,0B)1,0C)3,2D)1,2
考点为赋值表达式的使用,赋值表达式的值和变量的值是一样的。
printf在输出赋值表达式的值时,先赋值再输出。
b=a+b=l+0=1a=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;
考点为if句和逗号表达式的使用。
逗号运算符也称为顺序求值运算符,依次执行逗号表达式中的每个表选式。
逗号表达式是一个整体,复合语句也是一个整体,当a>
b时,A、B、D中if后的语句可以作为整体被执行,把a、b的值交换。
C的等价语句形式为:
if(a>
b)c=a;
a=b;
b=c;
不能实现a、b的值交换。
(18)有以下程序
{intc=0,k;
for(k=1;
k<
3;
k++)
switch(k)
{default:
c+=k
case2:
c++;
break;
case4:
c+=2;
printf(“%d\n”,c);
A)3B)5C)7D)9
考点为switch语句的使用。
switch语句中case和default的顺序可以任意,不影响程序结果。
switch语句在循环中被执行2次。
k=l时,c+=kc=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;
C)if(a<
=b)k=0;
elseif(b<
=c)k=1;
b)k=1;
elseif(b>
考点为条件表达式的使用。
语句的功能为:
a>
b且b>
c时,k=l
b且b<
=e时,k=0
a<
=b时,k=0
符合语句功能的只有A。
20)有以下程序
{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)0B)2C)3D)5
考点为字符数组的使用。
C语言用字符数组存放字符串,用\O作为结束标志。
(\0是ASCII码值为0的字符,也即数值0)程序的功能为统计字符数组s中小写字符的个数,n为计数器。
(21)有以下程序
{intn=2,k=0;
while(k++&
n++>
2);
printf(“%d%d\n”,k,n);
A)02B)13C)57D)12
考点为while语句的使用。
该while(k++&
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’;
考点为字符型变量的赋值和基本概念。
字符型为单引号括起的一个字符。
A为标准的字符型赋值方法,
B为把一个转义字符赋值给字符变量,也是正确的。
C为单引号括起的两个字符,不符合字符型定义。
D表面看上去是错误的,其实是正确的,也是一个转义字符。
‘/x2d’表示ASCII码值为16进制数2d的字符,即‘-’号。
(23)有以下程序
#include<
main()
{charc1,c2;
c1=’A’+’8’-‘4’;
c2=’A’+’8’-‘5’;
printf(“%c,%d\n”,c1,c2);
已知字母A的ASCII码为65,程序运行后的输出结果是
A)E,68B)D,69C)E,DD)输出无定值
考点为字符型数据的使用和基本知识。
字符型数据在内存中存放的是字符的ASCII码值,可以作为整型数据来处理。
英文字符和数字在ASCII码表中是按顺序排列的。
c1=‘A’+‘8'
-‘4’=‘A’+‘4’=Ec2=‘A’+‘8’-‘5’=‘A’+3=‘D’
(24)有以下程序
voidfun(intp)
{intd=2;
p=d++;
printf(“%d”,p);
{inta=1;
fun(a);
printf(“%d\n”,a);
A)32B)12C)21D)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<
中判断条件设置错误
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,2B)1,2,2,1C)2,1,2,1D)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<
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
考点为二维字符数组的使用和strlen()函数的使用。
初始化p=str[l]后,p指向第二个字符串“One*Dream!
”。
strlen()函数计算字符串的长度时不包括结束标志,所以strlen(p)=10。
(29)有以下程序
{inta[]={2,3,5,4},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<
{chara[10]=”abcd”;
printf(“%d,%d\n”,strlen(a),sizeof(a));
程序运行后的输出结果是
A)7,4B)4,10C)8,8D)10,10
考点为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;
考点为指向函数的指针的用法。
函数名代表函数的入口地址。
指向函数的指针应该定义为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)7B)8C)9D)10
选C.考点为静态局部变量的使用。
主函数和f函数中的a都为局部变量,作用域都在本函数之内,互不影响。
f函数中的a为静态局部变量,占用固定的内存单元,下一次调用时仍可保留上次调用时的值。
也就是说,如果多次调用f函数,a的定义只在第一次调用时有效,从第二次调用开始,a的定义相当于不存在,直接使用a的值。
主函数中调用了2次f(a),第一次调用,s=f(a)=f(3)f函数:
n=3a=ln=n+(a++)=4a=2返回n,主函数s=4。
第二次调用,s=s+f(a)=4+f(3)(a值为主函数中的a值)f函数n=3a=2n=n+(a++)=5a=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,64B)10,10C)64,10D)64,64
考点为带参数的宏定义。
宏定义中的参数授有类型,仅为字符序列,不能当作表达式运算。
宏展开时,把实参字符串原样写在替换文本中。
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;
}structorda;
C)structord{intx;
}a;
D)struct{intx;
考点为结构体变量的定义。
可以先定义结构体类型,再定义结构体变量,如A。
可以在定义结构体类型的同时定义结构体变量,如C。
可以直接定义结构体变量,没有类型名,如D。
B选项错误,定义结构体类型的同时使用此类型。
(37)设有定义:
char*c;
,以下选项中能够使字符型指针c正确指向一个字符串的是
A)charstr[]=”string”;
c=str;
B)scanf(“%s”,c);
C)c=getchar();
D)*c=”string”;
考点为字符指针的使用。
选项A为正确用法。
先将字符串存于字符数组中,然后将数组名赋给字符指针。
(数组名代表数组首地址,定义数组时为其分配确定地址)选项C错误。
getchar()函数输入个字符给字符型变量,而不是字符指针。
选项B和D有类似的错误,两个选项并无语法错误,但运行时可能会出现问题。
原因:
在选项B和D中,字符指针没有被赋值,是个不确定的值,指向一个不确定的内存区域,这个区域可能存放有用的指令或数据。
在这个不确定的区域重新存放字符串,可能会发生无法预知的错误。
(38)有以下程序
structA
{inta;
charb[10];
doublec;
structAf(structAt);
{structAa={1001,”ZhangDa”,1098.0};
a=f(a);
jprintf(“%d,%s,%6.1f\n”,a.a,a.b,a.c);
structAf(structAt)
(t.a=1002;
strcpy(t.b,”ChangRong”);
t.c=1202.0;
returnt;
)
A)1001,ZhangDa,1098.0
B)1001,ZhangDa,1202.0
C)1001,ChangRong,1098.0
D)1001,ChangRong,1202.0
考点为结构体类型在函数中的应用。
因为使用结构体变量,程序看似很杂乱。
但在使用中,结构体变量和普通变量的作用是一样的。
如果这样看,程序执行流程如下:
函数调用f(a)将实参a传给形参t,函数内部对t重新赋值,然后返回t;
主函数a=f(a),把返回值t赋给a,然后输出a,其
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机等级考试 二级 语言 笔试 试题 答案 解析