二级C语言题集
阅读原文时间:2022年03月13日阅读:1

时间:2015-5-13 18:01

在131题之后是按考点分类的题集,有需要的朋友可以看一下

————————————————————————————————————————————————————————

单项选择题:

1、程序流程图中带有箭头的线段表示的是(  )。

A)  图元关系

B)  数据流

C)  控制流  

D)  调用关系

    参考答案:C

【解析】在数据流图中,用标有名字的箭头表示数据流。在程序流程图中,用标有名字的箭头表示控制流。所以选择C)。

程序流程图:
1、箭头表示控制流;
2、矩形表示加工步骤;
3、菱形表示逻辑条件;

程序流程图中箭头表示控制流,数据流图中箭头表示数据流。 

 

2、结构化程序设计的基本原则不包括(  )。

A)  多态性

B)  自顶向下

C)  模块化

D)  逐步求精

    参考答案:A

【解析】结构化程序设计的思想包括:自顶向下、逐步求精、模块化、(限制使用goto语句),所以选择A。
    图形:
    程序流程图:
    N-S图:在使用过程中,人们发现程序流程图中的流程线不一定是必需的,为此,人们设计了一种新的流程图,它把整个程序写在一个
                大框图内,这个大框图由若干个小的基本框图构成,这种流程图简称N-S图。(框框图)
    PAD图:(问题分析图)它用二维数形结构的图表示程序的控制流,将这种图转换为程序代码比较容易。

 结构化程序设计的原则包括:自顶向下,逐步求精,模块化。
 

3、软件设计中模块划分应遵循的准则是(  )。

A)  低内聚低耦合

B)  高内聚低耦合

C)  低内聚高耦合

D)  高内聚高耦合

    参考答案:B

【解析】软件设计中模块划分应遵循的准则是高内聚低偶合、模块大小规模适当、模块的依赖关系适当等。模块的划分应遵循一定的要求,以保证模块划分合理,并进一步保证以此为依据开发出的软件系统可靠性强,易于理解和维护。模块之间的耦合应尽可能的低,模块的内聚度应尽可能的高。 
内聚:
        高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。
        内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。
        所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
耦合:耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度
           量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以
           及传递的信息。) 对于低耦合,粗浅的理解是:
                    一个完整的系统,模块与模块之间,尽可能的使其独立存在。
                    也就是说,让每个模块,尽可能的独立完成某个特定的子功能。
                    模块与模块之间的接口,尽量的少而简单。
                    如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。
                    这样有利于修改和组合。

4、在软件开发中,需求分析阶段产生的主要文档是(  )。

A)  可行性分析报告 

B)  软件需求规格说明书

C)  概要设计说明书

D)  集成测试计划

    参考答案:B

【解析】A)错误,可行性分析阶段产生可行性分析报告。C)错误,概要设计说明书是总体设计阶段产生的文档。D)错误,集成测试计划是在概要设计阶段编写的文档。B)正确,需求规格说明书是后续工作如设计、编码等需要的重要参考文档。

软件开发过程中,需求分析阶段产生的主要文档是软件需求规格说明书。

软件的开发一般分为五个阶段:
1、计划
        此阶段主要确定软件的开发目标及可行性。
2、需求分析
        在确定软件开发可行性的情况下,对软件需要实现的各个功能进行详细需求分析。需求分析阶段是一个很重要的阶段,、这一阶段
        做的好,将为整个软件项目的开发打下良好的基础。同样软件需求也是在软件开发过程中不断变化和深入的,因此,我们必须制定
        需求变更计划来应对这种变化,以保护整个项目的正常进行。 
 3、软件设计
        此阶段中要根据需求分析的结果,对整个软件系统进行设计,如系统框架设计、数据库设计等。软件设计一般分为总体设计和详细
        设计。好的软件设计将为软件程序编写打下良好的基础。 
4、程序编码
        此阶段是将软件设计的结果转化为计算机可运行的程序代码,在程序编码中一定要制定统一、符合标准的编写规范,以保证程序的刻
        可读性、易维护性,以提高程序的运行效率。 
5、软件测试
        整个测试阶段分为单元测试、组装测试、系统测试,测试方法主要有白盒测试和黑盒测试。

白盒测试:
        是通过程序的源代码进行测试而不使用用户界面,这种类型的测试需要从代码句法发现内部代码在算法、溢出、路径、条件等等中
        的缺点或者错误,进而加以修正。
黑盒测试:
        又被称为功能测试、数据驱动测试或者基于规格说明的测试,是通过使用整个软件或某种软件功能来严格的测试,而并没有功过检
        查程序的源代码或者很清楚的了结该软件的源代码程序具体是怎样设计的。 测试人员通过输入他们的数据然后来看输出的结果从
        而了解软件怎样工作。

5、算法的有穷性是指(  )。

A)  算法程序的运行时间是有限的

B)  算法程序所处理的数据量是有限的

C)  算法程序的长度是有限的

D)  算法只能被有限的用户使用

    参考答案:A

【解析】算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。有穷性是指算法程序的运行时间是有限的。

6、对长度为n的线性表排序,在最坏情况下,比较次数不是n(n-1)/2的排序方法是(  )。

A)  快速排序

B)  冒泡排序

C)  直接插入排序

D)  堆排序

    参考答案:D

【解析】除了堆排序算法的比较次数是,其他的都是n(n-1)/2。

7、在数据库设计中,将E-R图转换成关系数据模型的过程属于(  )。

A)  需求分析阶段

B)  概念设计阶段

C)  逻辑设计阶段

D)  物理设计阶段

    参考答案:C

【解析】E-R图转换成关系模型数据则是把图形分析出来的联系反映到数据库中,即设计出表,所以属于逻辑设计阶段。
E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。 

8、在E-R图中,用来表示实体联系的图形是(  )。

A)  椭圆形

B)  矩形 

C)  菱形

D)  三角形
    参考答案:B
【解析】在E-R图中实体集用矩形,属性用椭圆,联系用菱形。 
矩形框:表示实体,在框中记入实体名。

菱形框:表示联系,在框中记入联系名。

椭圆形框:表示实体或联系的属性,将属性名记入框中。对于主属性名,则在其名称下划一下划线。

连线:实体与属性之间;实体与联系之间;联系与属性之间用直线相连,并在直线上标注联系的类型。(对于一对一联系,要在两个实体连线方向各写1; 对于一对多联系,要在一的一方写1,多的一方写N;对于多对多关系,则要在两个实体连线方向各写N,M。)

9、有三个关系R、S和T如下:

由关系R和S通过运算得到关系T,则所使用的运算为(  )。

A)  并  

B)  自然连接 

C)  笛卡尔积  

D)  交

    参考答案:D

【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以B)错误。笛卡尔积是用R集合中元素为第一元素,S集合中元素为第二元素构成的有序对,所以C)错误。根据关系T可以很明显的看出是从关系R与关系S中取得相同的关系组所以取得是交运算,选择D)。

在数学中,两个集合X和Y的笛卡儿积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。 

14、设有定义:char  s[81];  int  i=0;,以下不能将一行(不超过80个字符)带有空格的字符串正确读入的语句或语句组是(  )。

A)  gets(s);

B)  while((s[i++]=getchar())!='\n');s[i]='\0';

C)  scanf("%s",s);

D)  do{ scanf("%c",&s[i]); }while(s[i++]!='\n'); s[i]='\0';

    参考答案:C

【解析】字符串的输入不能使用scanf("%s",s);而应该使用gets(s)。
scanf遇到空格就停止读入。 

16、读取二进制文件的函数调用形式为:fread(buffer,size,count,fp);,其中buffer代表的是(  )。

A)  一个内存块的字节数

B)  一个整型变量,代表待读取的数据的字节数

C)  一个文件指针,指向待读取的文件

D)  一个内存块的首地址,代表读入数据存放的地址

    参考答案:D

【解析】fread(void *buffer, size t size, size t count, FILE *stream);功能是从一个文件流中读数据,读取count个元素,每个元素size字节,如果调用成功返回count。buffer :用于接收数据的内存地址,大小至少是 size*count 字节;size :单个元素的大小,单位是字节;count :元素的个数,每个元素是size字节;stream :输入流。
它一般用来定义数组,因为它本身的意思就是“缓冲区”,在C语言里,数组就是个缓冲区,所以用常常用它。

23、设有如下说明:

typedef struct ST

{ long a;

int b;

char c[2];

}NEW;

以下说法正确的是(  )。

A)  NEW是一个结构体变量

B)  NEW是一个结构体类型

C)  ST是一个结构体类型

D)  以上说明形式非法

    参考答案:B
【解析】以上形式定义NEW表示ST的结构类型,然后可以用NEW来说明结构体变量。因此选项B)正确
ST是结构名,NEW是结构体类型,NEW st,则st是结构体变量。

25、软件测试的目的是(  )。

A)  评估软件可靠性

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

C)  改正程序中的错误

D)  发现程序中的错误

    参考答案:D
【解析】软件测试是为了发现错误而执行程序的过程,测试要以查找错误为中心,而不是为了演示软件的正确功能。不是为了评估软件或改正错误。

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

A)  内模式

B)  概念模式

C)  外模式

D)  设计模式

    参考答案:C
【解析】数据库系统的三级模式是概念模式、外模式和内模式。概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户公共数据视图。外模式也称子模式或用户模式,它是用户的数据视图,给出了每个用户的局部数据描述,所以选择C)。内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法。

27、设变量均已正确定义,若要通过scanf("%d%c%d%c",&a1,&c1,&a2,&c2);语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正确的是(注:□代表空格字符)(  )。

A)  10□X□20□Y<回车>

B)  10□X20□Y<回车>

C)  10□X<回车>

20□Y<回车>

D)  10X<回车>

20Y<回车>

    参考答案:D
【解析】本题中,scanf函数的格式控制没有空格,所以,对于选项A)、B)、C),输入的第一个空格会作为字符赋值给变量c1,而不会被解释成分隔符。

28、设有定义:int k=1,m=2;float f=7;,则以下选项中错误的表达式是(  )。

A)  k=k>=k 

B)  -k++

C)  k%int(f)

D)  k>=f>=m

    参考答案:C
【解析】选项C)中int(f)不正确,因为强制类型转换表示为:(类型名)(表达式),正确表示为(int)f。

29、有定义语句:char s[10];,若要从终端给s输入5个字符,错误的输入语句是(  )。

A)  gets(&s[0]);

B)  scanf("%s",s[1]);

C)  gets(s);

D)  scanf("%s",s+1);

    参考答案:B
【解析】在格式输入中,要求给出的是变量的地址,而B)答案中给出的s[1]是一个值的表达式。

30、 有以下程序:

#include

void fun(int a,int b){ int t;

t=a; a=b; b=t;

}

main(){ int c[10]={1,2,3,4,5,6,7,8,9,0},i;

for(i=0;i<10;i+=2) fun(c[i],c[i+1]);

for(i=0;i<10;i++) printf("%d,",c[i]);

printf("\n");

}

程序的运行结果是(  )。

A)  1,2,3,4,5,6,7,8,9,0,

B)  2,1,4,3,6,5,8,7,0,9,

C)  0,9,8,7,6,5,4,3,2,1,

D)  0,1,2,3,4,5,6,7,8,9,

    参考答案:A
【解析】在C语言中函数参数的传递是"传值"的,即形参和实参是两个没有关系的变量,函数fun虽然看似交换了参数值,但是只交换了形参的值,其结果不会传递给实参,因此数组C没有变化。主函数中给数组C元素赋值1,2,…,9,0。第一个for循环语句中调用fun函数,该函数功能是交换变量的数值,注意循环变量i的增量。第二个for循环语句将数组C中元素的值进行输出。

31、设有以下说明语句:

struct ex

       { int x ; float y; char z ;} example;

