真题和详细解析.docx

上传人:b****5 文档编号:7830839 上传时间:2023-01-26 格式:DOCX 页数:21 大小:42.42KB
下载 相关 举报
真题和详细解析.docx_第1页
第1页 / 共21页
真题和详细解析.docx_第2页
第2页 / 共21页
真题和详细解析.docx_第3页
第3页 / 共21页
真题和详细解析.docx_第4页
第4页 / 共21页
真题和详细解析.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

真题和详细解析.docx

《真题和详细解析.docx》由会员分享,可在线阅读,更多相关《真题和详细解析.docx(21页珍藏版)》请在冰豆网上搜索。

真题和详细解析.docx

真题和详细解析

绝密★启用前

2010年3月全国计算机等级考试二级笔试试卷

C语言程序设计及参考答案

(考试时间90分钟,满分100分)

一、选择题(

(1)—(10)、(21)—(40)每题2分,(11)—(20)每题1分。

共70分)

下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写

在答题卡上,答在试卷上不得分。

(1)下列叙述中正确的是

A)对长度为n的有序链表进行查找,最坏情况下需要的比较次数为n

B)对长度为n的有序链表进行对分查找,最坏情况下需要的比较次数为(n/2)

C)对长度为n的有序链表进行对分查找,最坏情况下需要的比较次数为(log2n)

D)对长度为n的有序链表进行对分查找,最坏情况下需要的比较次数为(nlog2n)

答案:

选A【解析】对于链表,只能通过指针域确定下一结点,对分法查找不适用于链表。

对长度为n的有序链表进行查找,最坏情况是查找到最后结点,比较次数为n.

(2)算法的时间复杂度是指

A)算法的执行时间B)算法所处理的数据量

C)算法程序中的语句或指令条数D)算法在执行过程中所需要的基本运算次数

答案:

选D【解析】时间复杂度是执行算法所需要的计算工作量,可以用算法在执行过程中所需要的基本运算次数来度量。

(3)软件按功能可以分为:

应用软件、系统软件和支撑软件(或工具软件)。

下面属于系统软件的是

A)编辑软件B)操作系统C)教务管理系统D)浏览器

答案:

选B【解析】操作系统是最基本的系统软件,其他选项属于应用软件。

(4)软件(程序)调试的任务是

A)诊断和改正程序中的错误B)尽可能多地发现程序中的错误

C)发现并改正程序中的所有错误D)确定程序中错误的性质

答案:

选A【解析】软件测试的目的:

尽可能多的发现软件中的错误,以查找错误为中心。

软件调试的任务:

在软件测试的基础上,诊断和改正程序中的错误。

(5)数据流程图(DFD图)是

A)软件概要设计的工具B)软件详细设计的工具

C)结构化方法的需求分析工具D)面向对象方法的需求分析工具

答案:

选C【解析】结构化方法的需求分析是以数据流图(DFD)和数据图等为主要工具,建立系统的逻辑模型。

(6)软件生命周期可分为定义阶段,开发阶段和维护阶段。

详细设计属于

A)定义阶段B)开发阶段C)维护阶段D)上述三个阶段

答案:

选B【解析】定义阶段:

可行性研究与计划制定、需求分析;开发阶段:

概要设计、详细设计、实现、测试;维护阶段:

使用、维护、退役。

(7)数据库管理系统中负责数据模式定义的语言是

A)数据定义语言B)数据管理语言C)数据操纵语言D)数据控制语言

答案:

选A【解析】数据定义语言(DDL):

负责数据的模式定义与数据的物理存取构建;数据操纵语言(DML):

负责数据的操纵,包括查询、插入、删除和修改;数据控制语言(DCL):

负责数据完整性、安全性的定义与检查以及并发控制、故障恢复。

(8)在学生管理的关系数据库中,存取一个学生信息的数据单位是

A)文件B)数据库C)字段D)记录

答案:

选D【解析】一个学生信息对应二维表格中的一行,即关系中的一条记录。

(9)数据库设计中,用E-R图来描述信息结构但不涉及信息在计算机中的表示,它属于数据库设计的

A)需求分析阶段B)逻辑设计阶段

C)概念设计阶段D)物理设计阶段

答案:

选C【解析】数据库的概念设计阶段是分析数据间内在语义关联,在此基础上建立一个数据的抽象模型,采用E-R模型与视图集成法进行设计。

