1、国家二级(C+)机试模拟试卷 174 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列叙述中错误的是( )。(分数:2.00)A.算法的时间复杂度与问题规模无关B.算法的时间复杂度与计算机系统无关C.算法的时间复杂度与空间复杂度没有必然的联系D.算法的空间复杂度与算法运行输出结果的数据量无关2.设表的长度为 20。则在最坏情况下,冒泡排序的比较次数为( )。(分数:2.00)A.190B.20C.19D.903.下列叙述中正确的是( )。(分数:2.00)A.带链栈的栈底指针是随栈的操作而动态变化的B.若带链队列的队头指针与队尾指针相同,
2、则队列为空C.若带链队列的队头指针与队尾指针相同,则队列中至少有一个元素D.带链栈的栈底指针是固定的4.设一棵树的度为 3,共有 27 个结点,其中度为 3,2,0 的结点数分别为 4,1,10。该树中度为 1 的结点数为( )。(分数:2.00)A.12B.13C.11D.不可能有这样的树5.下面描述中正确的是( )。(分数:2.00)A.好的软件设计应是高内聚低耦合B.内聚性和耦合性无关C.内聚性是指多个模块间相互连接的紧密程度D.耦合性是指一个模块内部各部分彼此结合的紧密程度6.某系统总体结构如下图所示 (分数:2.00)A.5B.7C.4D.87.下面属于应用软件的是( )。(分数:2
3、.00)A.人事管理系统B.Oracle 数据库管理系统C.C+编译系统D.ios 操作系统8.下面选项中不是关系数据库基本特征的是( )。(分数:2.00)A.不同的列应有不同的数据类型B.不同的列应有不同的列名C.与行的次序无关D.与列的次序无关9.工厂生产中所需的零件可以存放在多个仓库中,而每一仓库中可存放多种零件。则实体仓库和零件间的联系是( )。(分数:2.00)A.多对多B.一对多C.多对一D.一对一10.学生和课程的关系模式定义为 S(S#,Sn,Sd,Dc,SA)(其属性分别为学号、姓名、所在系、所在系的系主任、年龄); C(C#,Cn,P#)(其属性分别为课程号、课程名、先选
4、课); SC(S#,C#,G)(其属性分别学号、课程号和成绩)。 关系中包含对主属性传递依赖的是( )。(分数:2.00)A.S#Sd,SdDcB.S#SdC.S#Sd,(S#,C#)GD.C#P#,(S#,C#)G11.下列选项中,不属于 C+关键字的是( )。(分数:2.00)A.forB.thenC.inlineD.while12.下列选项中,错误的 C+表达式是( )。(分数:2.00)A.a+1B.b=65C.int(x)D.x+=3313.有如下程序段 int k=10; do coutb?(b?c 1:0):0; 等价的是( )。(分数:2.00)A.if(ab)&(bc) te
5、mp=1; else temp=0;B.if(ab)|(bc) temp=1; else temp=0;C.if(ab) temp=1; else if(bc) temp=1; else22.下列有关指针的操作中,正确的是( )。(分数:2.00)A.int a=10;void*ptr=&a;coutD.输出流的插入运算符y) return x; return y; int main() int a(9),b(8),c(7); coutb?(b?c 1:0):0; 等价的是( )。(分数:2.00)A.if(ab)&(bc) temp=1; else temp=0; B.if(ab)|(bc)
6、 temp=1; else temp=0;C.if(ab) temp=1; else if(bc) temp=1; else解析:解析:题意中,表达式 temp=ab?(bc?1:0):0 是条件运算表达式,首先执行 bc?1:0当 bc时,值为 1;当 bb?(x):0,其中 x 的值为 1 或 0,当 ab 时,temp 的值为x,否则 temp 的值为 0;所以当 ab 且 bc 时,temp=1,否则 temp=0,答案 A 满足,本题答案为 A。22.下列有关指针的操作中,正确的是( )。(分数:2.00)A.int a=10;void*ptr=&a;coutD.输出流的插入运算符y
7、) return x; return y; int main() int a(9),b(8),c(7); coutb,所以 fun(a,b)返回值为 a,bc,fun(b,c)返回值为 b,所以 fun(fun(a,b),fun(b,c)等价于 fun(a,b),也就等价于 a 的值,所以程序输出 9,本题答案为B。35.计算数列第 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)时,返回的函数值为( )。(分数:2.00)
8、A.0B.1C.2 D.3解析:解析:fa()函数是一个递归函数,当参数 n 的值大于 1 时,函数会递归调用自身,返回值为fa(n1)+fa(n 一 2),所以当调用 fa(3)时,等价于:fa(2)+fa(1),也就等价于 fa(1)+fa(0)+fa(1),即1+0+1=2,本题答案为 c。36.有如下程序; #include using namespace std; void hey(_,int&b) int c;c=a;a=b;b=c; int main() int m=14,n=20; hey(m,n); coutmA.int*aB.int&aC.int a D.a解析:解析:题意
9、 hey()函数体中是将 a 和 b 的值进行交换,可知 a 是。hey()函数的第一个参数,main()函数中,m 初值为 14,n 初值为 20,经过 hey()函数的调用,将 m 传给参数 a,n 传给参数 b 后,输出 m 的值 14,n 的值也是 14,可知在 hey()函数中,交换 a、b 值的同时修改了实参 n,而 m 未被修改,所以形参 a 只是实参 m 的一个拷贝变量,选项 A、B 错误;另外在定义形参 a 时,需要指定数据类型,所以选项D 错误;本题答案为 C。37.有如下程序: #include using namespace std; void f(int i)cout
10、i; void f(double d)coutd*2; int main() f(30); f(3); return 0; 运行后的输出结果是( )。(分数:2.00)A.6 3 B.60 3C.3 6D.3 60解析:解析:题意两个 f()函数是重载函数,main()函数中调用 f(30),。由于参数 d=30 是实型,所以调用参数为 double 类型的函数,输出 d*2,由于 C+在输出时,默认不显示小数点后的 0,所以输出6,接下来调用 f(3),调用参数为 int 类型的函数,输出 3,所以本题答案为 A。38.有如下程序: #includeiostream using namesp
11、ace std; class Goods货物类 double unit_price;单价 int quantity;数量 public: Goods(double u=00,int q=0):unit_price(u),quantity(q) double getPrice()constreturn unit_price;返回单价 int getQuantity()constreturn quantity;返回数量 增加数量 Goods operator+(int q)constreturn Goods(unit_price,quantity+q); ; 增加数量 Goods operator
12、+(_)return g+q; 输出货物信息 ostream&operator(ostream& os,Goods g) cout“单价:“ggetPrice(),”数量:“ggetQuantity()endl; return os; ; int main() Goods g(356,100); coutgg+3325+g; return 0; 若运行后的输出结果是:单价:356,数量:100 单价:356,数量:133 单价:356,数量:125 则程序中下划线处缺失部分应该是( )。(分数:2.00)A.Goods q,Goods gB.Goods g,Goods qC.int q,Goo
13、ds g D.Goods g,int q解析:解析:程序中,语句 Goods g(356,100);定义了 Goods 类的对象 g,通过构造函数可知单价unit_price 赋值为 356,数量 quantity 赋值为 100,所以 coutg 使用重载的输出运算符39.下列关于类的静态成员的叙述中,错误的是( )。(分数:2.00)A.静态成员函数可以直接访问类中的所有成员,无需对象名 B.静态成员属于类,为该类所有对象共享C.静态数据成员必须在类外进行初始化D.即使没有定义任何对象,也可以使用该类的公有静态成员解析:解析:静态成员不属于任何一个对象,它由该类所有对象所共享,静态成员函数
14、只能够访问类中的静态数据成员,选项 A 错误,选项 B 正确;静态数据成员只能在类的定义体外进行初始化,选项 C 正确;即使没有定义任何对象,也可以通过作用域运算符使用该类的公有静态成员,使用方法是类名:静态成员名,选项 D 正确,本题答案为 A。40.有如下类定义: class MyClass int k; public: MyClass(int n):k(n) ; 则下列数组定义中,错误的是( )。(分数:2.00)A.MyClass m414=MyClass(1),MyClass(2),MyClass(3),MyClass(4);B.MyClass m4=MyClass(1),MyCla
15、ss(2),MyClass(3);C.MyClass m44=1,2,3; D.MyClass m4=1,2,3;解析:解析:MyClass 提供一个参数为整型变量的构造函数,构造对象时,使用参数初始化成员 k 的值;选项 A 定义一个包含 4 个元素的数组,数组元素的类型是 MyClass 类型,并且对该数组的 4 个元素分别显示调用构造函数完成初始化,选项 A 正确;同理,选项 B 定义数组 m4,由于初始化值个数为 3 个,所以系统默认该数组长度为 3,选项 B 正确;选项 D 定义数组 m4,使用 3 个整数初始化数组元素,此时系统调用构造函数将整数隐式转换成 MyClass 类型,并
16、默认数组长度为 3,选项 D 正确;选项 C 同样定义数组m4,它包含 4 个元素,初始化时,同样使用 3 个整数 1,2,3 初始化前 3 个元素,系统调用构造函数将整数隐式转换成 MyClass 类型,来完成前 3 个元素的初始化,但是由于 MyClass 没有默认构造函数,所以第4 个元素不能完成构造,选项 C 错误,本题答案为 C。二、基本操作题(总题数:1,分数:2.00)41.使用 VC6 打开考生文件夹下的 proj1 工程目录内的 proj1dsw 文件,其中在编辑窗口内显示的主程序文件中定义有 Xabe 类和主函数 main。在程序文本中位于每行“ERROR*found*下面
17、的一行有错误,请加以更正。 更正后程序的输出为:57 注意:只允许修改每个”ERROR*found*下面的一行语句,不允许改动程序中的其他任何内容。#includeiostreamusing namespace std;class Xabe int*a;int n; public: Xabc(int aa,int nn):n(nn) a=Hew intn; for(int i=0;in;i+) ERROR*found* aai=ai; inl GetA(int i)constreturn ai; int SumA(int n); Xabc()deletea;int Xabc:SumA(int
18、n) int s=0; for(int j=0;jn;j+)s+=aj; return s;int main() int a6=2,5,8,3,6,9; Xabe x(a,6); a3=19; int d=0; for(int i=0;i6;i+) ERROR*found* d+=xai; ERROR*found* int f=SumA(5); coutd+fendl: return 0;(分数:2.00)_正确答案:(正确答案:(1)ai=aai; (2)d+=xGetA(i); (3)int f=xSumA(5);)解析:解析:(1)Xabc 的构造函数需要使用形参 aa 为成员指针 a
19、赋值,函数体中,首先动态分配 n 个连续的整型变量的内存空间,并将内存空间的首地址赋给 a,然后通过 for 循环,使用数组 aa 为 a 的 n 个元素的赋值。 (2)x 是类 Xabc 的对象,成员 a 在定义时没有指定访问标号,默认为 private 成员,所以这里不能通过 x 对象直接访问 a,应该通过公有成员函数 GetA()来访问。 (3)SumA()函数是类 Xabc 的公有成员函数,需要通过对象来引用,而不能直接引用。三、简单应用题(总题数:1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj2 下的工程 proj2,其中定义了 vehicle
20、类,并派生出 motorcar 类和 bicycle 类。然后以 motorcar 和 bicycle 作为基类,再派生出 motorcycle 类。要求将 vehicle 作为虚基类,避免二叉性问题。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 80 150 100 l 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。 #includeiostreamh class vehicle private: int MaxSpeed; int Weight public: *found* vehicle(in
21、t maxspeed,int weight):_ vehicle(); int getMaxSpeed()return MaxSpeed; int getWeight()return Weight; ; *found* class bicycle:_public vehicle private: int Height; public: bicycle(int maxspeed,int weight,int height):vehicle(maxspeed,weight),Height(height) int getHeight()return Height; ; *found* class m
22、otorcar:_public vehicle private: int SeatNum; public: motorcar(int maxspeed,int weight,int seatnum):vehicle(maxspeed,weight),SeatNum(seatnum) int getSeatNum()return SeatNum; ; *found* class motorcycle:_ public: motorcycle(int maxspeed,int weight,int height):vehicle(maxspeed,weight),bicycle(maxspeed,
23、weight,height),motorcar(maxspeed,weight,1) ; void main() motorcycle a(80,150,100); coutagetMaxSpeed()endl; coutagetWeight()endl; coutagetHeight()endl; coutagetSeatNum()endl; (分数:2.00)_正确答案:(正确答案:(1)MaxSpeed(maxspeed),Weight(weight); (2)virtual (3)virtual (4)public bicycle,public motorcar)解析:解析:(1)主要
24、考查考生对构造函数的掌握,构造函数使用初始化列表来对私有成员 MaxSpeed 和Weight 初始化。 (2)主要考查考生对派生类的掌握,题目要求将 vehicle 作为虚基类,避免二义性问题。因此在这里添加 virtual 使 vehicle 成为虚基类。 (3)主要考查考生对派生类的掌握,题目要求以motorcar 和 bicycle 作为基类,再派生出 motorcycle 类。在主函数中可以看到 motorcycle 类的实例 a调用 getH。sight 函数和 getSeatNum 函数,由此可知这两个基类都是公有继承,因此得出语句:public bicycle,public m
25、otorcar。四、综合应用题(总题数:1,分数:2.00)43.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj3 下的工程文件 pmj3。本题创建一个小型字符串类,字符串长度不超过 100。程序文件包括 proj3h、proj3cpp、writeToFileobj。补充完成重载赋值运算符函数,完成深复制功能。 屏幕上输出的正确结果应该是: Hello! Happy new year! 要求: 补充编制的内容写在“*333*”与“*666*”两行之间。不得修改程序的其他部分。 注意: 程序最后调用 writeToFile 函数,使用另一组不同的测试数据,将不同的运行结果输出到文件
26、outdat 中。输出函数 writeToFile 已经编译为 obj 文件。 proj3h #includeiostream #includeiomanip using namespace std; class MiniString public: friend ostream&operator(ostream&output,const MiniString&s)重载流插入运算符 outputssPtr;return output; friend istream&operator(istream&input,MiniString&s)重载流提取运算符 char temp100;用于输入的临时
27、数组 temp0=0;初始为空字符串 inputsetw(100)temp; int inLen=strlen(temp);输入字符串长度 if(inLen!=0) s1ength=inLen;赋长度 if(ssptr!=0)deletessPtr;避免内存泄漏 ssPtr=new charslength+1; strcpy(ssPtr,temp);如果 s 不是空指针,则复制内容 else ssPtr0=0;如果 s 是空指针,则为空字符串 return input; void modString(const char*string2)更改字符串内容 if(string2 !=0)如果 st
28、ring2 不是空指针,则复制内容 if(strlen(string2)!=length) length=strlen(string2); deletesPtr; sPtr=new charlength+1;分配内存 strcpy(sPtr,string2); else sPtr0=0;如果 string2 是空指针,则为空字符串 MiniString&operator=(const MiniString&otherString); MiniString(const char*s=|):length(s!=0)?strlen(s):0)构造函数 sPtr=0; if(1ength!=0) se
29、tString(s); MiniString()析构函数 deletesPtr; private: int length;字符串长度 char*sPtr;指向字符串起始位置 void setString(const char*string2)辅助函数 sPtr=new charstrlen(string2)+1; 分配内存 if(string2!=0)strepy(sPtr,string2);如果 string2不是空指针,则复制内容 else sPtr0=0;如果 string2 是空指针,则为空字符申 ;proj3cpp#includeiostream#includeiomanipusin
30、g namespace std;#include“proj3h“MiniString&MiniString:operator=(const MiniString&otherString)重载赋值运算符函数。提示:可以调用辅助函数setString*333*666*int main() MiniString strl(“Hello!“),str2; void writeToFile(const char*); str2=strl;使用重载的赋值运算符 str2modString(“Happy new year!“); coutstrln: coutstr2n; writeToFile(“); r
31、eturn 0;(分数:2.00)_正确答案:(正确答案:length=otherStringlength; 把对象字符串 otherStfing 的长度赋值给变量 length setStnng(otherStringsPtr); 调用函数 setstring,实现给类变量 sptr 分配空间,以及逐个把对象 otherstring 字符串的值复制到 sptr 中 return*this; 返回被赋值的对象)解析:解析:主要考查考生对运算符重载的掌握,题目要求重载赋值运算符函数。要重载的运算符是“=”,即赋值的意思。提示:可以调用辅助函数 setStfing。该函数的功能是复制形参的字符串到 sPtr中,因此,首先复制 length,其次通过函数 setString 复制 sPtr,最后按要求返回*this;。