则下面的叙述中不正确的是(  )。

A)  struct结构体类型的关键字

B)  example是结构体类型名

C)  x,y,z都是结构体成员名

D)  struct ex是结构体类型名

    参考答案:B
【解析】本题中,struct ex是结构体类型名,example是结构体变量名。

33、若有代数式 (其中e仅代表自然对数的底数,不是变量),则以下能够正确表示该代数式的C语言表达式是(  )。

A)  sqrt(fabs(pow(n,x)+exp(x)))

B)  sqrt(fabs(pow(n,x)+pow(x,e)))

C)  sqrt(abs(n^x+e^x))

D)  sqrt(fabs(pow(x,n)+exp(x)))

    参考答案:A
【解析】B)选项中函数pow(x,e)错误应该直接使用exp(x)函数。C)选项中函数abs(n^x+e^x)错误,应该使用fabs()返回浮点数的绝对值。D)选项中pow(x,n)参数顺序错误。

36、以下数组定义中错误的是(  )。

A)  int  x[2][3]={1,2,3,4,5,6};

B)  int  x[][3]={0};

C)  int  x[][3]={{1,2,3},{4,5,6}};

D)  int  x[2][3]={{1,2},{3,4},{5,6}};

    参考答案:D
【解析】D)选项中x[2][3]定义的是一个两行三列的二维数组,而在给数组元素赋值时却赋成了三行,所以错误。

37、设有定义:char  p[]={'1', '2', '3'},*q=p; ,以下不能计算出一个char型数据所占字节数的表达式是(  )。

A)  sizeof(p)

B)  sizeof(char)

C)  sizeof(*q)

D)  sizeof(p[0])

    参考答案:B
【解析】根据题目中的定义可以知道sizeof(p),计算的是数组p中所有元素所占用的字节数,而不是char型数据所占字节数。

41、面向对象方法中,继承是指(  )。

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

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

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

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

    参考答案:D

【解析】继承是面向对象的方法的一个主要特征,是使用已有的类的定义作为基础建立新类的定义技术。广义的说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们,所以说继承是指类之间共享属性和操作的机制。

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

A)  记录长度

B)  文件的大小

C)  联系的复杂程度

D)  数据之间的联系方式

    参考答案:D
【解析】层次模型的基本结构是树形结构,网状模型是一个不加任何条件限制的无向图,关系模型采用二维表来表示,所以三种数据库的划分原则是数据之间的联系方式。

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

A)  一对一

B)  一对多

C)  多对多

D)  多对一

    参考答案:C

【解析】因为一个人可以操作多个计算机,而一台计算机又可以被多个人使用,所以两个实体之间是多对多的关系。

46、下面的程序段运行后,输出结果是(  )。

int i,j,x=0;

static int a[8][8];

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

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

a[i][j]=2;

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

x+=a[i][j];

printf("%d",x);

A)  9

B)  0

C)  不确定值

D)  18

    参考答案:B

【解析】本题主要考查的是用二维数组首地址和下标来引用二维数组元素的方法。通过分析可知,程序中的双重循环定义了一个如下的二维数组:

0 1 2 0 0 0 0 0

2 3 4 0 0 0 0 0

4 5 6 0 0 0 0 0

0 0 0 0 0 0 0 0

……

0 0 0 0 0 0 0 0

由于数组的下标是从0开始的,所以二维数组元素a[i][j]表示的是二维数组a的第i+1行、第j+1列对应位置的元素。从第二次的嵌套循环结束后j的值为,所以

   for(i=0;i<8;i++)x+=a[i][j];

计算的是数组中所有第四列的元素的和,即0。

47、有以下程序:

#include

struct ord

{ int x,y;}dt[2]={11,12,13,14};

main(){

struct ord*p=dt;

printf("%d,",++(p->x));printf("%d\n",++(p->y));

}

程序运行后的输出结果是(  )。

A)  11,12

B)  12,13

C)  13,14 

D)  14,1l

    参考答案:B
【解析】本题中定义了一个结构体数组dt[2],其中dt[0].x=11,dt[0].y=12,dt[1].x=13,dt[1].y=14。在main函数中指针p指向了结构体数组的第一个元素,因此p->x值为11,p->y值为12,自加运算的结果分别为12和13。

48、有以下程序:

int fun1(double a){return (int)(a*=a);}

int fun2(double x,double y)

{double a=0,b=0;

a=fun1(x);b=fun1(y);return(int)(a+b);

}

main()

{double w;w=fun2(1.1,2.0);…}

程序执行后变量w中的值是(  )。

A)  5.21

B)  5

C)  5.0 

D)  0.0

    参考答案:C
【解析】题中变量w的定义为double型,函数fun2()的定义为int型,按照各类数值型数据间的混合运算,整型数据被转换为实型数据。

当fun2运行完毕返回值为int型时,w还是double型,所以值为5.0。

49、有以下程序:

#include

main()

{ int a=5,b=1,t;

t=(a<<2)|b;printf("%d\n",t);

}

程序运行后的输出结果是(  )。

A)  21

B)  11

C)  6

D)  1

    参考答案:A

【解析】按位或运算符"|"是双目运算符,其功能是参与运算的两数各对应的二进位相或。左移运算符"<<"是双目运算符,其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。将5变换为二进制数为101,左移2位后为10100,1转换为二进制数为00001,10100与00001进行或运算后为10101,再将其转换为十进制数为21。因此,本题答案为A)。
&运算为保留二进制位相同的位,| 运算为保留不同位,20的二进制形式为10100,20 | 1 则为10101,所以得出的结果是21。

50、有三个关系R、S和T如下:

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

A)  自然连接

B)  差

C)  交

D)  并

    参考答案:B
【解析】关系T中的元组是R关系中有而S关系中没有的元组的集合,所以进行的是差的运算。

求集合的交集。该模块主要实现:对集合中的元素进行分析,把两个集合中共有的元素保存到另一个集合中。
求集合的并集。该模块主要实现:对集合中的元素进行分析,把两个集合中所有的元素保存到另一个集合中。

求集合的差集。该模块主要实现:对集合中的元素进行分析,把两个集合中不共有的元素保存到另一个集合中。
投影运算就是去除两个集合中其中几列。 

51、若有定义int a[2][3];,则对a数组的第i行第j列(假设i,j已正确说明并赋值)元素值的正确引用为(  )。

A)  *(*(a+i)+j) 

B)  (a+i)[j]

C)  *(a+i+j)

D)  *(a+i)+j

    参考答案:A
【解析】本题考查了二维数组元素的引用方法。选项A)中a+i指向了数组a的第i+1行,*(a+i)则是第i+1行第0列的地址值,*(a+i)+j指向了数组a第i+1行,j+1列,*(*(a+i)+j)取到的是数组a的a[i][j]元素。

一、数据结构与算法

52、下列叙述中正确的是(  )。

A)  循环队列是队列的一种链式存储结构

B)  循环队列是队列的一种顺序存储结构

C)  循环队列是非线性结构

D)  循环队列是一种逻辑结构

    参考答案:B

【解析】在实际应用中,队列的顺序存储结构一般采用循环队列的形式。

顺序存储就是指用一组连续的存储单元依次存储,链式存储内存中地址不是挨着的,循环队列增设了两个指针头指针和尾指针,实现空间的最大利用,链式的是循环链表。

53、下列叙述中正确的是

A)  所谓算法就是计算方法

B)  程序可以作为算法的一种描述方法

C)  算法设计只需考虑得到计算结果 

D)  算法设计可以忽略算法的运算时间

    参考答案:B

【解析】算法是指对解题方案的准确而完整的描述,算法不等于数学上的计算方法,也不等于程序,A选项错误。算法设计需要考虑可行性、确定性、有穷性与足够的情报,不能只考虑计算结果,C选项错误。算法设计有穷性是指操作步骤有限且能在有限时间内完成,如果一个算法执行耗费的时间太长,即使最终得出了正确结果,也是没有意义的,D选项错误。算法在实现时需要用具体的程序设计语言描述,所以程序可以作为算法的一种描述方法,B选项正确。 

54、下列叙述中正确的是

A)  算法的效率只与问题的规模有关,而与数据的存储结构无关

B)  算法的时间复杂度是指执行算法所需要的计算工作量

C)  数据的逻辑结构与存储结构是一一对应的

D)  算法的时间复杂度与空间复杂度一定相关

    参考答案:B

【解析】算法的效率与问题的规模和数据的存储结构都有关,A错误。算法的时间复杂度,是指执行算法所需要的计算工作量,B正确。由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此数据的逻辑结构和存储结构不是一一对应的,C错误。算法的时间复杂度和空间复杂度没有直接的联系,D错误。

算法的执行效率与数据的存储结构是有很大关系的,例如在数组中的插入删除算法的时间复杂度O(N)=n,而在链表中插入删除算法的时间复杂度为O(1)。

55、下列叙述中错误的是

A)  算法的时间复杂度与算法所处理数据的存储结构有直接关系

B)  算法的空间复杂度与算法所处理数据的存储结构有直接关系

C)  算法的时间复杂度与空间复杂度有直接关系

D)  算法的时间复杂度与算法程序执行的具体时间是不一致的

    参考答案:C

【解析】算法的时间复杂度是指执行算法所需要的计算工作量。数据的存储结构直接决定数据输入,而这会影响算法所执行的基本运算次数,A选项叙述正确。算法的空间复杂度是指执行这个算法所需要的内存空间,其中包括输入数据所占的存储空间,B选项叙述正确。而算法的时间复杂度与空间复杂度没有直接关系,故选择C选项。算法程序执行的具体时间受到所使用的计算机、程序设计语言以及算法实现过程中的许多细节所影响,而算法的时间复杂度与这些因素无关,所以是不一致的,D选项叙述正确。

56、下列关于算法复杂度叙述正确的是

A)  最坏情况下的时间复杂度一定高于平均情况的时间复杂度

B)  时间复杂度与所用的计算工具无关

C)  对同一个问题,采用不同的算法,则它们的时间复杂度是相同的

D)  时间复杂度与采用的算法描述语言有关

    参考答案:B

【解析】算法的时间复杂度是指执行算法所需要的计算工作量,它与使用的计算机、程序设计语言以及算法实现过程中的许多细节无关,B选项正确,D选项错误。最坏情况下的时间复杂度可以与平均情况的时间复杂度相同,A选项错误。不同的算法时间复杂度一般不相同,C选项错误。

57、下列叙述中正确的是

A)  程序执行的效率与数据的存储结构密切相关

B)  程序执行的效率只取决于程序的控制结构

C)  程序执行的效率只取决于所处理的数据量

D)  以上说法均错误

    参考答案:A

【解析】程序执行的效率与数据的存储结构、数据的逻辑结构、程序的控制结构、所处理的数据量等有关。

58、下列关于线性链表的叙述中,正确的是(  )。

A)  各数据结点的存储空间可以不连续,但它们的存储顺序与逻辑顺序必须一致

B)  各数据结点的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续

C)  进行插入与删除时,不需要移动表中的元素

D)  以上说法均不正确

    参考答案:C

【解析】一般来说,在线性表的链式存储结构中,各数据结点的存储序号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。线性链表中数据的插入和删除都不需要移动表中的元素,只需改变结点的指针域即可。

59、下列叙述中正确的是

A)  有且只有一个根结点的数据结构一定是线性结构

B)  每一个结点最多有一个前件也最多有一个后件的数据结构一定是线性结构

C)  有且只有一个根结点的数据结构一定是非线性结构

D)  有且只有一个根结点的数据结构可能是线性结构,也可能是非线性结构

    参考答案:D

【解析】一个非空的数据结构如果满足以下两个条件:有且只有一个根结点;每一个结点最多有一个前件,也最多有一个后件,称为线性结构,故A、B和C选项都错误;不同时满足以上两个条件的数据结构就称为非线性结构,其中树形结构只有一个根结点,D选项正确。