(10)有两个关系R和T如下:

RT

A

B

C

a

1

2

b

2

2

c

3

2

d

3

2

A

B

C

c

3

2

d

3

2

则由关系R得到关系T的操作是

选择B)投影C)交D)并

答案:

选A【解析】考点为关系模型中的常见运算。

选择:

从一个关系中选择若干行,是一元运算(本题从R中的4行中选择2行得到T);投影:

从一个关系中选择若干行,是一元运算;交、并:

对具有相同关系模式的两个关系取其交集和并集,是二元运算。

(11)以下叙述正确的是

A)C语言程序是由过程和函数组成的

B)C语言函数可以嵌套调用,例如:

fun(fun(x))

C)C语言函数不可以单独编译

D)C语言中除了main函数,其他函数不可以作为单独文件形式存在

答案:

选B【解析】选项A错误:

C语言中没有过程的概念;选项B正确:

C语言中函数可以嵌套调用;选项C错误:

C语言何总可以对包含一个或多个函数的源程序单独编译;选项错误:

C语言程序可以有多个源程序组成,其中一个源程序文件包含main函数,其他函数可以写在另外的源程序文件中,作为单独文件形式存在。

(12)以下关于C语言的叙述中正确的是

A)C语言中的注释不可以夹在变量名或关键字的中间

B)C语言中的变量可以再使用之前的任何位置进行定义

C)在C语言算术的书写中,运算符两侧的运算数类型必须一致

D)C语言的数值常量中夹带空格不影响常量值的正确表示

答案:

选A【解析】选项A:

正确:

注释夹在变量名和关键字中间,不再是正确的变量和关键字,同时产生语法错误;选项B错误:

变量定义可以在函数开始,函数外面或者复合语句的开始。

不可以放在使用它之前的任何位置,比如放在循环体内会造成重复定义;选项C错误:

例如赋值语句,只要赋值兼容即可,不一定类型必须一致。

比如实型数据和字符数据都可以赋给整型变量;选项D错误:

数值常量中夹带空格不再是正确的常量值,同时语法错误。

(13)以下C语言用户标示符中,不合法的是

A)_1B)AaBcC)a_bD)a--b

答案:

选D【解析】标识符由字母、数字、下划线组成,第一个字符必须为字母或下划线。

选项D出现了非法字符“-”,其他选项均符合要求。

(14)若有定义:

doublea=22;inti=0,k=18;则不符合C语言规定的赋值语句是

A)a=a++,i++B)i=(a+k)<=(i+k)C)i=a%11D)i=!

a

答案:

选C【解析】运算符%要求两边的操作数必须为整数,所以选项C错误。

选项B和选项D正确:

可以将逻辑赋给变量i,最后i的值都为0.选项A中的自增复制运算也是正确的,不过整体上是逗号表达式语句。

(15)

#include

 

main()

{

chara,b,c,d;

scanf("%c%c",&a,&b);

c=getchar();d=getchar();

printf("%c%c%c%c\n",a,b,c,d);

}

当执行程序时,按下列方式输入数据(从第一列开始,代表回车,注意:

回车是一个字符)

12

34

则输出结果是:

A、1234B、12C、12D、12

334

答案:

选C【解析】程序用两种方式分别输入4个字符赋给a、b、c、d。

scanf:

读取1赋给a,2赋给b。

getchar:

回车也是一个字符,读取回车赋给c,3赋给d。

多余的字符4及回车没有被读取。

最后的输出结果是选项C。

