二级C++语言程序设计标准预测试卷四
(考试时间90分钟,满分100分)
一、选择题(每小题2分,共70分) 四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。
(1)为了培养良好的程序设计风格,下列描述中正确的是
A)程序应简单、清晰、可读性好
B)符号名的命名只要符合语法
C)充分考虑程序的执行效率
D)程序的注释可有可无
(2)在最坏情况下,下列各排序方法的比较次数正确的是
A)冒泡排序为n/2
B)冒泡排序为n(n+1)/2
C)快速排序为n/2
D)快速排序为n(n一1)/2
(3)按“先进后出”原则组织数据的结构是
A)有序表
B)栈
C)队列
D)二叉树
(4)对下列二叉树进行中序遍历的结果是
A)ZBTYCPXA
B)ATBZXCYP
C)ZBTACYXP
D)ATBZXCPY
(5)下列叙述中正确的是
A)数据的逻辑结构与存储结构必定是一一对应的
B)由于计算机存储空间是向量式的存储结构,因此,数据的存储结构一定是线性结构
C)程序设计语言中的数组一般是顺序存储结构,因此,利用数组只能处理线性结构。
D)以上三种说法都不对
(6)下列叙述中正确的是
A)接口复杂的模块,其耦合程度一定低
B)耦合程度弱的模块,其内聚程度一定高
C)耦合程度弱的模块,其内聚程度一定低
D)上述三种说法都不对
(7)软件调试的目的是
A)发现错误
B)改正错误
C)改善软件的性能
D)挖掘软件的潜能
(8)下列叙述中正确的是
A)买体集之间一对一的联系实际上就是一一对应的关系
B)关系模型只能处理实体集之间一对一的联系
C)关系模型属于格式化模型
D)以上三种说法都不对
(9)数据库概念设计中由分散到集中的设计方法是
A)视图设计
B)视图集成设计
C)集中式模式设计
D)分散式模式设计
(10)下列叙述中正确的是
A)程序设计就是编制程序
B)程序的测试必须由程序员自己去完成
C)程序经调试改错后还应进行再测试
D)程序经调试改错后不必进行再测试
(11)以下选项中,与k=n++完全等价的表达式是
A)k=n,n=n+1
B)n=n+l,k=n
C)k=++n
D)k+=n+1
(12)已知char a;int b;float c;double d;则表达式a*b+c—d结果为
A)double
B)int
C)float
D)char
(13)假定有下列变量定义:
int k=7.X=12;
则能使值为O的表达式是
A)x*=k-k%5
B)x*一(k—k%5)
C)x%=(k一5)
D)(x-=k)=(k+=5)
(14)下面关于for循环的正确描述是
A)for循环只能用于循环次数已经确定的情况
B)for循环是先执行循环体语句,后判断表达式
C)在for循环中,不能用break语句跳出循环体
D)for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来
(15)在int a=3,int*p=&a;中,p的值是
A)变量a的地址值
B)无意义
C)变量p的地址值
D)3
(16)对于int a[3][7]:下列表示中错误的是
A)*(*a+3)
B)*(a十1)[5]
C)*(*(a+1))
D)*(&a[O][O]+2)
(17)已知一函数的形参说明为int arr[5][6],则与此等效的形参说明为
A)int arr[][]
B)int [5][]
C)int*a[6]
D)intt(*a)[6]
(18)若有以下程序段:
int a=O,b=O,c=O:
c=(a-=a-5),(a=b,b+3);
cout<其输出结果是
A)3,O,一10
B)0,O,5
C)一10,3,一lO
D)3,O,3
(19)下面的程序的结果是
main()
{mt x=3,y=O,z=O;
if(x=y+z)COtlt<<”* * * *”;
else cout<<”####”;
}
A)有语法错误不能通过编译
B)输出****
C)可以通过编译,但是不能通过连接.因而不能运行
D)输出并####
(20)下面程序的输出是
main()
A)一l
B)0
C)l
D)不确定的值
(21)若有以下定义和语句
则以下选项中错误的语句是
A) *q=0;
B) w=p;
C) *p=a;
D) *p=*W:
(22)有以下程序
执行后输出结果是
A)7,8,8
B)7,8,7
C)8,7,7
D)8,7,8
(23)设有定义:
则以下引用形式中,正确的是
A)x=value:
B)x=C::value;
C)p=&value
D)p=C::value
(24)以下叙述中正确的是
A)在类中,不作特别说明的数据成员均为私有类型
B)在类中,不作特别说明的成员函数均为公有类型
C)类成员的定义必须是成员变量在前、成员函数在后
D)类成员的定义必须放在类定义体内部
(25)以下关于派生机制的描述中,不正确的是
A)派生类不仅可以继承基类的成员,也可以添加自己的成员
B)设置protected成员是为派生类访问基类成员之用
C)采用不周的继承方式,将限制派生类对基类成员的访问
D)采用私有继承,派生类只能得到基类的公有成员
(26)以下叙述中不正确的是
A)一个类的友元函数可以无条件的使用这个类的私有成员
B)静态成员函数可以直接访问非静态数据成员
c)不可以声明抽象类的对象,但可以声明抽象类的指针变量
D)静态数据成员为类的所有对象所共有
(27)以下使用不当会破坏面向程序设计特性的是
A)派生类
B)虚函数
C)抽象类
D)静态函数
(28)在文件操作中,代表以追加方式打开文件的模式是
A)ios::ate
B)iOS::app
C)i0S::out
D)ios::trunc
(29)析构函数的特征包括
A)一个类中只能定义一个析构函数
B)析构函数与类名没有关系
C)析构函数的定义只能在类体内部
D)析构函数可以有一个或多个参数
(30)即当基类本身也是某一个类的派生类时,底层的派生类也会自动继承问接基类的成
员,这说明继承具有
A)规律性
B)传递性
C)重复性
D)多样性
(31)已知类A有公用数据成员a,且有A ohj2;A*const ptr—new A;则下列语句正
确的是
A)ptr->a=100;
B)ptr=&obj2;
C)ptr++;
D)ptr=obj2;
(32)下面的描述中错误的是
A)调用函数时,实参可以是表达式
B)调用函数时,实参与形参可以共用内存单元
C)调用函数时,将为形参分配内存单元
D)调用函数时,实参与形参的类型必须一致
(33)下列有关类和对象的叙述不正确的是
A)任何一个对象都归属于一个具体的类
B)类与对象的关系和数据类型与变量的关系相似
C)类的数据成员不允许是另一个类的对象
D)一个类可以被实例化成多个对象
(34)下列关于抽象类的叙述不正确的是
A)含有纯虚函数的类称作抽象类
B)抽象类只能是基类
C)抽象类不能被实例化
D)纯虚函数可以被继承
(35)下列描述中正确的是
A)多重继承中,不同父类中不能有同名成员
B)多重派生中,所有父类的派生方式必须相同
C)多重派生的子类不能再派生子类
D)上述三种说法都不对
二、填空题(每空2分,共30分)
请将每空的正确答案写在答题卡【1】~【l5】序号的横线上,答在试卷上不得分。
(1)在深度为5的完全二又树中,叶子结点的个数最多为 【1】 。
(2)在一个容量为25的循环队列中.若头指针front=15,尾指针rear=6,则该循环队列中共有 【2】个元素。
(3)符合结构化原则的三种基本控制结构为:顺序结构,选择结构和 【3】 。
(4)在结构化分析方法中.用于描述系统中所用到的全部数据和文件的文档称为 【4】 。
(5)数据库管理最本质的特点是实现数据的共享。为了实现数据的共享,保证数据的独
立性、完整性和安全性,需要有一组软件来管理数据库中的数据,处理用户对数据库的访问,这组软件称为【5】。
(6)假定要访问一个结构指针p所指对象中的b指针成员所指的对象,则表示方法为 【6】 。
(7)设px是指向一个类动态对象的指针变量,则执行”delete px;”语句时,将自动调用该类的【7】 。
(8)若需要把一个函数”void Func();”定义为一个类Sample的友元函数,则应在类Sample的定义中加入一条语句 【8】 。
(9)类class one在声明func成员函数时发生错误,出错原因是【9】 。
(10)下列程序从保存整数的文本文件”c:Sample.dat”中依次取出每个数据并显示出来,同时统计并显示出所有数据的个数。程序划线处的表达式为 【10】 。
来源:
(11)类中包含了一个静态成员函数,则main函数中和P.f1(P);语句具有同样功能的语句为 【1l】 。
(13)下列程序中的重载函数(1isp()发生错误,错误原因是 【13】 。
#include
class Sample
(14)类time可以输出12小时或24小时制的时间,现需要设计一个缺省构造函数,缺省值为O时0分O秒。该缺省构造函数为 【4】 。
(15)在下列基类的定义中,有无virlual修饰use成员函数的结果将不同.其原因是【15】 。
当use()为虚拟函数时的程序执行结果:
sized(A)=8
sized(B)=12
sizeof(C)=16
当use()非虚拟函数时的程序执行结果:
sizeof(A)=4
sizeof(B)=8
sizeof(C)=12
源程序如下:
标准预测试卷四答案及解析
一、选择题
(1)A【解析】 良好的程序设计风格主要包括设计的风格、语言运用的风格、程序文本的风格和输入 输出的风格。 设计的风格主要体现在三个方面:结构要清晰;思路要清晰;在设计程序时应遵循“简短朴实”的原 则,切忌卖弄所谓的“技巧”。 语言运用的风格主要体现在两个方面:选择合适的程序设计语言以及不要滥用语言中的某些特色。 特别要注意.尽量不用灵活性大、不易理解的语句成分。 程序文本的风格主要体现在四个方面:注意程序文本的易渎性;符号要规范化:在程序中加必要的注 释;在程序中要合理地使用分隔符等。 输入输出的风格主要体现在三个方面:对输出的数据应该加上必要的说明;在需要输入数据时,应该 给出必要的提示;以适当的方式对输入数据进行检验.以确认其有效性。 总之,程序设计的风格应该强调简单和清晰,程序必须是可以理解的.强调“清晰第一.效率第二”。 由上所述,符号名的命名不仅要符合语法.而且符号名的命名应具有一定实际含义.以便于对程序功 能的理解。因此,选项B中的说法是错误的。 由于程序设计的风格强调的是“清晰第一,效率第二”,而不是效率第一。因此,选项C中的说法也是 错误的。 程序中的注释部分虽然不是程序的功能,计算机在执行程序时也不会执行它,但不能错误地认为注 释是可有可无的部分。在程序中加入正确的注释能够帮助读者理解程序,注释是提高程序可读性的 重要手段。因此,选项D中的说法也是错误的。
(2)D 【解析】 在最坏情况下,冒泡排序的比较次数为n(n一1)/2,快速排序的比较次数也 为n(n一1)/2。
(3)B【解析】栈是按“先进后出”原则组织数据的结构;队列是按“先进先出”原则组织数据的结构;而 有序表与二叉树均不是。
(4)C【解析】按照二叉树中序遍历的方法:在访问根结点、遍历左子树与遍历右子树这三者中,首先 遍历左子树.然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时。仍然先遍历左子树,然后 访问根结点,最后遍历右子树。对本题中的二叉树进行中序遍历的结果应是TZBACYXP。
(5)D【解析】一般来说,一种数据的逻辑结构根据需要可以表示成多种存储结构,因此.数据的逻辑 结构与存储结构不一定是一一对应的。选项A中的说法是错误的。 虽然计算机的存储空间是向量式的存储结构,但由于一种数据的逻辑结构根据需要可以表示成多种 存储结构.例如。线性链表是线性表的链式存储结构。一般来说.在线性表的链式存储结构中,各数 据结点的存储序号是不连续的.并且各结点在存储空间中的位置关系与逻辑关系也不一致。在线性 链表中,各数据元素之间的前后件关系是由各结点的指针域来指示的。因此,数据的存储结构不一 定是线性结构。选项B中的说法也是错误的。 虽然程序设计语言中的数组一般是顺序存储结构,但是,利用数组也能处理非线性结构。例如.满二 叉树与完全二叉树是非线性结构.但对于满二又树与完全--3L树来说,根据完全二叉树的性质6,可 以按层序进行顺序存储,即利用程序设计语言中的数组来存储。这样,不仅节省了存储空间。又能方 便地确定每一个结点的父结点与左右子结点的位置。对于一般的二叉树来说,也可以将--3L树中每 一个结点的左指针、右指针以及数据域分别用三个数组中的对应元素来存储,即实际上也是利用了 程序设计语言中的数组来处理二又树这样的非线性结构。选项C中的说法也是错误的。 综上所述.选项A、B与C中的说法都是错误的。
(6)B【解析】 影响模块之间耦台的主要因素有两个:一是模块之间的连接形式,二是模块接口的复杂 性。一般来说.接口复杂的模块.其耦合程度要比接口简单的的模块强。因此,选项A中的说法是 错误的。 耦合和内聚是一个问题的两个方面,耦合程度弱的模块.其内聚程度一定高。因此,选项C和D中 的说法也是错误的;选项B中的说法是正确的。
(7)B【解析】软件调试的目的是改正程序中的错误。
(8)D【解析】实体集之间一对一的联系不一定是一一对应的关系。例如,在一个教室中,实体集“学 生”与实体集“座位”之间是一对一的联系。因为实体集“学生”中的每一个学生最多与实体集“座位” 中的一个座位有联系(学生坐在该座位上);并且。实体集“座位”中中的每一个座位也最多与实体集 “学生”中的一个学生有联系(座位上坐着该学生)。但该教室中的学生与座位之间不一定是一一对 应的关系.因为有可能某些座位是空的,没有学生去坐。因此,选项A中的说法是错误的。 在关系模型中.由于使用表格数据来表示实体之间的联系.因此,可以直接描述多对多的实体联系。 因此.选项B中的说法也是错误的。 关系模型是与格式化模型完全不同的数据模型,它与层次模型、网状模型相比有着本质的区别。关 系模型是用表格数据来表示实体本身及其相互之间的联系,它是建立在数学理论基础上的。因此, 选项C中的说法也是错误的。
(9)B【解析】 数据库概念设计中由分散到集中的设汁方法是视图集成设计。
(10)C【解析】程序设计并不单指编程,而是有很多步骤,编程只是其中的一步,选项A是错误的;程 序测试工作应避免由程序员自己去完成,选项B也是错误的;程序经调试改错后还应进行再测试. 选项C是正确的.选项D是错误的。
(11)A【解析】本题考察自增运算符和赋值运算符的运算顺序。考生要注意区分++n和n++的 区别。
(12)A【解析】本题考察混合运算表达式类型,由表达式中具有最高优先级的类型所确定,所以答案 为A。
(13)C【解析】本题考察考生对表达式的理解。只要考生能正确将表达式展开,并理解各符号的含 义,将变量的值代人即可判断出正确答案为C。
(14)D【解析】for循环作为C语言中的一种重要的控制结构之一。需要考生扎实掌握,尤其要注意 for循环的三个表达式的执行顺序。
(15)A【解析】本题实际是考察指针的含义。指针代表的是变量或函数等在内存的地址。
(16)B【解析】本题考察指针和数组的关系。其根本的联系在于数组名表示该数组的首地址,等同于 指针,因此用数组名进行指针运算是正确的.并能够进行与整数的加减操作。考生要注意的是+的 运算优先级和[]的运算优先级的大小问题。本题正确答案为B。
(17)D【解析】二维数组可以看作是一维数组的扩展。选项D表示的是一个一维数组,里面每个元 素是一个指针,而指针肯定指向某个地址,从而完成二维数组的扩展。考生要注意选项C中*和[]的运算优先级。
(18)B【解析】本题考察逗号表达式的使用规则。只要考生能将表达式正确展开,逐步分析,就可获 得正确答案为B。
(19)D【解析】注意本题本意是考察x==y+z.但是少写了一个一,因此逻辑表达式变成了赋值语 句,故x的值为O.即假,因此程序执行else部分。本题答案为D。
(20)A【解析】本题考察if语句的嵌套,else总是与最近的那个if配对,只要考生按照逻辑表达式的 值进行细心判断就可以得到正确的答案。考生需要注意的是.在C+十语言中,O表示假,非O即为 真,因此可以用数字作为逻辑判断的依据。
(21)D【解析】考生遇到这么复杂的变量间关系时,可以在草稿纸上画出各个变量的内存存放示意 图,然后用箭头指向表示指针变量与其他变量之间的关系。如果能够清晰的画出这些变量问关系, 则可以会让你容易的判断出正确答案为D。
(22)B【解析】可以很容易分析出f函数的功能是比较两个数的大小,返回较小者。而,指向的也是 较小者,故代人数据即可得出正确结果为B。
(23)B【解析】value作为类的数据成员在引用时可以通过对象来引用,也可以通过域操作符引入类 名来限定。因此选项A和C可以排除,由于选项D中p是指针,它对指针变量的赋值方式是错 误的。
(24)A【解析】类中默认的类型是私有类型,除非特别指定为公有或保护类型。同时,并没有强制要 求成员函数和数据成员的排列顺序.如果类的成员函数在类定义体内部定义,则为内联函数.一般 类的成员函数都在类定义体的外部实现。
(25)D【解析】继承方式不同,派生类能够访问的基类的成员数量也不同。继承方式有三种:公有继 承,私有继承和保护继承,每种继承方式结合成员函数的类型可以组合成不同的访问级别.从而提 供了灵活多样的派生类访问基类的似限。
(26)B【解析】静态成员函数不能直接访问非静态数据成员。静态成员只有一份.供同一类的不同对 象共享。友元函数对类的访问是完全开放的.从而增加了访问类的灵活性.但却破坏了类的封 装性。
(27)D【解析】静态函数作为一一种共享成份,过量使用或不当使用都可能造成程序间和对象间使用的 混乱。而派生类,抽象类和虚函数则是构成了类层次和多态性的基础,是C++中面向对象思想的 重要实现方式。
(28)B【解析】本题考察的是流操作中的文件打开方式,有in,OUt和app分别表示读,写和追加。
(29)A【解析】析构函数不能有参数,是惟一的,没有返回类型,其主要工作就是完成对象销毁前的资 源回收等工作。
(30)B【解析】继承具有传递性,从而在类的层次结构中才表现出丰富多彩的特性,呈现出动态性。
(31)A【解析】本题主要考察const的使用,const根据其位置的不同修饰不同的成份,从而表现出灵 活的特性,考生容易混淆。此处const修饰的是指针,即指针本身不能改变.故选项B、C和D都是 错误的。但是指针指向的地址里面的值确实可以改变的,因此选项A是正确答案。
(32)B【解析】 函数调用时,如果实参是表达式,则表达式的结果传人形参。形参和实参之间进行数 据的拷贝,当然需要为形参临时分配内存单元,函数调用完成之后,形参分配的单元被系统收回。 因此选项B为正确答案。
(33)c【解析】对象是类的实例,类的成员可以是其他类的对象。那么在该类实例化的时候,必须保 证其他类的对象已经生成,否则将会出现错误。
(34)B【解析】抽象类是指包含纯虚函数的类,它主要用于基类,给其他派生类提供参考,由于含纯虚 函数,故抽象类不能实例化。
(35)D【解析】本题考察多重继承情况下各层次类的命名和派生规则。
二、填空题
(1)【l】16【解析】在深度为5的完全二叉树中,就属深度为5的满二叉树中的叶子结点的个数最多, 这些叶子结点均在最后一层(即第5层)上。 又根据二叉树的性质l:在二叉树的第k层上.最多有2K-1(k≥1)个结点。因此.在第5层上最多的 结点数为25-1=16。
(2)【2】16【解析】设循环队列的容量为m。 如果rear>front,则循环队列中的元素个数为rear—front; 如果rear
(3)【3】循环结构(或重复结构)【解析】符合结构化原则的三种基本控制结构为:顺序结构,选择结构 和循环结构(或重复结构)。
(4)【4】数据字典【解析】在结构化分析方法中,用于描述系统中所用到的全部数据和文件的文档称 为数据字典。
(5)【5】数据库管理系统(DBMS)【解析】数据库管理最本质的特点是实现数据的共享。为了实现数 据的共享,保证数据的独立性、完整性和安全性,需要有一组软件来管理数据库中的数据,处理用户 对数据库的访问,这组软件就是数据库管理系统(DBMS)。
(6)【6】*(p一>b) 【解析】注意运算符的优先级问题,可用括号括起来以明确含义。
(7)【7】析构函数【解析】采用new进行动态分配内存生成新对象的时候。对象执行构造函数,在执行 delete时,执行对象的析构函数以回收资源。
(8)【8】friend void Func(); 【解析】注意friend关键词应加在函数的前面,表示该函数作为本类的一 个友元函数。
(9)【9】class one前没有声明语句class tWO;,【解析】当一个类作为另一个类的成员函数、成员函数的 参数或其他情况的时候,要确保编译器能正确解析。由于在class one之前没有关于class two的任 何说明.而在class one的func函数中却用了class two类的参数。因此是错误的。
(10)【lO】fin>>x【解析】while语句用于完成题目指定的功能,则while的条件判断部分应完成从 文件读取字符的功能,并能够判断出读入字符失败后的情况。
(11)【11】M::fl(P);【解析】由于f1是类M的静态成员函数,即说明类M的任何对象都共享一份 f1,因此,不仅可以从对象那里访问f1,还可以用域操作符::通过类名来访问。
(12)【12】ptr一>a:100;【解析】本题考察的是COD_St的使用。const修饰的是指针变量的值,及指针 本身是可变的,但指针所指对象的值是常量,即ptr一>a是不能被改变的。
(13)【13】在静态成员函数的实现中不能直接引用类中说明的非静态成员
(14)【14】Time(){h=O;m=O;s=O;} 【解析】 注意缺省构造函数为无参构造函数,且必须为私有数 据成员赋初值。
(15)【15】采用虚函数的每个派生类都含有一个指向虚函数表的指针,故多4字节。