60、下列叙述中正确的是

A)  存储空间不连续的所有链表一定是非线性结构

B)  结点中有多个指针域的所有链表一定是非线性结构

C)  能顺序存储的数据结构一定是线性结构

D)  带链的栈与队列是线性结构

    参考答案:D

【解析】一个非空的数据结构如果满足以下两个条件:有且只有一个根节点;每一个节点最多有一个前件,也最多有一个后件,称为线性结构,称为线性表,可以采用顺序存储和链接存储,其中链式存储空间不连续,所以A选项错误。双向链表节点有两个指针域,指向前一个节点的指针和指向后一个节点的指针,也是线性结构,B选项错误。顺序存储结构中可能根节点不唯一,故可能不是线性结构,C选项错误。栈是所有的插入与删除都限定在表的同一端进行的线性表;队列是指允许在一端进行插入,而在另一端进行删除的线性表。D选项正确。

61、下列叙述中正确的是

A)  循环队列属于队列的链式存储结构

B)  双向链表是二叉树的链式存储结构

C)  非线性结构只能采用链式存储结构

D)  有的非线性结构也可以采用顺序存储结构

    参考答案:D

【解析】循环队列是队列的一种顺序存储结构,A选项错误。双向链表为顺序存储结构,二叉树通常采用链式存储结构,B选项错误。完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储方式,C选项错误,D选项正确。

62、下列叙述中正确的是

A)  在链表中,如果每个结点有两个指针域,则该链表一定是非线性结构

B)  在链表中,如果有两个结点的同一个指针域的值相等,则该链表一定是非线性结构

C)  在链表中,如果每个结点有两个指针域,则该链表一定是线性结构

D)  在链表中,如果有两个结点的同一个指针域的值相等,则该链表一定是线性结构

    参考答案:B

【解析】一个非空的数据结构如果满足以下两个条件:有且只有一个根节点;每一个节点最多有一个前件,也最多有一个后件,称为线性结构。双向链表节点有两个指针域,指向前一个节点的指针和指向后一个节点的指针,也是线性结构,A选项错误。如果有两个节点的同一个指针域的值相等,说明一个节点有两个前件,属于非线性结构,B选项正确,D选项正确。非线性结构主要是指树形结构和网状结构,可以满足每个节点有两个指针域的条件,C选项正确。

64、下列叙述中正确的是

A)  所有数据结构必须有根结点

B)  所有数据结构必须有终端结点(即叶子结点)

C)  只有一个根结点,且只有一个叶子结点的数据结构一定是线性结构

D)  没有根结点或没有叶子结点的数据结构一定是非线性结构

    参考答案:D

【解析】一个非空的数据结构如果满足以下两个条件:有且只有一个根结点;每一个结点最多有一个前件,也最多有一个后件,称为线性结构,在数据结构中习惯称为线性表,D选项正确。图是可能不包含根结点或叶子结点的数据结构,AB选项错误。数据结构中若有中间结点不满足只有一个前件或者后件条件,则不属于线性结构,C选项错误。

65、下列关于算法的描述中错误的是

A)  算法强调动态的执行过程,不同于静态的计算公式

B)  算法必须能在有限个步骤之后终止

C)  算法设计必须考虑算法的复杂度  

D)  算法的优劣取决于运行算法程序的环境

    参考答案:D

【解析】算法是指对解题方案的准确而完整的描述,简单地说,就是解决问题的操作步骤。算法不同于数学上的计算方法,强调实现,A选项叙述正确。算法的有穷性是指,算法中的操作步骤为有限个,且每个步骤都能在有限时间内完成,B选项叙述正确。算法复杂度包括算法的时间复杂度和算法的空间复杂度。算法设计必须考虑执行算法所需要的资源,即时间与空间复杂度,故C选项叙述正确。算法的优劣取决于算法复杂度,与程序的环境无关,当算法被编程实现之后,程序的运行受到计算机系统运行环境的限制,故正确答案为D选项。

 
66、下列叙述中正确的是

A)  每一个结点有两个指针域的链表一定是非线性结构

B)  所有结点的指针域都为非空的链表一定是非线性结构

C)  循环链表是循环队列的链式存储结构

D)  线性结构的存储结点也可以有多个指针

    参考答案:D

【解析】一个非空的数据结构如果满足以下两个条件:有且只有一个根结点;每一个结点最多有一个前件,也最多有一个后件,则称为线性结构,在数据结构中习惯称为线性表。双向链表结点具有两个指针域,属于线性结构,A选项错误。循环链表所有结点的指针域都为非空,属于线性结构,B选项错误。循环链表是链表,循环队列属于队列,队列只能在队尾入队,在排头退队,链表可以在任何位置插入、删除,C选项错误。双向链表结点具有多个指针域,D选项正确。

67、设数据集合为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选项正确。

68、下列叙述中正确的是

A)  栈与队列都只能顺序存储

B)  循环队列是队列的顺序存储结构

C)  循环链表是循环队列的链式存储结构

D)  栈是顺序存储结构而队列是链式存储结构

    参考答案:B

【解析】栈是所有的插入与删除都限定在表的同一端进行的线性表;队列是指允许在一端进行插入,而在另一端进行删除的线性表,二者均即可以顺序存储也可以链式存储。为了充分地利用数组的存储空间,把数组的前端和后端连接起来,形成一个环形的表,称为循环队列,因此循环队列是队列的一种顺序存储结构, B选项正确。

69、下列叙述中正确的是

A)  存储空间连续的数据结构一定是线性结构

B)  存储空间不连续的数据结构一定是非线性结构

C)  没有根结点的非空数据结构一定是线性结构

D)  具有两个根结点的数据结构一定是非线性结构

    参考答案:D

【解析】一个非空的数据结构如果满足以下两个条件:有且只有一个根节点;每一个节点最多有一个前件,也最多有一个后件,称为线性结构,也称为线性表,可以采用顺序存储和链接存储,其中顺序存储的空间连续而链式存储空间不连续。非线性结构是指不满足以上两个条件的数据结构,非线性结构主要是指树形结构和网状结构。数据结构线性与否与存储空间是否连续没有直接关系,如二叉树可以用一片连续的空间来存储,但其为非线性结构,A选项错误。线性表的链式存储结构可以用不连续的空间来存储,但其为线性结构,B选项错误。没有根结点的非空数据结构一定不是线性结构,C选项错误。具有两个根结点的结构一定是非线性结构,D选项正确。

70、下列叙述中正确的是

A)  带链队列的存储空间可以不连续,但队头指针必须大于队尾指针

B)  带链队列的存储空间可以不连续,但队头指针必须小于队尾指针

C)  带链队列的存储空间可以不连续,且队头指针可以大于也可以小于队尾指针

D)  带链队列的存储空间一定是不连续的

    参考答案:C

【解析】带链的队列就是用一个单链表来表示队列,队列中的每一个元素对应链表中的一个节点,其存储结构既可以采用顺序存储也可以是链接存储,其中顺序存储的空间连续而链式存储空间不连续,D选项错误。循环队列中,由于指针超过队列地址最大值时会移动到队列最小地址处,所以队头指针可以大于也可以小于队尾指针,A、B选项错误,C选项正确。

71、下列叙述中正确的是(  )。

A)  顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的

B)  顺序存储结构只针对线性结构,链式存储结构只针对非线性结构

C)  顺序存储结构能存储有序表,链式存储结构不能存储有序表

D)  链式存储结构比顺序存储结构节省存储空间

    参考答案:A

【解析】链式存储结构既可以针对线性结构也可以针对非线性结构,所以B)与C)错误。链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以D)错误。

72、在线性表的顺序存储结构中,其存储空间连续,各个元素所占的字节数

A)  相同,元素的存储顺序与逻辑顺序一致

B)  相同,但其元素的存储顺序可以与逻辑顺序不一致

C)  不同,但元素的存储顺序与逻辑顺序一致

D)  不同,且其元素的存储顺序可以与逻辑顺序不一致

    参考答案:A

【解析】顺序表具有以下两个基本特征:线性表中所有元素所占的存储空间是连续的;线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。在顺序表中,每个元素占有相同的存储单元。A选项正确。

73、下列关于栈叙述正确的是(  )。

A)  算法就是程序

B)  设计算法时只需要考虑数据结构的设计

C)  设计算法时只需要考虑结果的可靠性

D)  以上三种说法都不对

    参考答案:D

【解析】算法是指解题方案的准确而完整的描述,算法不等于程序,也不等于计算方法,所以A)错误。设计算法时不仅要考虑对数据对象的运算和操作,还要考虑算法的控制结构。

74、设栈的顺序存储空间为S(1: 50),初始状态为top=0。现经过一系列入栈与退栈运算后,top=20,则当前栈中的元素个数为

A)  30

B)  29

C)  20

D)  19

    参考答案:C

【解析】栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素赋予指定变量。当栈为空时,栈顶指针top=0,经过入栈和退栈运算,指针始终指向栈顶元素。top=20,则当前栈中有20个元素,C选项正确。

75、设栈的顺序存储空间为S(1: m),初始状态为top=m+1。现经过一系列入栈与退栈运算后,top=20,则当前栈中的元素个数为

A)  30

B)  20

C)  m-19

D)  m-20

    参考答案:C

【解析】栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素赋予指定变量。栈为空时,栈顶指针top=0,经过入栈和退栈运算,指针始终指向栈顶元素。初始状态为top=m+1,当top=20时,元素依次存储在单元20:m中,个数为m-19,C选项正确。

76、设栈的顺序存储空间为S(0:49),栈底指针bottom=49,栈顶指针top=30(指向栈顶元素)。则栈中的元素个数为

A)  30

B)  29

C)  20

D)  19

    参考答案:C

【解析】栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素赋予指定变量。元素依次存储在单元30:49中,个数为
 
77、一个栈的初始状态为空。现将元素A,B,C,D,E依次入栈,然后依次退栈三次,并将退栈的三个元素依次入队(原队列为空),最后将队列中的元素全部退出。则元素退队的顺序为

A)  ABC

B)  CBA

C)  EDC

D)  CDE

    参考答案:C

【解析】栈所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素赋予指定变量。队列指允许在一端进行插入,而在另一端进行删除的线性表。习惯上称往队列的队尾插入一个元素为入队运算,称从队列的队头删除一个元素为退队运算。元素入栈后为ABCDE,退栈并入队后,队中元素为EDC。退队时从队头开始,顺序为EDC,C选项正确。

78、设有栈S和队列Q,初始状态均为空。首先依次将A,B,C,D,E,F入栈,然后从栈中退出三个元素依次入队,再将X,Y,Z入栈后,将栈中所有元素退出并依次入队,最后将队列中所有元素退出,则退队元素的顺序为

A)  DEFXYZABC    

B)  DEFXYZABC    

C)  FEDXYZCBA    

D)  DEFZYXABC

    参考答案:B

【解析】栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。队列是指允许在一端进行插入,而在另一端进行删除的线性表。将A,B,C,D,E,F入栈后,栈中元素为ABCDEF,退出三个元素入队,队列元素为FED,将X,Y,Z入栈后栈中元素为ABCXYZ,全部入队后,队列元素为FEDZYXCBA,故B选项正确。

79、下列与队列结构有关联的是

A)  函数的递归调用

B)  数组元素的引用

C)  多重循环的执行

D)  先到先服务的作业调度

    参考答案:D

【解析】队列的修改是依先进先出的原则进行的,D正确。

 80、设循环队列的存储空间为Q(1: 35),初始状态为front=rear=35。现经过一系列入队与退队运算后,front=15,rear=15,则循环队列中的元素个数为

A)  15

B)  16

C)  20

D)  0或35

    参考答案:D