(注:

程序运行时,输入的数据存于键盘缓冲区中,等待程序读取。

16、以下关于C语言数据类型使用的叙述中错误的是:

A、若要准确无误的表示自然数,应使用整数类型。

B、若要保存带有多位小数的数据,应使用双精度类型。

C、若要处理如"人员信息"等含有不同类型的相关数据,应自定义结构体类型。

D、若只处理"真"和"假"两种逻辑值,应使用逻辑类型。

答案:

选D【解析】C语言中没有逻辑型数据,所以选项D错误,其他选项均正确。

17、若a是数值类型,则逻辑表达式(a==1)||(a!

=1)的值是:

A、1B、0C、2D、不知道a的值,不能确定

答案:

选A解析】逻辑或运算c||d的两边只要有一个成立,结果就为真

(1)。

而a==1和a!

=1相互对立,肯定有一个成立,所以表达式的值为1。

18、以下选项中与if(a==1)a=b;elsea++;语句功能不同的switch语句是:

A、switch(a)B、switch(a==1)

{case1:

a=b;break;{case0:

a=b;break;

default:

a++;case1:

a++;

}}

C、switch(a)D、switch(a==1)

{default:

a++;break;{case1:

a=b;break;

case1:

a=b;case0:

a++;

}}

答案:

选B【解析】根据switch语句的功能,可以判断选项A和选项C正确。

选项B和选项D中,主要看表达式a==1的值。

当a为1时,a==1成立,此表达式值为1,应该执行case1;当a不为1时,a==1不成立,值为0,应执行case0.只有选项B与题目功能不同。

19、有如下嵌套的if语句

if(a

if(a

elsek=c;

else

if(b

elsek=c;

以下选项中与上述if语句等价的语句是

k=(a

a:

b;k=(b

b:

c;

k=(a

((b

a:

b):

((b

b:

c);

k=(a

((a

a:

c):

((b

b:

c);

k=(a

a:

b;k=(a

a;c

答案:

选C【解析】条件语句k=(a

a:

b的功能:

if(a

(20)有以下程序

#include

main()

{inti,j,m=1;

for(i=1;i<3;i++)

{for(j=3;j>0;j--)

{if(i*j>3)break;

m*=i*j;

}

}

printf("m=%d\n",m)

}

程序运行后的输出结果是

(A)m=6(B)m=2(C)m=4(D)m=5

答案:

选A【解析】外层循环执行2次(i=1~2),内层循环正常执行3次(j=3~1)。

m*=(i*j)→m=m*(i*j)外层循环:

第一次循环(i=1)i*j>3始终不成立

i=1j=3m=1*(1*3)=3;i=1j=2m=3*(1*2)=6;i=1j=1m=6*(1*1)=6

外层循环:

第二次循环(i=2)i=2j=3此时i*j>3条件成立,执行break退出内层循环,此时外层循环也是最后一次循环,同时退出,最后输出m的值为6.

(21)有以下程序

#includes

main()

{inta=1,b=2;

for(;a<8;a++){b+=a;a+=2;}

printf("%d,%d\n",a,b);

}

程序运行后的输出结果是

(A)9,18(B)8,11(C)7,11(D)10,14

答案:

选D【解析】当a<8时执行循环体,执行完循环体语句后,接着执行a++,再判断循环条件a<8是否成立,如果成立继续循环,否则退出循环。

初始值:

a=1b=2a<8成立执行第一次循环:

b=b+a=3a=a+2=3a++后,a=4a<8成立,执行第二次循环:

b=a+b=7a=a+2=6a++后,a=7a<8成立,执行第三次循环:

b=a+b=14a=a+2=9a++后,a=10此时a<8不成立,退出循环,输出a=10b=14.

(22)有以下程序,其中k的初值为八进制数

#include

main()

{intk=011;

printf("%d\n",k++);

}

程序运行后的输出结果是

(A)12(B)11(C)10(D)9

答案:

选D【解析】C语言中,整型常量以0开头,表示是一个八进制数。

K=011是八进制数,转换为十进制数为9.(11)8=1*81+1*80=(9)10%d表示以十进制格式输出整数,k++表示先输出k的值再加1,所以输出9.

(23)下列语句中,正确的是

A)char*s;s="Olympic";B)chars[7];s="Olympic";

C)char*s;s={"Olympic"};D)chars[7];s={"Olympic"};

答案:

选A【解析】字符型指针变量可以用选项A的赋值方法:

char*s;s=“Olympic”;选项C的写法:

char*s;s={“0lympic”};是错误的。

字符数组可以在定义的时候初始化:

chars[]={“Olympic”};或者chars[]=“Olympic”;都是正确的。

但是不可以在定义字符数组后,对数组赋值。

所以选项B和选项D错误。

(数组名代表首地址,是常量,不允许出现在赋值号左端)另外,选项B、D中字符数组S的大小至少为8,才能放下字符串。

(字符串的末尾都有结束标志“\0”)

(24)以下关于return语句的叙述中正确的是

A)一个自定义函数中必须有一条return语句

B)一个自定义函数中可以根据不同情况设置多条return语句

C)定义成viod类型的函数中可以有带返回值的return语句

D)没有return语句的自定义函数在执行结束时不能返回到调用处

答案:

选B【解析】·自定义函数中可以没有return语句,如一些不需要返回值的函数。

·自定义函数中可以有多余return语句。

例如:

在分支结构中,可以从不同的分支中返回到调用程序。

·定义成void类型的函数,不允许从该函数取得返回值,函数内部也不允许有return语句。

·没有return语句的函数,在执行到函数的最后一条语句会自动返回到调用位置处。

(25)下列选项中,能够正确定义数组的语句是

A)intnum[0..2008];B)intnum[];

C)intN=2008;D)#defineN2008

intnum[N];intnum[N]

答案:

选D【解析】C语言不允许定义动态数组,定义数组的大小必须为常量表达式。

选项D正确:

选项中的N为符号常量,可以用来定义数组大小。

选项A错误:

C语言中数组没有选项A的定义方法。

选项B错误;定义数组时应指明数组大小。

如果不指明数组大小,需要给定初值的个数。

如:

intx[]={1,2,3}。

选项C错误:

选项中的N为变量,不能用来定义数组大小。

(26)有以下程序

#include

voidfun(char*c,intd)

{*c=*c+1;d=d+1;

printf("%c,%c,",*c,d);

}

main()

{charb=’a’,a=’A’;

fun(&b,a);printf("%c,%c\n",b,a);

}

程序运行后的输出结果是

A)b,B,b,AB)b,B,B,AC)a,B,B,aD)a,B,a,B

