1、二级 C+新增无纸化真题 2015 年(1)及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:40.00)1.下列叙述中正确的是_。(分数:1.00)A.算法的空间复杂度与算法所处理的数据存储空间有关B.算法的空间复杂度是指算法程序控制结构的复杂程度C.算法的空间复杂度是指算法程序中指令的条数D.压缩数据存储空间不会降低算法的空间复杂度2.下列各组排序法中,最坏情况下比较次数相同的是_。(分数:1.00)A.希尔排序与堆排序B.简单插入排序与希尔排序C.简单选择排序与堆排序D.冒泡排序与快速排序3.设栈的存储空间为 S(1:50),初始状态为 top=51。
2、现经过一系列正常的入栈与退栈操作后,top=20,则栈中的元素个数为_。(分数:1.00)A.31B.30C.21D.204.某二叉树共有 400 个结点,其中有 100 个度为 1 的结点,则该二叉树中的叶子结点数为_。(分数:1.00)A.149B.150C.151D.不存在这样的二叉树5.下面属于“类-对象”主要特征的是_。(分数:1.00)A.对象一致性B.对象无关性C.类的多态性D.类的依赖性6.下面不属于需求分析阶段工作的是_。(分数:1.00)A.需求获取B.可行性研究C.需求分析D.撰写软件需求规格说明书7.软件生命周期是指_。(分数:1.00)A.软件的需求分析、设计与实现B
3、.软件的开发与管理C.软件的实现和维护D.软件产品从提出、实现、使用维护到停止使用退役的过程8.在数据库的三级模式结构中,描述数据库中全体数据的全局逻辑结构和特征的是_。(分数:1.00)A.内模式B.用户模式C.外模式D.概念模式9.大学中每个年级有多个班,每个班有多名学生,则实体班级和实体学生之间的联系是_。(分数:1.00)A.一对多B.一对一C.多对一D.多对多10.有 3 个关系 R、S 和 T 如下: R A B C a 1 n b 2 m c 3 f d 5 e S A D c 4 a 5 e 7 T A B C D c 3 f 4 a 1 n 5 则由关系 R、S 得到关系 T
4、 的操作是_。(分数:1.00)A.交B.投影C.自然连接D.并11.下列关于 new 和 delete 运算符的叙述中,错误的是_。(分数:1.00)A.delete 运算符用于释放用 new 分配的内存空间B.new 运算符创建类对象时要调用构造函数C.使用 new 创建数组时可以为数组元素指定初值D.使用 new 和 delete 运算符可以动态建立或删除对象12.下列选项中,不属于 C+关键字的是_。(分数:1.00)A.doB.tryC.importD.static13.若已定义过类 A 和 B,并且定义类 C 如下: class C public: int val; A aObj;
5、 B bObj; C*cObj; C(): cObj(0), val(0) ; 若要建立类 C 的对象 object,则类成员 val、aObj、bObj 和 cObj 中最后被初始化的是_。(分数:1.00)A.valB.aObjC.bObjD.cObj14.若有如下类定义 class Number double Convert() return double(value); public: void Add(); void Add(int x); private: int value; ; 则下列叙述中,错误的是_。(分数:1.00)A.类中有 1 个私有数据成员B.类中有 1 个私有成员
6、函数C.编译时会产生 Add()函数重定义错误D.成员函数 Convert()是内联函数15.若已知“int a37;”,则用指针表示数组 a 中的元素时,下列表示中错误的是_。(分数:1.00)A.*(a+1)5B.*(*a+3)C.*(*(a+1)D.*(*a00+2)16.下列语句中正确的是_。(分数:1.00)A.const int*p NULL;B.const int y=99;C.const int x=0;D.const int z:100;17.有如下程序段: int i=1; int j=4; int main() int i=5; j+=i; coutijendl; 运行时
7、的输出结果是(分数:1.00)A.14B.95C.59D.5518.下列关于函数参数的叙述中,正确的是_。(分数:1.00)A.函数原型中不必声明形参类型B.函数体中不能修改形参对应的实参值C.函数的形参在函数被调用时获得初始值D.函数形参的生存期与整个程序的运行期完全相同19.通过运算符重载,只能改变运算符原有的_。(分数:1.00)A.优先级B.操作数个数C.操作数类型D.结合性20.在一个函数体中,定义一个变量的默认存储类型是_。(分数:1.00)A.externB.registerC.autoD.static21.下列关于运算符函数的叙述中,错误的是_。(分数:1.00)A.运算符函数
8、的名称总是以 operator 为前缀B.重载类型转换运算符不需要声明返回值类型C.默认的赋值运算符实现了深层复制功能D.不能为重载运算符函数的参数设置默认值22.有如下程序: #includeiostream using namespace std; void fun(int i) cout“/int i“; void fun(char e)cout“/char c“; int main() fun(0); fun(“0“); retum 0; 运行后的输出结果是_。(分数:1.00)A./int i/int iB./int i/char cC./char c/int iD./char c/
9、char c23.已知函数 func 的原型为 int func(int,int); 则下列不能作为它的重载函数原型的是_。(分数:1.00)A.bool func(int, int, bool);B.void func(int a, int b);C.int func(int, char);D.float func(double, int);24.计算数列第 n 项的函数定义如下: int fa(int n) if(n=0) return 0; else if(n=1) return 1; else return fa(n-1)+fa(n-2); 若执行函数调用表达式 fa(3)时,返回的函
10、数值为_。(分数:1.00)A.0B.1C.2D.325.下列关于友元的叙述中,错误的是_。(分数:1.00)A.关键字 friend 用于声明友元B.友元可以提高程序的运行效率C.友元函数通过 this 指针访问对象成员D.一个类的成员函数可以是另一个类的友元26.建立一个类对象时,系统自动调用_。(分数:1.00)A.析构函数B.友元函数C.静态函数D.构造函数27.在 C+中,编译系统自动为一个类生成默认构造函数的条件是_。(分数:1.00)A.该类没有定义任何有参构造函数B.该类没有定义任何无参构造函数C.该类没有定义任何构造函数D.该类没有定义任何成员函数28.有如下程序: #inc
11、ludeiostream using namespace std; class Rect int x, y; public: Rect(int x1=0, int y1=0):x(x1), y(y1) int get() return x*y; ; class Cube Rect plane; int high; public: Cube(int cx, int cy, int ch):plane(cx, cy), high(ch) int get()return plane.get()*high; ; int main() Cube e(3, 4, 5); coutc.get()endl;
12、return 0; 运行时的输出结果是_。(分数:1.00)A.12B.35C.60D.8029.下列关于继承方式的描述中,错误的是_。(分数:1.00)A.如果不显式地指定继承方式,则默认的继承方式是私有 privateB.采用公有继承方式时,基类中的公有成员在派生类中仍然是公有成员C.采用保护继承方式时,基类中的保护成员在派生类中仍然是保护成员D.采用保护继承方式时,基类中的公有成员在派生类中仍然是公有成员30.有如下类定义: class Bag public: Bag(int p=200, char s=“M“):price(p), size(s) coutsize; private:
13、int price; char size; ; 若执行语句 Bag Alice, Kelly(Mice), *Twins2, F44; 则输出结果为_。(分数:1.00)A.MMMMMMMMB.MMMMMMC.MMMMMD.MMMM31.有如下程序: #includeiostream using namespace std; class TV public: TV(int s=41):size(s) TV(const TV TV() private: int size; ; TV fun(TV return t; int main() TV x, y; x=fun(y); return 0;
14、此程序运行时输出字符 1 的个数是_。(分数:1.00)A.1B.2C.3D.432.有如下程序: #includeiostream #includestring using namespace std; class Shape public: void Draw(); string GetName(); private: string name; ; class Rectangle:private Shape protected: void Draw() Shape:Draw(); /A string GetName() return name; /B ; int main() Rectan
15、gle rect; rect.Draw(); /C rect.GetName(); /D return 0; 带标号的语句中,编译时不会出错的是_。(分数:1.00)A.AB.BC.CD.D33.有如下程序: #includeiostream using namespace std; class Employee public: cout“E“; ; class Manager:public Employee public: Manager()cout“M“; ; int main() Employee*obj=new Manager; delete obj; return 0; 若运行时的输
16、出结果是“ME”,则划线处缺失的部分是_。(分数:1.00)A.Employee()B.Employee()C.virtual Employee()D.virtual Employee()34.有如下类定义: class Box public: Box(int h, int w, int r):wid(w), len(r), hei(h) private: int len, wid, hei; ; Box 类中 3 个数据成员的初始化顺序为_。(分数:1.00)A.len,hei,widB.len,wid,heiC.hei,wid,lenD.wid,len,hei35.有如下程序: #incl
17、udeiostream #includestring using namespace std; class TV public: Tv(int s=2):size(s) TV(const TV private: int size; ; int main() TV room1(1), room2(room1), room3; TV*roomPtr=new TV(3); delete roomPtr; return 0; 运行时的输出结果是_。(分数:1.00)A.3211B.3210C.3121D.232336.有如下程序: #includeiostream #includestring usi
18、ng namespaee std; class Person public: Person(string n):name(n) Person() cout“P“; private: string name; ; class Date public: Date(int y=2014, int m=9, int d=21):year(y), month(m), day(d) Date() cout“D“; private: int year, month, day; ; class Student:public Person public: Student(string n, char c):Pe
19、rson(n), birthday(), sex(c) Student() cout“S“; private: Date birthday; char sex; ; int main() Student stu1(“Z“, “F“); return 0; 运行时的输出结果是_。(分数:1.00)A.SDPB.SDSC.SPDD.DSP37.已知函数模板定义如下: templateclass T T min(T x, T y) return xy? x:y; 下列叙述中,错误的是_。(分数:1.00)A.该函数模板有一个模板参数B.T 类型所允许的类型范围应提供有意义的运算符操作C.该函数模板生
20、成的模板函数中,参数和返回值的类型可以不同D.该函数模板可以生成模板函数 double min(double, double)38.有如下函数模板: templateclass TT square(T x) retum x*x; 其中的参数 T 是_。(分数:1.00)A.函数形参B.函数实参C.模板实参D.模板形参39.下列函数模板声明中,合法的是_。(分数:1.00)A.templatetypename TT abs(T x);B.template classTvoid abs(T x);C.template Tclass Tabs(T x);D.templatetypename Tabs
21、(T x);40.在下列枚举符号中,用来定位文件开始位置的符号常量是_。(分数:1.00)A.ios_base:curB.ios_base:outC.ios_base:begD.ios_base:end二、基本操作题(总题数:1,分数:18.00)41.请使用菜单命令或直接使用 VC6 打开 下的工程 proj1,其中有“MP3 播放器”类 MP3Player 和主函数main 的定义。程序中位于每个/ERROR *found*下的语句行有错误,请加以更正。更正后程序的输出应该是: 天籁-1 黑色 注意:只能修改每个/ERROR *found*下的那一行,不要改动程序中的其他内容。 #incl
22、udeiostream #includeiostream using namespace std; class MP3Player /“MP3 播放器”类 char*type;/型号 char*color;/颜色 public: /ERROR *found* MP3Player(const char*ty=NULL, const char*co) /ERROR *found* if(ty=NULL) type=NULL; else type=new eharstden(ty)+1; strcpy(type, ty); if(co=NULL) color=NULL; else color=new
23、 charstrlen(co)+1; strcpy(color, co); MP3Player() if(type) deletetype; /ERROR *found* if(color) delete color; const char *getType()const return type; const char *getColor()const return color; ; int main() MP3Piayer myplayer(“天籁-1”, “黑色”); coutmyplayer.getType()endl; coutmyplayer.getColor()endl; retu
24、rn 0; (分数:18.00)_三、简单应用题(总题数:1,分数:18.00)42.请使用菜单命令或直接用 VC6 打开 下的工程 proj2,其中有元素类 Element 和集合类 MySet 的定义。请在程序中的横线处填写适当的代码,然后删除横线,以实现上述类定义。此程序的输出结果应为: 0 3 5 8 0 3 8 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不能删除或移动“/*found*”。 #includeiostream #includecmath using namespace std; #define MaxElement 100 class Element
25、 /“元素”类 public: int n; Element(int i=0):n(i) ; class MySet/“集合”类 Element*element; /指向存储元素的数组的指针 int size; /数组大小 int counter; /数组中元素的个数 int current; /用于表示扫描位置,及当前被扫描元素在数组中的下标 public: MySet():element(new Element100), size(100), counter(0), current(0) MySet()deleteelement; void add(Element ele); /向集合中添
26、加一个元素,保持由小到大的顺序。 void remove(Element ele); /删除集合中指定的元素 void scanFirst()current=0; /将扫描位置定位于首元素 /*found* void scanNext()_; /将扫描位置定位于下一个元素 Element get()eonstreturn elementcurrent; /返回当前被扫描的元素 bool isEnded()constreturn current=counter;/如果已经没有更多的元素可扫描了,返回 true。 void show();/显示集合中所有元素 ; void MySet:add(El
27、ement ele) int pos=counter; /pos 用于确定元素应插入的位置 while(pos0) /从后往前寻找该位置 if(ele.nelementpos-1.n)break; /找到应插入的位置,退出循环 /*found* if(_) return; /发现相同元素,终止添加过程。 pos-; if(counter=size) /如果没有足够空间,扩充空间(增加 100 个元素的容量) Element*tmp=element; /tmp 指向原来的数组 /*found* element=_; /申请一个新的数组,容量扩大 100 个元素的容量 for(int i=0; i
28、size; i+) elementi=tmpi; size+=100; deletetmp; for(int i=counter; ipos; i-)elementi=elementi-1; /后移相关元素,腾出存放新元素的空间 elementpos=ele; /插入新元素 counter+; void MySet:show() scanFirst(); /扫描位置定位于首元素 while(!isEnded() coutget().n“; /*found* _; /扫描定位于下一个元素 coutendl; void MySet:remove(Element ele) int pos=count
29、er-1; /pos 用于确定要删除的元素的位置 while(pos=0) /从后往前寻找该位置 if(ele.nelementpos.n) return; /集合中没有该元素,终止删除过程。 if(ele.n=elementpos.n)break; /找到删除的元素,退出循环。 pos-; if(pos0)return; /集合中没有该元素,终止删除过程。 for(int i=pos; icounter-1; i+) elementi=elementi+1; /删除该元素,后面的元素顺序前移。counter-; if(counter+100=size)/如果来使用的存储单元超过 100,缩减
30、存储空间,减少 100 个单元 Element*tmp=element; element=new Elementsize-100; for(int i=0; isize; i+) elementi=tmpi; size-=100: deletetmp; int main() MySet set; set.add(Element(3); set.add(Element(8); set.add(Element(5); set.add(Element(0); set.show(); set.remove(Element(5); set.remove(Element(4); set.add(Eleme
31、nt(8); set.show(); return 0; (分数:18.00)_四、综合应用题(总题数:1,分数:24.00)43.请使用菜单命令或直接用 VC6 打开 下的工程 proj3,其中声明了 Date 类,它是一个用于表示日期的类。成员函数 isLessThan 用以比较两个日期的大小:当第一个日期早于第二个日期时,返回 true,否则返回 false。请补充完整函数 isLessThan。在 main 函数中给出了一组测试数据,此情况下程序的输出应该是: 2007-06-212007-07-03 2007-06-21=2007-06-19 2007-06-212010-01-01
32、 注意:只需在函数 isLessThan 的/*333*和/*666*之间填入若干语句,不要改动程序中的其他内容。 #include“Date.h“ int main() Date date1(2007, 6, 21), date2(2007, 7, 3), date3(2007, 6, 19), date4(2010, 1, 1); date1.show(); date1.isLessThan(date2)?cout“ “:cout“=“; date2.show(); coutendl; date1.show(); date1.isLessThan(date3)?cout“:cout“=“;
33、 date3.show(); coutendl; date1.show(); date1.isLessThan(date4)?cout“ “:cout“=“; date4.show(); coutendl; writeToFile(“c:/test“); /不用考虑此语句的作用 return 0; /proj3/Date.cpp #include“Date.h“ void Date:show(ostream bool Date:isLessThan(Date date)const /*333* /*666* /proj3/Date.h #includeiostream #includeioma
34、nip using namespace std; class Date int year; int month; int day; public: Date(int y, int m, int d):year(y), month(m), day(d) int getYear()constreturn year; int getMonth()constreturn month; int getDay()eonstreturn day; void show(ostream bool operator=(Date date)const return year=date.year bool isLes
35、sThan(Date date)const; ; void writeToFile(const char*path); (分数:24.00)_二级 C+新增无纸化真题 2015 年(1)答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:40.00)1.下列叙述中正确的是_。(分数:1.00)A.算法的空间复杂度与算法所处理的数据存储空间有关 B.算法的空间复杂度是指算法程序控制结构的复杂程度C.算法的空间复杂度是指算法程序中指令的条数D.压缩数据存储空间不会降低算法的空间复杂度解析:解析 算法的空间复杂度是指执行这个算法所需要的内存空间,包括 3 个部分:输入
36、数据所占的存储空间;程序本身所占的存储空间;算法执行过程中所需要的额外空间。为了降低算法的空间复杂度,主要应减少输入数据所占的存储空间以及额外空间,通常采用压缩存储技术。故 A 选项正确。2.下列各组排序法中,最坏情况下比较次数相同的是_。(分数:1.00)A.希尔排序与堆排序B.简单插入排序与希尔排序C.简单选择排序与堆排序D.冒泡排序与快速排序 解析:解析 对长度为 n 的线性表,下表为常用排序算法最坏情况下比较次数: 方法 最坏情况比较次数 冒泡排序 O(n 2 ) 简单插入排序 O(n 2 ) 简单选择排序 O(n 2 ) 快速排序 O(n 2 ) 堆排序 O(nlog 2 n) 上表
37、中未包括希尔排序,因为希尔排序的时间效率与所取的增量序列有关,如果增量序列为:d 1 =n/2,d i+1 =d i /2,在最坏情况下,希尔排序所需要的比较次数为 O(n 1.5 )。由上表可知冒泡排序与快速排序比较次数相同,故 D 选项正确。3.设栈的存储空间为 S(1:50),初始状态为 top=51。现经过一系列正常的入栈与退栈操作后,top=20,则栈中的元素个数为_。(分数:1.00)A.31 B.30C.21D.20解析:解析 栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即取出栈顶元素赋予指定变量。栈为空时,栈顶指针
38、 top=0,经过入栈和退栈运算,指针始终指向栈顶元素。初始状态为 top=51,当 top=20 时,元素依次存储在单元 20:50 中,个数为 50-19=31,故 A 选项正确。4.某二叉树共有 400 个结点,其中有 100 个度为 1 的结点,则该二叉树中的叶子结点数为_。(分数:1.00)A.149B.150C.151D.不存在这样的二叉树 解析:解析 在树结构中,一个结点所拥有的后件个数称为该结点的度。对任何一棵二叉树,度为 0 的结点(即叶子结点)总是比度为 2 的结点多一个。二叉树中有 400 个结点,设叶子结点个数为 n 0 ,度为 1的结点个数为 100,设度为 2 的结
39、点个数为 n 2 。400=n 0 +100+n 2 且 n 0 =n 2 +1,则 n 0 =150.5,n 2 =149.5。由于结点个数必须是整数,所以不存在这样的二叉树,故选择 D 选项。5.下面属于“类-对象”主要特征的是_。(分数:1.00)A.对象一致性B.对象无关性C.类的多态性 D.类的依赖性解析:解析 类-对象的基本特点如下。 特点 描述 标识唯一性 一个对象通常可由对象名、属性 和操作三部分组成 分类性 指可以将具有相同属性和操作的 对象抽象成类 多态性 指同一个操作可以是不同对象的 行为,不同对象执行同一操作产 生不同的结果 封装性 从外面看只能看到对象的外部特 性,对
40、象的内部对外是不可见的 模块独立性好 由于完成对象功能所需的元素都 被封装在对象内部,所以模块独 立性好 由上表可知“类-对象”主要特征包括类的多态性,故 C 选项正确。6.下面不属于需求分析阶段工作的是_。(分数:1.00)A.需求获取B.可行性研究 C.需求分析D.撰写软件需求规格说明书解析:解析 需求分析阶段对待开发软件提出的需求进行分析并给出详细定义,编写软件规格说明书及初步的用户手册,提交评审,可以分为 4 个方面:需求获取、需求分析、编写需求规格说明书和需求评审。可行性研究是软件生命周期的第二阶段主要任务,在需求分析之前,故选择 B 选项。7.软件生命周期是指_。(分数:1.00)
41、A.软件的需求分析、设计与实现B.软件的开发与管理C.软件的实现和维护D.软件产品从提出、实现、使用维护到停止使用退役的过程 解析:解析 通常把软件产品从提出、实现、使用、维护到停止使用、退役的过程称为软件生命周期,故 D 选项正确。8.在数据库的三级模式结构中,描述数据库中全体数据的全局逻辑结构和特征的是_。(分数:1.00)A.内模式B.用户模式C.外模式D.概念模式 解析:解析 数据库系统在其内部分为三级模式,即概念模式、内模式和外模式。概念模式是数据库系统中全局数据逻辑结构的描述,全体用户的公共数据视图。外模式也称子模式或者用户模式,是用户的数据视图,也就是用户所能够看见和使用的局部数
42、据的逻辑结构和特征的描述,是与某一应用有关的数据的逻辑表示。内模式又称物理模式,是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。描述数据库中全体数据的全局逻辑结构和特征的是概念模式,故 D 选项正确。9.大学中每个年级有多个班,每个班有多名学生,则实体班级和实体学生之间的联系是_。(分数:1.00)A.一对多 B.一对一C.多对一D.多对多解析:解析 实体集之间通过联系来建立联接关系分为三类:一对一联系(1:1)、一对多联系(1:m)、多对多联系(m:n)。每个班有多名学生,但每个学生只能在一个班级里,故实体班级和实体学生之间的联系是一对多,故 A 选项正确。10.有 3 个关系
43、 R、S 和 T 如下: R A B C a 1 n b 2 m c 3 f d 5 e S A D c 4 a 5 e 7 T A B C D c 3 f 4 a 1 n 5 则由关系 R、S 得到关系 T 的操作是_。(分数:1.00)A.交B.投影C.自然连接 D.并解析:解析 交:RS 结果是既属于 R 又属于 S 的记录组成的集合。并:RS 是将 S 中的记录追加到 R后面。上述两种操作中,关系 R 与 S 要求有相同的结构,故 A、D 选项错误。投影是指从关系模式中指定若干个属性组成新的关系。由于 T 中含有 R 中不存在的属性,明显不可能由 R 向 S 投影得到 T,故 B 选项
44、错误。自然连接:去掉重复属性的等值连接。R 与 S 重复属性是 A,等值元组为 a 和 c,进行自然连接得到的两个元组按照属性 ABCD 的顺序为 c3f4 与 aln5,正好为题目中关系 T,故 C 选项正确。11.下列关于 new 和 delete 运算符的叙述中,错误的是_。(分数:1.00)A.delete 运算符用于释放用 new 分配的内存空间B.new 运算符创建类对象时要调用构造函数C.使用 new 创建数组时可以为数组元素指定初值 D.使用 new 和 delete 运算符可以动态建立或删除对象解析:解析 在 C+中,申请和释放堆中分配的存贮空间,分别使用 new 和 del
45、ete 的两个运算符来完成:指针变量名=new 类型名(初始化式);delete 指针名;使用 new 运算符创建数组时必须为数组元素指定大小,而非初值,因此选项 A、B、D 三项正确,只有 C 选项错误。12.下列选项中,不属于 C+关键字的是_。(分数:1.00)A.doB.tryC.import D.static解析:解析 do.while()是 C+中的循环语句,do 属于关键字,选项 A 正确;try.catch()是 C+中捕获异常的语句,try 属于关键字,选项 B 正确;static 可以用来声明静态变量、静态函数、静态成员变量、静态成员函数等,static 属于关键字,选项 D 正确;import 在 python 语言中属于关键字,用来导入文件或者模块,在 C+中不属于关键字,选项 C 错误。答案选 C。13.若已定义过类 A 和 B,并且定义类 C 如下: class C public: int val; A aObj; B bObj; C*cObj; C(): cObj(0), val(0) ; 若要建立类 C 的对象 obje