【解析】在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置。在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界时,其加1操作的结果是指向向量的下界0。由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时,头尾指针均相等。答案为D选项。

81、设循环队列为Q(1: m),其初始状态为front=rear=m。经过一系列入队与退队运算后,front=15,rear=20。现要在该循环队列中寻找最大值的元素,最坏情况下需要比较的次数为

A)  4

B)  6

C)  m-5

D)  m-6

    参考答案:A

【解析】循环队列是队列的一种顺序存储结构,用队尾指针rear指向队列中的队尾元素,用排头指针指向排头元素的前一个位置,因此,从排头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列中的元素,队列初始状态为front=rear=m,当front=15,rear=20时,队列中有5个元素,比较次数为4次,A选项正确。

82、设循环队列为Q(1:m),其初始状态为front=rear=m。经过一系列入队与退队运算后,front=20,rear=15。现要在该循环队列中寻找最小值的元素,最坏情况下需要比较的次数为

A)  5

B)  6

C)  m-5

D)  m-6

    参考答案:D

【解析】循环队列是队列的一种顺序存储结构,用队尾指针rear指向队列中的队尾元素,用排头指针指向排头元素的前一个位置,因此,从排头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列中的元素,队列初始状态为front=rear=m,当front=20,rear=15时,队列中有m-20+15=m-5个元素,比较次数为m-6次,D选项正确。

83、下列叙述中正确的是

A)  循环队列是顺序存储结构    

B)  循环队列是链式存储结构

C)  循环队列是非线性结构  

D)  循环队列的插入运算不会发生溢出现象

    参考答案:A

【解析】循环队列是队列的一种顺序存储结构. 线性结构是n个数据元素构成的有限序列,除第一个元素外的每一个元素,有且只有一个前件,除最后一个元素外,有且只有一个后件。循环队列是线性结构。当需要插入的数据大于循环队列的存储长度,入队运算会覆盖前面的数据,发生溢出现象。故A选项正确。

84、线性表的链式存储结构与顺序存储结构相比,链式存储结构的优点有

A)  节省存储空间

B)  插入与删除运算效率高 

C)  便于查找 

D)  排序时减少元素的比较次数

    参考答案:B

【解析】顺序表和链表的优缺点比较如下表: 

类 型优 点缺  点

顺序表(1)可以随机存取表中的任意结点 (2)无需为表示结点间的逻辑关系额外增加存储空间(1)顺序表的插入和删除运算效率很低(2)顺序表的存储空间不便于扩充 (3)顺序表不便于对存储空间的动态分配链表(1)在进行插入和删除运算时,只需要改变指针即可,不需要移动元素 (2)链表的存储空间易于扩充并且方便空间的动态分配需要额外的空间(指针域)来表示数据元素之间的逻辑关系,存储密度比顺序表低由表中可以看出链式存储插入与删除运算效率高,故B选项正确。

二、程序设计基础

85、在软件设计中不使用的工具是(  )。

A)  系统结构图 

B)  PAD图

C)  数据流图(DFD图) 

D)  程序流程图

    参考答案:C

 【解析】系统结构图是对软件系统结构的总体设计的图形显示。在需求分析阶段,已经从系统开发的角度出发,把系统按功能逐次分割成层次结构,是在概要设计阶段用到的。PAD图是在详细设计阶段用到的。程序流程图是对程序流程的图形表示,在详细设计过程中用到。数据流图是结构化分析方法中使用的工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它是一种功能模型,是在可行性研究阶段用到的而非软件设计时用到,所以选择C)。

86、在面向对象方法中,不属于"对象"基本特点的是(  )。

A)  一致性

B)  分类性

C)  多态性

D)  标识唯一性

    参考答案:A

【解析】对象有如下一些基本特点:标识唯一性、分类性、多态性、封装性、模块独立性好。所以选择A)。

87、下面对对象概念描述正确的是

A)  对象间的通信靠消息传递

B)  对象是名字和方法的封装体

C)  任何对象必须有继承性

D)  对象的多态性是指一个对象有多个操作

    参考答案:A

【解析】对象之间进行通信的构造叫做消息,A正确。多态性是指同一个操作可以是不同对象的行为,D错误。对象不一定必须有继承性,C错误。封装性是指从外面看只能看到对象的外部特征,而不知道也无须知道数据的具体结构以及实现操作,B错误。

88、下面属于字符类的实例是

A)  '518'

B)  "5"

C)  'nm

D)  '\n'

    参考答案:D

【解析】字符实例的一般形式是用一对单引号括起来的一个字符。另外ASCII码中还有一些控制字符,C语言中用转义字符的形式来书写这些常,转义字符一反斜杠(\)开始,后面跟1个字符或字符序列。'518'单引号中有三个字符,A选项错误。"5"双引号为字符串,B选项错误。'nm'单引号中有两个字符,C选项错误。'\n'为换行符,属于字符类实例,D选项正确。

89、下面对类-对象主要特征描述正确的是

A)  对象唯一性 

B)  对象无关性 

C)  类的单一性     

D)  类的依赖性

    参考答案:A

【解析】对象的基本特点是:标识唯一性、分类性、多态性、封装性、模块独立性好。类是具有共同属性、共同方法的对象的集合,是关于对象的抽象描述,反映属于该对象类型的所有对象的性质。对象具有的性质,类也具有。故A选项正确。

90、 面向对象方法中,实现对象的数据和操作结合于统一体中的是

A)  结合 

B)  封装

C)  隐藏   

D)  抽象

    参考答案:B

【解析】对象的基本特点是:标识唯一性、分类性、多态性、封装性、模块独立性好。封装是指隐藏对象的属性和实现细节,将数据和操作结合于统一体,仅对外提供访问方式,B选项正确。

91、 面向对象方法中,继承是指(  )。

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

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

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

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

    参考答案:D

【解析】继承是面向对象的方法的一个主要特征,是使用已有的类的定义作为基础建立新类的定义技术。广义的说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们,所以说继承是指类之间共享属性和操作的机制。

三、软件工程基础

92、构成计算机软件的是

A)  源代码

B)  程序和数据

C)  程序和文档

D)  程序、数据及相关文档

    参考答案:D

【解析】软件指的是计算机系统中与硬件相互依赖的另一部分,包括程序、数据和有关的文档,选D。

93、软件生命周期中的活动不包括(  )。

A)  市场调研

B)  需求分析

C)  软件测试

D)  软件维护

    参考答案:A

【解析】软件生命周期可以分为软件定义、软件开发与软件运行维护三个阶段。主要活动阶段是:可行性研究与计划阶段,需求分析,软件设计,软件实现,软件测试,运行和维护,所以选择A)。

94、下面属于系统软件的是

A)  财务管理系统

B)  数据库管理系统

C)  编辑软件Word

D)  杀毒软件

    参考答案:B

【解析】计算机软件按功能分为应用软件、系统软件、支撑软件(或工具软件)。系统软件是管理计算机的资源,提高计算机的使用效率,为用户提供各种服务的软件,如操作系统、数据库管理系统、编译程序、汇编程序和网络软件等,B选项正确。A、C、D选项为应用软件。

95、负责数据库中查询操作的数据库语言是(  )。

A)  数据定义语言

B)  数据管理语言

C)  数据操纵语言

D)  数据控制语言

    参考答案:C

【解析】数据定义语言:负责数据的模式定义与数据的物理存取构建;数据操纵语言:负责数据的操纵,包括查询及增、删、改等操作;数据控制语言:负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。

96、软件工程的三要素是

A)  方法、工具和过程

B)  建模、方法和工具

C)  建模、方法和过程

D)  定义、方法和过程

    参考答案:A

【解析】软件工程是应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序。软件工程包含3个要素:方法、工具和过程。A选项正确。

97、在下列模式中,能够给出数据库物理存储结构与物理存取方法的是(  )。

A)  外模式

B)  内模式

C)  概念模式

D)  逻辑模式

    参考答案:B

【解析】数据库系统的三级模式是概念模式、外模式和内模式。概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户公共数据视图。外模式也称子模式或用户模式,它是用户的数据视图,给出了每个用户的局部数据描述。内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法,所以选择B)。

98、下面不属于软件设计阶段任务的是

A)  软件的详细设计

B)  软件的总体结构设计

C)  软件的需求分析

D)  软件的数据设计

    参考答案:C

【解析】软件生命周期分为:软件定义期、软件开发期、运行维护期。软件设计属于软件开发期任务,通常又分为概要设计和详细设计两个阶段,给出软件的结构、模块的划分、功能的分配以及处理流程。需求分析属于软件定义期任务,C选项正确。

99、软件生命周期中,确定软件系统要做什么的阶段是

A)  需求分析

B)  软件测试

C)  软件设计

D)  系统维护

    参考答案:A

【解析】软件生命周期各阶段的主要任务是:问题定义、可行性研究与计划制定、需求分析、软件设计、软件实现、软件测试、运行维护。其中需求分析是指对待开发软件提出的需求进行分析并给出详细定义,也即是确定软件系统要做什么,A选项正确。

100、 下面不属于软件需求分析阶段主要工作的是

A)  需求变更申请

B)  需求分析

C)  需求评审

D)  需求获取

    参考答案:A

【解析】需求分析阶段的工作可概括为4个方面:①需求获取。②需求分析。③编写需求规格说明书。④需求审评。

101、下面不属于软件需求分析阶段工作的是

A)  需求获取  

B)  需求计划 

C)  需求分析 

D)  需求评审

    参考答案:B

【解析】需求分析阶段的工作可以分为4个方面:需求获取、需求分析、编写需求规格说明书和需求评审,而需求计划不属于需求分析阶段的工作,故正确答案为B选项。

102、 下面对软件测试描述错误的是

A)  严格执行测试计划,排除测试的随意性

B)  随机地选取测试数据

C)  随机地选取测试数据

D)  软件测试是保证软件质量的重要手段

    参考答案:B

【解析】在测试之前制定测试计划,并严格执行,测试用例的选择不可随意,应选择有代表性的,尽可能发现迄今为止尚未发现的错误,A选项叙述正确,B选项叙述错误。测试根本目的是尽可能多地发现并排除软件中隐藏的错误,C选项叙述正确。软件测试是保证软件质量、可靠性的关键步骤,D选项叙述正确。故正确答案为B选项。

103、在软件开发中,需求分析阶段可以使用的工具是(  )。

A)  N-S图

B)  DFD图

C)  PAD图

D)  程序流程图

    参考答案:B

【解析】在需求分析阶段可以使用的工具有数据流图DFD图,数据字典DD,判定树与判定表,所以选择B)。

104、下面不能作为结构化方法软件需求分析工具的是

A)  系统结构图

B)  数据字典(DD)

C)  数据流程图(DFD图)

D)  判定表

    参考答案:A

【解析】结构化方法软件需求分析工具主要有数据流图、数据字典、判定树和判定表。

104、下面可以作为软件设计工具的是

A)  系统结构图

B)  数据字典(DD)

C)  数据流程图(DFD图)

D)  甘特图

    参考答案:A

【解析】结构化分析方法的常用工具:数据流图(DFD)、数据字典(DD)、判定表、判定树。常用的过程设计工具如下所述:图形工具(程序流程图、N-S图、PAD图、HIPO)、表格工具(判定表)、语言工具(PDL)。结构化设计方法使用的描述方式是系统结构图。A选项正确。

105、下面不能作为软件需求分析工具的是

A)  PAD图

B)  数据字典(DD)

C)  数据流程图(DFD图)

D)  判定树

    参考答案:A

【解析】需求分析方法可以分为结构化分析方法和面向对象的分析方法,结构化分析工具包括:数据流图(DFD)、数据字典(DD)、结构化英语、判定表和判定树等。PAD图是过程设计工具,所以A选项正确。

106、 数据字典(DD) 所定义的对象都包含于

