2024-06-05 06:01:58
2012年3月全国计算机等级考试二级C语言真题及答案如下:
(考试时间90分钟,满分100分)
一、 选择题
1、 下列叙述中正确的是:
A、循环队列是队列的一种顺序存储结构
B、循环队列是队列的一种链式存储结构
C、循环队列是非线性结构
D、循环队列是一直逻辑结构
1)【答案】A
【解析】为了充分利用存储空间,可以把顺序队列看成一个环状空间,即把顺序队列的头尾指针相连,这样的队列称之为循环队列。它是对顺序队列的改进,故循环队列是队列的一种顺序存储结构
2、 下列叙述中正确的是
A、栈是一种先进先出的线性表
B、队列是一种后进先出的线性表
C、栈和队列都是非线性结构
D、以上三种说法都不对
(2)【D】
【解析】栈是一种后进先出的线性表,队列是一种先进先出的线性表,二者均是线性结构,故选项A)、B)、C)均不对,答案为选项D)。
3、 一棵二叉树共有25个节点,其中5个时子节点,那么度为1的节点数为
A、4 B、6 C、10 D、16
【D】
【解析】由二叉树的性质n0=n2+1可知,度为0的结点数(即叶子结点数)=度为2的结点数+1,根据题意得知,度为2的结点数为4个,那么25-5-4=16即为度为1的结点数,选项D)正确
4、 在下列模式中,能够给出数据库物理存储结构与物理存取方法的是
A、内模式 B、外模式 C、概念模式 D、逻辑模式
【答案】A
【解析】内模式也称存储模式,它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述。所以选项A)正确。
5、 在满足实体完整性约束的条件下
A、一个关系中可以没有候选关键词
B、一个关系中只能有一个候选关键词
C、一个关系中必须有多个候选关键词
D、一个关系中应该有一个或者多个候选关键词
【答案】D
【解析】在关系R中如记录完全函数依赖于属性(组)X,则称X为关系R中的一个候选关键字。在一个关系中,候选关键字可以有多个且在任何关系中至少有一个关键字。所以在满足数据完整性约束的条件下,一个关系应该有一个或多个候选关键字,所以选项D)正确。
6、 有三个关系R、S和T如下:
R
A B C
a 1 2
b 2 1
c 3 1
则由关系R和S得到关系T的操作是
A、自然连接 B、并 C、差 D、交
【答案】C
【解析】R和S的差是由属于R但不属于S的元组组成的集合,运算符为“-”。记为T=R-S。根据本题关系R和关系S运算前后的变化,可以看出此处进行的是关系运算的差运算
7、 软件生命周期中的活动不包括
A、软件维护 B、市场调研 C、软件测试 D、需求分析
【答案】B
【解析】通常把软件产品从提出、实现、使用、维护到停止使用(退役)的过程称为软件生命周期。可以将软件生命周期分为软件定义、软件开发及软件运行维护三个阶段。软件生命周期的主要活动阶段是可行性研究与计划制定、需求分析、软件设计、软件实现、软件测试、运行和维护。软件生命周期不包括市场调研。
8、 下面不属于需求分析阶段任务的是
A、确定软件系统的功能需求 B、确定软件系统的系统的系能需求
B、制定软件集成测试计划 D、需求规格说明书审评
【答案】C
【解析】需求分析是对待开发软件提出的需求进行分析并给出详细的定义。主要工作是编写软件需求规格说明书及用户手册。需求分析的任务是导出目标系统的逻辑模型,解决“做什么”的问题。制定软件集成测试计划是软件设计阶段需要完成的任务
9、 在黑盒测试方式中,设计测试用例的主要根据是
A、程序外部功能 B、程序内部逻辑
C、程序数据结构 D、程序流程图
【答案】A
【解析】黑盒测试也称功能测试或数据驱动测试,设计测试用例着眼于程序外部结构、不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。
10、 在软件设计中不使用的工具是
A、系统结构图 B、程序流程图
C、PAD图 D、数据流图(DFD图)
【答案】D
【解析】软件设计包括概要设计和详细设计,软件概要设计中,面向数据流的设计方法有变换型系统结构图和事务型数据流两种。软件详细设计,程序流程图(PDF)和PAD(问题分析图)是过程设计的常用工具。数据流图(DFD图)是软件定义阶段结构化分析方法常用的工具。
11、针对简单程序设计,以下叙述的实施步骤正确的是
A、确定算法和数据结构、编码、调试、整理文档
B、编码、确定算法和数据结构、调试、整理文档
C、整理文档、确定算法和数据结构、编码、调试
D、确定算法和数据结构、调试、编码、整理文档
【答案】A)
【解析】简单程序设计的步骤是首先要确定算法和数据结构,然胡编码、调试,最后整理相关文档。
12、关于C语言中数的表示,以下叙述正确的是
A、只有整型数在允许范围内能精确无误的表示,实型数会有误差
B、只要在在允许范围内整型和实型都能精确表示
C、只有实型数在允许范围内能精确无误的表示,整型数会有误差
D、只有八进制表示的数在不会有误差
【答案】A)
【解析】实型数据在内存中存储的二进制位数是有限的,例如float型数据在内存中有24位二进制尾数。而一个十进制实数转化为二进制实数时,其有效数字位数有可能会超过尾数的存储长度,从而导致有效数字丢失而产生误差
13、以下关于算法叙述错误的是
A、算法可以用伪代码、流程图等多种形式来描述
B、一个正确的算法必须有输入
C、一个正确的算法必须有输出
D、用流程图可以描述的算法可以用任何一种计算机高级语言编写成程序代码
【答案】B)
【解析】一个正确的算法可以有零个或者多个输入,必须有一个或者多个输出
14、以下叙述错误的是
A、一个C程序可以包含多个不同名的函数
B、一个C程序只能有一个主函数
C、C程序在书写时,有严格的缩进要求,否则不能编译通过
D、C程序的主函数必须用main作为函数名
【答案】C)
【解析】一个C程序有且只有一个主函数 main()。一个C 程序可以包含多个不同名字的子函数。C程序在书写时没有严格的缩进要求。
15、设有以下语句
Char ch1,ch2, scanf(”%c%c”,&ch1,&ch2);
若要为变量ch1和ch2分别输入字符A和B,正确的输入形式应该是
A、A和B之间用逗号间隔 B、A和B之间不能有任何间隔符
C、A和B之间可以用回车间隔 D、A和B之间用空格间隔
【答案】B)
【解析】考察C语言中输入格式,因为在输入格式中定义好了”%c%c”,其中没有任何符号,所以中间不能加任何字符,包含不能加逗号、回车和空格,因为这些也算是字符。所以在输入时也不可以有任何间隔符号。
16、以下选项中非法的字符常量是
A、’\102’ B、’\65’ C、’\xff’ D、’\019’
【答案】D)
【解析】字符常量有两种表示方法:
一种是用该字符的图形符号,如'b' ,'y','*'。另外还可以用字符的ASCII码表示,即用反斜符(\)开头,后跟字符的ASCII码,这种方法也称为转义序列表示法,具体方法是:有两种形式:一种是用字符的八进制ASCII码,表示为:\odd.这里,ddd是八进制值(o可以省略)。另一种使用字符的十六进制ASCII码值,表示为 \0xhh或0Xhh 这里hh是两位十六进制值。
本题中D)选项‘\019'使用是八进制表示,不应该出现9,所以错误
17、有以下程序
#include <sthio.h>
Main()
{
Int A=0,B=0,C=0;
C=(A-=A-5);(A=B,B+=4);
Printf(“%d, %d, %d\n”,A,B,C)
}
程序运行后输出的结果是
A 0,4,5 B 4,4,5 C 4,4,4 D 0,0,0
【答案】A)
【解析】考察C语言关于赋值的应用,首先执行a-=a-5,即a=a-(a-5),使得a的值为5,然后执行c=(a-=a-5),即将a的值5赋给变量c,使得c的值也为5。然后执行下句逗号表达式中的a=b,把b的值0赋给a,此时a的值为0,然后执行b=b+4,使得b的值为4。最后打印输出。
18、设变量均已正确定义并且赋值,以下与其他三组输出结构不同的一组语句是
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);
【答案】D)
【解析】本题考察自增运算符,++x表示先将x值加1后再用,x++表示先使用x值,用后加1,所以本题中ABC选项都会输出x+1的值,只有D选项会输出x值。
19、以下选项中,能表示逻辑值“假”的是
A 1 B 0.000001 C 0 D 100.0
【答案】C)
【解析】在C语言中非0的值表示真,0表示假
20、有以下程序
#include <sthio.h>
Main()
{ int a;
Scanf(“%d”,&a);
If(a++<9) printf((“%d\n”,a);
Else printf((“%d\n”,a--);
}
程序运行时键盘输入9<回车>,则输出的结构是
A、10 B 11 C 9 D 8
【答案】A)
【解析】考察if语句和自增自减运算符,判断条件中if(a++<9)是先用后加,即a的值为9,所以条件不成立,但是a已经进行了自增1操作,a的值此时为10。执行else语句时,因为打印a--,是先用后减,所以先输出10,然后a的值变为9。
21、有以下程序
#include <sthio.h>
Main()
{int s=0,n;
For (n=0;n<3;n<++)
{switch(s)
{ case 0;
Case 1;s+=1;
Case 2;s+=2;break;
Case 3;s+3;
Case 4;s+=4;
}
printf((“%d\n”,s);
}
}
程序运行后的结果是
A 1,2,4 B 1,3,6 C 3,10,14 D 3,6,10
【答案】C)
【解析】本题考察switch语句的应用,case分支后面如果没有break,那么就会顺序执行下面的case,直到遇到break跳出。所以第一次循环后s的值为3打印输出。第二次s的值为:s=s+3,s=s+4,即为10,打印输出。第三次没有匹配成功直接执行default语句,s=s+4,所以s的值为14,打印输出。
22、若k是int类型变量,且有以下for语句
For(k=-1;k<0;k++) printf(****\n”);
下面关于语句执行情况的叙述中正确的是
A、循环体执行一次 B、循环体执行两次
C、循环体一次也不执行 D、构成无限循环
【答案】A)
【解析】考察for循环语句,本题中k初始值为-1,执行一次循环体,执行完后k值为0,不满足k<0条件,推出循环,所以执行了一次。
23、有以下程序
#include <sthio.h>
Main()
{char A,B,C;
B=’1’;C=’A’
For(A=0;A<6;A++)
{if(A%2) putchar(B+A);
Else putchar(C+A);
}
}
程序运行后输出的结果是
A 1B3D5F B ABCDFE C A2C4E6 D 123456
【答案】C)
【解析】考察for语句和if语句,第一次循环a的值为0 ,a%2也为0 ,条件不满足所以打印的是(c+a)即变量c的值“A”。第二次a的值为1,条件a%2的值为1,条件满足打印字符(b+a)即字符 “2”。第三次a的值为2,条件不满足,打印(a+c)即字符”C”。同理打印后续字符为“4E6”。
24、设有如下定义语句
Int m[ ]={2,4,6,8},*k=m;
以下选项中,表达式的值为6的是
A *(k+2) B k+2 C *k+2 D *k+=2
【答案】A)
【解析】考察数组和指针的概念,本题中*k指向数组m的首地址。*(k+2)现将指针后移两个元素,即为m[2]的首地址,然后取出m[2]的值6,所以选择A选项。选项B的值是一个地址无意义。选项C的值为4。选项D使得m[0]的值为4。
25、fun函数的功能是:通过键盘输入给x所指的整型数组所有元素赋值。在下列划线处应该填写的是
#include <sthio.h>
#define N 5
Viod fun(int x[N])
{int m;
For(m=N-1;m>0;m--) scanf(“%d\n”, );
}
A &x[++m] B &x[m+1] C x+(m++) D x+m
【答案】D)
【解析】考察指针的概念和应用,数组名本身就是地址,所以不需要在用&符号。C选项不能对所有元素赋值而是反复再给一个数值赋值且是死循环。
26、若有函数
Viod fun(double a[], int *n)
{………}
以下叙述中正确的是
A、 调用fun函数时只有数组执行按值传送,其他实参和形参之间执行按地址传送
B、 形参a和n都是指针变量
C、 形参a是一个数组名,n是指针变量
D、 调用fun函数时将把double型实参数组元素一一对应地传送给形参a数组
【答案】B)
【解析】函数中的形参a[]已经退化为一个指针,所以AC都不对,D选项中只是传入一个指针,并没有把数组的元素挨个赋值,正确选项为B。
27、有以下程序
#include <sthio.h>
Main()
{int a,b,k,m,*p1,*p2;
k=1,m=8;
p1=&k,p2=&m;
a=/*p1-m; b=*p1+*p2+6;
printf(“%d ”,a); printf(“%d\n”,b);
}
编译时编译器提示错误信息,你认为出错的语句是
A、a=/*p1-m B、b=*p1+*p2+6
C、k=1,m=8; D、p1=&k,p2=&m;
【答案】A)
【解析】选项A中a = /*p1-m;表示方式不正确,未能正确表示出含义
28、以下选项中有语法错误的是
A char *str[ ]={“guest”}; B、char str[10 ]={“guest”};
C、char *str[3] *str[1]={“guest”}; D、char str[3][10];str[1]={“guest”};
【答案】D)
【解析】考察指针数组的概念,D选项中str为二维字符数组,不能够直接把一个字符串赋值到二维数组的某一行中。
29、avg函数的功能是求整型数组中的前若干个元素的平均值,设数组元素个数最多不超过10,则下列函数说明语句错误的是
A、int avg(int *a,int n); B、int avg(int a[10],int n);
C、int avg(int a,int n) ; D、int avg(int a[],int n);
【答案】C)
【解析】考察函数声明基本用法,C选项中函数的第一形参没有指名是数组,代表的是一个整型数,声明不正确。
30、有以下函数
#include <sthio.h>
#include <string.h>
main()
{ printf(“%d\n”,strren”ATS\n012\1”) );}
程序运行后的输出结果是
A 3 B 8 C 4 D 9
【答案】B)
【解析】考察转义字符的用法,strlen函数的作用是求得字符串长度,\n与\1均是反义字符各表示一个字符所以打印值为8。
31、有以下函数
#include <sthio.h>
main()
{ char a[20],b[20],c[20];
scanf(”%s%s”,a,b);
get(c);
printf(”%s%s\n”,a,b,c);
}
程序运行时从第一行开始输入 this is a cat!<回车>,则输出结果是
A thisisacat! B this is a C thisis a cat! D thisisa cat!
【答案】C)
【解析】考察scanf和gets输入字符串的区别,scanf语句接收字符时遇到空格就作为一个字符串的结束,所以a数组中为this ,b数组中为is,但是getchar函数见到回车才认为结束所以c数组为 a cat!。所以打印结果如选项C。
32、有以下函数
#include <sthio.h>
viod fun(char c)
{if(c>’x’) fun(c-1);
printf (“%c”,c);
}
main()
{fun”z”;}
程序运行输出结果是
A xyz B wxyz C zyxw D zyx
【答案】A)
【解析】考察函数的嵌套调用,当运行fun(‘z’),调用fun(‘y’),然后嵌套调用fun(‘x’),输出结果为先输出x,然后输出y,最后输出z。
33、有以下函数
#include <sthio.h>
viod func(int n)
{int i;
for(i=0;i<=n;i++) printf(“*”);
printf(“#”);
main()
{ func(3); printf(“????”); func(4); printf(“\n”); }
程序运行输出结果是
A ****#????***# B ***#????*****#
C **#????*****# D ****#????*****#
【答案】D)
【解析】考察for循环函数调用,执行fun(3)是输出****,然后输出#,执行fun(4)时输出*****,然后输出#,所以选项D)正确。
34、有以下函数
#include <sthio.h>
viod fun(int *s)
{staic int j=0;
do {s[j]=s[j]+s[j+1];} wihle(++j<2);
}
main()
{int k,a[10]={1,2,3,4,5};
for(K+1;k<3;k++) fun(a);
for(K+1;k<5;k++) printf(“%d”,a[k]);
printf(“\n”);
}
程序运行输出结果是
A 12345 B 23445 C 34756 D 35745
【答案】D)
【解析】考察静态局部变量,静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义,它的生存期为整个源程序。
(2)静态局部变量只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋以0值。
(4) 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。
根据这个特点,函数第一次调用时,会将数组a变为35345,当第二次调用时,函数内的j值为2,所以会将数组a的第三个元素更改为7,所以最终结果为35745,选项D)正确。
35、有以下函数
#include <sthio.h>
#define S(x) (x)*x*2
main()
{int k=5,j=2;
printf(“%d,”,S[k+j]); printf(“%d\n”,S(k-j)));
}
程序运行输出结果是
A 98,18 B 39,11 C39,18 D98,11
【答案】B)
【解析】考察宏定义的使用,根据该宏的定义,S(k+j)=(k+j)*k+j*2=39, S(k-j)=(k-j)*k-j*2=11,所以答案为39,11选项B)正确。
36、有以下函数
#include <sthio.h>
Viod exch(int t[ ])
{t[0]=t[5];}
{int x[10]={1,2,3,4,5,6,7,8,9,10},i=0;
While(i<=4) {exch(&x[i])’i++;}
for(i=0;i<5;i++) printf(“%d”,x[i]);
printf(“\n”);
}
程序运行输出结果是
A 2 4 6 8 10 B 1 3 5 7 9 C 1 2 3 4 5 D 6 7 8 9 10
【答案】D)
【解析】通过分析代码,可以看出来,函数的作用就是把数组某个元素的变为这个元素位置加5后对用的元素值,所以执行完之后输出数组x的前五个元素的值,其实就是数组x的后五个元素的值,即6 7 8 9 10
37、设有以下程序段
Struct MP3
{char name[20];
Char color;
Float price;
}std,*ptr;
ptr=& std;
若要引用结构体变量std中的color成员,写法错误的是
A std.color B ptr-> color C std-> color D (*ptr) .color
【答案】C)
【解析】考察结构体的用法,在引用结构体中的成员变量时,可以使用’.’来引用,当指针指向结构体时,可以使用’->’来指向结构体重的成员,C选项引用错误
38、有以下函数
#include <sthio.h>
struct stu
{int mun; char name[10]; int age;};
viod fun(struct stu *p)
{ printf(“%s\n”,p->name);}
mian()
{ struct stu x[3]={{01,”zhang”,20},{02,”wang”,19},{03,”zhao”,18}};
fun(x+2);
}
程序运行输出结果是
A zhang B zhao C wang D 19
【答案】B)
【解析】考察结构体的用法,结构体数组存储了三个人的信息,x+2代表了指向第三个元素,所以输出name为Zhao。
39、有以下函数
#include <sthio.h>
mian()
{int a=12,c;
c=(a<<2)<<1;
printf(“%d\n”,c):
}
程序运行输出结果是
A 3 B 50 C 2 D 96
【答案】D)
【解析】考察移位操作,执行c=(a<<2)<<1语句时,首先是 a左移两位,其等效于将a乘以4,得到48,然后将48左移一位,相当于是乘以2,所以结果为c=96,选项D正确
40、以下函数不能用于向文件写入数据的是
A ftell B fwrite C fputc D fprintf
【答案】A)
【解析】考察文件的操作,函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。调用函数ftell()就能非常容易地确定文件的当前位置。不能写入数据,其他三个选项都可以向文件中写入。