真题和详细解析.docx

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

真题和详细解析.docx

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

真题和详细解析.docx

真题和详细解析

绝密★启用前

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

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

  一、选择题(每小题2分,共70分)

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

请将正确选项填涂在答题卡相应位置上,答在试卷上不得分。

  

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

 A)线性表的链式存储结构与顺序存储结构所需要的存储空间是相同的

 B)线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构

 C)线性表的链式存储结构所需要的存储空间一般要少于顺序存储结构

 D)上述三种说法都不对

  

答案:

选B【解析】线性表的顺序存储结构:

每个结点只需要存放表中的数据元素;线性表的链式存储结构:

每个结点除了存放表中的数据元素外,还要存放指针域,用来指示其后继结点的存储位置信息;所以链式存储结构需要存储空间一般多余顺序存储结构。

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

 A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化

 B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化

 C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化

 D)上述三种说法都不对

  

答案:

选C【解析】栈是一端固定、一端活动的顺序存储结构,其中固定的一端为栈底,活动的一端为栈顶。

当有新元素进栈时,栈顶指针向上移动;当有元素出栈时,栈顶指针向下移动。

在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化,所以选C。

(3)软件测试的目的是

 A)评估软件可靠性

 B)发现并改正程序中的错误

 C)改正程序中的错误

 D)发现程序中的错误

  

答案:

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

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

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

(4)下面描述中,不属于软件危机表现的是

 A)软件过程不规范

 B)软件开发生产率低

 C)软件质量难以控制

 D)软件成本不断提高

  

答案:

选A【解析】软件危机包括成本、质量、生产率等问题,主要表现在:

软件需求的增长得不到满足;软件开发成本和进度无法控制;软件质量难以保证;软件维护程度底;软件成本不断提高;软件开发生产率的提高赶不上硬件的发展和应用的增长。

(5)软件生命周期是指

 A)软件产品从提出、实现、使用维护到停止使用退役的过程

 B)软件从需求分析、设计、实现到测试完成的过程

 C)软件的开发过程

D)软件的运行维护过程

答案:

选A【解析】通常将软件产品从提出、实现、使用维护到停止使用退役的过程陈伟软件生命周期。

(6)面向对象方法中,继承是指

 A)一组对象所具有的相似性质

 B)一个对象具有另一个对象的性质

 C)各对象之间的共同性质

 D)类之间共享属性和操作的机制

  

答案:

选D【解析】继承是面向对象方法的主要特征。

在面向对象的软件技术中,继承是指子类自动地共享基类中定义的数据和方法的机制。

使用已有的类定义建立新类。

新类直接继承其父类的描述(数据和操作)或特性,子类自动共享父类中定义的数据和方法。

(7)层次型、网状型和关系型数据库划分原则是

 A)记录长度

 B)文件的大小

 C)联系的复杂程度

 D)数据之间的联系方式

  

答案:

选D【解析】数据模型按照不同的应用层次分为概念数据模型、逻辑数据模型和物理数据模型。

三种模型属于逻辑数据模型,划分原则是根据数据之间的联系方式。

(8)一个工作人员可以使用多台计算机,而一台计算机可被多个人使用,则实体工作人员、与实体计算机之间的联系是

 A)一对一

 B)一对多

 C)多对多

 D)多对一

  答案:

选C【解析】两个实体间的联系可分为3种:

1.一对一联系:

主表中的一条记录与相关表中的一条记录相关联;2.一对多联系:

主表中的一条记录与相关表中的多条记录相关联;3.多对多联系:

主表中的多条记录与相关表中的多条记录相关联。

本题中的实体“工作人员”和“计算机”的联系属于多对多。

(9)数据库设计中反映用户对数据要求的模式是

 A)内模式

 B)概念模式

 C)外模式

 D)设计模式

答案:

选C【解析】数据系统的三级模式:

概念模式、外模式、内模式。

内模式处于最底层,反映了数据在计算机中的实际存储形式;概念模式处于中层,反映了设计者的数据全局逻辑要求;外模式处于最外层,反映了用户对数据的要求。

(10)有三个关系R、S和T如下:

RST

A

B

C

a

1

2

b

2