A)  数据流图(DFD图) 

B)  程序流程图

C)  软件结构图

D)  方框图

    参考答案:A

【解析】在数据流图中,对所有元素都进行了命名,所有名字的定义集中起来就构成了数据字典。因此选A,而B,C,D都不符合。

107、下面不属于软件设计阶段任务的是

A)  软件总体设计

B)  算法设计

C)  制定软件确认测试计划

D)  数据库设计

    参考答案:C

【解析】从技术观点上看,软件设计包括软件结构设计、数据设计、接口设计、过程设计。所以A、B、D正确,C为软件测试阶段的任务。

108、某系统结构图如下图所示
 
该系统结构图的最大扇出数是

A)  n

B)  1

C)  3

D)  4

    参考答案:A

【解析】扇出指的是由一个模块直接调用的其他模块数。题干中某系统为一个模块,其扇出数目为n(n>3),功能1与功能n模块扇出数均为2,故A选项正确。

109、某系统结构图如下图所示

该系统结构图的宽度是

A)  2 

B)  3 

C)  4

D)  n

    参考答案:D

【解析】宽度是指最大模块数的层的控制跨度。题目中系统第一层只有1个模块,第二层有n(n>3)个模块,第三层有4个模块,控制跨度为n,D选项正确。 

110、 下面不能作为软件设计工具的是

A)  PAD图    

B)  程序流程图

C)  数据流程图(DFD图) 

D)  总体结构图

    参考答案:C

【解析】软件设计常用的工具有:图形工具:程序流程图、N-S图、PAD图、HIPO;表格工具:判定表;语言工具:PDL(伪码)。另外,在结构化设计方法中,常用的结构设计工具是结构图,故选择C选项。

111、下面属于白盒测试方法的是

A)  边界值分析法 

B)  基本路径测试

C)  等价类划分法 

D)  错误推测法

    参考答案:B

【解析】白盒测试是把程序看成装在一只透明的白盒子里,测试者完全了解程序的结构和处理过程。它根据程序的内部逻辑来设计测试用例,检查程序中的逻辑通路是否都按预定的要求正确地工作。白盒测试的主要技术有逻辑覆盖测试、基本路径测试等,B选项正确。常用的黑盒测试方法和技术有:等价类划分法、边界值分析法、错误推测法和因果图等,A、C、D选项错误。

112、下面属于黑盒测试方法的是

A)  边界值分析法

B)  基本路径测试

C)  条件覆盖

D)  条件-分支覆盖

    参考答案:A

【解析】黑盒测试是把程序看成一只黑盒子,测试者完全不了解,或不考虑程序的结构和处理过程。它根据规格说明书的功能来设计测试用例,检查程序的功能是否符合规格说明的要求。常用的黑盒测试方法和技术有:等价类划分法、边界值分析法、错误推测法和因果图等,A选项正确。白盒测试的主要技术有逻辑覆盖测试(语句覆盖、路径覆盖、判断覆盖、条件覆盖)、基本路径测试等,B、C、D选项错误。

113、使用白盒测试方法时,设计测试用例应根据

A)  程序的内部逻辑

B)  程序的复杂结构

C)  程序的功能  

D)  使用说明书

    参考答案:A

【解析】白盒测试又称为结构测试或逻辑驱动测试,它允许测试人员利用程序内部的逻辑结构及有关信息来设计或选择测试用例,对程序所有的逻辑路径进行测试,故A选项正确。

四、数据库设计基础

114、在数据库管理系统提供的数据语言中,负责数据模式定义的是

A)  数据定义语言

B)  数据管理语言

C)  数据操纵语言 

D)  数据控制语言

    参考答案:A

【解析】数据库管理系统提供了相应的数据语言,它们是:数据定义语言,该语言负责数据的模式定义与数据的物理存取构建;数据操纵语言,该语言负责数据的操纵,包括查询与增、删、改等操作;数据控制语言,该语言负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。A选项正确。

115、在数据管理的三个发展阶段中,数据的共享性好且冗余度最小的是

A)  人工管理阶段 

B)  文件系统阶段

C)  数据库系统阶段

D)  面向数据应用系统阶段

    参考答案:C

【解析】数据管理技术的发展经历了3个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。由下表可知C选项正确。

特点人工管理阶段文件系统阶段数据库系统阶段

管理者                人                                        文件系统                                   数据库管理系统

面向对象            某个应用程序                       某个应用程序                            现实世界

共享程度            无共享,冗余度大                共享性差,冗余度大                  共享性大,冗余度小

独立性                不独立,完全依赖于程序     独立性差                                   具有高度的物理独立性和一定的逻辑独立性

结构化                无结构                                 记录内有结构,整体无结构       整体结构化,用数据模型描述

控制能力            由应用程序控制                   由应用程序控制                         由DBMS提供数据安全性、完整性、并发控制和恢复
数据管理发展至今已经历了三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。其中最后一个阶段结构简单,使用方便逻辑性强物理性少,在各方面的表现都最好,一直占据数据库领域的主导地位。数据库系统的特点为高共享、低冗余、独立性高、具有完整性。

116、数据库应用系统中的核心问题是(  )。

A)  数据库设计

B)  数据库系统设计

C)  数据库维护

D)  数据库管理员培训

    参考答案:A

【解析】数据库应用系统中的核心问题是数据库的设计。

117、当数据库中数据总体逻辑结构发生变化,而应用程序不受影响,称为数据的

A)  逻辑独立性

B)  物理独立性 

C)  应用独立性   

D)  空间独立性

    参考答案:A

【解析】数据独立性包括物理独立性和逻辑独立性,物理独立性指数据的物理结构的改变,不会影响数据库的逻辑结构,也不会引起应用程序的改动;逻辑独立性指数据库的总体逻辑结构的改变,不会导致相应的应用程序的改变。

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

A)  内模式

B)  概念模式

C)  外模式

D)  设计模式

    参考答案:C

【解析】数据库系统的三级模式是概念模式、外模式和内模式。概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户公共数据视图。外模式也称子模式或用户模式,它是用户的数据视图,给出了每个用户的局部数据描述,所以选择C)。内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法。

118、下面不属于需求分析阶段任务的是(  )。

A)  确定软件系统的功能需求

B)  确定软件系统的性能需求

C)  需求规格说明书评审 

D)  制定软件集成测试计划

    参考答案:D

【解析】需求分析阶段的工作有:需求获取;需求分析;编写需求规格说明书;需求评审,所以选择D)。

119、在数据库系统中,用于对客观世界中复杂事物的结构及它们之间的联系进行描述的是

A)  概念数据模型

B)  逻辑数据模型

C)  物理数据模型

D)  关系数据模型

    参考答案:A

【解析】数据模型按照不同的应用层次分为以下3种类型:概念数据模型,着重于对客观世界复杂事物的描述及对它们内在联系的刻画;逻辑数据模型,是面向数据库系统的模型,着重于在数据库系统一级的实现;物理数据模型,是面向计算机物理实现的模型,此模型给出了数据模型在计算机上物理结构的表示。A选项正确。

 逻辑 = 模型

 
120、在数据库中,数据模型包括数据结构、数据操作和

A)  数据约束  

B)  数据类型

C)  关系运算   

D)  查询

    参考答案:A

【解析】数据模型通常由数据结构、数据操作及数据约束3部分组成。故A选项正确。

121、逻辑模型是面向数据库系统的模型,下面属于逻辑模型的是

A)  关系模型 

B)  谓词模型 

C)  物理模型  

D)  实体-联系模型

    参考答案:A

【解析】逻辑数据模型也称数据模型,是面向数据库系统的模型,着重于在数据库系统一级的实现。成熟并大量使用的数据模型有层次模型、网状模型、关系模型和面向对象模型等。故A选项正确。

122、在关系数据库中,用来表示实体间联系的是

A)  属性

B)  二维表

C)  网状结构

D)  树状结构

    参考答案:B

【解析】关系模型实体间的联系采用二维表来表示,简称表。选项C为网状模型实体间的联系,选项D为层次模型实体间的联系,选项A属性刻画了实体

123、关系数据模型

A)  只能表示实体间1:1联系

B)  只能表示实体间1:m联系

C)  可以表示实体间m:n联系

D)  能表示实体间1:n联系而不能表示实体间n:1联系

    参考答案:C

【解析】关系模型是目前最常用的数据模型之一,现实世界的实体以及实体间的各种联系均用关系来表示。实体集之间通过联系来建立联接关系分为三类:一对一联系(1:1)、一对多联系(1:m)、多对多联系(m:n)。C选项正确。

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

A)  记录长度

B)  文件的大小

C)  联系的复杂程度

D)  数据之间的联系方式

    参考答案:D

【解析】层次模型的基本结构是树形结构,网状模型是一个不加任何条件限制的无向图,关系模型采用二维表来表示,所以三种数据库的划分原则是数据之间的联系方式。

125、在关系模型中,每一个二维表称为一个

A)  关系

B)  属性

C)  元组

D)  主码(键)

    参考答案:A

【解析】关系模型采用二维表来表示,即每个二维表称为一个关系。

126、在关系A(S,SN,D)和B(D,CN,NM)中,A的主关键字是S,B的主关键字是D,则D是A的

A)  外键(码)

B)  候选键(码)

C)  主键(码)

D)  元组

    参考答案:A

【解析】二维表中的一行称为元组。候选键(码)是二维表中能唯一标识元组的最小属性集。若一个二维表有多个候选码,则选定其中一个作为主键(码)供用户使用。表M中的某属性集是表N的候选键或者主键,则称该属性集为表M的外键(码)。A中属性集D是B的主关键字,故D是A的外键(码),A选项正确。

127、有关系R如下,其中属性B为主键:

BCD

a0k1

b1n1

2p1

则其中最后一个记录违反了

A)  实体完整性约束

B)  参照完整性约束

C)  用户定义的完整性约束 

D)  关系完整性约束

    参考答案:A

【解析】关系模型中可以有3类完整性约束:实体完整性约束、参照完整性约束和用户定义的完整性约束。实体完整性约束是指,若属性M是关系的主键,则属性M中的属性值不能为空值。属性B为主键,最后一个记录为空,违反了实体完整性约束,A选项正确。

128、有三个关系表R、S和T如下,其中三个关系对应的关键字分别为A,B和复合关键字(A,B)。

 

表T的记录项(b,q,4)违反了

A)  实体完整性约束

B)  参照完整性约束

C)  用户定义的完整性约束

D)  关系完整性约束

    参考答案:B

【解析】关系模型中可以有3类完整性约束:实体完整性约束、参照完整性约束和用户定义的完整性约束。实体完整性约束是指,若属性M是关系的主键,则属性M中的属性值不能为空值。T中主键不为空,A选项错误。参照完整性约束是指,若属性(或属性组)A是关系M的外键,它与关系M的主码相对应,则对于关系M中的每个元组在A上的值必须为:要么取空值;要么等于关系M中某个元组的主码值。属性B为关系S的外键,它与关系S的主键相对应,则T中元组在B上应该为空或者与S中主键值相等,题目中不相等,违反参照完整性约束,B选项正确。此题关系中无语义要求,C选项错误。

129、有两个关系R,S如下,由关系R和S通过运算得到关系T,则所使用的操作为

A)  并

B)  自然连接

C)  笛卡尔积

D)  差

    参考答案:D

【解析】常用的扩充运算有交、除、连接及自然连接等。并:RS是将S中的记录追加到R后面。差:R-S结果是属于R但不属于S的记录组成的集合。交:RS结果是既属于R又属于S的记录组成的集合。差运算R-S:关系R中两条记录其中(b  1 n1)不属于S,所以R-S=T。D选项正确。

130、有两个关系R和 T如下:

则由关系R得到关系T的操作是:
A)  投影             

B)  交

C)  选择  

D)  并

    参考答案:A

