1、国家二级(C+)机试模拟试卷 175 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.设数据结构 B=(D,R),其中 D=a,b,c,d,e,f R=(f,A),(d,B),(e,D),(c,e),(a,C) 该数据结构为( )。(分数:2.00)A.线性结构B.循环队列C.循环链表D.非线性结构2.下列叙述中错误的是( )。(分数:2.00)A.循环队列空的条件是队头指针与队尾指针相同B.若二叉树没有叶子结点,则为空二叉树C.带链栈的栈底指针是随栈的操作而动态变化的D.若带链队列中只有一个元素,则队头指针与队尾指针必定相同3.某带链栈的初
2、始状态为 top=bottom=NULL,经过一系列正常的入栈与退栈操作后,top=bottom=20。该栈中的元素个数为( )。(分数:2.00)A.1B.0C.20D.不确定4.设一棵度为 3 的树,其中度为 2,1,0 的结点数分别为 3,1,6。该树中度为 3 的结点数为( )。(分数:2.00)A.1B.2C.3D.不可能有这样的树5.下面描述错误的是( )。(分数:2.00)A.模块的独立性与模块的信息隐蔽和局部化无关B.内聚性和耦合性是模块独立程度的定性度量标准C.一个模块的内聚性越高则该模块的独立性越强D.一个模块的耦合性越高则该模块的独立性越弱6.下面属于黑盒测试方法的是(
3、)。(分数:2.00)A.错误推测法B.基本路径测试C.判定覆盖D.条件覆盖7.下面模型中为概念模型的是( )。(分数:2.00)A.实体一联系模型B.层次模型C.关系模型D.网状模型8.学生关系模式中有 D(D#,Dn,D1,DAddr)(其属性分别为系编号、系名称、系主任和系地址)和S(S#,Sn,SG,Date,Maj,D#)(其属性分别为学号、姓名、性别、入学日期、专业和系编号)两个关系,关系 S 的主键(码)是 S#,关系 S 的外键(码)是( )。(分数:2.00)A.D#B.MajC.DlD.Dn9.关系的实体完整性要求关系中不能为空的属性是( )。(分数:2.00)A.主键属性
4、B.外键属性C.全部属性D.候选键属性10.学生选修课程的关系模式为 SC(S#,Sn,Sd,Sa,C#,G)(其属性分别为学号、姓名、所在系、年龄、课程号和成绩);C(C#,Cn,P#)(其属性分别为课程号、课程名、先选课)。关系模式中包含对主属性部分依赖的是( )。(分数:2.00)A.S#SdB.(S#,C#)GC.C#CnD.C#P#11.已知类 X 中一个成员函数的原型声明为“void Copy(X&r);”,则下列选项中。解释正确的是( )。(分数:2.00)A.r 为指向类 X 的指针B.r 的地址值赋值给了变量 CopyC.变量 X 与 r 按位与的结果作为函数 Copy 的参
5、数D.r 是类 X 的对象引用,用来作为函数 Copy 的形参12.下列字符串中不能作为 C+标识符使用的是( )。(分数:2.00)A.IN25B.testC._1481D.12313.下列语句中能正确定义变量的是( )。(分数:2.00)A.const int*p NULL;B.const int y=99;C.const int x=0;D.const int z:100;14.有如下程序: #include using namespace std; int main() int sum=0; for(int i=1;iseconds+; return*this; void displa
6、y() cout等必须重载为成员函数,不能作为普通函数重载,选项 B 正确;重载不能改变运算符运算对象(操作数)的个数,选项 C 正确;加法运算符有两个操作数,作为成员函数重载时,第一操作数是调用对象本身,所以形参表只有一个操作数,选项 D 正确;本题答案为A。18.下列运算符函数中肯定不属于类 Can 的成员函数的是( )。(分数:2.00)A.int operator 一(Can,Can); B.Can operator 一(double);C.int operator 一(Can);D.Can operator 一(int);解析:解析:运算符一至多有 2 个操作数,如果作为成员函数重载
7、,那么形参表至多只有一个操作数,选项 A 中形参表有 2 个操作数,所以选项 A 一定不属于类 can 的成员函数,选项 B、C、D 都可能是 cafl 的成员函数,本题答案为 A。19.下列因素中,对 C+编译器区分重载函数无任何意义的是( )。(分数:2.00)A.常成员函数关键字 constB.返回值类型 C.参数类型D.参数个数解析:解析:C+中,两个函数是重载函数,必须具有相同的名字,且形参表或 const 属性不同,选项A、C、D 都可以区分;函数不能仅仅基于不同的返回类型而实现重载,选项 B 不能区分,本题答案为 B。20.有如下程序: #includeiostream usin
8、g namespace std; class Date public: Date(int y=2014,int m=9,int d=9):year(y),month(m),day(d) _(ostream&stream,Date&ddd)运算符的定义 streamdddyeardddmonthdddday; return stream; private: int year,month,day; ; int main() Date GoodDay; coutGoodDayendl: return 0; 若运行时的输出结果是“201499”,横线处的内容应为( )。(分数:2.00)A.istre
9、am&operatorseconds+; return*this; void display() coutseconds; private: int seconds; ; int main() clock c; +c; cdisplay(); (+(+e)display();cdisplay(); return 0; 运行后的输出结果是( )。(分数:2.00)A.1 3 2B.1 3 3 C.1 2 3D.1 2 2解析:解析:main()函数中首先定义 clock 类对象 c,使用默认构造函数,初始化 c 的成员 seconds 为0;然后调用重载的增量运算符函数,将 c 的成员 seeo
10、nds 自增 1,此时 cseconds 的值为 1;再调用display()函数输出 cseconds,结果为 1;接下来连续两次调用增量运算符函数,将 cseconds 增加2,此时 cseconds 的值为 3,再调用 display()函数输出 3,最后再次调用 display()函数输出 3,综上运行结果为:1 3 3;本题答案为 B。39.下列关于构造函数的叙述中,错误的是( )。(分数:2.00)A.构造函数名与类名相同B.构造函数可以有返回值 C.构造函数可以重载D.每个类都有构造函数解析:解析:C+中,构造函数名与类名相同,选项 A 正确;构造函数没有返回值,选项 B 错误;
11、构造函数支持函数重载,调用时根据参数类型或函数的 const 属性调用不同的构造函数,选项 C 正确;如果没有给类定义任何构造函数,编译器在需要的时候会自动生成一个默认构造函数,选项 D 正确;本题答案为B。40.下列关于 this 指针的叙述中,错误的是( )。(分数:2.00)A.this 指针只能在类的非静态成员函数中使用B.this 指针存储着对象的地址C.this 指针不需要显式定义D.在构造函数中不能使用 this 指针 解析:解析:C+中,静态成员函数不属于任何类对象,它独立于类的任意对象而存在,由所有类对象所共享,它没有 this 指针,只有类的非静态成员函数才有 this 指
12、针,选项 A 正确;this 指针存储着调用对象的地址,选项 B 正确;成员函数不能定义 this 指针,它是由编译器隐含定义的,选项 C 正确;在构造函数中对象还没有完成生成,但这并不意味着对象什么都没有,所以构造函数中也有 this 指针,通常尽量避免在构造函数中使用 this 指针,选项 D 错误;本题答案为 D。二、基本操作题(总题数:1,分数:2.00)41.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj1 下的工程 proj1。程序中位于每个“ERROR*found*”之后的一行语句有错误,请加以改正。改正后程序的输出结果应为: Name:Smith Age:21 ID
13、:99999 CourseNum:12 Record:970 注意:只修改每个“ERROR*found*”下的那一行,不要改动程序中的其他内容。 #includeiostream using namespace std; class Studentlnfo protected: ERROR*found* char Name; int Age; int ID; int CourseNum; float Record; public: Studentlnfo(char*nanle,int Age,int ID,int courseNum,float record); FRROR*found* vo
14、id Studentlnfo() float AverageRecord() return RecordCourseNum; void show()const cout“Name:“Name“Age:“Age“ID:“ID “CourseNum:“CourseNum“Record:“Recordendl; ; ERROR*found* Studentlnfo Studentlnfo(char * Name,int Age,int ID,int CourseNum,float Record) Name=name; Age=age; this-ID=ID; CourseNum=courseNum;
15、 Record=record; int main() Studentlnfo st(“Smith“,21,99999,12,970); stshow(); return 0; (分数:2.00)_正确答案:(正确答案:(1)char*Name; (2)Studentlnfo() (3)Studentlnfo:Studentlnfo(char*name,int age,int ID,int courseNam,float record)解析:解析:(1)主要考查考生对动态数组的掌握,由题目可知 Name 应该指向一个动态数组,而不是一个有效 char 型字符,因此要定义成 char 型指针。 (
16、2)主要考查考生对析构函数的掌握,析构函数不需要函数返回类型,应把 void 去掉。 (3)主要考查考生对构造函数定义的掌握,构造函数也要使用作用域符号“:”。三、简单应用题(总题数:1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj2 下的工程 proj2。此工程中包含一个源程序文件 maincpp,其中有“房间”类 Room 及其派生出的“办公室”类 Office 的定义,还有主函数 main 的定义。请在程序中“*found*”下的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 办公室房间号:308 办公室长度:56 办公室
17、宽度:48 办公室面积:2688 办公室所属部门:会计科 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。 #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_loom_no),length(the_length),wid
18、th(the_width) int theRoomNo()constreturn room_no; 返回房间号 double theLength()constreturn length; 返回房间长度 double theWidth()constreturn width; 返回房间宽度 *found* double theArea()const_返回房间面积(矩形面积) ; class Office:public Room“办公室”类 char*depart;所属部门 public: Office(int the_room_no,double the_length,double the_wid
19、th,const char*the_depart) *found* :_ depart=new charstrlen(the_depart)+1; *found* strcpy(_); Office()deletedepart; const char * theDepartment()constreturn depart;返回所属部门 ; int main() *found* Office_; cout“办公室房间号:“an_officetheRoomNo()endl “办公室长度:“an_officetheLength()endl “办公室宽度:“an_officetheWidth()end
20、l “办公室面积:“an_officetheArea()endl “办公室所属部门:“an_officetheDepartment()endl; return 0; (分数:2.00)_正确答案:(正确答案:(1)return length*width; (2)Room(the_room_no,the_length,the_width) (3)depart,the_depart (4)an_office(308,56,48,“会计科“)解析:解析:(1)主要考查考生对成员函数的掌握,题目要求返回房间面积(矩形面积)。由此可知空格部分要填写的是一个 return 语句,返回房间面积,也就是 le
21、ngth*width,因此可以得出程序 return length*width;。 (2)主要考查考生对派生类的构造函数的掌握,派生类的构造函数要使用成员列表初始法先对基类进行初始化。 (3)考查 strcpy 函数,由前一条语句“depart=newcharstrlen(the_depart)+1;”可知,程序给 depart 分配了长度为 the_depart 串长加 1 的空间,因此要复制字符串 the_depart 串到depart,直接填写“strcpy(depart,the_depart)”即可。 (4)主要考查考生对类的掌握,题目要求输出的结果为: 办公室房间号:308 办公室长
22、度:56 办公室宽度:48 办公室面积:2688 办公室所属部门:会计科 由 Office 类的构造函数可知要定义的一个 Office 类的对象为an_office(308,56,48,“会计科“)。四、综合应用题(总题数:1,分数:2.00)43.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj3 下的工程 proj3,其中声明的 DataList 类,是一个用于表示数据表的类。DataList 的重载运算符函数 operator+,其功能是求当前数据表与另一个相同长度的数据表之和;即它返回一个数据表,其每个元素等于相应两个数据表对应元素之和。请编写这个operator+函数。程序
23、的正确输出应该是: 两个数据表: 1,2,3,4,5,6 3,4,5,6,7,8 两个数据表之和: 4,6,8,10,12,14 要求: 补充编制的内容写在“*333*”与“*666*”之间,不得修改程序的其他部分。 注意:程序最后将结果输出到文件outdat 中。输出函数 writeToFile 已经编译为 obj 文件,并且在本程序中调用。 DataListh #includeiostream using wpace std; class DataListf数据表类 int len; doubled; public: DataList(int len,double data=NULL);
24、DataList(DataList&data); int length()constreturn len; double getElement(int i)constreturn di; DataList operator+(const DataList&list)const;两个数据表求和 void show()const;显示数据表 ; void writeToFile(char*,const DataList&); mainclyp #include“DataListh“ Datalist:DatRlist(int len,double data):len(1en) d=new doub
25、lelen; for(int i=0;ilen;i+) di=(data=NULL?00:datai); DataList:DataList(DataList&data):len(data1en) d=new doublelen; for(int i=0;ilen;i+) di=datadi; DataList DataList:operator+(const DataList&list)const两个数据表求和 double*dd=new doublelist1ength(); *333* *666* return DataList(listlength(),dd); void DataLi
26、st:show()const显示数据表 for(int i=0;ilen-1;i+) coutdi“,“; coutdlen-1endl; int main() double s1=1,2,3,4,5,6; double s2=3,4,5,6,7,8; DataList listl(6,s1),list2(6,s2);定义两个数据表对象 cout“两个数据表:“endl; list1show(); list2show(); coutendl“两个数据表之和:“endl; (1istl+list2)show(); writeToFile(“,list1+list2); return 0; (分数:2.00)_正确答案:(正确答案:for(im i=0;ilen;+i) 遍历对象 list 中的数组和 d 数组,把对应的值相加后放到数组 dd 中。 ddi =di +listdi;)解析:解析:主要考查考生对重载运算符的掌握,题目要求对两个数据表求和。程序已经定义了动态数组dd,并已经分配好了空间,接下来只要运用循环语句完成元素相加并进行赋值即可。