1、国家二级( C+)机试模拟试卷 175及答案与解析 一、选择题 1 设数据结构 B=(D, R),其中 D=a, b, c, d, e, f R=(f, A), (d, B), (e, D), (c, e), (a, C) 该数据结构为 ( )。 ( A)线性结构 ( B)循环队列 ( C)循环链表 ( D)非线性结构 2 下列叙述中错误的是 ( )。 ( A)循环队列空的条件是队头指针与队尾指针相同 ( B)若二叉树没有叶子结点,则为空二叉树 ( C)带链栈的栈底指针是随栈的操作而动态变化 的 ( D)若带链队列中只有一个元素,则队头指针与队尾指针必定相同 3 某带链栈的初始状态为 top=
2、bottom=NULL,经过一系列正常的入栈与退栈操作后, top=bottom=20。该栈中的元素个数为 ( )。 ( A) 1 ( B) 0 ( C) 20 ( D)不确定 4 设一棵度为 3的树,其中度为 2, 1, 0的结点数分别为 3, 1, 6。该树中度为 3的结点数为 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D)不可能有这样的树 5 下面描述错误的是 ( )。 ( A)模块的独立性与模 块的信息隐蔽和局部化无关 ( B)内聚性和耦合性是模块独立程度的定性度量标准 ( C)一个模块的内聚性越高则该模块的独立性越强 ( D)一个模块的耦合性越高则该模块的独立性越弱 6
3、 下面属于黑盒测试方法的是 ( )。 ( A)错误推测法 ( B)基本路径测试 ( C)判定覆盖 ( D)条件覆盖 7 下面模型中为概念模型的是 ( )。 ( A)实体一联系模型 ( B)层次模型 ( C)关系模型 ( D)网状模型 8 学生关系模式中有 D(D#, Dn, D1, DAddr)(其属性分别为系编号、系 名称、系主任和系地址 )和 S(S#, Sn, SG, Date, Maj, D#)(其属性分别为学号、姓名、性别、入学日期、专业和系编号 )两个关系,关系 S的主键 (码 )是 S#,关系 S的外键(码 )是 ( )。 ( A) D# ( B) Maj ( C) Dl ( D
4、) Dn 9 关系的实体完整性要求关系中不能为空的属性是 ( )。 ( A)主键属性 ( B)外键属性 ( C)全部属性 ( D)候选键属性 10 学生选修课程的关系模式为 SC(S#, Sn, Sd, Sa, C#, G)(其属性分别为学号、姓名、所在系、年龄、课 程号和成绩 ); C(C#, Cn, P#)(其属性分别为课程号、课程名、先选课 )。关系模式中包含对主属性部分依赖的是 ( )。 ( A) S#Sd ( B) (S#, C#)G ( C) C#Cn ( D) C#P# 11 已知类 X中一个成员函数的原型声明为 “void Copy(X&r); ”,则下列选项中。解释正确的是
5、( )。 ( A) r为指向类 X的指针 ( B) r的地址值赋值给了变量 Copy ( C)变量 X与 r按位与的结果作为函数 Copy的参数 ( D) r是类 X的对象引用,用来作为函数 Copy的形参 12 下列字符串中不能作为 C+标识符使用的是 ( )。 ( A) IN25 ( B) test ( C) _1481 ( D) 123 13 下列语句中能正确定义变量的是 ( )。 ( A) const int*p NULL; ( B) const int y=99; ( C) const int x=0; ( D) const int z: 100; 14 有如下程序: #includ
6、e using namespace std; int main() int sum=0; for(int i=1; i using namespace std; int i=1; int j=4; int main() int i=5; j+=i; cout using 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)运算符 using namespace std; void fun(int&x,
7、int y) int temp; temp=x: x=y: y=temp: int main() int x=4, y=5; fun(x, y); cout using namespace std; int fl(int x, int y=5)return x+y; int n(double x)return x; int main() int a=3; double b=2 5; cout using namespace std; double add(double a, double b, double c=1) return a+b+c: int main() int result=ad
8、d(2, 3); cout using namespace std; class clock public: clock(): seconds(0); clock& operator+() this-seconds+; return*this; void display() coutseconds using namespace std; class Studentlnfo protected: ERROR*found* char Name; int Age; int ID; int CourseNum; float Record; public: Studentlnfo(char*nanle
9、, int Age, int ID, int courseNum, float record); FRROR*found* void Studentlnfo() float AverageRecord() return Record CourseNum; void show()const coutID=ID; CourseNum=courseNum; Record=record; int main() Studentlnfo st(“Smith“, 21, 99999, 12, 970); st show(); return 0; 三、简单应用题 42 请使用 VC6或使用【答题】菜单打开考生
10、文件夹 proj2下的工程 proj2。此工程中包含一个源程序文件 main cpp,其中有 “房间 ”类 Room及其派生出的 “办公室 ”类 Office的定义,还有主函数 main的定义。请在程序中 “ *found*”下的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 办公室房间号: 308 办公室长度: 5 6 办公室宽度: 4 8 办公室面积: 26 88 办公室所属部门:会计科 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动 “ *found*”。 #include using namespace std; class
11、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), width(the_width) int theRoomNo()constreturn room_no; 返回房间号 double theLength()constreturn length; 返回房间长度 double theWidt
12、h()constreturn 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 charstrlen(the_depart)+1; *found* strcpy(_); Office()delet
13、edepart; const char * theDepartment()constreturn depart; 返回所属部门 ; int main() *found* Office_; cout using wpace std; class DataListf数据表类 int len; doubled; public: DataList(int len, double data=NULL); DataList(DataList&data); int length()constreturn len; double getElement(int i)constreturn di; DataLis
14、t operator+(const DataList&list)const;两个数据表求和 void show()const;显示数据表 ; void writeToFile(char*, const DataList&); main clyp #include“DataList h“ Datalist: DatRl ist(int len, double data): len(1en) d=new doublelen; for(int i=0; i等必须重载为成员函数,不能作为普通函数重载,选项 B正确;重载不能改变运算符运算对象 (操作数 )的个数,选项 C正确;加法运算符有两个操作数,作
15、为成员函数重载时,第一操作数是调用对象本身,所以形参表只有一个操作数,选项 D正确;本题答案为 A。 18 【正确答案】 A 【试题解析】 运算符一至多有 2个操作数,如果作为成员函数重载,那么形参表至多只有一个操作数,选项 A中形参表有 2个操作数,所以选项 A一定不属于类can的成员函 数,选项 B、 C、 D都可能是 cafl的成员函数,本题答案为 A。 19 【正确答案】 B 【试题解析】 C+中,两个函数是重载函数,必须具有相同的名字,且形参表或const属性不同,选项 A、 C、 D都可以区分;函数不能仅仅基于不同的返回类型而实现重载,选项 B不能区分,本题答案为 B。 20 【正
16、确答案】 D 【试题解析】 题意中 Date类重载了插入运算符 ,其中第一个参数是输出流对象的形参引用,第二个参数是 Date类对象的引用;由重载函数的返回值可知,返回类型也是输出流对象的引用,选项 A、 C错误;另外由于 main()函数中调用重载的插入运算符时: coutGoodDay,第一个参数是 cout,第二个参数是GoodDay,可知重载函数的两个参数都有实参传入,不存在隐式参数,所以该重载函数不是成员函数,而只能是类 Date的友元函数,选项 B错误,选项 D正确。 21 【正确答案】 B 【试题解析】 C+中,两个函数是重载函数,必须具有相同的名字,且形参表或const属性不同
17、,其中形参表不同包括形参的类型不同或形参的数量不同;选项 A中参数个数不同,是重载函数;选项 C中参数类型不同,是重载函 数;选项 D中参数类型不同,是重载函数;函数不能仅仅基于不同的返回类型而实现重载,选项 B仅仅返回类型不同,不是重载函数,本题答案为 B。 22 【正确答案】 C 【试题解析】 增量运算符 +有前缀自增运算符和后缀自增运算符两种,在重载该运算符时,由于他们的形参数目和类型都相同,为了可以区分是前缀运算符还是后缀运算符,通常将后缀运算符函数增加一个额外的 int型形参,使用后缀运算符时,编译器提供 0作为这个形参的实参,所以在调用前缀自增运算符时,使用对象显示的调用 x op
18、emtor+(),调用后缀自增运算 符时,显示的调用x operator+(0),本题答案为 C。 23 【正确答案】 D 【试题解析】 fun()函数的形参 x是整型引用类型, y是整型,将 x和 y的值交换后,传给 x的实参值被修改为传给 y的实参值,而传给 y的实参值不变,所以main()函数中,实参 x、 y在调用 fun()函数后, x的值修改为 5, y的值 5保持不变,输出结果为: 5, 5,答案为 D。 24 【正确答案】 C 【试题解析】 题意中两个 f1()函数是重载函数,其中第一个 f1()函数有两个整型形参 x, y,其中 y有默认值 5,函数 返回值 x+y;第二个
19、fl()函数有一个 double类型形参 x,再将 x转换为整型作为函数返回值; main()函数中,表达式 fl(a)+fl(b)两次调用 fl(), fl(a)由于实参 a是整型变量,所以会调用第一个 fl()函数,其中形参x的值为 a, y的值为 5,返回值为 a+5=8; fl(b)由于实参 b是 double类型,所以调用第二个 fl()函数,返回值为 2;所以程序运行结果为 8+2=10,答案为 C。 25 【正确答案】 A 【试题解析】 程序中 MYClass类给出一个默认构造函数,形参 d是整数类型,默认 值为 0,在成员初始化列表中使用形参 d初始化 val成员;语句序列中两
20、个表达式: 7+y和 x+3说明加法运算符函数的两个操作数可以是整型,也可以是MyClass类型,如果是整型的话,需要使用默认构造函数将整数类型隐式转换成临时的 MyClass类对象,此时赋给运算符函数时,就不可以使用引用类型了,所以选项 B、 C、 D都是错误的,选项 A是正确的,选项 A中由于两个操作数都是在形参列表,所以只能将运算符函数定义为友元函数,而不能定义为成员函数,本题答案为 A。 26 【正确答案】 C 【试题解析】 C+中,两个函 数是重载函数,必须具有相同的名字,且形参表或const属性不同,其中形参表不同又可以分为形参个数不同 (例如选项 A)或者形参类型不同 (例如选项
21、 B、 D),所以选项 A、 B、 D都可以作为重载函数原型;函数不能仅仅基于不同的返回类型而实现重载,选项 C不能作为重载函数原型,本题答案为 C。 27 【正确答案】 D 【试题解析】 增量运算符 +有前缀自增运算符和后缀自增运算符两种,在重载该运算符时,由于他们的形参数目和类型都相同,为了可以区分是前缀运算符还是后缀运算符,通常将后缀运算符函数增加一个额外的 int型形 参,使用后缀运算符时,编译器提供 0作为这个形参的实参,所以在调用前缀自增运算符时,使用对象显示的调用 x operator+(),调用后缀自增运算符时,显示的调用x operator+(0),本题答案为 D。 28 【
22、正确答案】 A 【试题解析】 题意 fa()函数是一个递归函数,当 n取值不等于 1时,函数递归调用自身,返回值为 3*fa(n-1)+2;当 n取值为 1时,函数返回值为 1;所以 fa(4)展开,等价于 3*fa(3)+2,等价于 3*(3*fa(2)+2)+2,等价于 3*(3*(3*fa(1)+2)+2)+2,等价于 3*(3*(3*1+2)+2)+2,也就等价于: 53,本题答案为 A。 29 【正确答案】 C 【试题解析】 题意 fib()函数是一个递归函数,当 n等于 0时,函数返回 0;当 n等于 1时,函数返回 1;当 n大于 1时,函数递归调用自身,返回值为 fib(n1)
23、+fib(n一 2); fib(2)调用一次函数,展开后等价于 fib(1)+fib(0),又调用了 2次,等价于 1+0=1,总共调用 3次 fib()函数,本题答案为 C。 30 【正确答案】 C 【试题解析】 add()函数有三个 double类型的形参 a、 b、 c,其中 c有默认值 1,当调用函数形式为: add(2, 3)时,形参 a的值为 2, b的值为 3, c的值为默认值l,函数返回 2+3+1=6,所以 main()函数中, result值为 6,输出 6,本题答案为C。 31 【正确答案】 A 【试题解析】 C+中,类的构造函数初始化列表仅仅指定用于初始化成员的值,并不
24、指定这些初始化执行的次序,成员被初始化的次序是定义成员的次序,所以成员对象在初始化时,构造函数的调用次序是这些成员的在类中的声明次序,选项 A正确,本题答案为 A。 32 【 正确答案】 B 【试题解析】 常对象是指对象的所有成员的值都不能被修改,常成员函数是指只能引用本类的数据成员,而不能修改它们的成员函数;常成员函数可以被常对象调用,也可以被普通对象调用,而普通成员函数只能被普通对象调用,不能被常对象调用,题意中对象 a是常对象, b是普通对象, SetData()是普通成员函数,GetData()是常成员函数,所以选项 B中通过常对象 a调用普通成员函数 SetData()是错误的,选项
25、 A、 C、 D都正确;本题答案为 B。 33 【正确答案】 C 【试题解析】 C+中,一 个类只要定义一个构造函数,编译器都不会再生成默认构造函数,也就是说只有一个类没有定义任何构造函数时,编译器才会在需要的时候自动生成一个默认构造函数本题答案为 C。 34 【正确答案】 B 【试题解析】 C+中,类的构造函数是在创建类对象时自动调用执行,选项 A正确;在构造函数的初始化列表中可以对数据成员进行初始化,对于基本类型或有默认构造函数的类成员对象,可以不进行初始化,系统自动完成初始化值,选项B错误;构造函数的 -参数可以有默认值,选项 C正确;如果没有声明任何构造函数,那么该类通常会在需要的时
26、候自动生成默认构造函数和复制构造函数,选项D正确,本题答案为 B。 35 【正确答案】 A 【试题解析】 C+中,类成员都是在构造函数的初始化列表中完成初始化的,在函数体内对类成员进行赋值,是在初始化完成之后,选项 B错误;类的构造函数是在创建类对象时由系统自动调用执行,选项 C错误;参数为空的构造函数属于默认构造函数,但有参数且参数都有默认值的构造函数也属于默认构造函数,选项 D错误;如果没有声明任何构造函数,那么该类通常会在需要的时候自动生成默认构造函数和复制构造函数,所以每个类都有复制构造函数,选 项 A正确;本题答案为 A。 36 【正确答案】 B 【试题解析】 友元函数是该函数可以访
27、问对应类的非公有成员,它本身不属于类的成员,选项 A错误;对于没有指定访问权限的成员,默认访问权限是私有的,选项 B正确;在类定义体内部实现的成员函数属于内联函数,在类定义体外实现的不属于内联函数,选项 C错误;类的成员函数可以是 private、 protected或public,选项 D错误;本题答案为 B。 37 【正确答案】 C 【试题解析】 友元函数不属于类的成员,没有 this指针,选项 B错误;静态成员函数 不属于任何类对象,它独立于类的任意对象而存在,由所有类对象所共享,它也没有 this指针,选项 A、 D错误;只有类的非静态成员函数才有 this指针,选项 C正确;本题答案
28、为 C。 38 【正确答案】 B 【试题解析】 main()函数中首先定义 clock类对象 c,使用默认构造函数,初始化 c的成员 seconds为 0;然后调用重载的增量运算符函数,将 c的成员 seeonds自增 1,此时 c seconds的值为 1;再调用 display()函数输出 c seconds,结果为1;接下来连续两次调用增量运算符函数,将 c seconds增加 2,此时 c seconds的值为 3,再调用 display()函数输出 3,最后再次调用 display()函数输出 3,综上运行结果为: 1 3 3;本题答案为 B。 39 【正确答案】 B 【试题解析】
29、C+中,构造函数名与类名相同,选项 A正确;构造函数没有返回值,选项 B错误;构造函数支持函数重载,调用时根据参数类型或函数的 const属性调用不同的构造函数,选项 C正确;如果没有给类定义任何构造函数,编译器在需要的时候会自动生成一个默认构造函数,选项 D正确;本题答案为 B。 40 【 正确答案】 D 【试题解析】 C+中,静态成员函数不属于任何类对象,它独立于类的任意对象而存在,由所有类对象所共享,它没有 this指针,只有类的非静态成员函数才有this指针,选项 A正确; this指针存储着调用对象的地址,选项 B正确;成员函数不能定义 this指针,它是由编译器隐含定义的,选项 C
30、正确;在构造函数中对象还没有完成生成,但这并不意味着对象什么都没有,所以构造函数中也有 this指针,通常尽量避免在构造函数中使用 this指针,选项 D错误;本题答案为 D。 二、基本操作题 41 【正确答案】 (1)char*Name; (2) Studentlnfo() (3)Studentlnfo: Studentlnfo(char*name, int age, int ID, int courseNam, float record) 【试题解析】 (1)主要考查考生对动态数组的掌握,由题目可知 Name应该指向一个动态数组,而不是一个有效 char型字符,因此要定义成 char型指针
31、。 (2)主要考查考生对析构函数的掌握,析构函数不需要函数返回类型,应把 void去掉。 (3)主 要考查考生对构造函数定义的掌握,构造函数也要使用作用域符号“: ”。 三、简单应用题 42 【正确答案】 (1)return length*width; (2)Room(the_room_no, the_length, the_width) (3)depart, the_depart (4)an_office(308, 5 6, 4 8, “会计科 “) 【试题解析】 (1)主要考查考生对成员函数的掌握,题目要求返回房间面积 (矩形面积 )。由此可知空格部分要填写的是一个 return语句, 返
32、回房间面积,也就是length*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 办公室长度: 5 6 办公室宽度: 4 8 办公室面积: 26 88 办公室所属部门:会计科 由 Office类的构造函数可知要定义的一个 Office类的对象为 an_office(308,5 6, 4 8, “会计科 “)。 四、综合应用题 43 【正确答案】 for(im i=0; ilen; +i) 遍历对象 list中的数组和 d数组,把对应的值相加后 放到数组 dd中。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1