【解析】用于查询的3个操作无法用传统的集合运算表示,引入的运算为投影运算、选择运算、笛卡尔积。常用的扩充运算有交、除、连接及自然连接等。投影,从关系模式中指定若干个属性组成新的关系,题目中从R中指定AB组成新的关系T,故A选项正确。选择,从关系中找出满足给定条件的元组的操作称为选择,即结果T应该包含R中全部属性,故C选项错误。假设,R与S经过某种关系得到T,则并:R∪S是将S中的记录追加到R后面;交:R∩S结果是既属于R又属于S的记录组成的集合。上述两种操作中,关系R与S以及T要求有相同的结构,故B、D选项错误。

131、有三个关系R、S和T如下:

由关系R和S通过运算得到关系T,则所使用的运算为(  )。

A)  笛卡尔积

B)  交

C)  并

D)  自然连接

    参考答案:D

【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据T关系中的有序组可知R与S进行的是自然连接操作。

二级C语言
第一章    C语言概述
1.1    C语言基础知识
1.1.1    C语言简介
1、以下不能用于描述算法的是

A)  文字叙述

B)  程序语句

C)  伪代码和流程图

D)   E-R图

    参考答案:D

【解析】算法的描述有伪代码、流程图、N-S结构图等。E-R是实体联系模型。所以选择D。

1.1.2    C语言程序的构成

简单程序设计步骤中不包括

A)  编码

B)  确定算法

C)  安装编译程序

D)  调试

    参考答案:C

【解析】简单程序设计步骤为:确定数据结构、确定算法、编码、调试、整理文档,不包括安装编译程序,故答案为C选项。

1.1.3    C程序生成的过程

我们所写的每条C语句,经过编译最终都将转换成二进制的机器指令。关于转换以下说法错误的是

A)  一条C语句可能会被转换成零条机器指令

B)  一条C语句可能会被转换成多条机器指令

C)  一条C语句对应转换成一条机器指令

D)  某种类型和格式的C语句被转换成机器指令的条数是固定的

    参考答案:C

【解析】一个C语句经过编译后产生若干条机器指令。声明部分不是语句,不产生机器指令,只是对有关数据的声明。而且固定类型和格式的C语句被转换成机器指令的条数固定。所以选择C选项。

1.2    常量、变量和数据类型
1.2.1    标识符
1、C语言中的标识符分为关键字、预定义标识符和用户标识符,以下叙述正确的是

A)  关键字可用作用户标识符,但失去原有含义

B)  预定义标识符可用作用户标识符,但失去原有含义

C)  在标识符中大写字母和小写字母被认为是相同的字符

D)  用户标识符可以由字母和数字任意顺序组成

    参考答案:B

【解析】关键字不可用作C语言的标识符,所以A错误。在标识符中大写字母与小写字母作为不同字符处理,所以C错误。标识符由下划线、字母、数字组成,且必须以下划线和字母开始,所以D错误。

2、设有两行定义语句:

    int   scanf;

    float  case;

  则以下叙述正确的是

A)  两行定义语句都不合法

B)  两行定义语句都合法

C)  第1行语句不合法

D)  第2行语句不合法

    参考答案:D

【解析】合法的标识符由字母(大、小写均可)、数字和下划线组成,并且必须以字母或下划线开头。关键字是指被C语言保留的,不能用作其他用途的一些标识符,它们在程序中都代表着固定的含义,用户不可重新定义。预定义标识符是系统已经有过定义的标识符,用户可以重新定义,可以作为变量名。scanf为库函数名,属于预定义标识符,可以被用户重定义,所以第一行语句合法。case为关键字,是选择结构switch语句中的关键字,不可被用户重定义,所以第二行语句不合法。D选项正确。

1.2.2.1    整型常量
1、以下选项中,合法的一组C语言数值常量是(  )。

A)  12. 0Xa23 4.5e0

B)  028 .5e-3 -0xf

C)  .177 4e1.5 0abc

D)  0x8A 10,000 3.e5

    参考答案:A

【解析】C语言中八进制整型常量的开头是数字0,十六进制整型常量的开头数字是0x。C语言中的实型常量有两种表示形式:小数形式,小数形式表示的实型常量必须要有小数点;指数形式,以"e"或"E"后跟一个整数来表示以10为底数的幂数,且规定字母e或E之前必须要有数字,且e或E后面的指数必须为整数。B)选项中 028错误,八进制中没有数字8。C)选项中4e1.5中e后面的指数不是整数。D)选项中3.e5小数点后面缺少数字。

2、有以下程序

#include

main()

{  int  k=33; 

   printf("%d,%o,%x\n", k, k, k);

}

程序的运行结果是

A)  33,41,21 

B)  33,33,33 

C)  41,33,21 

D)  33,21,41

    参考答案:A

【解析】整型常量有3种表示方法,分别是十进制数表示法、八进制数表示法和十六进制数表示法。十进制整型常量没有前缀,输出格式控制符为%d;八进制整型常量以0作为前缀,输出格式控制符为%o;十六进制整型常量以0X或0x作为前缀,输出格式控制符为%x。整型33用八进制表示为41,十六进制表示为21,A选项正确。

3、有以下程序

#include

main()

{

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

}

程序运行后的输出结果是

A)  0 

B)  变量无定义,输出不确定

C)  -1

D)  1

    参考答案:A

【解析】NULL是在stdio.h头文件中定义的预定义符,NULL的代码值为0,如果以整型格式输出则输出0。A选项正确。

1.2.2.2    实型常量
1、 以下选项中可用作C程序合法实数的是

A)  3.0e0.2

B)    .1e0

C)  E9

D)  9.12E

    参考答案:B

【解析】A选项中E后面的指数必须为整数。C语言规定,E之前必须要有数字,所以C选项错误。E后面必须要有数字,且必须为整数,所以D选项错误。

1.2.2.3    字符常量
1、以下不合法的字符常量是

A)  '\\'

B)  '\"'

C)  '\018'

D)  '\xcc'

    参考答案:C

【解析】转义字符中,八进制的表示形式为\ddd,但是八进制中不能包含数字8,所以C选项不合法。

2、已知大写字母A的ASCII码是65,小写字母a的ASCII码是97。以下不能将变量c中的大写字母转换为对应小写字母的语句是

A)  c=('A'+c)%26-'a'

B)  c=c+32

C)  c=c-'A'+'a'

D)  c=(c-'A')%26 +'a'

    参考答案:A

【解析】根据题意可知,小写字母比与之对应的大写字母的ASCII码大32。A选项中字符A加上c表示的大写字符再对字母个数26取余,本身这个表达式没有任何含义所以选择A选项。

首先c-'A'计算出此大写字母的偏移;如c=‘B’;则其偏移就为‘B’-‘A’=1;
而,1%26:是因为字母只有26个;所以确保其偏移在0-25之内;
因此一个字母在大写字母的偏移号+小写字母的基值('a'); 即可得到对应的小写值1+’a' = ‘b'

3、以下选项中非法的C语言字符常量是

A)  '\128'

B)  '\127'

C)  '\x01'

D)  '\x08'

    参考答案:A

【解析】字符常量就是用一对单引号括起来的单个字符,还有一些特殊字符常量,即以"\"开头的转义字符。由于字符常量所占空间为一个字节,所以"\"后面的数字应小于128,可以用十进制或八进制表示,则'\128'为非法字符常量,A选项正确。

4、有以下说明语句

      char  *s = "\"Name\\Address\n";

指针s所指字符串的长度是

A)  17

B)  15

C)  14

D)  说明语句不合法

    参考答案:C

【解析】以"\"开头的转义字符也是字符常量。用一对双引号括起来的多个字符为字符串。"\""\\""\n"为转义字符,所以字符串长度为14,C选项正确。

5、有如下程序

#include

#include

main() 

{

    printf("%d\n", strlen("0\n011\1"));

}

程序运行后的输出结果是

A)  6

B)  8

C)  9

D)  4

    参考答案:A

【解析】由一对双引号括起来的一串字符为字符串。字符常量是用一对单引号括起来的单个字符,还有一些特殊字符常量,即以"\"开头的转义字符。"\"后可以为某些单个字符也可以为八进制或十六进制数字。strlen函数统计字符串长度,遇到"\0"统计结束。'0''\n''0''1''1''\1'共6个字符,A选项正确。 

6、以下不能输出小写字母a的选项是

A)  printf("%c\n","a");

B)  printf("%c\n",'A'+32);

C)  putchar(97);

D)  putchar('a');

    参考答案:A

【解析】字符是按照其ASCII形式存储的,其值不能超过范围0~255,否则不是合法的字符。printf函数格式控制符%c以字符形式输出数据。putchar函数将括号中参数以字符形式输出。A选项"a"为字符串,不是单个字符,输出格式不正确,不能输出a,选择A选项。字符'a'的ASCII码为97,字符'A'的ASCII码为65。'A'+32即为'a',故B选项能输出a。C、D选项putchar函数参数均为字符'a',均可正确输出a。

7、以下合法的转义字符是

A)    '\0X41'

B)  '\0x41'  

C)   '\X41'  

D)  '\x41' 

    参考答案:D

【解析】'\xhh'表示1到2位十六进制所代表的字符,故答案为D选项。

 在字符常量中,表示十六进制的字符必须是\x**,x必须为小写。

8、3、C语言的常量包括数值型常量和符号常量,以下叙述正确的是

A)  数值型常量1.0和1所占内存的大小不同

B)  不能用sizeof求数值型常量所占内存的大小

C)  不能用sizeof求符号常量所占内存的大小

D)  可以用&A取得符号常量A所占内存的首地址

参考答案:A

【解析】整型常量:用不带小数点的数字表示。实型常量:用带小数点的数字表示。字符型常量:用带有单引号的字符表示。A选项中1.0为实型常量,所占内存为4个字节,1为整型常量,所占内存为2个字节,A选项正确。sizeof用来获取类型或数据对象的长度,其操作数可以是系统提供的数据类型,可以是用户自定义,也可以是各种常量和表达式,B、C选项错误。&是C语言的取地址运算符,只能对变量取地址运算,不能对常量进行取地址运算,D选项错误。

&为取地址运算符,只能对变量进行取地址,不能对常量进行取地址运算。

1.2.2.4    字符串常量

1、1、以下关于字符串的叙述中正确的是

A)  空串比空格打头的字符串小

B)  两个字符串中的字符个数相同时才能进行字符串大小的比较

C)  可以用关系运算符对字符串的大小进行比较

D)  C语言中有字符串类型的常量和变量

参考答案:A

【解析】字符串比较大小是以第1个不相同字符的大小为标准的,跟长度没有关系,B选项不正确;字符串比较大小除了使用库函数strcn3()以外,就只能靠自己写代码来实现了,而不能通过关系运算符来比较大小。因为字符串在表达式中相当于const char*,即常字符指针,代表的是字符串的首地址,关系运算符会将两个字符串的首地址值比较大小,这是毫无意义的。C选项不正确。C语言中只有字符串常量而没有字符串变量,D选项描述不正确;空串的长度为0,而以空格打头的字符串的长度至少为1,因此A选项是正确。

字符串比较大小除了使用库函数strcn3( ) 以外,就只能靠自己写代码来实现了,而不能通过关系运算符来比较大小,因为字符串在表达式中相当用const char* ,即常字符指针,代表大师字符串的首地址,关系运算符会将两个字符串的首地址比较大小,这是毫无意义的。
1:字符串的比较是以第一个不相同的字符的大小为标准的
        比如ABCD和ACBD比较,当判断到第二个字符时,第二个字符串的字符大于第一个字符串的字符,所以判断第二个串大于第一个串,如果全都相等,则判断字符串长度,先遇到\0的则为小串。
2: 空串长度为0,而以空格打头的字符串长度至少为1。