答案:

选A【解析】调用函数时,把实参的值传给形参,是单向的值传递,形参的改变不会影响到实参的值。

主程序中调用函数:

fun(&b,a)参数传递:

形参字符指针c获得实参变量b的地址,即指针c指向实参变量b.形参变量d获得实参a的值,即字符’A’。

执行fun函数:

*c=*c+1把指针c做指向的内存单元的内容增1,即实参变量b的值增1,变为字符‘b’。

d=d+1形参变量的值变为字符’B’。

函数内部的输出为:

b,B,返回到主程序:

实参变量b的值在函数内被改变为字符‘b’,而形参变量d的值仍为字符’A’.主程序中的输出为:

b,A。

(27)若有定义int(*pt)[3];,则下列说法正确的是

A)定义了基类型为int的三个指针变量

B)定义了基类型为int的具有三个元素的指针数组pt。

C)定义了一个名为*pt、具有三个元素的整型数组

D)定义了一个名为pt的指针变量,它可以指向每行有三个整数元素的二维数组

答案:

选D【解析】int(*pt)[3]:

定义名为pt的指针变量,用来指向包含有3个整型元素的一维数组。

也就是说指针变量pt的基类型为行指针,可以指向每行有三个元素的二维数组。

例:

对于二维数组a[4][3],a是数组名,存放二维数组的首地址(第0行地址)。

二维数组名a的基类型为指向3个元素的一维数组的行指针。

所以可以进行复制:

pt=a;(二者基类型一致)即:

指针变量pt可以指向这个每行有三个元素的二维数组。

(28)设有定义doublea[10],*s=a;,一下能够代表数组元素a[3]的是

A)(*s)[3]B)*(s+3)C)*s[3]D)*s+3

答案:

选B【解析】数组名a代表数组首地址(即元素a[0]地址),指针变量s=a即s=&a[0]。

选项B正确:

C语言中,*(s+3)无条件等价与s[3],也即数组元素a[3]。

选项A错误:

根据指针s的定义,(*s)即a[0],其后不能带下标。

选项C错误:

*s[3]相当于*(s[3]),而s[3]是数组元素,不是指针,前面不能加*号。

选项D错误:

*s+3表示把数组元素a[0]的值假3,不能代表a[3].

(29)有以下程序

#include

main()

{inta[5]={1,2,3,4,5},b[5]={0,2,1,3,0},is=0

for(i=0;i<5;i++)s=s+a[b[i]];

printf("%d\n",s);

}

程序运行后的输出结果是

A)6B)10C)11D)15

答案:

选C【解析】在5次循环中,分别把b数组中的5个元素值作为a数组的下标,将对应a数组元素的值累加到s中。

s=a[0]|+a[1]+a[2]+a[3]+a[0]=1+3+2+4+1=11

(30)有以下程序

#include

main()

