1、国家二级(C+)机试模拟试卷 150 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列数据结构中,能用二分法进行查找的是( )。(分数:2.00)A.无序线性表B.线性链表C.二叉链表D.顺序存储的有序表2.下列叙述中,不属于设计准则的是( )。(分数:2.00)A.提高模块独立性B.使模块的作用域在该模块的控制域中C.设计成多入口、多出口模块D.设计功能可预测的模块3.下列队列的描述中,正确的是( )。(分数:2.00)A.队列属于非线性表B.队列在队尾删除数据C.队列按“先进后出”进行数据操作D.队列按“先进先出”进行数据操作4.对下
2、列二树进行前序遍历的结果为( )。 (分数:2.00)A.ABCDEFGHB.ABDGEHCFC.GDBEHACFD.GDHEBFCA5.对于长度为 n 的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是( )。(分数:2.00)A.冒泡排序为 n(n-1)2B.简单插入排序为 nC.希尔排序为 nD.快速排序为 n26.为了使模块尽可能独立,要求( )。(分数:2.00)A.内聚程度要尽量高,耦合程度要尽量强B.内聚程度要尽量高,耦合程度要尽量弱C.内聚程度要尽量低,耦合程度要尽量弱D.内聚程度要尽量低,耦合程度要尽量强7.下列选项中不属于软件生命周期开发阶段任务的是( )。(分
3、数:2.00)A.软件测试B.概要设计C.软件维护D.详细设计8.数据独立性是数据库技术的重要特点之一。所谓数据独立性是指( )。(分数:2.00)A.数据与程序独立存放B.不同的数据被存放在不同的文件中C.不同的数据只能被对应的应用程序所使用D.以上三种说法都不对9.在学校中,“班级”与“学生”两个实体集之间的联系属于( )关系。(分数:2.00)A.一对一B.一对多C.多对一D.多对多10.软件调试的目的是( )。(分数:2.00)A.发现错误B.改善软件的性能C.改正错误D.验证软件的正确性11.在公有派生时,派生类中定义的成员函数只能访问原基类的( )。(分数:2.00)A.私有成员、
4、保护成员和公有成员B.保护成员和私有成员C.公有成员和保护成员D.公有成员和私有成员12.有如下定义: int b10=1,2,3,4,5,6,7,8,9,10,*q=b; 则数值为 8 的表达式是( )。(分数:2.00)A.*q+8B.*(q+7)C.*q+=8D.q+713.下面的符号中可以用作 C+标识符的是( )。(分数:2.00)A.3testB.fccotherC.elseD.radius14.下列程序执行后,输出的结果是( )。 int x=-5,y=0; while(+x) y+; coutyendl;(分数:2.00)A.1B.2C.4D.515.有如下类声明: class
5、 TestClass intn; public: TestClass(int i=0):n(i) void setValue(int n0); ; 下面关于 setValue 成员函数的实现中,正确的是( )。(分数:2.00)A.TestClass:setValue(int n0)n=n0;B.void TestClass:setValue(int n0)n=n0;C.void setValue(int n0)n=n0;D.setValue(int n0)n=n0;16.下面关于常成员函数的说法中正确的是( )。(分数:2.00)A.常成员函数不能修改任何的数据成员B.常成员函数只能修改一般
6、的数据成员C.常成员函数只能修改常数据成员D.常成员函数只能通过常对象来调用17.下面的函数调用为: fun(x+y,3,min(n-1,y)则 fun 的实参个数是( )。(分数:2.00)A.3B.4C.5D.618.下面关于虚函数的描述中,正确的是( )。(分数:2.00)A.基类中利用 virtual 关键字说明一个虚函数后,其派生类中定义相同的原型函数时可不必加 virtual来说明B.虚函数是非成员函数C.虚函数是 static 类型的成员函数D.派生类中的虚函数与基类中类型相同的虚函数具有不同的参数个数或类型19.有如下程序: #includeiostream using nam
7、espace std; class Base protected: Base()coutase; Base(char c)coutc; ; class Derived:public Base public:Derived(char c)coutc; ; int main() Derived d(Derived); return 0; 执行这个程序屏幕上将显示输出( )。(分数:2.00)A.DerivedB.DerivedBaseC.BaseDerivedD.DerivedDerived20.有如下程序: #includeiostream using namespace std; int ma
8、in() coutfill(*); coutwidth(6); coutfill(#); cout888endl; return 0: 的执行结果是( )。(分数:2.00)A.#888B.888#C.*888D.888*21.假定一个类的构造函数为 A(int aa,int bb)a=aa-;b=a*bb;,则执行 Ax(4,5);语句后,xa和 xb 的值分别为( )。(分数:2.00)A.3 和 15B.5 和 4C.4 和 20D.20 和 522.在类中说明的成员可以使用关键字的是( )。(分数:2.00)A.publicB.extemC.cpuD.register23.下列不能作为
9、类的成员的是( )。(分数:2.00)A.自身类对象的指针B.自身类对象C.自身类对象的引用D.另一个类的对象24.使用地址作为实参传给形参,下列说法正确的是( )。(分数:2.00)A.实参是形参的备份B.实参与形参无联系C.形参是实参的备份D.参与形参是同一对象25.下列程序的输出结果是( )。 #includeiostrearnh void main() int n3=10,20,30,40,50,60;int(*p)3; p=n;coutp00,*(p0+1),(*p)2endl;(分数:2.00)A.10,30,50B.10,20,30C.20,40,60D.10,30,6026.设
10、程序如下: #includeiostrearn using narnespace std; int main() int*p,*q,r=10; q=(分数:2.00)A.TestClass*p;B.TestClass m;C.TestClassdata=8;D.TestClassshow();29.类中的一个字符指针成员指向具有 m 个字节的存储空间时,它所能存储的字符串的最大长度为( )。(分数:2.00)A.m-2B.m-1C.mD.m+130.有如下程序: #includeiostream using namespace std; class TestClass static int i
11、; public: TestClass()i+; TestClass ()i-;) static int getVal0return i; ; int TestClass:i=0; void f()TestClass obj2;coutobj2getVal(); int main() TestClass obj1; f(); TestClass*obj3=new TestClass;coutobj3-getVal(); delete obj3;coutTestClass:getVa1(); return 0; 程序的输出结果是( )。(分数:2.00)A.232B.221C.222D.2313
12、1.下面关于派生类的描述中错误的是( )。(分数:2.00)A.派生类中至少有一个基类B.一个派生类可以作为另一个派生类的基类C.派生类只继承了基类中的公有成员和保护成员D.派生类的缺省继承方式是私有32.有如下程序: #includeiostream using namespace std; class TestClass int n; public: TestClass(int k):n(k) int get()return n; im getOconstreturn n+l; ; int main() TestClass p(5); const TestClass q(6); coutp
13、get()qget(); return 0: 执行后的输出结果是( )。(分数:2.00)A.55B.57C.75D.7733.下列关于抽象类的表述中正确的是( )。(分数:2.00)A.派生类必须要实现作为基类的抽象类中的纯虚函数B.抽象类的成员函数至少有一个没实现C.抽象类不可能用来定义对象D.派生类不能成为抽象类34.执行下列语句: #includeiostream using namespace std; int main() int x=3; if(x=5) coutx+endl; else coutxendl; return 0; 程序的输出是( )。(分数:2.00)A.3B.4
14、C.5D.635.假定 TestClass 为一个类。则该类的拷贝构造函数的声明语句为( )。(分数:2.00)A.TestClass(TestClass x)B.TestClass iass TestClass2:public TestClass1public: *error* explicit TestClass2(int i) m_i=i; ; TestClass2(分数:2.00)A.TestClass*p; B.TestClass m;C.TestClassdata=8;D.TestClassshow();解析:解析:C+中,若没有类的显式声明构造函数则系统会为其提供一个默认的构造函
15、数,若提供了构造函数则会将系统提供的默认的构造函数覆盖。调用构造函数时,实参必须与形参匹配。但是如果声明一个对象指针时,不是定义一个对象,不调用对象的构造函数。29.类中的一个字符指针成员指向具有 m 个字节的存储空间时,它所能存储的字符串的最大长度为( )。(分数:2.00)A.m-2B.m-1 C.mD.m+1解析:解析:在 C+中,字符串以0作为字符串结束的标志,所以个数为 m-1。30.有如下程序: #includeiostream using namespace std; class TestClass static int i; public: TestClass()i+; Tes
16、tClass ()i-;) static int getVal0return i; ; int TestClass:i=0; void f()TestClass obj2;coutobj2getVal(); int main() TestClass obj1; f(); TestClass*obj3=new TestClass;coutobj3-getVal(); delete obj3;coutTestClass:getVa1(); return 0; 程序的输出结果是( )。(分数:2.00)A.232B.221 C.222D.231解析:解析:由于 i 是类 TestClass 的静态成
17、员,该成员被类的所有实例共享。当定义 obil 时,系统自动调用构造函数 TestClass(),i 的值将加 1;调用函数 f()时,在定义 obj2 时系统会自动调用构造函数TestClass(),i 的值将再加 1;调用 obj2gotVal();后,将 i 的值输出,输出值为 2;当调用函数 f()即将结束时,系统自动调用析构函数TestClass(),i 的值将减 1;当定义 obj3 时,系统自动调用构造函数 TestClass(),i 的值将加 1,调用 coutgetVal();后,将 i 的值输出,输出值为 2:调用 delete obj3 后将执行 TestClass 的析
18、构函数TestClass(),执行后,i 的值将减 1,TestClass:getVal()为类的一个静态成员函数,其作用是返回私有静态成员变量 i 的值 1。31.下面关于派生类的描述中错误的是( )。(分数:2.00)A.派生类中至少有一个基类B.一个派生类可以作为另一个派生类的基类C.派生类只继承了基类中的公有成员和保护成员 D.派生类的缺省继承方式是私有解析:解析:继承方式有公有继承、私有继承和保护继承 3 种,缺省的继承方式是私有继承。派生类从基类继承所有的成员,但是对于基类的私有成员派生类是不可直接访问的。32.有如下程序: #includeiostream using names
19、pace std; class TestClass int n; public: TestClass(int k):n(k) int get()return n; im getOconstreturn n+l; ; int main() TestClass p(5); const TestClass q(6); coutpget()qget(); return 0: 执行后的输出结果是( )。(分数:2.00)A.55B.57 C.75D.77解析:解析:C+中对常对象的成员函数调用,将自动调用其常成员函数,程序中调用原型为“int got()const;“的函数,对于非常对象将调用原型为“i
20、nt get();的函数。因为首先用 5 对对象 p 进行了初始化,所以执行 pget()时直接返回 5,而对于常对象则以 6 对 q 进行初始化,在调用 qget()时,将调用原型为“int got()const;“的函数,该函数将返回 n+1,第二个输出应为 7,所以本题答案为 57。33.下列关于抽象类的表述中正确的是( )。(分数:2.00)A.派生类必须要实现作为基类的抽象类中的纯虚函数B.抽象类的成员函数至少有一个没实现C.抽象类不可能用来定义对象 D.派生类不能成为抽象类解析:解析:C+中拥有纯虚函数的类称为抽象类。抽象类不能用来定义对象。如果一个抽象类的派生类没有重定义来自基类
21、的某个纯虚函数,则该函数在派生类中仍是纯虚函数,该类仍为抽象类。34.执行下列语句: #includeiostream using namespace std; int main() int x=3; if(x=5) coutx+endl; else coutxendl; return 0; 程序的输出是( )。(分数:2.00)A.3B.4C.5 D.6解析:解析:if(条件)语句 1 else 语句 2,语句的执行过程是:首先判断条件是否为真(不为 0),为真则执行语句 1,否则执行语句 2。题目中的条件是 x=5,意思是把 5 赋予变量 x,它将 x 置 5 且返回一个真值。35.假定
22、TestClass 为一个类。则该类的拷贝构造函数的声明语句为( )。(分数:2.00)A.TestClass(TestClass x)B.TestClass iass TestClass2:public TestClass1public: *error* explicit TestClass2(int i) m_i=i; ; TestClass2& operator ()(int i) this-m_i=i; void print() *error* coutm_iendl; private: int m_i;void fun(TestClass2 C1) C1print();int mai
23、n() fun(10); return 0;(分数:2.00)_正确答案:(正确答案:(1)删除private:语句 (2)TestClass2(int i) (3)std:coutm_istd:endl;)解析:解析:(1)第 1 个标识下的“virtualTestClass1()”语句是 TestClass1()析构函数,不是私有函数,所以删除“private:”。 (2)“explicit TestClass2(int i)”构造函数语句中的“explicit”是禁止隐式转换。程序 中无法实现对类 TestClass2 的直接使用,所以这里应该将其删除。即“TestClass2(int
24、i)”。 (3)第 3 个标识下实现,fun 函数中 m_i 的标准输出,即在屏幕上输出 10。在程序中用到 C+标准库时,要使用 std 标准命名空间进行限定。cout 为标准库函数,所以要声明 cout 是在命名空间。std 中定义的流对象,即“std:coutm_istd:endl;”或者添加“using namespace std;”。三、简单应用题(总题数:1,分数:2.00)42.使用 VC6 打开考生文件夹下的源程序文件 modi2epp。请完成函数 fun(char*s),该函数完成以下功能: (1)把 S 中的大写字母转换成小写字母,把其中的小写字母转换成大写字母。并且在函数
25、中调用写函数 WriteFile()将结果输出到 modi2txt 文件中。 例如:s=helloTEST,则结果为:s=HELLOtest (2)完成函数 WriteFile(char*s),把字符串输入文件中。 提示:打开文件使用的第二参数为 ios 注意:不要改动 main 函数,不得增行或行,也不得更改程序的结构。#includeiostream#includefstream#includecmathusing narnespace std;void WriteFile(char*s)void fun(ehar*s)void ClearFile() orstream out1; out
26、1open(modi2txt); out1close(); intmain() ClearFile(); char s1024; toutplease input a string:endl; cingetline(s,1024); fun(s); return0; (分数:2.00)_正确答案:(正确答案:(1)void WriteFile(char*s)中的命令语句: ofstream out1; out1open(modi2txt“,ios_base:binarylios_base:app);打开文件 modi2 out1s: 写入字符串 s out1close(); (2)void f
27、un(char*s)中的命令语句: for(int i=0;si!=0;i+) 循坏判断每一个字符 if( si=A&si=Z) 如果是大写字符,转换为小写字符 si=si-A+a; si-A+a等于字符 si+32 Else if(si=a&si=z) 如果是小写字符,转换为大写字符 si=si-a+A; si-a+A等于字符 si-32 WriteFile(s);)解析:解析:(1)在 WriteFile(char*s)函数中,利用标准流 ofstream 实现字符串写入文件 modi2txt。 (2)在 fun 函数中,利用 for 循环逐个判断字符是大写还是小写。 (3)如果是大写,那
28、么加上 32 实现大写转换为小写。否则,就减去 32,实现小写到大写的转换。最后调用前面实现的 WriteFile 函数,将字符串写入文件。四、综合应用题(总题数:1,分数:2.00)43.用 VC6 打开考生文件夹下的源程序文件 modi3cpp,其中定义了多个类,但类不能达到输出要求,按照定义的输出修改函数,使得输出如下: TestClass3 TestClass2 TestClass1 其中定义的类并不完整,按照要求完成下列操作,将类的定义补充完整。 (1)类 TestClass2 公共继承于 TestClass1,请在注释*1*后添加适当的语句。 (2)print 函数为虚函数,请在注
29、释*2*后添加适当的语句。 (3)修改语句,使得 p 指定对象 obj3,请在注释*3*后添加适当的语句。 (4)修改语句,利用 p 调用 print()函数,完成输出信息,注释*4*后添加适当的语句。 注意:仅在函数指定位置添加语句,请勿改动主函数 main 与其他函数中的任何内容。#inCludeiostreamusing namespace std;class TestClass1public: void print() toutTestClassendl; ; *1*class TestClass2 public: *2* void print() toutTestClass2endl
30、; ;class TestClass3:public TestClass2 public: void print() coutTestClass3endl; ;int main() TestClass2 obj2; TestClass3 obj3; TestClass1*p; obj2print(); obj3print();*3* p=obj3; *4* pprint(); return ();(分数:2.00)_正确答案:(正确答案:(1)将“class TestClass2”补充完整为:class TestClass2:public TestClass1 (2)将“void print(
31、)”补充完整为:virtual void print() (3)将“p=obi3;”修改为:p=&obj3; (4)将“pprint();”修改为:p-print();)解析:解析:(1)题目 1 要求“类 TestClass2 公共继承于。TestClass1”。从已有的类产生一个新的子类,成为类的派生。声明派生类的一般形式为class 派生类名:继承方式基类名。根据题目中的要求以及派生类的一般形式,第 1 个标识下添加语句“class TestClass2:publicTestClass1”。 (2)题目 2 要求“print 函数为虚函数”。在 C+中,用 virtual 声明的函数为虚函数,因此第 2 个标识下的语句修改为“virtualvoid print()”。 (3)题目 3 要求“使得 p 指定对象 obj3”。p 为指针变量,obj3 为类的对象,将一个指针变量指向另一个变量,只要把被指向的变量的地址赋给指针变量即可。取对象 0bj3 地址的语句为&obj3,所以这里补全“p=&obj3;”。 (4)题目 4 要求“利用 p 调用 print()函数”。C+中用”-”运算符实现成员访问,因此调用 print()函数,应将第 4 个标识下修改为“p-print();”。