1、二级 C+-17-1 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:40.00)1.一个栈的初始状态为空。现将元素 1、2、3、4、5、A、B、C、D、E 依次入栈,然后再依次出栈,则元素出栈的顺序是_。(分数:1.00)A.12345ABCDEB.EDCBA54321C.ABCDE12345D.54321EDCBA2.下列叙述中正确的是_。(分数:1.00)A.循环队列有队头和队尾两个指针,因此,循环队列是非线性结构B.在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况C.在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况D.循环队
2、列中元素的个数是由队头指针和队尾指针共同决定3.在长度为 n 的有序线性表中进行二分查找,最坏情况下需要比较的次数是_。 A.O(n) B.O(n2) C.O(log2n) D.O(nlog2n)(分数:1.00)A.B.C.D.4.下列叙述中正确的是_。(分数:1.00)A.顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的B.顺序存储结构只针对线性结构,链式存储结构只针对非线性结构C.顺序存储结构能存储有序表,链式存储结构不能存储有序表D.链式存储结构比顺序存储结构节省存储空间5.数据流图中带有箭头的线段表示的是_。(分数:1.00)A.控制流B.事件驱动C.模块调用D.
3、数据流6.在软件开发中,需求分析阶段可以使用的工具是_。(分数:1.00)A.N-S 图B.DFD 图C.PAD 图D.程序流程图7.在面向对象方法中,不属于“对象”基本特点的是_。(分数:1.00)A.一致性B.分类性C.多态性D.标识唯一性8.一间宿舍可住多个学生,则实体宿舍和学生之间的联系是_。(分数:1.00)A.一对一B.一对多C.多对一D.多对多9.在数据管理技术发展的三个阶段中,数据共享最好的是_。(分数:1.00)A.人工管理阶段B.文件系统阶段C.数据库系统阶段D.三个阶段相同10.有三个关系 R、S 和 T 如下: R A B m 1 n 2 S B C 1 3 3 5 T
4、 A B C m 1 3 由关系 R 和 S 通过运算得到关系 T,则所使用的运算为_。(分数:1.00)A.笛卡尔积B交C并D.自然连接11.下列语句中,错误的是_。(分数:1.00)A.const int buffer=256;B.const double*point;C.int const buffer=256;D.double*const point;12.if 语句的语法格式可描述为: 格式 1:if(条件)语句 或 格式 2:if(条件)语句 1 else语句 2 关于上面的语法格式,下列表述中错误的是_。(分数:1.00)A.条件部分可以是一个 if 语句,例如 if(if(a=
5、0)B.语句部分可以是一个 if 语句,例如 if()if()C.如果在条件前加上逻辑非运算符!并交换语句 1和语句 2的位置,语句功能不变D.语句部分可以是一个循环语句,例如 if()while()13.有如下说明: int a10=1, 2, 3, 4,5,6, 7, 8, 9, 10, *p=a; 则数值为 9 的表达式是_。(分数:1.00)A.*p+9B.*(p+8)C.*p+=9D.p+814.有如下程序段: int i=0, j=1; int / r=j;/ int*p=/ *p=/ 其中会产生编译错误的语句是_。(分数:1.00)A.B.C.D.15.下列字符串中,不可以用做
6、C+标识符的是_。(分数:1.00)A.y_2006B._TEST_HC.ReturnD.switch16.为了取代 C 中带参数的宏,在 C+中使用_。(分数:1.00)A.重载函数B.内联函数C.递归函数D.友元函数17.通过运算符重载,可以改变运算符原有的_。(分数:1.00)A.操作数类型B.操作数个数C.优先级D.结合性18.在函数中,可以用 auto、extern、register 和 static 这四个关键字中的一个来说明变量的存储类型,如果不说明存储类型,则默认的存储类型是_。(分数:1.00)A.autoB.externC.registerD.static19.下列运算符函
7、数中肯定不属于类 FunNumber 的成员函数的是_。(分数:1.00)A.int operator-(FunNumber);B.FunNumber operator-();C.FunNumber operator-(int);D.int operator-(FunNumber, FunNumber);20.若有下面的函数调用: fun(a+b, 3, max(n-1, b) 则 fun 的实参个数是_。(分数:1.00)A.3B.4C.5D.621.关于运算符重载,下列表述中正确的是_。(分数:1.00)A.C+已有的任何运算符都可以重载B.运算符函数的返回类型不能声明为基本数据类型C.在
8、类型转换符函数的定义中不需要声明返回类型D.可以通过运算符重载来创建 C+中原来没有的运算符22.有如下程序: #includeiostream using namespace std; int main() void function(double val); double val; function(val); coutval; return 0: void function(double val) val=3; 编译运行这个程序将出现的情况是_。(分数:1.00)A.编译出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数23.下列情况中,不会调用拷贝构造函数的是_。(分数:
9、1.00)A.用一个对象去初始化同一类的另一个新对象时B.将类的一个对象赋值给该类的另一个对象时C.函数的形参是类的对象,调用函数进行形参和实参结合时D.函数的返回值是类的对象,函数执行返回调用时24.以下关键字不能用来声明类的访问权限的是_。(分数:1.00)A.publicB.staticC.protectedD.private25.由于常对象不能被更新,因此_。(分数:1.00)A.通过常对象只能调用它的常成员函数B.通过常对象只能调用静态成员函数C.常对象的成员都是常成员D.通过常对象可以调用任何不改变对象值的成员函数26.下列有关继承和派生的叙述中,正确的是_。(分数:1.00)A.
10、如果一个派生类公有继承其基类,则该派生类对象可以访问基类的保护成员B.派生类的成员函数可以访问基类的所有成员C.基类对象可以赋值给派生类对象D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类27.在公有继承的情况下,允许派生类直接访问的基类成员包括_。(分数:1.00)A.公有成员B.公有成员和保护成员C.公有成员、保护成员和私有成员D.保护成员28.有如下程序: #includeiostream using namespace std; class Base public: void fun() cout“Base:fun“endl; ; class Derived:publi
11、c Base public: void fun() cout“Derived:fun“endl: ; int main() Derived d; d. fun(); return 0; 已知其执行后的输出结果为: Base:fun Derived:fun 则程序中下画线处应填入的语句是_。(分数:1.00)A.Base. fun();B.Base:fun();C.Base-fun();D.fun();29.有如下程序: #includeiostream using namespace std; class MyClass public: MyClass() cout“A“; MyClass(c
12、har c) coutc; MyClass() cout“B“; ; int main() MyClass pl, *p2; p2=new MyClass(“X“); delete p2; return 0; 执行这个程序的输出结果是_。(分数:1.00)A.ABXB.ABXBC.AXBD.AXBB30.有如下程序: #includeiostream using namespace std; int i=1; class Fun public: static int i; int value() return i-1; int value()const return i+1; ; int Fu
13、n:i=2; int main() int i=3; Fun fun1; const Fun fun2; return 0; 若程序的输出结果是: 123 则程序中下画线处遗漏的语句是_。(分数:1.00)A.coutfun1. value()Fun:ifun2. value();B.coutFun:ifun1. value()fun2. value();C.coutfun1. value()fun2. value()Fun:i;D.coutfun2. value()Fun:ifun1. value();31.有如下程序: #includeiostream using namespace st
14、d; class Obj static int i; public: Obj() i+; Obj() i-; static int getVal() return i; ; int Obj:i=0; void f() Obj ob2; coutob2. getVal(); int main() Obj ob1; f(); Obj*ob3=new Obj; coutob3-getVal(); delete ob3;coutObj:getVal(); return 0; 执行这个程序的输出结果是_。(分数:1.00)A.232B.231C.222D.22132.有如下程序: #includeios
15、tream using namespace std; class Pair int m, n; public: Pair(int j, int k): m(j), n(k) int get() return m; int get()const return m+n; ; int main() Pair a(3, 5); const Pair b(3, 5); couta. get()b. get(); return 0; 执行这个程序的输出结果是_。(分数:1.00)A.33B.38C.83D.8833.有如下程序: #includeiostream using namespace std;
16、class Base protected: Base() cout“A“; Base(char c) coutc; ; class Derived: public Base public: Derived(char c) coutc; ; int main() Derived d1(“B“); return 0; 执行这个程序的输出结果是_。(分数:1.00)ABB.BAC.ABD.BB34.有如下类定义: class MyBase int k; public: MyBase(int n=0): k(n) int value()const return k; ; class MyDefived
17、: MyBase int j; public: MyDefived(int i): j(i) int getK()const return k; int getJ()const return j; ; 编译时发现有一处语法错误,对这个错误最准确的描述是_。(分数:1.00)A.函数 getK 试图访问基类的私有成员变量 kB.在类 MyDerived 的定义中,基类名 MyBase 前缺少关键字 public、protected 或 privateC.类 MyDerived 缺少一个无参的构造函数D.类 MyDefived 的构造函数没有对基类数据成员 k 进行初始化35.有如下程序: #in
18、cludeiostream using namespace std; class Instrument public: virtual void Display()=0; ; class Piano: public Instrument public: void Display() /*函数体略*/ ; int main() Instrument s; Instrument*P=0; /; return 0; 下列叙述中正确的是_。(分数:1.00)A.语句“Insturment*P=0;”编译时出错B.语句“Instrument s;”编译时出错C.类 Piano 中的 Display 函数
19、不是虚函数D.类 Instrument 是一个虚基类36.有如下程序: #includeiostream using namespaee std; class A public: virtual void func1() cout“A1“; void rune2() cout“A2“; ; class B: public A public: void func1() cout“B1“; void func2() cout“B2“; ; int main() A*P=new B; P-func1(); P-func2(); delete P; return 0; 执行这个程序的输出结果是_。(分
20、数:1.00)A.B1B2B.A1A2C.B1A2D.A18237.关于在调用模板函数时模板实参的使用,下列表述中正确的是_。(分数:1.00)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何情况下都不能省略38.关于关键字 class 和 typename,下列表述中正确的是_。(分数:1.00)A.程序中的 typename 都可以替换为 classB.程序中的 cl
21、ass 都可以替换为 typenameC.在模板形参表中只能用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型39.在下列枚举符号中,用来表示“相对于当前位置”文件定位方式的是_。(分数:1.00)A.ios_base:curB.ios_base:begC.ios_base:outD.ios_base:end40.下列关于 C+流的描述中,错误的是_。(分数:1.00)A.cout“A“表达式可输出字符 AB.eof()函数可以检测是否到达文件尾C.对磁盘文件进行流操作时,必须包含头文件 fstreamD.以 ios_base:o
22、ut 模式打开的文件不存在时,将自动建立一个新文件二、基本操作题(总题数:1,分数:18.00)41.请使用 VC6 或使用答题 菜单打开 proj1 下的工程 proj1,此工程中包含一个源程序文件 main. cpp,其中有类 Book(“书”)和主函数 main 的定义。程序中位于每个“/ERROR *found*”下的语句行有错误,请加以改正。改正后程序的输出结果应该是: 书名:C+语句程序设计总页数:299 已把“C+语言程序设计”翻到第 50 页 已把“C+语言程序设计”翻到第 51 页 已把“C+语言程序设计”翻到第 52 页 已把“C+语言程序设计”翻到第 51 页 已把书合上
23、。 当前页:0 注意:只修改每个“/ERROR *found*”下的那一行,不要改动程序中的其他内容。 #includeiostream using namespace std; class Book char*title; int num_pages;/页数 int cur_page;/当前打开页面的页码,0 表示书未打开 public: /ERROR *found* Book(const char*theTitle, int pages) num_pages(pages) title=new charstrlen(theTitle)+1; strcpy(title, theTitle);
24、coutendl“书名:“title “总页数:“num_pages; Book() deletetitle; bool isClosed()const return cur_page=0; /书合上时返回 true,否则返回 false bool isOpen()const return! isClosed(); /书打开时返回 true,否则返回 false int numOfPages()const return num_pages; /返回书的页数 int currentPage()const return cur_page; /返回打开页面的页码 /ERROR *found* voi
25、d openAtPage(int page_no)const /把书翻到指定页 coutendl; if(page_no1 | | page_nonum_pages) cout“无法翻到第“cur_page“页。“; close(); else cur_page=page_no; cout“已把“title“”翻到第“cur_page“页“; void openAtPrevPage() openAtPage(cur_page-1); /把书翻到上一页 void openAtNextPage() openAtPage(cur_page+1); /把书翻到下一页 void close() /把书合
26、上 coutendl; if(isClosed() cout“书是合上的。“; else /ERROR *found* num_pages=0; cout“已把书合上。“; coutendl; ; int main() Book book(“C+语言程序设计“, 299); book. openAtPage(50); book. openAtNextPage(); book. openAtNextPage(); book. openAtPrevPage(); book. close(); cout“当前页:“book. currentPage()endl; return 0; (分数:18.0
27、0)_三、简单应用题(总题数:1,分数:24.00)42.请使用 VC6 或使用答题 菜单打开 proj2 下的工程 proj2。此工程中包含一个源程序文件 main. cpp,其中有“房间”类 Room 及其派生出的“办公室”类 Office 的定义,还有主函数 main 的定义。请在程序中“/*found*”下的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 办公室房间号:308 办公室长度:5.6 办公室宽度:4.8 办公室面积:26.88 办公室所属部门:会计科 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“/*found*
28、”。 #includeiostream using namespace std; class Room /“房间”类 int room_no;/房间号 double length;/房间长度(m) double width;/房间宽度(m) public: Room(int the_room_no, double the_length, double the_width): room_no(the_room_no), length(the_length), width(the_width) int theRoomNo()const return room_no; /返回房间号 double t
29、heLength()const return length;/返回房间长度 double theWidth()const return width;/返回房间宽度 /*found* double theArea()const_/返回房间面积(矩形面积) ; class Office: public Room /“办公室”类 char*depart;/所属部门 public: Office(int the_room_no, double the_length, double the_width, const char*the_depart) /*found* :_ depart=new char
30、strlen(the_depart)+1; /*found* strcpy(_); Office() deletedepart; const char*theDepartment()const return depart;/返回所属部门 ; int main() /*found* Office_; cout“办公室房间号:“an_office. theRoomNo()endl “办公室长度:“an_office. theLength()endl “办公室宽度:“an_office. theWidth()endl “办公室面积:“an_office. theArea()endl “办公室所属部门
31、:“an_office. theDepartment()endl; return 0; (分数:24.00)_四、综合应用题(总题数:1,分数:18.00)43.请使用 VC6 或使用答题 菜单打开 proj3 下的工程文件 proj3。本题创建一个小型字符串类,字符串长度不超过 100。程序文件包括 proj3. h、proj3. cpp、writeToFile. obj。补充完成重载赋值运算符函数,完成深复制功能。 屏幕上输出的正确结果应该是: Hello! Happy new year! 要求: 补充编制的内容写在“/*333*”与“/*666*”两行之间。不得修改程序的其他部分。 注意
32、: 程序最后调用 writeToFile 函数,使用另一组不同的测试数据,将不同的运行结果输出到文件 out. dat中。输出函数 writeToFile 已经编译为 obj 文件。 /proj3. h #includeiostream #includeiomanip using namespace std; class MiniString public: friend ostream return output; friend istream /用于输入的临时数组 temp0=“/0“;/初始为空字符串 input setw(100)temp; int inLen=strlen(temp)
33、;/输入字符串长度 if(inLen !=0) s. length=inLen;/赋长度 if(s. sPtr!=0)deletes. sPtr;/避免内存泄漏 s. sPtr=new chars. length+1; strcpy(s. sPtr, temp);/如果 S 不是空指针,则复制内容 else s. sPtr0=“/0“;/如果 s 是空指针,则为空字符串 return input; void modString(const char*string2)/更改字符串内容 if(string2 !=0)/如果 string2 不是空指针,则复制内容 if(strlen(string2
34、)!=length) length=strlen(string2); deletesPtr; sPtr=new char1ength+1;/分配内存 strcpy(sPtr, string2); else sPtr0=“/0“;/如果 string2 是空指针,则为空字符串 MiniString MiniString(const char*S=“): length(s !=0) ? strlen(s): 0)/构造函数 sPtr=0; if(length!=0) setString(s); MiniString()/析构函数 deletesPtr; private: int length;/字
35、符串长度 char*sPtr;/指向字符串起始位置 void setString(const char*string2)/辅助函数 sPtr=new charstrlen(string2)+1;/分配内存 if(string2!=0) strcpy(sPtr, string2);/如果 string2 不是空指针,则复制内容 else sPtr0=“/0“;/如果 string2 是空指针,则为空字符串 ; /proj3. cpp #includeiostream #includeiomanip using namespace std; #include“proj3. h“ MiniStrin
36、g void writeToFile(const char*); str2=strl;/使用重载的赋值运算符 str2. modString(“Happy new year!“); coutstrl“/n“; coutstr2“/n“; writeToFile(“ “); return 0; (分数:18.00)_二级 C+-17-1 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:40.00)1.一个栈的初始状态为空。现将元素 1、2、3、4、5、A、B、C、D、E 依次入栈,然后再依次出栈,则元素出栈的顺序是_。(分数:1.00)A.12345ABCDE
37、B.EDCBA54321 C.ABCDE12345D.54321EDCBA解析:解析 栈是先进后出的原则组织数据,所以入栈最早的最后出栈,所以选择 B。2.下列叙述中正确的是_。(分数:1.00)A.循环队列有队头和队尾两个指针,因此,循环队列是非线性结构B.在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况C.在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况D.循环队列中元素的个数是由队头指针和队尾指针共同决定 解析:解析 循环队列有队头和队尾两个指针,但是循环队列仍是线性结构的,所以 A 错误;在循环队列中需要队头指针与队尾指针来共同反映队列中元素的动态变化情况,所以
38、 B 与 C 错误。3.在长度为 n 的有序线性表中进行二分查找,最坏情况下需要比较的次数是_。 A.O(n) B.O(n2) C.O(log2n) D.O(nlog2n)(分数:1.00)A.B.C. D.解析:解析 当有序线性表为顺序存储时才能用二分法查找。可以证明的是对于长度为 n 的有序线性表,在最坏情况下,二分法查找只需要比较 log 2 n 次,而顺序查找需要比较 n 次。4.下列叙述中正确的是_。(分数:1.00)A.顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的 B.顺序存储结构只针对线性结构,链式存储结构只针对非线性结构C.顺序存储结构能存储有序表,链式
39、存储结构不能存储有序表D.链式存储结构比顺序存储结构节省存储空间解析:解析 链式存储结构既可以针对线性结构也可以针对非线性结构,所以 B 与 C 错误。链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以 D 错误。5.数据流图中带有箭头的线段表示的是_。(分数:1.00)A.控制流B.事件驱动C.模块调用D.数据流 解析:解析 数据流图中带箭头的线段表示的是数据流,即沿箭头方向传送数据的通道,一般在旁边标注数据流名。6.在软件开发中,需求分析阶段可以使用的工具是_。(分数:1.00)A.N-S 图B.DFD 图 C.PAD 图D.程序流程图解析:解析 在需求分析阶段可以使
40、用的工具有数据流图 DFD 图,数据字典 DD,判定树与判定表,所以选择 B。7.在面向对象方法中,不属于“对象”基本特点的是_。(分数:1.00)A.一致性 B.分类性C.多态性D.标识唯一性解析:解析 对象有如下一些基本特点:标识唯一性、分类性、多态性、封装性、模块独立性好。所以选择 A。8.一间宿舍可住多个学生,则实体宿舍和学生之间的联系是_。(分数:1.00)A.一对一B.一对多 C.多对一D.多对多解析:解析 因为一间宿舍可以住多个学生即多个学生住在一个宿舍中,但一个学生只能住一间宿舍,所以实体宿舍和学生之间是一对多的关系。9.在数据管理技术发展的三个阶段中,数据共享最好的是_。(分
41、数:1.00)A.人工管理阶段B.文件系统阶段C.数据库系统阶段 D.三个阶段相同解析:解析 数据管理发展至今已经历了三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。其中最后一个阶段结构简单,使用方便逻辑性强物理性少,在各方面的表现都最好,一直占据数据库领域的主导地位,所以选择 C。10.有三个关系 R、S 和 T 如下: R A B m 1 n 2 S B C 1 3 3 5 T A B C m 1 3 由关系 R 和 S 通过运算得到关系 T,则所使用的运算为_。(分数:1.00)A.笛卡尔积B交C并D.自然连接 解析:解析 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分
42、量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据 T 关系中的有序组可知 R 与 S 进行的是自然连接操作。11.下列语句中,错误的是_。(分数:1.00)A.const int buffer=256;B.const double*point;C.int const buffer=256;D.double*const point; 解析:解析 const 是一个 C+关键字,用于限定不允许改变的变量。选项 B 是指向常量的指针,定义时可以不初始化;选项 D 是指针常量,定义时必须初始化。故答案为 D。12.if 语句的语法格式可描述为: 格式 1:if(条件)语句 或 格式 2:
43、if(条件)语句 1 else语句 2 关于上面的语法格式,下列表述中错误的是_。(分数:1.00)A.条件部分可以是一个 if 语句,例如 if(if(a=0) B.语句部分可以是一个 if 语句,例如 if()if()C.如果在条件前加上逻辑非运算符!并交换语句 1和语句 2的位置,语句功能不变D.语句部分可以是一个循环语句,例如 if()while()解析:解析 本题考查 if 语句,if 语句的条件部分不能嵌套 if 语句,所以 A 选项错误;B 选项就是 if语句嵌套;C 选项其实就是将判断条件颠倒,然后执行语句也颠倒,所以效果一样;D 选项也正确。13.有如下说明: int a10
44、=1, 2, 3, 4,5,6, 7, 8, 9, 10, *p=a; 则数值为 9 的表达式是_。(分数:1.00)A.*p+9B.*(p+8) C.*p+=9D.p+8解析:解析 本题考查指向数组的指针,本题中指针变量 p 指向数组 a,那么*p 的值就是 1,即表示数组的第一个元素,那么数值为 9 的表达式就是将指针向后移动 8 个地址,即 p+8 指向的是数组元素值为9,所以数值为 9 的表达式是*(p+8)。14.有如下程序段: int i=0, j=1; int / r=j;/ int*p=/ *p=/ 其中会产生编译错误的语句是_。(分数:1.00)A. B.C.D.解析:解析
45、本题考查指针和引用。为引用,使用正确;中B.FunNumber operator-();C.FunNumber operator-(int);D.int operator-(FunNumber, FunNumber); 解析:解析 本题考查运算符重载的一些规则:一般情况下,单目运算符最好重载为类的成员函数,双目运算符则最好重载为类的友元函数;双目运算符=、()、- 不能重载为类的友元函数;类型转换函数只能定义为一个类的成员函数,而不能定义为类的友元函数;若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好;若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数;当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运