2、2、以下正确的字符串常量是
A)  "\\\"

B)  'abc'

C)  Olympic Games

D)  ""

参考答案:D

【解析】本题考察的知识点是:字符串常量。在C语言中,字符串常量是以双引号括起来的字符序列。因此B选项和C选项不正确。字符序列中可包含一些转义字符,转义字符都是以"\"开头的。A选项中包含了三个"\",前两个(\\)代表了一个"\"字符,后面一个和"""一起(\")被看作一个""",所以该字符串缺少一个结束的""",因此不正确。D选项的两个"""之间没有任何字符,代表的是一个空串,是合法的字符串常量,因此D选项正确。

反斜线"\"后面是转义字符

3、以下叙述中正确的是

A)  在语句char str[] = "string!";中,数组str的大小等于字符串的长度

B)  语句 char str[10] = "string!"; 和 char str[10] ={"string!"}; 并不等价

C)  对于一维字符数组,不能使用字符串常量来赋初值

D)  对于字符串常量 "string!",系统已自动在最后加入了'\0'字符,表示串结尾

参考答案:D

【解析】字符串中的字符依次存储在内存中一块连续的区域内,并且把空字符' \0'自动附加到字符串的尾部作为字符串的结束标志。故字符个数为n的字符串在内存中应占(n+1)个字节。B选项中两者等价,C选项中可以使用字符串常量来给一维字符数组赋值,就像B选项中一样,A选项中数组长度比字符串长度小一个字节,字符串中包含隐含的结尾符。

1、字符串赋值,需要复习。
2、对于一维字符数组的赋值,只能在定义时同时用字符串常量进行赋值。

4、有以下程序

#include

#include

main()

{

char  s[]="Beijing";

printf("%d\n", strlen(strcpy( s,"China") ));

}

程序运行后的输出结果是

A)  5

B)  7

C)  12

D)  14

    参考答案:A
 【解析】字符串常量是用一对双引号括起来的零个或多个字符的序列。在存储字符串常量时,由系统在字符串的末尾自动加一个"\0"作为字符串的结束标志。strcpy 函数将"China"复制给字符数组s,其在数组位置内存存储情况为"China\0g\0"。strlen函数统计字符串长度时,遇到"\0"结束,s数组长度为5,A选项正确。

strlen( )函数统计字符串长度时,遇到\0即结束,不计算\0所占用的一个字符长度。
执行strcpy时,从s的第一个地址开始赋值,一直将China\0全部复制到s所指向的内存单元中为止,此时s所指向的内存单元的内容为China\0g\0,所以strlen( )返回值为5。

1.2.2.5    符号常量
1、关于C语言的符号常量,以下叙述中正确的是
A)  符号常量的符号名是标识符,但必须大写

B)  符号常量是指在程序中通过宏定义用一个符号名来代表一个常量

C)  符号常量在整个程序中其值都不能再被重新定义

D)  符号常量的符号名必须是常量

参考答案:B

【解析】在C语言中,可以用一个标识符来代表一个常量,称为符号常量。这个标识符必须在程序中进行特别的"指定",并符合标识符的命名规则。用作符号常量的标识符通常采用大写字母表示,在主函数中其值不能再被定义。所以选择B选项。

符号常量在程序运行过程中,其值可以重新被定义。

1.2.3    变量
1.2.3.1    整型变量
1.2.3.2    实型变量

1、设有定义:double  x=2.12;,以下不能完整输出变量x值的语句是

A)  printf("x=%5.0f\n",x);

B)  printf("x=%f\n",x);

C)  printf("x=%lf\n",x);

D)  printf("x=%0.5f\n",x);
    参考答案:A
当数据的小数位多于指定宽度n时,截去右边多余的小数位,并对截去的第一位小数做四舍五入处理。

2、以下叙述中正确的是

A)  在C语言中,逻辑真值和假值分别对应1和0

B)  关系运算符两边的运算对象可以是C语言中任意合法的表达式

C)  对于浮点变量x和y,表达式:x==y 是非法的,会出编译错误

D)  分支结构是根据算术表达式的结果来判断流程走向的

参考答案:B

【解析】A选项中,在C语言中,逻辑真值对应非0; C选项中,表达式:x==y 是合法的;D选项中,分支结构的流程走向是根据表达式的值,并不仅仅是算数表达式的值。因此B选项正确。

在C语言中,逻辑真值为非零。

1.2.3.3    字符变量
1.2.4    类型的自动转换和强制类型转换

1、若在程序中变量均已定义成int类型,且已赋大于1的值,则下列选项中能正确表示代数式 的表达式是

A)  1.0/a/b/c

B)  1/(a*b*c)

C)  1.0/a*b*c

D)  1/a/b/(double)c

参考答案:A

【解析】由于abc均大于1,所以表达式1/abc小于1,需要用浮点类型表示。若要计算表达式值,需要使其自动转化成浮点类型,所以A选项正确。B选项由于变量与常量均为整型,不会自动转换为浮点类型,B选项错误。C选项表示表达式bc/a,故错误。D选项,由于算数运算法结合性自左向右,先计算1/a,结果为0,之后的计算无论是否转换数据类型结果均为0,D选项错误。

第2章    运算符与表达式
2.1    C语言运算符简介
2.1.1    C语言运算符简介
1、1、有以下程序

#include

main( )

{ int c, d;

c= 10^3;

d= 10+3;

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

}

程序运行后的输出结果是

A)  103,13

B)  13,13

C)  10,13

D)  9,13

参考答案:D

【解析】c语言中"^"的意思是按位异或,因此10^3表示先把10和3换算成2进制再进行异或,因此答案为D选项。

与运算&:一假全假
或运算 | :一真全真
异或运算 ^ :相同为假,不同为真。 

2.1.2    运算符的结合性和优先级
2.1.3    强制类型转换运算符
2.1.4    逗号运算符和逗号表达式

1、有以下程序

#include

int  fun(intA)

{

int  b=0;

static  int c=3;

a =( c++,b++);

return ( a );

}

main()

{

int  a = 2, i, k;

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

k = fun(a++);

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

}

程序的输出结果是

A)  4

B)  0

C)  1

D)  2

参考答案:B

【解析】题目中fun函数被执行了两次,两次执行后,都是返回了函数内部的b值,所以答案为0,即B选项正确。

注意局部变量的作用域

2、有以下程序:
#include  
main()
{ int  x, y, z;
  x=y=1;
  z=x++,y++,++y;
 printf("%d,%d,%d\n",x,y,z);
}
程序运行后的输出结果是(  )。

A)  2,3,3

B)  2,3,2

C)  2,3,1

D)  2,2,1

参考答案:C

【解析】z=x++,y++,++y;因为赋值运算符的优先级高于逗号运算符的优先级,所以可以将上式表示成(z=x++),(y++),(++y)。然后从左向右先计算表达式z=x++,因为x++先使用后自增,所以z的值为1,x的值为2。再计算逗号表达式第二个表达式y++,此时y的值为2,最后计算第三个表达式++y,y的值为3。

注意:赋值运算符的优先级高于逗号运算。

2.2    算术运算符和算数表达式
2.2.1    基本的算数运算符
2.2.2    算术表达式和运算符的优先级与结合性
1、有C语言表达式 2*3+4+15%3 ,关于其执行顺序,以下叙述正确的是

A)  先执行2*3得6,再执行6+4得10,再执行15%3得0,最后执行10+0得10

B)  先执行2*3得6,再执行15%3得5,最后执行6+4+5得15

C)  先执行15%3得0,再执行2*3得6,最后执行6+4+0得10

D)  先执行15%3得3,再执行4+3得7,再执行2*3得6,最后执行6+7得13

参考答案:A

【解析】首先运算符"*"和运算符"%"有相同优先级,并且优先级都高于运算符'+',再根据运算结合性,乘法和取余运算都满足从左到右的运算规则,C,D选项错误;因为15%3=0,排除B选项,答案为A选项。

各级运算符等级相等,按顺序从左到右依次执行,并不按照数学思想中的优先等级。

2、若有以下程序

#include

void  sp(int  *a)

{  int  b=2;

*a = *a * 2;   printf("%d,", *a);

a=&b;    *a = *a * 2;   printf("%d,", *a);

}

main()

{  int  k=3;

sp(&k);   printf("%d\n", k);

}

则程序的输出结果是

A)  6,12,12

B)  6,4,3

C)  6,4,6

D)  9,4,9

参考答案:C

【解析】首先在主函数中给整型变量k赋值为3,调用sp函数,将变量k的地址作为实参传递给形参指针变量a;在sp函数中,*a = *a * 2;即结果为6,通过printf()函数输出。整型变量b的地址赋给指针变量a,再执行*a = *a * 2;,即结果为4,通过printf()函数输出。返回主函数,输出k的值6。因此C选项正确。

2.2.3    自增自减运算符
1、以下不能将s所指字符串正确复制到t所指存储空间的是(  )

A)  do{*t++=*s++;}while(*s );

B)  for(i=0;t[i]=s[i];i++);

C)  while(*t=*s){t++;s++}

D)  for(i=0,j=0;t[i++]=s[j++]; );

参考答案:A

【解析】do{*t++=*s++;}while(*s); 不能因为当*s='\0'时,while(*s)跳出循环,这样字符串结束标志'\0'没有复制给*t,造成*t不完整。注意,*t++=*s++是先执行t=*s,然后才进行t=t+1,s=s+1。B),C),D)都能将'\0'复制过去。

2、设有定义:

    int  k=0;

以下选项的四个表达式中与其他三个表达式的值不相同的是

A)  ++k

B)  k+=1

C)  k++

D)  k+1

    参考答案:C

【解析】++k,先使得k的值自增1后再使用,k++是先取得k的值再将k的值自增1,所以C选项中表达式的值为0,而其他三个表达式的值均为1,所以选择C。

k++表示分号结束前的值

3、若有定义语句:

    int  year=2009, *p=&year ;

以下不能使变量year中的值增至2010的语句是

A)  (*p)++;

B)  *p++;

C)  ++(*p);

D)  *p+=1;

    参考答案:B

【解析】由于自加运算符++的运算级别高于间接运算*的运算级别,所以B选项的表达式*p++不能使变量year中的值增至2010。因此B选项正确。

自增运算符的级别高于间接运算符*的级别

2.3    赋值运算符与赋值表达式

2.3.1    赋值运算符和赋值表达式
1、设a,b,c是整型变量且均已赋值,则以下选项中错误的赋值语句是

A)  a = (b = 3) = 1;

B)  a = (b = 2) + c;

C)  a = b = c + 10;

D)  a = 1 + (b = c = 2);

参考答案:A

【解析】赋值运算结合性为由右向左结合,赋值运算符左值为变量,右值为变量或常量,且左右两边数据类型相同才能实现赋值。A选项中,赋值运算(b=3)=1,左值为表达式,不是变量不能被赋值,A选项错误,所以选择A选项。B选项运算过程为,先赋值b=2,再计算b+c,将结果赋给a,是正确的赋值语句。C选项运算过程为,先计算c+10将结果赋给b,再将b赋给a,是正确的赋值语句。D选项运算过程为,先将2赋给c,再将c赋给b,然后计算1+b,将结果赋给a, 是正确的赋值语句。
当赋值号右边存在两个括号时,执行完第一个括号,立即执行赋值运算符

2.3.2    复合的赋值运算符
1、若有以下程序

#include

main()

{  int  a=0,b=0,c=0;

c= (a -= ++a), (a+=b, b+=4);

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

}

则程序的输出结果是

A)  0,4,0

B)  0,4,4

C)  1,4,1

D)  1,4,4

参考答案:A