{intb[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;

for(i=0;i<3;i++)

For(j=i;j<=i;j++)t+=b[i][b[j][i]];

Printf("%d\n",t);

}

程序运行后的输出结果是

A)1B)3C)4D)9

答案:

选C【解析】外循环执行3次,内循环执行1次(仅j=i时)

i=0t=t+b[0][b[0][0]]=t+b[0][0]=1+0=1

i=1t=t+b[1][b[1][1]]=t+b[1][1]=1+1=2

i=2t=t+b[2][b[2][2]]=t+b[2][2]=2+2=4

(31)若有以下定义和语句

charsl[10]="abcd!

",*s2="n123\\";

printf("%d%d\n",strlen(s1),strlen(s2));

则输出结果是

A)55B)105C)107D)58

答案:

选A【解析】·strlen函数:

返回字符串的长度,求子符串的长度,遇到结束标志‘\0’为止,但长度不包括结束标志。

·字符数组s1的后5个元素没有赋值,都为‘\0’,即“abcd!

”后为‘\0’所以strlen(s1)的值为5.

·字符指针s2所指向的字符串中,\n为转义字符换行符,表示1个字符;\\也为转义字符,代表\,也是1个字符,其后为字符串结束标志‘\0’;所以strlen(s2)的值也为5.

(32)有以下程序

#include

#defineN8

voidfun(int*x,inti)

{*x=*(x+i);}

main()

{inta[N]={1,2,3,4,5,6,7,8},i;

fun(a,2);

for(i=0;i

{printf("%d",a[i]);}

printf("\n");

}

程序运行后的输出结果是

A)1313B)2234C)3234D)1234

答案:

选C【解析】数组名代表数组首地址即a[0]的地址。

函数调用:

fun(a,2)参数传递后,形参指针x获得数组首地址,即指向a[0];形参变量i=2。

*x即a[0],*(x+2)即a[2].

*x=*(x+2)→a[0]=a[2]执行后,a[0]变为3,a[2]不变。

返回到主程序:

循环4次,输出数组a前4个元素:

3234

(33)有以下程序

#include

intf(intt[],intn);

main()

{inta[4]={1,2,3,4},s;

s=f{a,4};printf("%d\n",s);

}

intf(intt[],intn)

{if(n>0)returnt[n-1]+f(t,n-1);

elsereturn0;

}

程序运行后的输出结果是

A)4B)10C)14D)6

答案:

选B【解析】函数调用后,实参数组a和形参数组t占用相同的内存单元,可以认为是同一数组。

s=f(a,4)=t[3]+f(a,3)=4+f(a,3)=4+t[2]+f(a,2)=7+t[1]+f(a,1)=7+2+f(a,1)=9+t[0]+f(a,0)=9+1+f(a,0)=10+0=10

(34)有以下程序

#include

intfun()

{staticintx=1;

x*=2;returnx;

}

main()

{intI,s=1;

for(i=1;i<=2;i++)s=fun();

printf("%d\n",s);

}

程序运行后的输出结果是

A)0B)1C)4D)8

答案:

选C。

【解析】fun函数中的x为静态局部变量,占用固定的内存单元,下一次调用时仍可保留上次调用时的值。

也就是说,如果多次调用fun函数,x的定义只在第一次调用时有效,从第二次调用开始,x的定义相当于不存在,直接使用x的值。

主程序调用两次fun函数:

第一次调用:

x=1x=x*2=2s=2第二次调用:

(直接上次x值)x=x*2=4s=4

(35)以下程序

#include

#defineSUB(a)(a)-(a)

main()

{inta=2,b=3,c=5,d;

d=SUB(a+b)*c;

printf("%d\n",d);

}

程序运行后的结果是

A)0B)-12C)-20D)10

答案:

选C【解析】考点为带参数的宏定义。

宏定义中的参数没有类型,仅为字符序列,不能当作表达式运算。

宏展开时,把实参字符串原样写在替换文本中。

d=SUB(a+b)*c=(a+b)-(a+b)*c=5-25=-20

(36)没有定义

structcomplex

{intreal,unreal;}datal={1,8},data2;

则以下赋值语句中的错误的是

A)data2=data1;B)data2=(2,6);

C)data2.real1=data1.real;D)data2.real=data1.unreal;

答案:

选B【解析】考点为结构体变量的定义和初始

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1