1、全国计算机等级考试二级 C 语言真题 2012 年 3 月及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(1)-(10)、(21)-(4(总题数:40,分数:70.00)1.下列叙述中正确的是( )。 (分数:2.00)A.循环队列是队列的一种顺序存储结构B.循环队列是队列的一种链式存储结构C.循环队列是非线性结构D.循环队列是一直逻辑结构2.下列叙述中正确的是( )。 (分数:2.00)A.栈是一种先进先出的线性表B.队列是一种后进先出的线性表C.栈和队列都是非线性结构D.以上三种说法都不对3.一棵二叉树共有 25 个节点,其中 5 个时子节点,那么度为 1 的节点数为(
2、)。 (分数:2.00)A.4B.6C.10D.164.在下列模式中,能够给出数据库物理存储结构与物理存取方法的是( )。 (分数:2.00)A.内模式B.外模式C.概念模式D.逻辑模式5.在满足实体完整性约束的条件下( )。 (分数:2.00)A.一个关系中可以没有候选关键词B.一个关系中只能有一个候选关键词C.一个关系中必须有多个候选关键词D.一个关系中应该有一个或者多个候选关键词6.有三个关系 R、S 和 T 如下: (分数:2.00)A.自然连接B.并C.差D.交7.软件生命周期中的活动不包括( )。 (分数:2.00)A.软件维护B.市场调研C.软件测试D.需求分析8.下面不属于需求
3、分析阶段任务的是( )。 (分数:2.00)A.确定软件系统的功能需求B.确定软件系统的系统的系能需求C.制定软件集成测试计划D.需求规格说明书审评9.在黑盒测试方式中,设计测试用例的主要根据是( )。 (分数:2.00)A.程序外部功能B.程序内部逻辑C.程序数据结构D.程序流程图10.在软件设计中不使用的工具是( )。 (分数:2.00)A.系统结构图B.程序流程图C.PAD 图D.数据流图(DFD 图)11.针对简单程序设计,以下叙述的实施步骤正确的是( )。 (分数:1.00)A.确定算法和数据结构、编码、调试、整理文档B.编码、确定算法和数据结构、调试、整理文档C.整理文档、确定算法
4、和数据结构、编码、调试D.确定算法和数据结构、调试、编码、整理文档12.关于 C 语言中数的表示,以下叙述正确的是( )。 (分数:1.00)A.只有整型数在允许范围内能精确无误的表示,实型数会有误差B.只要在在允许范围内整型和实型都能精确表示C.只有实型数在允许范围内能精确无误的表示,整型数会有误差D.只有八进制表示的数在不会有误差13.以下关于算法叙述错误的是( )。 (分数:1.00)A.算法可以用伪代码、流程图等多种形式来描述B.一个正确的算法必须有输入C.一个正确的算法必须有输出D.用流程图可以描述的算法可以用任何一种计算机高级语言编写成程序代码14.以下叙述错误的是( )。 (分数
5、:1.00)A.一个 C 程序可以包含多个不同名的函数B.一个 C 程序只能有一个主函数C.C 程序在书写时,有严格的缩进要求,否则不能编译通过D.C 程序的主函数必须用 main 作为函数名15.设有以下语句 Char ch1,ch2, scanf(”%c%c”, 若要为变量 ch1 和 ch2 分别输入字符A 和 B,正确的输入形式应该是( )。 (分数:1.00)A.A 和 B 之间用逗号间隔B.A 和 B 之间不能有任何间隔符C.A 和 B 之间可以用回车间隔D.A 和 B 之间用空格间隔16.以下选项中非法的字符常量是( )。 (分数:1.00)A./102B./65C./xffD.
6、/01917.有以下程序 #include Main() Int A=0,B=0,C=0; C=(A-=A-5);(A=B,B+=4); Printf(“%d, %d, %d/n”,A,B,C) 程序运行后输出的结果是( )。 (分数:1.00)A.0,4,5B.4,4,5C.4,4,4D.0,0,018.设变量均已正确定义并且赋值,以下与其他三组输出结构不同的一组语句是( )。 (分数:1.00)A.x+; printf(“%d/n”,x);B.n=+x; printf(“%d/n”,n);C.+x; printf(“%d/n”,x);D.n=x+; printf(“%d/n”,n);19.
7、以下选项中,能表示逻辑值“假”的是( )。 (分数:1.00)A.1B.0.000001C.0D.100.020.有以下程序 #include Main() int a; Scanf(“%d”, If(a+,则输出的结构是( )。 (分数:1.00)A.10B.11C.9D.821.有以下程序 #include Main() int s=0,n; For (n=0;n0;m-) scanf(“%d/n”, ); (分数:2.00)A. k=1,m=8; p1= a=/*p1-m; b=*p1+*p2+6; printf(“%d ”,a); printf(“%d/n”,b); 编译时编译器提示错
8、误信息,你认为出错的语句是( )。 (分数:2.00)A.a=/*p1-mB.b=*p1+*p2+6C.k=1,m=8;D.p1=28.以下选项中有语法错误的是( )。 (分数:2.00)A.char *str =“guest”;B.char str10 =“guest”;C.char *str3 *str1=“guest”;D.char str310;str1=“guest”;29.avg 函数的功能是求整型数组中的前若干个元素的平均值,设数组元素个数最多不超过 10,则下列函数说明语句错误的是( )。 (分数:2.00)A.int avg(int *a,int n);B.int avg(i
9、nt a10,int n);C.int avg(int a,int n) ;D.int avg(int a,int n);30.有以下函数 #include #include main() printf(“%d/n”,strren”ATS/n012/1”) ); 程序运行后的输出结果是( )。 (分数:2.00)A.3B.8C.4D.931.有以下函数 #include main() char a20,b20,c20; scanf(”%s%s”,a,b); get(c); printf(”%s%s/n”,a,b,c); 程序运行时从第一行开始输入 this is a cat!,则输出结果是(
10、)。(分数:2.00)A.thisisacat!B.this is aC.thisis a cat!D.thisisa cat!32.有以下函数 #include viod fun(char c) if(cx) fun(c-1); printf (“%c”,c); main() fun”z”; 程序运行输出结果是( )。 (分数:2.00)A.xyzB.wxyzC.zyxwD.zyx33.有以下函数 #include viod func(int n) int i; for(i=0;i colorC.std- colorD.(*ptr) .color38.有以下函数 #include struc
11、t stu int mun; char name10; int age; viod fun(struct stu *p) printf(“%s/n”,p-name); mian() struct stu x3=01,”zhang”,20,02,”wang”,19,03,”zhao”,18; fun(x+2); 程序运行输出结果是( )。 (分数:2.00)A.zhangB.zhaoC.wangD.1939.有以下函数 #include mian() int a=12,c; c=(a0;m-) scanf(“%d/n”, ); (分数:2.00)A. k=1,m=8; p1= a=/*p1-m;
12、 b=*p1+*p2+6; printf(“%d ”,a); printf(“%d/n”,b); 编译时编译器提示错误信息,你认为出错的语句是( )。 (分数:2.00)A.a=/*p1-m B.b=*p1+*p2+6C.k=1,m=8;D.p1=解析:【解析】选项 A 中 a = /*p1-m;表示方式不正确,未能正确表示出含义。28.以下选项中有语法错误的是( )。 (分数:2.00)A.char *str =“guest”;B.char str10 =“guest”;C.char *str3 *str1=“guest”;D.char str310;str1=“guest”; 解析:【解析
13、】考察指针数组的概念,D 选项中 str 为二维字符数组,不能够直接把一个字符串赋值到二维数组的某一行中。29.avg 函数的功能是求整型数组中的前若干个元素的平均值,设数组元素个数最多不超过 10,则下列函数说明语句错误的是( )。 (分数:2.00)A.int avg(int *a,int n);B.int avg(int a10,int n);C.int avg(int a,int n) ; D.int avg(int a,int n);解析:【解析】考察函数声明基本用法,C 选项中函数的第一形参没有指名是数组,代表的是一个整型数,声明不正确。30.有以下函数 #include #inc
14、lude main() printf(“%d/n”,strren”ATS/n012/1”) ); 程序运行后的输出结果是( )。 (分数:2.00)A.3B.8 C.4D.9解析:【解析】考察转义字符的用法,strlen 函数的作用是求得字符串长度,/n 与/1 均是反义字符各表示一个字符所以打印值为 8。31.有以下函数 #include main() char a20,b20,c20; scanf(”%s%s”,a,b); get(c); printf(”%s%s/n”,a,b,c); 程序运行时从第一行开始输入 this is a cat!,则输出结果是( )。(分数:2.00)A.th
15、isisacat!B.this is aC.thisis a cat! D.thisisa cat!解析:【解析】考察 scanf 和 gets 输入字符串的区别,scanf 语句接收字符时遇到空格就作为一个字符串的结束,所以 a 数组中为 this ,b 数组中为 is,但是 getchar 函数见到回车才认为结束所以 c 数组为 a cat!。所以打印结果如选项 C。32.有以下函数 #include viod fun(char c) if(cx) fun(c-1); printf (“%c”,c); main() fun”z”; 程序运行输出结果是( )。 (分数:2.00)A.xyz
16、B.wxyzC.zyxwD.zyx解析:【解析】考察函数的嵌套调用,当运行 fun(z),调用 fun(y),然后嵌套调用 fun(x),输出结果为先输出 x,然后输出 y,最后输出 z。33.有以下函数 #include viod func(int n) int i; for(i=0;i colorC.std- color D.(*ptr) .color解析:【解析】考察结构体的用法,在引用结构体中的成员变量时,可以使用.来引用,当指针指向结构体时,可以使用-来指向结构体重的成员,C 选项引用错误。38.有以下函数 #include struct stu int mun; char name
17、10; int age; viod fun(struct stu *p) printf(“%s/n”,p-name); mian() struct stu x3=01,”zhang”,20,02,”wang”,19,03,”zhao”,18; fun(x+2); 程序运行输出结果是( )。 (分数:2.00)A.zhangB.zhao C.wangD.19解析:【解析】考察结构体的用法,结构体数组存储了三个人的信息,x+2 代表了指向第三个元素,所以输出 name 为 Zhao。39.有以下函数 #include mian() int a=12,c; c=(a2)A.3B.50C.2D.96
18、解析:【解析】考察移位操作,执行 c=(a2)40.以下函数不能用于向文件写入数据的是( )。 (分数:2.00)A.ftell B.fwriteC.fputcD.fprintf解析:【解析】考察文件的操作,函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。调用函数 ftell()就能非常容易地确定文件的当前位置。不能写入数据,其他三个选项都可以向文件中写入。二、填空题(每空 2 分,共 30 分)(总题数:15,分数:30.00)41.将长度为 n 的顺序存储在线性表中删除一个元素,最坏
19、情况下需要移动表中的元素个数为 1。(分数:2.00)填空项 1:_ (正确答案:【1】n-1)解析:【解析】在顺序表中删除一个元素,最坏情况是删除第一个元素,后面的(n-1)个元素均要向前移动,所以此处填 n-1。42.设循环队列的存储空间为 Q(1:3),初始状态为 front=rear=30。现经过一系列入队与退队运算后,front=16,rear=15,则循环队列中有 1 个元素。(分数:2.00)填空项 1:_ (正确答案:【2】29)解析:【解析】通过题干的描述可知此循环队列共 30 个空间,另外队尾指针 rear 的值小于队头指针front 的值,所以利用公式(rear-fron
20、t+30)%30=29,可知此循环队列的元素个数为 29。43.数据库管理系统提供的数据语言中,负责数据的增、删、改和查询的是 1。 (分数:2.00)填空项 1:_ (正确答案:【3】数据操纵语言)解析:【解析】数据操纵语言 DML(Data Manipulation Language),用户通过它可以实现对数据库的基本操作。例如,对表中数据的查询、插入、删除和修改。 在 DML 中,应用程序可以对数据库作插、删、改、排、检等五种操作。44.在将 E-R 图转换到关系模式时,实体和联系都可以表示成 1。 (分数:2.00)填空项 1:_ (正确答案:【4】关系)解析:【解析】关系数据库逻辑设
21、计的主要工作是将 E-R 图转换成指定 RDBMS 中的关系模式,这种转换是比较直接的,实体与联系都可以表示成关系。45.常见的软件工程方法有结构化方法和面向对象方法,类、继承以及多态性等概念属于 1。(分数:2.00)填空项 1:_ (正确答案:【5】面向对象方法)解析:【解析】面向对象方法是一种基于对象模型的程序设计方法,包括面向对象分析、面向对象设计、面向对象编程,是目前应用范围最广的设计方法。其中对象模型 包括六个要素:封装、抽象、模块化、层次结构、类、并发性。面向对象方法的主要特征是封装、继承和多态性,所以此空应填面向对象方法。46.设变量 a 和 b 已定义为 int 类型,若要通
22、过 scanf(”a=%d,b=%d”,语句分别给 a 和 b 输入1 和 2,则正确的数据输入内容是 1。(分数:2.00)填空项 1:_ (正确答案:a=1,b=2)解析:【解析】scanf-|_|-函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息,其调用格式为: scanf(“,),scanf(“a=%d,b=%d“, a+=a%=9; printf(“%d/n”,a); (分数:2.00)填空项 1:_ (正确答案:2)解析:【解析】a+=a%=9; 其中 a%=9 等价于 a=a%9; 结果为 1, 所以 a+=a%=9 等价于 a=a+1,故答案为 2.48.设 AB
23、c 都是整型变量,如果 a 的值为 1,b 的值为 2,则执行 c=a+|b+;语句后,变量 b 的值是 1。(分数:2.00)填空项 1:_ (正确答案:2)解析:【解析】a|b 若 a,b 都为假,则 a|b 为假,其他都为真. 如果 a 为真时,则对 b 不进行真假,所以对于 c=a+|b+, 因为 a+时为真,所以 b+不进行判断,b 的值保持不变,故 b=2。49.有以下程序段 s=1.0; for(k=1,k=n;k+) s=s+1.0(k*(k+1); printf(“%f/n”,s); 请填空,使以下程序段的功能与上面的程序段完全相同。 s=1.0; k=1; while1 s
24、=s+1.0(k*(k+1); k=k+1; printf(“%f/n”,s); (分数:2.00)填空项 1:_ (正确答案:k=n)解析:【解析】for 和 while 都是循环语句,可以实现相同的功能。50.以下程序段的输出结果是 1。 #include mian2 char a,b; for(a=0;a填空项 1:_ (正确答案:074)解析:【解析】本题第一次循环时 a 的值为 0,b 的值为 0 所以打印字符0。第二次循环时 a 的值为7,b 的值为 7,所以打印字符7。第三次 a 的值为 14,b 的值为 4,打印字符4。51.以下程序段的输出结果是 1。 #include mi
25、an2 char *ch4=“red”,”green”,”blue”; Int i=0; While(chi); putchar(chi0; i+; (分数:2.00)填空项 1:_ (正确答案:rgb)解析:【解析】char * ch4是指针数组,数组元素全为 char 类型指针, 由于数组元素均为指针,因此chi是指第 i 个字符串的指针,chi0为指向第 i 个字符串的首地址。52.有以下程序 #include mian1 int arr=1,3,5,7,2,4,6,8, i, start; Scanf(“%d”, For(i=0,i,则输出结果为 2。 (分数:2.00)填空项 1:_
26、 (正确答案:572)解析:【解析】第一次循环打印 arr10%8即 arr2的值,为 5。第二次循环打印 arr11%8即 arr3的值,为 7。第三次循环打印 arr12%8即 arr4的值,为 2。53.以下程序的功能是输出 a 数组中的所有字符串,请填空 #include mian1 char *a=“ABC”,”DEFGH”,”IJ”,”KLMNOP”; Int i=0; For(;i填空项 1:_ (正确答案:ai)解析:【解析】char *a 为指针数组, ai为指向第 i 个字符串的指针。54.以下程序的输出结果是 1。 #include #include #include m
27、ian2 char *p, *q, *r; p=q=r=(char *)malloc(sizeof(char)*20); strcpy(p,”attaboy,welcome!”); printf(“%c%c%c/n”,p11, q3, r4); free(p); (分数:2.00)填空项 1:_ (正确答案:cab)解析:【解析】p=q=r=(char*)malloc(sizeof(char)*20);等价于 r=(char*)malloc(sizeof(char)*20); q=r; p=q,所以 p,q,r,指向相同的地址。55.设文件 test.txt 中原已写入字符串 Begin,执行以下程序后,文件中的内容为 1。 #include mian2 file *fp; fp=fopen(“test.txt”,”w+”); fputs(“test”,fp); fclose(fp); (分数:2.00)填空项 1:_ (正确答案:test)解析:【解析】fopen 函数功能是打开一个文件,函数原型 FILE * fopen(const char * path,const char * mode); 当 mode 为 w+,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件.fputs 将字符串写入到 fp 中.所以文件内容为 test。