1

c

3

1

A

D

c

4

A

B

C

D

c

3

1

4

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

  A)自然连接

  B)交

  C)投影

D)并

答案:

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

投影:

从一个关系中选择若干列,是一元运算。

本题为二元运算,排除C。

交、并:

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

本题中R、S为不同关系模式,排除选项B、D。

自然连接:

对具有共同属性(列)的两个关系,按共同属性值相同的行连接,形成新的关系。

参与自然连接的两个关系可以是不同的关系模式,所以选A。

(11)以下关于结构化程序设计的叙述中正确的是

 A)一个结构化程序必须同时由顺序、分支、循环三种结构组成

 B)结构化程序使用goto语句会很便捷

 C)在C语言中,程序的模块化是利用函数实现的

 D)由三种基本结构构成的程序只能解决小规模的问题

  

答案:

选C【解析】选A错误,简单的程序可以只有顺序结构组成,不必同时包含三种结构。

选项B错误,结构化程序限制是有goto语句,尽可能使用替代语句。

选项C正确,函数是组成C语言程序的基本单位,用函数实现程序的模块化。

选项D错误,实践证明,由三种基本结构构成的程序可以解决任何复杂的问题。

(12)以下关于简单程序设计的步骤和顺序的说法中正确的是

 A)确定算法后,整理并写出文档,最后进行编码和上机调试

 B)首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档

 C)先编码和上机调试,在编码过程中确定算法和数据结构,最后整理文档

 D)先写好文档,再根据文档进行编码和上机调试,最后确定算法和数据结构

  

答案:

选B【解析】简单程序设计的步骤:

(1)确定数据结构

(2)确定算法(3)编码(4)在计算机上调试程序(5)整理并写出文档

(13)以下叙述中错误的是

 A)C程序在运行过程中所有计算都以二进制方式进行

 B)C程序在运行过程中所有计算都以十进制方式进行

 C)所有C程序都需要编译链接无误后才能运行

 D)C程序中整型变量只能存放整数,实型变量只能存放浮点数

  

答案:

选B【解析】计算机内部各种数据的处理都以二进制方式进行,所以A正确,B错误。

选项C正确:

编译和链接过程不能有任何错误,才能生成exe文件运行。

选项D正确:

整型变量只能存放整数,用字符型赋值,最后存放的也是整数(ASCII码值)。

实型变量只能存放浮点数,用整数赋值,最后也要转换为浮点型(如1.0)。

(14)有以下定义:

inta;longb;doublex,y;则以下选项中正确的表达式是

 A)a%(int)(x-y)

 B)a=x!

=y;

 C)(a*y)%b

 D)y=x+y=x

  

答案:

选A【解析】%运算符要求两边的操作数必须为整数。

选项A正确:

a及(int)(x-y)均为整数。

选项C错误:

(a*y)为double类型。

(int与double运算,结果为double)。

选项B错误:

该选项为语句,不是表达式。

去掉分号后是正确的表达式a=(x!

=y)。

选项D错误:

赋值运算符的结合性是从右到左,相当于y=(x+y=x),而x+y=x是不正确的,赋值号的左值不能为常量或表达式。

(15)以下选项中能表示合法常量的是

 A)整数:

1,200

 B)实数:

1.5E2.0

 C)字符斜杠:

‘\’

D)字符串:

"\007"

答案:

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

在C语言中,整数没有千位分隔符的表示形式。

选项B错误:

用指数表示实数时,E后面的指数必须为整数。

选项C错误:

在C语言中,要表示字符斜杠,需使用转义字符:

‘\\’。

选项D正确;\007为转义字符,\后带有1~3为数字,为八进制数字,该字符为特殊字符响铃(beep),选项D中的字符串中只包含beep这个字符。

注:

main(){chars[10]=”\007”;charch=’\007’;prinf(“%s\n”,s);prinf(“%c\n”,ch);运行结果:

两次响铃

(16)表达式a+=a-=a=9的值是

 A)9B)_9C)18D)0

  

答案:

选D【解析】“+=-==”均为赋值运算符,结合性为从右到左。

表达式相当于:

a+=a-=(a=9),执行a=9后,接着执行a-=a,结果为a=0;最后执行a+=a,结果a=0,整个赋值表达式的值也为0.

(17)若变量已正确定义,在if(W)printf(“%d\n,k”);中,以下不可替代W的是

 A)a<>b+cB)ch=getchar()C)a==b+cD)a++

  

答案:

选A【解析】C语言中的不等于运算符为:

=,没有<>的写法,所以选项A错误。

If(W)中的W一半为关系表达式或者逻辑表达式,也可以为任何合法表达式。

运算原则:

表达式为非0值表示逻辑真,0表示逻辑假。

例:

if(a++)只要a不为0,表达式就为真;if(ch=getchar())zhiyaoshuruzifudeASCII码值不为0,表达式就为真。

(18)有以下程序

  #include

  main()

  {inta=1,b=0;

  if(!

a)b++;

  elseif(a==0)if(a)b+=2;

  elseb+=3;

  printf(”%d\n”,b);

  }

  程序运行后的输出结果是

A)0B)1C)2D)3

  

答案:

选A【解析】else配对原则:

与它上面最近的未配对的if语句配对。

程序中的等价语句为:

if(!

a)b++;elseif(a==0){if(a)b+=2;elseb+=3;}两个条件均不满足,没有执行任何肤质语句,b保持原来的值不变(b=0)。

(19)若有定义语句inta,b;doublex;则下列选项中没有错误的是

  A)switch(x%2)B)switch((int)x/2.0

  {case0:

a++;break;{case0:

a++;break;

  case1:

b++;break;case1:

b++;break;

  default:

a++;b++;default:

a++;b++;

  }}

  C)switch((int)x%2)D)switch((int)(x)%2)

  {case0:

a++;break;{case0.0:

a++;break;

  case1:

b++;break;case1.0:

b++;break;

  default:

a++;b++;default:

a++;b++;

}}

答案:

选C【解析】主要观察switch后的表达式和case后的常量。

Switch后的表达式应该为整形表达式或字符表达式,case后的常量类型和switch一致。

选项A错误:

%要求两边的操作数必须为整数,x%2中的x为double类型。

选项B错误:

switch后的表达式不为整型,不应该进行处罚运算,应进行求余运算。

选项D错误:

case后面的表达式与switch不一致。

选项C正确。

(20)有以下程序

  #include

  main()

  {inta=1,b=2;

  while(a<6){b+=a;a+=2;b%二10;}

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

  }

  程序运行后的输出结果是

  A)5,11B)7,1C)7,11D)6,1

  

答案:

选B【解析】考点为while循环语句,循环条件为a<6.程序的执行流程为:

(初始值:

a=1b=2)第一次循环(a=1):

b=1+2=3a=1+2=3b=3%10=3;第二次循环(a=3):

b=3+3=6a=3+2=5b=6%10=6;第三次循环(a=5):

b=6+5=11a=5+2=7b=11%10=1;此时a<6不成立,退出循环,a=7,b=1。

(21)有以下程序

  #include<stdio.h>

  main()

  {inty=10;

  while(y--);

  printf(”Y=%d\n”,Y);

  }

  程序执行后的输出结果是

 A)y=0B)y=-1C)y=1D)while构成无限循环

答案:

选B【解析】考点为while语句及“—”运算符。

注意:

while(y--);的循环体空语句。

y—是先使用y的值,在减1.循环条件为:

只要“y—”为非0值,就始终循环(执行空语句)。

Y的值不断减1,循环条件不成立时,y—的值为0(即y的值为0),终止循环。

终止循环后,y的值还要减1,最后输出y的值为-1.

(22)有以下程序

  #include<stdio.h>

  main()

  {chars[」=”rstuv";

  printf(”%c\n”,*s+2);

  }

  程序运行后的输出结果是

A)tuvB)字符t的ASCII码值C)tD)出错

答案:

选C【解析】s为字符数组名,代表数组首地址,指向数组第一个元素s[0](字符‘r’)。

*s+2表示s所指向的字符的ASCII码值加2,s指向的字符为r,加2后代表的字符为t,最后用%c格式输出,所以输出字符t。

注意:

不要把*s+2理解为*(s+2),本题巧合的是都代表字符‘t’。

(23)有以下程序

  #include<stdio.h>

  #include<string.h>

  main()

  {charx[]=”STRING”;

  x[0」=0;x[1]=’\0’;x[2」=’0’;

  printf(”%d%d\n”,sizeof(x),strlen(x));

  }

  程序运行后的输出结果是

  A)61B)70C)63D)71

  

答案:

选B【解析】

·sizeof()运算符:

当操作数是数组名时,结果是该数组所占内存空间的总字节数。

·数组x存放字符串“STRING”,加上结束标志‘\0’,共7个字符,相当于:

charx[7]=“STRING”,每个字符占1个字节,sizeof(x)返回数组x的总字节数为7.

·strlen()函数:

计算字符串的长度时,遇到结束标志为止,且长度不包括结束标志。

数组x在定义是赋初值后,又重新赋值,x[0]=0即想x[0]=‘\0’,所以strlen(x)=0.

·关于结束标志:

‘\0’即ASCII码值为0的字符,也就是整数0。

(24)有以下程序

  #include<stdio.h>

  Intf(intx);

  main()

  {intn=1,m;

  m=f(f(f(n)));printf(”%d\n”,m);

  }

  intf(intx)

  {returnx*2;}

  程序运行后的输出结果是

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

  

答案:

选D【解析】三次调用f函数:

f(n)=f

(1)=2f

(2)=4f(4)=8m=f(f(f(n)))=f(f(f

(1)))=f(f

(2))=f(4)=8

(25)以下程序段完全正确的是

 A)int*p;scanf("%d",&p);B)int*p;scanf(“%d”,p);

 C)intk,*p=&k;scanf("%d",p);D)intk,*p:

;*p=&k;scanf(“%d”,p);

答案:

选C【解析】函数格式:

scanf(格式控制,地址表列)

·p为指针,本身即为地址,在scanf函数中不需要使用&p的形式,所以选项A错误。

(指针变量p的值由系统分配,不需要人工输入赋值,否则会引起无法预知的错误)

·选项B:

指针p没有赋初值,是一个不确定的值,指向不确定的内存区域,这个区域可能存放有用的指令或数据。

在这个不确定的区域输入数据,可能会发生无法预知的错误,所以选项B不完全正确。

·对于指针p,如果在定义时付出资,应使用int*p=&k;的形式如果在定义后赋值,只能使用p=&k;的形式,所以选项D错误。

·综上所述,选项C正确。

(26)有定义语句:

int*p[4];以下选项中与此语句等价的是

A)intp[4];B)int**p;C)int*(p「4」);D)int(*p)「4」;

  

答案:

选C【解析】对于int*p[4],[]的优先级大于*,先计算[]里的内容。

所以int*p[4]相当于:

int*(P[4]),而不是int(*p)[4]。

选项C正确:

定义了一个包含有4个元素的指针数组。

选项A错误:

定义的是普通的整型数组。

选项B错误:

定义的是指向指针的指针。

选项D错误:

定义了一个指向由4个元素组成的一维数组的指针。

(27)下列定义数组的语句中,正确的是

 A)intN=10;B)#defineN10

  intx[N];intx[N];

 C)intx[0..10];D)intx[];

  

答案:

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

选项B正确:

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

选项A错误:

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

选项D错误:

定义数组时应指明数组大小。

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

如:

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

(28)若要定义一个具有5个元素的整型数组,以下错误的定义语句是

A)inta[5]=﹛0﹜;B)intb[]={0,0,0,0,0};

C)intc[2+3];D)inti=5,d[i];

  

答案:

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

选项C正确:

数组大小是一个常量表达式,相当于C[5]。

选项D错误:

i为变量,不能用来定义数组大小。

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

选项A正确:

可以只给一部分元素赋值,未赋值元素的值为0.选项B正确:

数组定义时可以不指明长度,初值个数即为数组长度。

(29)有以下程序

  #include<stdio.h>

  voidf(int*p);

  main()

  {inta[5]={1,2,3,4,5},*r=a;

  f(r);printf(”%d\n”;*r);

  }

  voidf(int*p)

  {p=p+3;printf(”%d,”,*p);}

  程序运行后的输出结果是

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

