全国计算机等级考试二级C语言真题题库
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全国计算机等级考试二级C语言真题题库2 2014年3月
(总分43, 做题时间120分钟)
一、选择题(每小题1分,共40分)
1. 下列叙述中正确的是()。
A 每一个节点有两个指针域的链表一定是非线性结构
B 所有节点的指针域都为非空的链表一定是非线性结构
C 循环链表是循环队列的链式存储结构
D 线性结构的存储节点也可以有多个指针
答案:D
[解析]一个非空的数据结构如果满足以下两个条件:有且只有一个根节点;每一个节点最多有—个前件,也最多有一个后件,则称为线性结构,在数据结构中习惯称为线性表。
双向链表节点具有两个指针域,属于线性结构,故A选项错误。
循环链表所有节点的指针域都为非空,属于线性结构,故B选项错误。
循环链表是链表,循环队列属于队列,队列只能在队尾入队,在排头退队,链表可以在任何位置插入、删除,故C选项错误。
双向链表节点具有多个指针域,故D选项正确。
2. 使用白盒测试方法时,设计测试用例应根据()。
A 程序的内部逻辑
B 程序的复杂结构
C 程序的功能
D 使用说明书
答案:A
[解析]白盒测试又称为结构测试或逻辑驱动测试,它允许测试人员利用程序内部的逻辑结构及有关信息来设计或选择测试用例,对程序所有的逻辑路径进行测试,故A选项正确。
3. 在医院,每个医生只属于某一个诊疗科,医生同一天可为多位患者看病,而一名患者可在多个科室治疗,则实体医生和患者之间的联系是()。
A 多对多
B 多对一
C 一对多
D 一对一
答案:A
[解析]一般来说,实体集之间必须通过联系来建立连接关系,分为三类:一对一联系(1:1)、一对多联系(1:m)、多对多联系(m:n)。
医生可为多位患者看病,患者也可以找多位医生看病,实体医生与患者联系是多对多,故A选项正确。
4. 设序列长度为n,在最坏情况下,时间复杂度为O(log2n)的算法是()。
A 二分法查找
B 顺序查找
C 分块查找
D 哈希查找
答案:A
[解析]对长度为n的线性表排序,最坏情况下时间复杂度,二分法查找为O(log2n);顺序查找法为O(n);分块查找时间复杂度与分块规则有关;哈希查找时间复杂度为O(1),因其通过计算HashCode来定位元素位置,所以只需一次即可。
故正确答案为A选项。
5. 设数据集合为D={1,3,5,7,9},D上的关系为R,下列数据结构
B=(D,R)中为非线性结构的是()。
A R={ (5,1),(7,9),(1,7),(9,3)}
B R={ (9,7),(1,3),(7,1),(3,5)}
C R={ (1,9),(9,7),(7,5),(5,3)}
D R={ (1,3),(3,5),(5,9)}
答案:D
[解析]一个非空的数据结构如果满足以下两个条件:有且只有一个根节点;每一个节点最多有一个前件,也最多有一个后件,则称为线性结构,在数据结构中习惯称为线性表。
A选项中,5为根节点,线性表为51793。
B选项中,9为根节点,线性表为97135。
C选项中,1为根节点,线性表为19753。
D选项中,节点1与7都是根节点,属于非线性结构,故D选项正确。
6. 深度为7的二叉树共有127个节点,则下列说法中错误的是()。
A 该二叉树有一个度为1的节点
B 该二叉树是满二叉树
C 该二叉树是完全二叉树
D 该二叉树有64个叶子节点
答案:A
[解析]在树结构中,一个节点所拥有的后件个数称为该节点的度,所有节点中最大的度称为树的度。
完全二叉树指除最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少有边的若干节点。
满二叉树指除最后一层外,每一层上的所有节点都有两个子节点的二叉树。
深度为7的二叉树,前6层共有节点个数为26-1=63,则第7层有127-63=64个节点,即第7层节点数达到最大值,故此二叉树为满二叉树,也是完全二叉树,该二叉树没有度为1的节点,有64个叶子节点。
故正确答案为A选项。
7. 二叉树的中序序列为BDCA,后序序列为DCBA,则前序序列为()。
A DCBA
B BDCA
C ABCD
D BADC
答案:C
[解析]二叉树遍历可以分为3种:前序遍历(访问根节点在访问左子树和访问右子树之前)、中序遍历(访问根节点在访问左子树和访问右子树两者之间)、后序遍历(访问根节点在访问左子树和访问右子树之后)。
本题中中序序列为BDCA,后序序列为DCBA,可知A 为根节点,BDC为左侧节点,C是B右子节点,D是C右子节点,故前序序列为ABCD,C选项正确。
8. 下面能作为软件需求分析工具的是()。
A PAD图
B 程序流程图
C 甘特图
D 数据流程图(DFD图)
答案:D
[解析]软件需求分析方法包括结构化分析方法和面向对象的分析方法两大类,前者常用工具为数据流图(DFD)、数据字典(DD)、判定表、判定树等。
故D选项正确。
选项B是软件功能实现时设计图。
9. 下面不属于对象主要特征的是()。
A 唯一性
B 多态性
C 可复用性
D 封装性
答案:C
[解析]对象的基本特点如下表所示。
可知C选项正确。
10.
A (c,c,11,4)
B (e,e,6,1)
C (a,a,2,4)
D (a,a,2,4)和(e,e,6,1)
答案:A
[解析]从关系中找出满足给定条件的元组的操作称为选择,“∧”为交运算,它由属于前
者且属于后者的元组组成。
题目为选出属于属性B,同时属性C大于4,并且属性D大于3的元组,结果为(c,c,11,4),应保留全部属性。
故A选项正确。
11. C语言整数不包括()。
A 带小数点的整数
B 正整数
C 负整数
D 无符号整数
答案:A
[解析]C语言整数包括正整数、负整数、无符号整数、不含带小数点的整数,故答案为A选项。
12. 设a,b,c是整型变量,且已正确赋初值,以下选项中错误的赋值语句是()。
A a=1%(b=c=2);
B a=(b=3)*c
C a=b=c/10
D a=2=(b=9)=1
答案:D
[解析]D选项中,“()”具有最高优先级,b先赋值9,再根据赋值运算符号白右向左进行赋值,再给b赋值为1,再计算2=b,赋值运算符左边必须是一个变量,但数值2是常量,语法错误,故答案为D选项。
13. 以下选项中,合法的实数是()。
A 1.5E2
B E1.1
C 2.10E
D 1.9E1.4
答案:A
[解析]E表示“10的幂次”,E的右侧必须是整数,排除B、C、D选项、答案为A选项。
14. 关于程序设计基本概念,以下叙述错误的是()。
A 计算机可以直接执行由任意高级语言编写的程序
B 高级语言都有与之对应的编译程序或解释程序
C 用任何一种计算机高级语言都可以把算法转换为程序
D 结构化算法可以解决任何复杂的问题
答案:A
[解析]计算机只能识别机器语言,不能直接识别由高级语言编写的程序,故答案为A 选项。
15. 以下不能用于实型数据的运算符是()。
A %
B /
C *
D +
答案:A
[解析]“%”符号两边必须是整数,因此答案为A选项。
16. C语言中,最基本的数据类型包括()。
A 整型、实型、逻辑型
B 整型、字符型、数组
C 整型、实型、字符型
D 整型、实型、结构体
答案:C
[解析]C语言中,最基本的数据类型包括整型、实型、字符型,答案为C选项。
17. 若有定义:int=0,b=0,c=0,d=0;,有C语言表达式(a++&&
b++)?c++:d++,以下关于其执行顺序的叙述正确是()。
A 先执行a++,表达式a++的值为0,短路,得a++,执行它
B 先执行a++,表达式a++的值为0;再执行b++,表达式b++的值为0,由此可确定(a++&&b++)值为0,因此执行d++
C 先执行a++,表达式a++的值为1;再执行b++,表达式b++的值为1,由此可确定(a++&&b++)值为1,由此可确定(a++&&b++)值为1,因此执行c++
D 先执行b++,表达式b++的值为1;再执行a++,表达式a++的值为1,由此可确定(a++&&b++)值为1,因此执行c++
答案:A
[解析]表达式1?表达式2:表达式3,若表达式1为真,则执行表达式2,否则执行表达式3。
逻辑与运算符遵循“短路求值”策略,即只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解右操作数,表达式(a++&&b++)中,左操作数a++的值为0,已经可以确定整个逻辑表达式的结果为0,因此右操作数b++不再求解,直接执行表达式3,即d++,答案为A选项。
18. 有以下程序:程序运行后的输出结果是()。
A 123
B ABC
C abc
D 012
答案:A
[解析]当满足ch<'E',输出ch-'A',即字符在ASCII码相减进行输出,%d表示输出十进制整数。
循环开始,ch=’B’,print(“%d”,ch-'A')=1,以此类推,答案为A选项。
19. 以下关于指针的叙述,错误的是()。
A 两个基类型相同的指针变量不能指向同一个对象
B 可以通过对指针变量自增、自减来移动指针
C 只有两个类型相同的指针才能进行减运算
D 一个指针变量可以通过不同的方式获得一个确定的地址值
答案:A
[解析]只要两个指针变量基类型相同,可以指向同一个对象,故答案为A选项。
20. 对于函数声明:void fun(float array[],int *ptr);以下叙述正确的是()。
A 调用函数时,array数组的元素和Ptr都是按值传送
B 函数声明有语法错误,参数array缺少数组大小定义
C 调用函数时,array数组中将存储从实参中复制来的元素值
D 函数参数array,ptr都是指针变量
答案:D
[解析]void fun(float array[],int *ptr)定义了2个形参:array[]和*ptr,其中函数形参中int array[]其实相当于int *array,答案为D选项。
21. 有以下程序:
程序运行后的输出结果是()
A 1,0,2,0,0,9
B 1,2,4,9,6,0
C 2,9,0,0,1,4
D 1,2,0,1,4,1
答案:A
[解析]本题定义一个4行2列数组,其中赋值6个数,其余自动为0,根据for循环,第一次输出第一列前三行数,分别是1,0,2;第二次输出第二列前三行数,分别是0,
0,9,因此答案为A选项。
22. 要求定义一个具有6个元素的int型一维数组,以下选项中错误的是()。
A int N=6,a[N];
B int a[2*3] ={0};
C #define N 3
int a[N=N];
D int a[] ={1,2,3,4,5,6};
答案:A
[解析]数组名后面括号内,必须是整型常量,不可以是变量,A选项定义错误,答案为A选项。
执行时若输入以下字符串:Peach flower is Pink.<回车>则输出结果是()。
A Peachflower is pink.
B Peachfloweris Pink.
C Peachflowerispink.
D Peach flower is pink.
答案:A
[解析]由于用“%s”格式输出字符串时,是以空格作为间隔符,因此,输入给b[0]=“Peach”,b[1]=“flower”,而while语句给c赋值时,getchar()能识别空格符,b[2]=“is Pink”,答案为A选项。
程序运行后的输出结果是()。
A agmrw
B ekpuy
C djotx
D flqvz
答案:B
[解析]在for循环中,执行完while语句后,j值为每行字符串的长度,此时a[i][j-1]为字符串数组每个元素的最后一个字符,a[i][j-2]为倒数第二个字符。
因此w[i]=a[i][j—2],比如i=0;j=6,则w[0]=a[0][4]=’e’,循环依次赋值,最后输出’y’,答案为B选项。
程序运行后的输出结果是()。
A 9,7,4,7
B 8,6,9,6
C 8,6,3,6
D 10,8,5,8
答案:A
[解析]由于name是一个长度为9的一维数组,故在内存中占用9字节长度,而其中字符串“c##line”只有7个字符,strlen()函数返回的是该字符串的长度,不包含结束符,str 是一个指针变量,占用4字节长度,但是由于name首地址赋给了str指针变量,在调用strlen()函数时,返回的是指针对应地址单元的字符串的长度7,因此答案为A选项。
26. 有以下程序:
程序运行时,从键盘输入2<回车>,输出结果是
()。
A #y#k#p#f
B #wi#nd#
C xj#oe
D #2222#
答案:A
[解析]首先定义了—个指针P指向数组的首地址,在while语句中,执行功能是如果当前指针指向地址单元内字符不等于空字符’\0’,则输'#'和指针对应地址元素的值在
ASCII码加2后变换的字符常量,因此,答案为A选项。
27. 若有定义:char*ps[]={“aa”,“bb”,“cc”,“dd“};,则以下叙述正确的是()。
A ps[0]是字符串”aa”
B *ps[0]是字符串“aa”的首地址
C ps[0]是字符串”aa”的首地址
D *ps[0]是字符串“aa”
答案:C
[解析]定义一个字符串数组指针ps后,ps是指针变量,ps[0]指向的是数组首个元素的地址,即字符串“aa”的首地址,答案为C选项。
28. 若有定义:char*ps[]={“aa”,“bb”,“cc”,“dd”};,则以下叙述正确的是()。
A *ps[0]是字符'a'
B *ps[0]是字符串“aa”
C ps[0]是字符'a'
D ps是字符串“aa”
答案:A
[解析]指针数组ps[]定义后,ps[0]代表数组首个元素的地址,即“aa”的地址,同时也是“aa”第一个字符a的地址,所以*ps[0]代表字符a,答案为A选项。
29. 以下合法的转义字符是()。
A '\0X41'
B '\0X41'
C '\X41'
D '\X41'
答案:D
[解析]“\xhh”表示1到2位十六进制所代表的字符,故答案为D选项。
30. 在源程序的开始处加上”#include<stdio.h>”进行文件引用的原因,以下叙述正确的是()。
A stdio.h文件中包含标准输人输出函数的函数说明,通过引用此文件以便能正确使用printf、scanf等函数
B 将stdio.h中标准输入输出函数链接到编译生成的可执行文件中,以便能正确运行
C 将stdio.h中标准输入输出函数的源程序插入到引用处,以便进行编译链接
D 将stdio.h中标准输入输出函数的二进制代码插入到引用处,以便进行编译链接
答案:A
[解析]“stdio.h”文件中包含标准输入输出函数的函数说明,预处理指令#include<stdio.h>是指程序可以在该文件中找到printf、scanf等函数,因此答案为A选项。
31. 设有定义:int a[10]={0,1,2,3,4,5,6,7,8,9},*P=a,i;,若0≤i≤9,则对a数组元素的引用错误的是()。
A a[10]
B *(&a[i])
C P[i]
D a[p-a]
答案:A
[解析]长度为n的数组其各个元素的下标应该是从0到n-1,因此,长度为10的数组a,第10个元素为a[9],而不是a[10],故答案为A选项。
32. 有以下程序:程序运行后的输出结果是()。
A 6,1
B 1,1
C 7,1
D 7,2
答案:C
[解析]表达式c=(13>>1)11中,>>是右移符号,数字13换算成二进制后右移1位,再和1进行按位或运算,结果为7;表达式d=(13>1)||1中,首先判断13是否大于1,此时条件成立返回1后,再和1进行或运算,结果为1,因此答案为C选项。
33. 有以下程序:
程序运行后的输出结果是()。
A =
B XXX
C =XX
D X=
答案:A
[解析]主函数首先为结构体定义两个变量s1、s2,分别使用字符串拷贝函数strcpy()为s1和s2的成员name赋值,再将s2中的成员信息赋值给s1,因此输出为“=”,答案为A选项。
34. 有以下程序:程序运行后的输出结果是()。
A 1,2,1,2,0,
B 1,5,0,4,0,
C 1,5,5,4,0,
D 0,4,0,4,0
答案:D
[解析]“&”表示与运算,主函数首先定义一个数组array[6],初始化前4个元素的值,其余默认值为0。
在for循环中,为数组array中每一个元素换算成二进制数后和二进制整数“100”进行按位与运算,再将结果进行输出,因此答案为D选项。
35. 有以下程序:程序的运行结果是()。
A 5
B 2
C 6
D 3
答案:A
[解析]malloc(size)函数作用是在内存的动态存储区分配一个长度为size的连续空间,函数的返回值是新分配的存储区的首地址,将该地址赋值给P指针,然后取P指针的地址,调用fun函数。
fun函数中对指向指针的指针s指向的内存单元赋值,其中x[1]表示二维数组x的第二行的行地址,x[1]+1表示二维数组x的第二行第二列的地址,所以fun函数的功能是将二维数组x的第二行第二列的值,即x[1][1]赋值给**s,*s为p,所以**s代表*P,x[1][1]与a[1][1]等价,因此答案为A选项。
36. 有如下定义:以下对内嵌结构体成员的引用形式错误的是()。
A ps->birth.y
B s.birth.y
C ps.birth.y
D (*ps).birth.y
答案:C
[解析]使用结构体指针对结构体成员进行访问时,形式为结构指针名->结构成员名,或者(*结构指针名).结构成员名,题目中ps为结构体指针,因此判断A选项引用形式错误,答案为c选项。
37. 有以下程序:
程序运行后的输出结果是
()。
A 6
B 21
C 123456
D 654321
答案:A
[解析]本题首先定义文件指针变量fp和一个数组a[],再打开一个文件“data.dat”,随后先给文件写入数据a[0],由于rewind函数是将文件指针从当前位置重新指向文件开始位置,所以for循环依次将数组a中的数据写入文件开始位置,退出循环后,文件中的数据顺序为:654321,重新使指针指向文件开始位置,将此时fp指向的数据(即文件中第一个数据6)写入变量k中,关闭文件,输出k值,故答案为A选项。
38. 以下程序段中,与其他3个功能不同的程序段是()。
A s=0;i=1;
for(;;){s+=i;i++;if(i<=10)break;}
B s=0;i=1;
for(;i<=10;){s+=i;i++;}
C s=0;
for(i=1;i<=10;i++){s+=i;}
D for(s=0,i=1;i<=10;s+=i,i++);
答案:A
[解析]B、C、D选项都表示对1到10进行累加后赋给s,而A选项中含break语句,循环体只执行一次,结束整个循环过程,因此答案为A选项。
39. 设有定义:int a=0,b=1;,以下表达式中,会产生“短路”现象,致使变量b的值不变的是()。
A +a||++b
B a++||++b
C ++a&&b++
D a++&&b++
答案:D
[解析]++放在变量前面时,表示将变量+1,再参与其他操作,a++&&b++时,由于a 值是0,直接判定与运算结果为0,忽视b++的值,因此b值不发生改变,答案为D选项。
40. 关于地址和指针,以下说法正确的是()。
A 通过强制类型转换可以将一种类型的指针变量赋值给另一种类型的指针变量
B 可以取一个常数的地址赋值给同类型的指针变量
C 可以取一个表达式的地址赋值给同类型的指针变量
D 可以取一个指针变量的地址赋值给基类型相同的指针变量
答案:A
[解析]常数的地址存储在内存的常量区,常量区存储的都是常量,值都是不可修改的,所以直接取常量的地址赋给指针变量没有任何意义,c语言也不允许这样做,编译会出错,B选项错误;表达式的值存储在临时变量中,内存中存在专门用来存储临时变量的区域,对这块地址进行操作也是没有意义的,C语言不允许这样做,编译会出错,C选项错误;可以取一个指针变量的地址,但是指针变量的地址属于指针,只能赋值给指针类型的指针变量,D选项错误。
故答案为A选项。
二、程序填空题
41. 给定程序中,函数fun的功能是:将形参指针所指结构体数组中的3个元素按num成员进行升序排列。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:部分源程序给出如下。
不得增行或删行,也不得更改程序的结构!试题程序:
答案:
(1)std[]
(2)PERSON
(3)std
[考点分析]
本题考查:数据类型的定义;数组元素的操作;函数参数的传递。
要使用函数对整个数组进行操作时,应使用数组名作为函数的实参。
当使用数组名作实参时,函数传递的实际上是数组的首地址,而并非数组本身,此时形参除了可以定义为指针变量外,还可以定义为数组,并且数组可以不指定大小,但无论用哪种形式,程序在编译时都将其作为一个指针变量处理。
[解题思路]
填空1:定义形参变量引用数组std,此时形参可以定义为指针变量,也可以定义为数组。
由下文可知,程序是通过数组下标对数组元素进行操作的,因此形参应使用数组形式,而非指针形式。
填空2:程序使用变量temp交换结构体数组元素的值,因而temp应定义为PERSON型。
填空3:程序通过函数fun对数组std进行操作,因此函数的实参应为std。
三、程序修改题
42. 下列给定程序中函数fun的功能是:将m(1≤m≤10)个字符串连接起来,组成一个新串,放人pt所指存储区中。
例如:把3个串“abc”、“CD”、“EF”连接起来,结果是“abcCDEF”。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
答案:
(1)int k,q,i;
(2)pt[i] =str[k][i];
[考点分析]
本题考查:c语言的书写和语法性错误,这类错误比较简单,只要编译程序,根据错误提示修改即可。
[解题思路]
(1)关键字书写错误,定义整型变量的关键字应使用int,而非Int。
(2)数组元素表示错误,表示二维数组元素,应使用方括号将行坐标和列坐标分别括起来,即str[k,i]应改为:str[k][i]。
四、程序设计题
43. 下列程序定义了N × N的二维数组,并在主函数中自动赋值。
请编写函数fun(int a[][N]),该函数的功能是:将数组左下半三角元素中的值全部置
成0。
例如a数组中的值为:则返回主程序后a数组中的值
应为:
注意:部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
试题程序:
注意:部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
试题程序:
答案:
[考点分析]
本题考查:for循环语句,使用嵌套循环语句遍历二维数组的各个元素;二维数组元素的引用。
[解题思路]对于N×N二维数组,如何表示其左下半三角元素,可以通过以下语句实现。
for(i=0;i<n;i++)
for(j=0;j<=i;j++)
外层循环用来控制矩阵的行下标,内层循环控制矩阵的列下标。
注意列下标的取值范围,因为要表示下三角元素,所以j的范围是0~i。