【解析】逗号运算符的结合性从左到右,因此逗号表达式将从左到右进行计算。且逗号运算符的优先级最低,所以先计算c=(a-=++a)这部分。其中,赋值运算符从右往左计算,先执行++a,a自增1后再赋值,所以a的值为1,执行a=a-1,即a=1-1,a的值为0,并将0赋给变量c。第二部分(a+=b,b+=4),先执行a=a+b,a=0+0,即a的值为0,然后执行b+=4,b=0+4,即b的值为4。所以打印结果为0,4,0,选择A选项。

逗号运算完先执行赋值语句

2.3.3    赋值运算中的类型转换
2.4    位运算
2.4.1    位运算符和位运算

第3章    基本语句
3.1    C语句概述
3.1.1  C语句分类
3.1.1.1控制语句
3.1.1.2其他类型语句
3.1.1.3空语句
3.1.1.4复合语句

3.2    赋值语句
3.3    输入输出概念及其实现
3.4    单个字符的输入输出
3.4.1  字符输出函数purchar()
1、有如下程序

#include

int disp(char* str)

{

while (*str) putchar(*str++);

return *str;

}

main()

{

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

}

程序运行后的输出结果是

A)  NAME0

B)  NAMEE

C)  NAME

D)  NAME\0

参考答案:A

【解析】程序执行过程为:调用函数disp,将字符串"NAME"首地址传给指针str,在while循环中,依次判断字符串中字符是否为'\0',不是'\0'则输出字符,否则结束循环。当(*str)='\0'时,结束循环,返回字符'\0'的ASCII码0,并输出。程序运行后的输出结果是:NAME0,A选项正确。

3.4.2  字符输入函数getchar()

若要求从键盘读入含有空格字符的字符串,应使用函数

A)  getchar()

B)  getc()

C)  gets()

D)  scanf()

参考答案:C

【解析】scanf ( )语句中用"空格"间隔不同的字符串,空格将被全部忽略掉,所以用scanf()函数不能输入空格;getchar()函数用于输入字符,其调用格式为:ch=getchar(),getchar()函数从终端读入一个字符作为函数值,把读入的字符赋给变量ch。在输入时,空格、回车符都将作为字符读入,而且只有在用户敲入回车键时,读入才开始执行。gets()函数的调用形式为:gets(str_adr),其中str_adr是存放输入字符串的起始地址,可以是字符数组名、字符数组元素的地址或字符指针变量。gets函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止。getc()函数的调用形式为:ch=getc(pf)其中pf是文件指针,函数的功能是从pf指定的文件中读入一个字符,并把它作为函数值返回。因此C选项正确。

scanf不能输入空格

3.5    数据格式的输入与输出
3.5.1.1printf()函数的一般形式
3.5.1.2格式字符

设有定义:

double a,b,c;

若要求通过输入分别给a、b、c输入1、2、3,输入形式如下(注:此处□代表一个空格)

□□1.0□□2.0□□3.0<回车>

则能进行正确输入的语句是

A)  scanf("%lf%lf%lf",a,b,c);

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

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

D)  scanf("%5.1lf%5.1lf%5.1lf",&a,&b,&c);

参考答案:B

【解析】scanf函数的一般形式为scanf(格式控制,变量1地址,变量2地址,…),其中,格式字符串要与数据类型保持一致,所以格式字符串中应为%lf,后面应该为变量地址,所以需要加上符号"&",所以选择B。

3.5.1.3使用printf()函数时的注意事项
3.5.2  scanf()函数
3.5.2.1scanf()函数的一般形式
3.5.2.2格式说明

1、设有定义:

int  a;  float  b;

执行

scanf("%2d%f", &a, &b);

语句时,若从键盘输入

876  543.0<回车>
则a和b的值分别是

A)  87和6.0

B)  876和543.0

C)  87和543.0

D)  76和543.0

参考答案:A

【解析】在格式字符前加入一个整数可以指定输入数据所占的宽度,所以赋值时会将87赋给变量a,把6.0赋给float型变量 b。

2、设有定义:int a,b;  float x,y; ,则以下选项中对语句所作的注释叙述错误的是

A)  scanf("%d%d%f",&a,&b);     /* 多余的格式符%f完全不起作用 */

B)  scanf("%d%d",&a,&b,&x);    /* 多余的输入项不能获得输入数据 */

C)  scanf("%d%f%d",&a,&b,&x);  /* 输入项与格式符类型不匹配,变量b和x得不到正确的输入数据 */

D)  scanf("Input:%d%d",&a,&b); /* 格式串中允许加入格式符以外的字符串 */

    参考答案:A

【解析】A选项中%f是起作用的,程序从键盘正确的读入前两个数据并且保存在指定的地址,读入第三个数据后,将其放入缓冲区,然后寻找应该存放的地址,因为没有找到,程序会发生错误而中断,A选项注释错误,所以选择A选项。B选项由于scanf接收数据只有两个,所以变量x得不到赋值,注释正确。C选项scanf会按照float类型读取输入的第二个数据并且保存为int类型,由于两种类型的存储形式与所占内存单元均不同,所以b得不到正确的赋值,注释正确。在使用scanf函数时,如果除了格式说明字符和附加格式字符外,还有其他字符,则在输入数据时要求按一一对应的位置原样输入这些字符,故D选项注释正确。

第4章    选择结构 

4.1    关系运算符和关系表达式
4.1.1 关系运算符及其优先次序
4.1.2 关系表达式

以下叙述中正确的是

A)  逻辑"或"(即运算符||)的运算级别比算术运算要高

B)  C语言的关系表达式:0<x<10完全等价于: (0<x) && (x<10)

C)  逻辑"非"(即运算符!)的运算级别是最低的

D)  由&&构成的逻辑表达式与由||构成的逻辑表达式都有"短路"现象

    参考答案:D

【解析】B选项中,(x>0)&&(x<10)的值是1或0,条件是x>0 并且x <10。但是 0<x<10这种写法的结果任何时候都是1; C选项中,逻辑"非"(即运算符!)的运算级别是最高的;A选项中,算术运算符优先级较高,关系和逻辑运算符优先级较低。因此D选项正确。

4.2    逻辑运算符和逻辑表达式
4.2.1 逻辑运算符及其优先级

设有宏定义:

    #define  IsDIV(k,n)   ( ( k%n==1) ? 1 : 0)

且变量m已正确定义并赋值,则宏调用:

    IsDIV(m,5) && IsDIV(m,7)

为真时所要表达的是

A)  判断m是否能被5和7整除

B)  判断m被5和7整除是否都余1

C)  判断m被5或者7整除是否余1

D)  判断m是否能被5或者7整除

    参考答案:B

【解析】本题考查逻辑运算符的相关概念,逻辑与若要为真,那么两边都要为真,所需要m都能被5和7整除都余1,所以选项B正确。

有以下程序

#include

main()

{  int  c,d;

   c= 13&5;  d=10&&5;

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

}

程序的运行结果是

A)  5,1

B)  1,1

C)  18,1

D)  13,1

    参考答案:A

【解析】"&"按位与运算,13=1101B,5=101B,执行语句c=13&5;结果为101B=5,即c=5。"&&"逻辑与运算,10与5均为真,结果为真,即d=1。A选项正确。

4.2.2 逻辑表达式

1、有以下函数

int fun( char *s, char *t )

{  while(( *s )&&( *t ) && (*t++ == *s++ ) );

   return  (*s-*t);

}

函数的功能是

A)  求字符串的长度

B)  比较两个字符串的大小

C)  将字符串s复制到字符串t中

D)  连接字符串s和字符串t

    参考答案:B

【解析】函数体执行过程为:将两个字符串首地址传入函数,分别赋给指针s与t,在函数体内s与t所指向的字符串的字符不为"\0"时,判断两个指针指向的字符是否相同,若相同则两个指针分别加一指向下一个字符,若不同则退出while循环,返回不相同的字符的ASCII码值之差。返回值大于0表示字符串s>t;返回值小于0表示s<t;返回值为0,表示s=t。函数实现了比较两个字符串大小的功能,B选项正确。

2、有以下程序

    #include  

    main()

    { char a[4][4]={' '};

      int i,j;

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

      {  a[i][0]=a[i][3]='#';

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

         {  a[0][j]=a[3][j]='#';

            if((i!=0)&&(i!=3)) a[i][j]='o';

          }

      }

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

      {  for(j=0; j<4;j++)

                    printf("%2c",a[i][j]);

         printf("\n");

       }

    }

程序的运行结果是

A)  # o o #

# o o #

B)  # # # #

# o o #

C)  # o o #

# # # #

D)  # # # #

# # # #

    参考答案:A

【解析】程序的执行过程为:定义4行4列二维数组字符a并且初始化为a[0][0]='',其他元素均为0。执行for循环将数组第一列和第四列赋值为'#'。执行for循环将数组第一行和第四行的第二个到第三个元素赋值为'#',然后将剩余元素全部赋值为'o'。此时矩阵为{{#,#,#,#},{#,o,o,#},{#,o,o,#},{#,#,#,#}}。之后输出矩阵第二行与第三行元素为: # o o #<回车> # o o #,A选项正确。

4.3    if语句和用if语句构成的选择结构
4.3.1 if语句的几种形式
1、有以下程序段

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

        if(a<b) a==b;

        if(a<c) a==c;

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

该程序段的功能是

A)  输出a、b、c中值相等的数值

B)  输出a、b、c中的最大值

C)  输出a、b、c中的最小值

D)  输出a的原始值

    参考答案:D

【解析】程序段执行过程为:从键盘读入3个整型数据分别赋值给a,b,c,如果a<b,判断a与b是否相等,无论结果如何不做任何改变。如果a<c,判断a与c是否相等,无论结果如何不做任何改变。最后对于a,b,c的值不做任何改变,输出a的原始值,D选项正确。

2、若有定义语句:

    char  *s1="OK", *s2="ok";

以下选项中,能够输出"OK"的语句是

A)  if (strcmp(s1,s2)!=0)  puts(s2);

B)  if (strcmp(s1,s2)!=0)  puts(s1);

C)  if (strcmp(s1,s2)==1)  puts(s1);

D)  if ( strcmp(s1,s2)==0)  puts(s1);

    参考答案:B

【解析】strcmp(s1,s2)是字符串比较函数,比较规则是两个字符串自左向右逐个字符相比(按照ASCII码值大小),以第一个不相同的字符的大小作为比较结果。因为'OK'<'ok',所以strcmp(s1,s2)为负值,只有B选项正确。

3、若有以下程序

     #include

     main()

     {  int  i,j=0; 

        char  a[]="How are you!";

        for (i=0; a[i]; i++)

           if (a[i] != ' ')  a[j++]=a[i];

        a[j]='\0';     

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

     }

则程序的输出结果是

A)  Hay!

B)  Howareyou

C)  Howareyou!

D)  How are you!

    参考答案:C

【解析】主函数中首先定义字符数组a[]="How are you!";执行for循环语句,语句if (a[i] != ' ')  a[j++]=a[i]; 其功能是将字符数组中的空格去掉。因此C选项正确。

4、若有以下程序

     #include

     main()

     {  int  i, j=0; 

        char  a[]="How are you!", b[10];

        for ( i=0;  a[i];  i++ )

           if (a[i] == ' ')  b[j++]=a[i+1];

        b[j]='\0';

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

     }

则程序的输出结果是

A)  Howareyou!

B)  Howareyou

C)  Hay!

D)  ay

    参考答案:D

【解析】程序首先初始化字符数组a[ ]为"How are you!"。语句if (a[i] = = ' ')  b[j++]=a[i+1];条件是判断字符数组a[ ]中是否是空格字符,如果是空格的话,将空格后的字符赋给数组b。并将b输出。因此D选项正确。

4.3.2 if语句的嵌套
4.3.3 条件运算符构成的选择结构
4.4    switch语句和goto语句
4.4.1 switch语句
4.4.2 语句标号
4.4.3 goto语句