全国计算机等级考试二级C语言真题题库2+.docx
《全国计算机等级考试二级C语言真题题库2+.docx》由会员分享,可在线阅读,更多相关《全国计算机等级考试二级C语言真题题库2+.docx(31页珍藏版)》请在冰点文库上搜索。
全国计算机等级考试二级C语言真题题库2+
全国计算机等级考试二级C语言真题题库22015年9月
(总分43,做题时间120分钟)
一、选择题(每小题1分,共40分)
1.下列叙述中错误的是()。
A数据结构中的数据元素不能是另一数据结构
B数据结构中的数据元素可以是另一数据结构
C空数据结构可以是线性结构也可以是非线性结构
D非空数据结构可以没有根节点
答案:
A
[解析]数据元素是一个含义很广泛的概念,它是数据的“基本单位”,在计算机中通常作为一个整体进行考虑和处理。
数据元素可以是一个数据也可以是被抽象出的具有一定结构的数据集合,所以数据结构中的数据元素可以是另一数据结构。
满足有且只有一个根节点并且每—个节点最多有一个前件,也最多有一个后件的非空的数据结构被认为是线性结构,不满足上述条件的结构为非线性结构。
空数据结构可以是线性结构也可以是非线性结构。
非空数据结构可以没有根节点,如非性线结构“图”就没有根节点。
故选A选项。
2.为了降低算法的空间复杂度,要求算法尽量采用原地工作(inplace)。
所谓原地工作是指()。
A执行算法时所使用的额外空间固定(即不随算法所处理的数据空间大小的变化而变化)
B执行算法时所使用的额外空间随算法所处理的数据空间大小的变化而变化
C执行算法时不使用额外空间
D执行算法时不使用任何存储空间
答案:
A
[解析]算法的空间复杂度是指执行这个算法所需要的内存空间,包括输人数据所占的存储空间、程序本身所占的存储空间、算法执行过程中所需要的额外空间。
如果额外空间量相对于问题规模(即输人数据所占的存储空间)来说是常数,即额外空间量不随问题规模的变化而变化,则称该算法是原地工作的。
故选A选项。
3.某循环队列的存储空间为Q(1:
m),初始状态为front=rear=m。
现经过一系列的入队操作和退队操作后,front=m,rear=m-1,则该循环队列中的元素个数为()。
Am-1
Bm
C1
D0
答案:
A
[解析]循环队列长度为m,由初始状态为front=rear=m,可知此时循环队列为空。
入队运算时,首先队尾指针进1(即rear+1),然后在rear指针指向的位置插入新元素。
特别的,当队尾指针rear=m+1时,置rear=1。
退队运算时,排头指针进1(即front+1),然后删除front指针指向的位置上的元素,当排头指针front=m+1时,置front=1。
从排头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列中的元素。
如果rear-front>0,则队列中的元素个数为rear-front个;如果rear-front<0,则队列中的元素个数为rear-front+m。
该题中m-1<m,即rear-front<0,则该循环队列中的元素个数为(m-1)-m+m=m-1。
故选A选项。
4.某棵树只有度为3的节点和叶子节点,其中度为3的节点有8个,则该树中的叶子节点数为()。
A15
B16
C17
D不存在这样的树
答案:
C
[解析]树是一种简单的非线性结构,直观地来看,树是以分支关系定义的层次结构。
在树结构中,一个节点所拥有的后件个数称为该节点的度,所有节点中最大的度称为树的度。
由于只有度为3的节点和叶子节点,可知最后一层都为叶子节点,倒数第二层一部分节点度为3,一部分为叶子节点,其余的节点的度均为3,计算度为3的节点总数(33-1-1)/2<8<(34-1-1)/2可知,树共有4层,前两层有度为3的节点(33-1-1)/2=4个,第三层有33=9个节点,其中4个是度为3的节点,5个是叶子节点,所以该树中的叶子节点数为4×3+5=17。
故选C选项。
5.某二叉树共有530个节点,其中度为2的节点有250个,则度为1的节点数为()。
A29
B30
C249
D251
答案:
A
[解析]在树结构中,一个节点所拥有的后件个数称为该节点的度,所有节点中最大的度称为树的度。
对任何一棵二叉树,度为0的节点总是比度为2的节点多一个。
二叉树节点总数为530,度为2的节点有250个,则度为0的节点有251个,那么度为1的节点个数为530-250-251=29。
故选A选项。
6.若某二叉树中的所有节点值均大于其左子树上的所有节点值,且小于右子树上的所有节点值,则该二叉树遍历序列中有序的是()。
A前序序列
B中序序列
C后序序列
D以上说法均可以
答案:
B
[解析]二叉树遍历可以分为3种:
前序遍历(访问根节点在访问左子树和访问右子树之前)、中序遍历(访问根节点在访问左子树和访问右子树两者之间)、后序遍历(访问根节点在访问左于树和访问右子树之后)。
由于节点值均大于其左子树上的所有节点值,且小于右子树上的所有节点值,那么只要遍历时访问根节点在访问左于树和右子树之间,遍历序列有序,即中序序列有序。
故选B选项。
7.将C语言的整数设为整数类I,则下面属于类I实例的是()。
A-103
B10E3
C10.3
D“0103”
答案:
A
[解析]整数类实例包括:
十进制常量用0~9表示,不能以0开头;八进制常量用0~7表示,必须用0开头;十六进制常量用0~9和A~F(a~f)表示,必须以0x或0X开头。
本题中B选项是科学计数法表示的浮点数实例,C选项是浮点数实例,D选项是字符串实例。
故选A选项。
8.下列叙述中正确的是()。
A软件包括程序、数据和文档
B软件包括程序和数据
C软件包括算法和数据结构
D软件包括算法和程序
答案:
A
[解析]计算机软件由两部分组成:
一是机器可执行的程序和数据;二是机器不可执行的,与软件开发、运行、维护、使用等有关的文档。
故选A选项。
9.软件生命周期是指()。
A软件的定义和开发阶段
B软件的需求分析、设计与实现阶段
C软件的开发阶段
D软件产品从提出、实现、使用维护到停止使用退役的过程
答案:
D
[解析]通常把软件产品从提出、实现、使用、维护到停止使用、退役的过程称为软件生命周期。
A、B、C选项均为生命周期的一部分。
故选D选项。
10.下列叙述中正确的是()。
A数据库系统可以解决数据冗余和数据独立性问题,而文件系统不能
B数据库系统能够管理各种类型的文件,而文件系统只能管理程序文件
C数据库系统可以管理庞大的数据量,而文件系统管理的数据量较少
D数据库系统独立性较差,而文件系统独立性较好
答案:
A
[解析]数据管理技术的发展经历了3个阶段:
人工管理阶段、文件系统阶段和数据库系统阶段。
三者各自的特点如下表所示。
数据库系统可以解决数据冗余和数据独立性问题,而文件系统不能。
数据库系统和文件系统的区别不仅在于管理的文件类型与数据量的多少,数据库系统具有高度的物理独立性和一定的逻辑独立性,而文件系统独立性较好。
故本题答案为A选项。
11.关于程序模块化,以下叙述错误的是()。
A程序模块化可以提高程序运行的效率
B程序模块化可以提高程序编制的效率
C程序模块化可以提高程序代码复用率
D程序模块化可以提高调试程序的效率
答案:
A
[解析]模块化程序的优点:
(1)易于维护和复用,可以提高程序编制的效率;
(2)易于分工合作;(3)易于模块化调试测试。
模块化程序的副作用:
(1)可能会降低程序运行效率;
(2)设计的前期工作需要多花费时间。
可知B,C,D选项正确。
答案为A选项。
12.以下正确使用C语言标识符的是()。
A&3
B#3
C_3
D-3
答案:
C
[解析]C语言合法标识名的命名规则是:
(1)标识符由字母、数字和下划线组成;
(2)第一个字符不能是数字只能是字母或下划线。
A选项的第一个字符为&,非法;B选项,第一个字符为#,非法;D选项,第一个字符为-,非法。
答案为C选项。
13.若有定义:
inta,b,c;以下程序段的输出结果是()。
a=11;b=3;c=0;
printf(”%d\n”,c=(a/b,a%b));
A2
B0
C3
D1
答案:
A
[解析]C语言中,逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式。
逗号运算符的优先级是所有运算符中级别最低的,逗号运算符保证左边的子表达式运算结束后才进行右边的子表达式的运算。
也就是说,逗号运算符是一个序列点,其左边所有副作用都结束后,才对其右边的子表达式进行运算,并以最右边表达式的值作为整个逗号表达式的值。
因此变量c的值为a%b即11%3=2。
故答案为A选项。
14.以下选项中合法的C语言常量是()。
A’C-STR’
B2014.1
C”\1.0
D2EK
答案:
B
[解析]所谓常量是指在程序运行的过程中,其值不能被改变的量。
在C语言中,有整型常量、实型常量、字符常量和字符串常量等类型。
A选项是字符串,但使用单引号,错误;C、D选项,为实型常量中指数形式,但指数形式e(E)之前必须是数字,之后必须为整数,错误。
故答案为B选项。
15.设有定义:
intx,y,z;,且各变量已赋正整数值,则以下能正确表示代数式“
”的C语言表达式是()。
A1.0/x/y/z
B1/x*y*z
C1/(x*y*z)
D1/x/y/(double)z
答案:
A
[解析]代数表达式1/(x•y•z)是小数,转为C语言的表达式必须是小数。
A选项由于1.0为浮点数,计算结果自动转换为浮点数,故A选项正确。
B、C、D选项的表达式均为0。
答案为A选项。
16.有以下程序:
当执行程序时,按下列方式输入数据(从第1列开始,代表回车,注意:
回车也是一个字符)12<CR>34<CR>则输出结果是()。
A
B12
C1234
D
答案:
A
[解析]scanf()函数从标准输入输出中读入两个字符’1’、’2’分别赋给变量a、b,遇到回车自动结束,但回车符已经存入缓冲区,函数getchar()将从中接受了回车符,故c被赋值为回车符,第二个getchar()读人字符’3’,因此a=’1’,b=’2’,c=,d=’3’。
故答案为A选项。
17.有以下程序:
执行时输入:
123<回车>,则输出结果是()。
A2,2,3,4,4,4,
B2,3,4,
C2,2,3,4,
D2,3,3,4,5,6,
答案:
C
[解析]continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。
在switch…case语句中,如果没有break会导致多个分支重叠。
因此,输人1,2,3,则执行case1:
printf("%d",b+1);case2:
printf("%d,",b+1);continue;后结束。
2则执行case2:
printf(”%d,",b+1);continue;3则执行default:
printf("%d,",b+1);continue;得到的结果是2,2,3,4。
故答案为C选项。
18.有以下程序:
执行时输入:
3.62.4<回车>,则输出结果是()。
A2.400000
B1.500000
C1.600000
D2.000000
答案:
A
[解析]题目中程序执行过程中关键语句z=x/y的结果为:
z=1.5,if条件成立,得x=2.4,y=2.4,z=1.0,下一次循环if条件不成立跳出循环,按照格式打印y值为2.400000。
故答案为A选项。
19.有以下程序:
执行时输入:
0<回车>后,则输出结果是()。
A5,
B0,0,0,0,0,
C0,1,2,3,4,
D0,1,
答案:
C
[解析]scanf(”%c”,&c),输入的字符,题目中输入了0,字符0对应于ASCII码为48,因此for循环中,i的范围从0~5,均小于48,if条件不成立,直接执行下一条语句printf,因此得到的结果是0,1,2,3,4。
故答案为C选项。
20.以下程序拟实现计算sum=1+1/2+1/3+…+1/50。
程序运行后,不能得到正确结果,出现问题的语句是()。
Asum+=1/i;
Bwhile(i<50);
Csum=1.0;
Di++;
答案:
A
[解析]选项A中,sum+=1/i;i为整型,因此1/i是整型类型,当1/i有小数时,小数部分会被截断。
因此1/i结果始终为0,导致结果出错,应改为sum+=1.0/i。
因此答案为A选项。
21.若有定义语句:
doublea,*p=&a;以下叙述中错误的是()。
A定义语句中的*号是一个间址运算符
B定义语句中的*号是一个说明符
C定义语句中的p只能存放double类型变量的地址
D定义语句中*p=&a把变量a的地址作为初值赋给指针变量p
答案:
A
[解析]指针运算符(通常称为间接引用运算符:
indirectionoperator或复引用运算符:
dereferencingoperator)返回其操作数(即一个指针)所指向的对象的值。
定义语句中的*号不是一个间址运算符,而是定义指针变量的说明符,因此,A项错误,B选项正确,原则上说变量p可以放double兼容性的变量地址,C选项正确,根据指针的赋值运算,可知D选项正确。
故答案为A选项。
22.关于函数返回值,以下叙述正确的是()。
A函数可以返回整个结构体,即使结构体中有数组
B函数只能返回基本数据类型的数值或指针
C函数不可以返回一个数组
D函数不能没有返回值
答案:
A
[解析]函数返回值可以为整型、实型、字符型、指针和结构类型,也可以没有返回值,因此A选项正确,可以返回数组指针,因此可知B、C、D选项错误。
放答案为A选项。
23.有以下程序:
程序运行后的输出结果是()。
A24
B720
C120
D6
答案:
C
[解析]函数fun()求数组指定返回的元素的积。
函数fun(a,3)求的是数组a[0]~a[3]的积。
因此结果为2*3*4*5=120,故答案为C选项。
24.若有语句:
inta[3][4],(*p)[4];p=a;,则以下选项中叙述错误的是()。
A系统将开辟一个名为p的二维数组,p[0][0]中的值即为a[0][0]中的值
Bp+1代表a[1][0]的地址
Cp中将存放a数组的首地址
Dp+2代表a数组最后一行的首地址
答案:
A
[解析](*p)[4]定义了一个数组指针。
p可以指向类似于arry[][4]的数组,题设中,p不是一个二维数组,只是可以指向这类二维数组,因此A选项错误。
p+1代表了第一行第一个元素的地址,p=a指向数组a的首地址,则B、C选项正确,同理可知D选项也正确。
故答案为A选项。
25.有以下程序:
程序运行后的输出结果是()。
AB,C,D,E,
BA,B,C,D,
CC,D,E,F,
DB,D,F,H,
答案:
A
[解析]函数change()的作用是从数组尾部将数组内的元素值加1。
数组的初始值为ABCD,因此经change()后,得到的值为BCDE。
故答案为A选项。
26.设有以下程序段:
floata[8]={1.0,2.0};intb[1]={0};charc[]={”A”,”B”};chard==“1”;以下叙述正确的是()。
A只有变量c的定义是合法的
B只有变量a,b、c的定义是完全合法的
C所有变量的定义都是完全合法的
D只有变量a,b的定义是完全合法的
答案:
D
[解析]floata[8]={1.0,2.0};定义了一个包含8个float型元素的数组,并初始化了数组的前2项,其他项是随机数。
intb[1]={0},定义了只有一个int型元素的数组,并初始化为0。
charc[]={"A","B"};定义一个char型数组,大小有初始化元素决定,但初始化值是字符串,类型不兼容,编译出错。
chard="1",;定义一个char型变量,但是初始化赋值字符串,类型不兼容,编译出错。
因此只有数组a,b的定义和初始化正确。
故答案为D选项。
27.有以下程序:
执行时输入:
2<回车>,则输出结果是()。
A1234
B5431
C1235
D3214
答案:
C
[解析]第一个for循环初始化数组a,分别为1,3,5,随机数,形成了基本有序的序列,再将输入的数字插入到数组a,使它们形成有序序列。
因此可以分析出,打印的结果为1,2,3,5。
故答案为C选项。
28.有以下程序:
}程序运行后的输出结果是()。
A9
B-1
C10
D0
答案:
A
[解析]while(p<a+n&&*p!
=x)p++;当p=a;n=10,x=10;时while循环条件成立,直到p=a+9,结束循环,执行下一条语句,if条件成立,返回p-a,此时执行p-a=a+9-a=9;因此,输出9。
故答案为A选项。
29.有以下程序:
程序运行后的输出结果是()。
Aejoty
Bafkpu
Cagmsy
Deimqu
答案:
C
[解析]数组a是二维数组,数组w存放二维数组a行列值相同的位置上的元素,由a[5][10]可得w[0]~w[4]的元素分别是agmsy,因此打印结果为agmsy。
故答案为C选项。
30.语句printf("%d\n",strlen("\t\"\\\n\'\065\08AB"));的输出结果是()。
A6
B7
C8
D9
答案:
A
[解析]字符串"\t\"\\\n\'\065\08AB"中共有13个字符,而strlen()函数从字符串第一个字符开始扫描,直到碰到第一个结束符'\0'为止,然后返回计数器值(长度不包含"\0")。
故输出结果为6。
答案为A选项。
31.有以下程序:
程序运行后的输出结果是()。
A012345
B876543210
C876543
D012345678
答案:
A
[解析]fun(*ss,m1,m2)的作用是,如果m1>m2交换数组元素ss[m1],ss[m2]。
因此,fun(ss,0,5)后ss的0,1,2,3,4,5,6,7,8,\0。
fun(ss,9,6)后ss的0,1,2,3,4,5,\0,8,7,6。
fun(ss,0,9)后ss的0,1,2,3,4,5,\0,8,7,6。
因此打印结果012345。
故答案为A选项。
32.有以下程序;
程序运行后的输出结果是()。
A1,2,1,2,2,4
B1,2,6,6,7,8
C1,2,2,4,2,4
D1,2,6,6,2,4
答案:
A
[解析]全局变量与函数体内局部变量同名时,局部变量会覆盖全局变量,因此在sub1()函数内,全局变量m,n是不可见的,在函数sub1()内对m,n操作的是局部变量,对全局变量不产生影响。
但在sub2()函数内,由于没有和全局变量重名,因此在此函数内,m,n是可见的。
因此,第一个printf()打印的是全局变量m,n,故打印的是1,2;第二个printf(),调用sub1()。
没有修改全局变量m,n,故打印的是1,2;第三个printf(),之前调用了sub2(),修改了全局变量m,n,因此,打印的是2,4。
故答案为A选项。
33.有以下程序:
程序运行后的输出结果是()。
A-263
B2
C0
D-26
答案:
D
[解析]isspace(c)检查参数c是否为空格字符。
若参数c为空格字符,则返回TRUE,否则返回NULL(0)。
Isdigit(c)函数检查参数c是否为阿拉伯数字0到9。
返回值若为阿拉伯数字,则返回TRUE,否则返回NULL(0)。
fun()函数的第一个for循环判断字符串是否为负号。
第二个for循环获取符号后面的数字字符,并将它们转化为整数。
若遇到了非数字的字符则跳出,最后返回数组的结果。
因此,可知首先获取负号,紧接着获取数值26,遇到了字符a,跳出返回-26,因此打印的结果是-26。
故答案为D选项。
34.设有定义:
structcomplex{intreal,unreal;}datal={1,8},data2;则以下赋值语句中错误的是()。
Adata2=(2,6);
Bdata2=data1;
Cdata2.real=data1.real;
Ddata2.real=data1.unreal;
答案:
A
[解析]结构体变量建议在定义的时候进行初始化。
结构体常见的几种初始化方法如下:
计算机内核喜欢用第一种,使用第一种和第二种时,成员初始化顺序可变。
因此,可以判断A选项错误。
答案为A选项。
35.有以下程序:
程序运行后的输出结果是()。
A11,11
B29,29
C26,29
D121,121
答案:
B
[解析]#define命令是C语言中的一个宏定义命令,标识符一般使用大写,为了区分其他标识符,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
宏定义不进行其他操作,仅仅只是替换标识符。
S(k+j+2)=k+j+2*k+j+2/k+j+2,经计算可得29,S(j+k+2)=j+k+2*k+j+2/j+k+2,经计算可得29。
因此输出为29,29。
答案为B选项。
36.若有定义:
typedefint*T[10];Ta;则以下选项与上述定义中a的类型完全相同的是()。
Aint*a[10];
Bint(*a)[10];
Cinta[10];
Dint(*a[10])();
答案:
A
[解析]C语言允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取”别名”。
类型定义符typedef即可用来完成此功能,可以完全代替原来的类型说明符。
因此,变量a的类型为int*a[10]。
typedefint*T[10],由于[]运算符优先级高于*,可以看成typedefint[10]*T,替换T可得int[10]*a=>int*a[10],因此,答案为A选项。
37.有以下程序:
程序运行后的输出结果是()。
A6,5,4,3,2,1,
B1,2,3,4,5,6,
C1,1,1,1,1,1
D6,6,6,6,6,6,
答案:
A
[解析]fopen("data.dat","w+");w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失,若文件不存在则建立该文件。
rewind(fp);使文件fp的位置指针指向文件开始。
fprintf(fp,"%d\n",a[5-i]);将a[i]输出到fp指向的文件中。
fscanf(fp,"%d",&k);将fp读入到变量k中,第一个for循环将数组中元素倒着输入到fp指向的文件中。
rewind();则指向文件开始,因此打印的是数组a的倒叙。
故打印结果为6,5,4,3,2,1。
答案为A选项。
38.有以下程序:
程序运行后的结果是()。
A有运行错误
B输出11.10
C输出12.10
D输出21.10
答案:
A
[解析]calloc(n,sizeof(type))在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针,如果分配不成功,返回NULL。
s在函