答案:

选D【解析】·主程序中r=a,r的值为数组a首地址(a[0]地址),r指向a[0]。

·执行函数调用f(r)时,实参指针r的值传给形参指针p,即p也指向a[0]。

在函数中,p的值加3,p指向a[3],所以输出*p时的值为4.

·然后返回到主程序,输出*r的值。

注意:

实参指针r的值传给形参指针p后,在函数内部p的改变对r是没有任何影响的。

返回到主程序后,实参指针r仍指向a[0],所以输出*r时为1.(int*r=a;相当于int*r;r=a;)

(30)有以下程序(函数fun只对下标为偶数的元素进行操作)

  #include<stdio.h>

  voidfun(int*a;intn)

  {inti、j、k、t;

  for(i=0;i<n一1;1+=2)

  {k=i;‘

  for(j=i;ja〔k])k=j;

  t=a〔i];a〔i]=a[k];a〔k]=t;

  }

  }

  main()

  {intaa「10」={1、2、3、4、5、6、7},i;

  fun(aa、7);

  for(i=0,i<7;i++)printf(”%d,”,aa[i]));

  printf(”\n”);

  }

  程序运行后的输出结果是

A)7,2,5,4,3,6,1B)1,6,3,4,5,2,7C)7,6,5,4,3,2,1D)1,7,3,5,6;2,1

  

答案:

选A【解析】·主程序中调用fun函数,将实参数组名aa传给形参指针a,二者指向相同的内存区域,同时n=7.

·根据题目开化寺说明及分析,函数fun的功能是对下标为偶数的元素按从大到小的顺序排序(选择法排序),奇数下标的元素不变。

·所以主程序中的输出结果为:

7,2,5,4,3,6,1,

a[0]a[2]a[4]a[6]

↓↓↓↓

1

2

3

4

5

6

7

aa

(31)下列选项中,能够满足“若字符串s1等于字符串s2,则执行ST"要求的是

 A)if(strcmp(s2,s1)==0)ST;B)if(sl==s2)ST;

 C)if(strcpy(sl,s2)==1)ST;D)if(sl-s2==0)ST;

  

答案:

选A【解析】字符串的比较只能通过strcmp函数进行,只有选项A正确。

格式:

strcmp(字符串1,字符串2)

(1)如果字符串1=字符串2,函数值为0.

(2)如果字符串1>字符串2,函数值为一正整数。

(3)如果字符串1<字符串2,函数值为一负整数。

选项B、D是比较s1、s2的等级孩子是否相同而非内容。

选项C是字符串复制而非比较。

(32)以下不能将s所指字符串正确复制到t所指存储空间的是

 A)while(*t=*s){t++;s++;}B)for(i=0;t[i]=s[i];i++);

 C)do{*t++=*s++;}while(*s);D)for(i=0,j=0;t[i++]=s[j++];);

答案:

选C【解析】四个选项都可以实现字符串的复制,但选项C不能将s所指字符串的结束标志(‘\0’)复制到t所指的空间中,没有正确复制所有内容,其他几个选项都可以。

选项A:

执行循环条件时将s指向的字符赋给t,在循环体内两个指针加1分别指向下一个字符,如此循环下去,最后一次将s指向的结束标志赋给t,循环结束。

选项B、D:

在for语句的表达式2(循环条件)中实现复制操作,复制完成后,下标加1指向下一个字符,如此循环,最后一次把结束标志复制完成后退出循环。

选项C:

++和*同优先级,结合方向为自右而左,*s++等价于*(s++)。

先执行结束标志前的复制操作,然后指针s加1指向结束标志,此时循环结束,没有执行复制结束标志的操作。

注意:

结束标志(‘\0’)即整数0,当循环条件表达式的值为结束标志时,即相当于逻辑假,退出循环。

(33)有以下程序(strcat函数用以连接两个字符串)

  #include<stdio.h>

  #include<string.h>

  main()

  {chara[20]=”ABCD\OEFG\0”,b[]=”IJK”;

  strcat(a,b);printf(”

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

当前位置:首页 > 自然科学 > 物理

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

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