国家二级(C++)笔试模拟试卷144 (题后含答案及解析)
题型有:1. 选择题 2. 填空题
选择题(每小题2分,共70分)下列各题A、B、C、D四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上。
1. 下列选项中,不是一个算法的基本特征是( )。 A.完整性 B.可行性 C.有穷性
D.拥有足够的情报
正确答案:A
解析:作为一个算法,一般应该具有4个特征:①可行性,即考虑到实际的条件能够达到一个满意的结果;②确定性,算法中第一个步骤都必须是有明确定义的;③有穷性,一个算法必须在有取的时间内做完;④拥有足够的情报。
2. 下列数据结构中,属于非线性的是( )。 A.线性表 B.队列 C.树 D.栈
正确答案:C 解析:线性结构是指数据元素只有一个直接前件元素和直接后件元素,线性表是线性结构。栈和队列是指对插入和删除操作有特殊要求的线性表,树是非线性结构。
3. 下列叙述中错误的是( )。
A.线性表是由n个元素组成的一个有限序列 B.线性表是一种线性结构
C.线性表的所有结点有且仅有一个前件和后件 D.线性表可以是空表
正确答案:C
解析:线性表是一种线性结构,由n(n≥0)个元素组成,所以线性表可以是空表。但是在线性表中,第一个结点没有前件,最后一个结点没有后件,其他结点有且只有一个前件和后件,所以选项C) 是错误的。
4. 按照“先进先出”组织数据的数据结构是( )。 A.队列
B.栈
C.双向链表 D.二叉树
正确答案:A
解析:队列是一种特殊的线性表,只允许在表的一端插入元素,在表的另一端删除元素,插入元素的一端叫“队尾”,删除元素的一端叫“队头”,先插入的元素先被删除,是按“先进先出”的原则组织数据的。
5. 下列关于线性链表的描述中正确的是( )。
A.存储空间不一定连续,且各元素的存储顺序是任意的
B.存储空间不一定连续,且前件元素一定存储在后件元素的前面 C.存储空间必须连续,且各前件元素一定存储在后件元素的前面 D.存储空间必须连续,且各元素的存储顺序是任意的
正确答案:A 解析:线性表的链式存储结构中的结点空间是动态生成的,它们在内存中的地址可能是连续的,也可能是不连续的。
6. 某二叉树共有60个叶子结点与50个度为1的结点,则该二叉树中的总结点数为( )。
A.148 B.169 C.182 D.198
正确答案:B
解析:叶子结点总是比度为2的结点多一个。所以,具有60个叶子结点的二叉树有59个度为2的结点。总结点数=60个叶子结点+59个度为2的结点+50个度为1的结点=169个结点。
7. 下列数据结构中,能用二分法进行查找的是( )。 A.顺序存储的有序线性表 B.结性链表 C.二叉链表
D.有序线性链表
正确答案:A 解析:二分法查拽只适用于顺序存储的有序线性表,对于顺序存储的非有序线性表和线性链表,都只能采用顺序查找。
8. 最简单的交换排序方法是( )。 A.快速排序 B.选择排序
C.堆排序 D.冒泡排序
正确答案:D 解析:所谓的交换排序方法是指借助数据元素之间的互相交换进行排序的一种方法,包括冒泡排序和快速排序,冒泡排序是一种最简单的交换排序方法,它通过相邻元素的交换,逐步将线性表变成有序。
9. 对于长度为n的线性表,在最坏情况下,下列各种排序法所对应的比较次数中,正确的是( )。
A.冒泡排序为n/2 B.冒泡排序为n C.快速排序为n
D.快速排序为n(n-1)/2
正确答案:D
解析:在最坏情况下,冒泡排序和快速排序的比较次数都是n (n-1)/2。
10. 结构化程序设计的三种基本结构是( )。 A.过程、子程序和分程序 B.顺序、选择和重复 C.递归、堆栈和队列 D.调用、返回和转移
正确答案:B
解析:程序的3种基本控制结构包括顺序、选择和重复(循环),这3种结构就足以表达出各种其他形式的结构。
11. 运算符重载是对已有的运算符赋予多重含义,因此( )。
A.可以对基本类型(如int类型)的数据,重新定义“+”运算符的含义 B.可以改变一个已有运算符的优先级和操作数个数
C.只能重载C++中已经有的运算符,不能定义新运算符 D.C++中已经有的所有运算符都可以重载
正确答案:C 解析:此题考查的是运算符的有关概念。运算符重载是针对C++原有运算符进行的,不能通过重载创造新的运算符;除了“.”、“.*”、“->*”、“::”、“?:”这5个运算符之外,其他运算符都可以重载。运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算符的语法结构。
12. 已知类Myst有一个只需要一个double型参数的构造函数,且将运算符“-”重载为友元函数。要使语句序列( )。 Myst x(3.2),y (5.5),z(0.0); z=8.9-y; y=x-6.3; 能够正常运行,运算符函数operator-应该在类中声明为
( )。
A.friend Myst operator-(Myst&,Myst&); B.friend Myst operator-(Myst,Myst); C.friend Myst operator-(Myst,Myst&); D.friend Myst operator-(Myst&,Myst);
正确答案:B
解析:此题需要注意的是,运算符重载函数的两个参数,应该是类Myst的对象,而不是引用,所以正确的声明语句是friend Myst operator- (Myst,Myst);。
13. 有如下函数模板声明: template<typename T> T Max(T a,T b){return(a>=b)?a:b;} 下列对函数模板Max( )的调用中错误的是( )。
A.Max(3.5,4.5) B.Max(3.5,4)
C.Max<double>(3.5,4.5) D.Max<double>(3.5,4)
正确答案:B
解析:选项B)中两个实参的实际类型不同而未进行转换,会出现错误。
14. 使用ifstream流类定义流对象并打开磁盘文件时,文件的隐含打开方式为( )。
A.ios::in B.ios::out
C.ios::inlios::out D.没有默认
正确答案:D
解析:使用ifstxeam流类定义流对象并打开磁盘文件时,文件没有默认的打开方式。其中ios::in是为输入而打开;iso::out是为输出而打开。
15. 有如下程序: #include<iostream> using namespace std; int main( ) { cout.fill(‘*’); cout.width(5); cout<<scientific<<314.15926535<<endl; return 0; } 程序运行后,输出的结果是( )。
A.3.141593e+002 B.3.1416e+002 C.**3.14e+002 D.314.16
正确答案:A
解析:cout.fill( )用于设置或返回输出的填充字符,默认是空格,fill( )函数的设置一直有效,直到下一个fill( )函数改变该值为止。cout.width( )用于设置或返回(不带参数)输出数据的字段宽度,此函数的设置只对下一个输出
有效。
16. 下列符号中,正确的C++标识符是( )。 A.enum B.2b C.foo-9 D._32
正确答案:D
解析:此题考查的是标识符。标识符是由数字、字母以及下划线构成,其中第一个字符必须是字母或下划线,中间不能有空格;标识符的长度是任意的,但由于编译系统的一般不超过31个字符;标识符中的大小写字母是不同的;定义标识符时不能采用系统的保留字,选项A)错误。符合这些要求的只有选项D)。
17. 下列关于C++函数的说明中,正确的是( )。 A.内联函数就是定义在另一个函数体内部的函数 B.函数体的最后一条语句必须是return语句
C.标准C++要求在调用一个函数之前,必须先声明其原型
D.编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式
正确答案:C
解析:选项A)中,内联函数不是定义在另一个函数体内部的函数,而是将incline放在函数定义中函数类型之前;函数体的最后一条语句可以是任意的语句,选项B)错误;编译器不会根据函数返回值的类型来区分重载形式,选项D)错误。标准C++要求在调用一个函数之前,必须先声明其原型,所以选项C)正确。
18. 类MyClass的定义如下: class MyClass { public: MyClass( ){value=0;} SetVariable(int i){value=i;} private: int value; }; 则对下列语句序列正确的描述是( )。 MyClass*P, my; p=&my;
A.语句p=&my; 是把对象my赋值给指针变量P
B.语句MyClass*p, my; 会调用两次类MyClass的构造函数 C.对语句*P. SetVariable(5)的调用是正确的
D.语句p->SetVariable(5)与语句my.SetVariable(5)等价
正确答案:D
解析:选项A),语句p=&my;是把对象my的地址值赋值给指针变量P;选项B),语句MyClass*p,my;,由于p只是一个指向对象的指针,因此定义指针p不调用构造函数,所以此语句只调用一次构造函数;对成员函数的引用可以通过两种形式:指针->成员函数(形参表)或者对象名.成语函数名(形参表),故选项C)错误,选项D)正确。
19. 若类A和类B的定义如下: #include<malloc.h> class A { int i,j; public: int geti( ) { return i; } }; class B:public A { int k; public: void make( ) { k=i*j; } }; 则上述定义中非法的表达式是( )。
A.k=i*j; B.int k; C.return i;
D.void make( );
正确答案:A
解析:因为派生类不是基类的私有成员i和j(默认情况下,成员的属性为私有),所以表达式k=i*j是非法的。其余的访问权限都是许可的。
20. 下列程序的输出结果为( )。 #include<iostream.h> class TestClass { public: TestClass ( ){val++;} static int val; }; int TestClass::val=0; void main( ) { TestClass cs1; cout<<cs1.val<<”“; TestClass cs2; TestClass cs3,cs4; cout<<cs2.val<<endl; }
A.03 B.13 C.14 D.24
正确答案:C
解析:由主函数main入手,定义TestClass类的对象cs1,执行cs1.val,其中val为静态变量,根据“int TestClass::val=0;”初始化,TestClass中的TestClass( ){val++;)构造函数执行后,val值为1。主函数中接着定义对象cs2,cs3,cs4。执行“cout<<cs2.val<<endl;”中的val值为4,所以输出为14。
21. 静态数据成员是为( )的数据。 A.私有 B.保护
C.所有对象共享 D.类成员
正确答案:C 解析:静态数成员是一种特殊的数据成员。静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间。所有对象共享这些静态数据成员,都可以引用它。
22. 下列是关于派生类声明的开始部分,其中正确的是( )。 A.class virtual B:public A B.virtual class B:public A C.class B:public A virtual
D.class B:virtual publicA
正确答案:D
解析:声明派生类的一般形式:class派生类名:[继承方式]基类名。其中继承方式包括public,private,protected。所以选项A),选项B)错误。而virtual为C++中的关键字,所以选项C)错。虚函数的使用方法是在基类用virtual声明成员函数为虚函数。
23. 有如下程序: #include<iostream> using namespace std; class TestClass1 { public: TestClass1 ( ){cout<<” TestClass1”;} ~TestClass1 ( ){cout<<”~ TestClass1”;} }; class TestClass2:public TestClass1 { TestClass1 *p; public: TestClass2( ){cout<<” TestClass2”;p=new TestClass1( );} ~TestClass2( ){cout<<”~TestClass2”;delete p;} }; int main( ) { TestClass2 obj; return 0; }
A.TestClass2TestClass1TestClass1~TestClass1~TestClass2~TestClass1 B.TestClass1TestClass2TestClass1~TestClass2~TestClass1~TestClass1 C.TestClass2TestClass1TestClass1~TestClass2~TestClass1~TestClass1 D.TestClass1TestClass2TestClas1~TestClass1~TestClass2~TestClass1
正确答案:B
解析:派生类中构造函数的执行顺序是:先调用基类构造函数,对基类数据成员初始化,然后调用子对象构造函数,对子对象数据成员初始化;最后执行派生类构造函数本身,对派生类数据成员初始化。由主函数mian入手,首先定义了一个TestClass2对象obj。其中TestClass2公共继承TestClass1,对象obi可以访问TestClass1中的公有成员函数。TestClass2中定义了一个TestClass1的指针p,给p分配新空间,即指向类TastClass1,输出“TestClass1”。在 TestClass2的构造函数中首先输出“TestClass2”,并在TestClass1构造函数中输出“TestClass1”。TestClass2析构函数中输出“~TestClass2”,删除指针p,输出“~TestClass1”。析构TestClass1输出“~TestClass1”。
24. 下列关于构造函数和析构函数的描述,错误的是( )。 A.析构函数中调用虚函数采用静态联编 B.对虚析构函数的调用可以采用动态联编
C.当基类的析构函数是虚函数时,其派生类的析构函数也一定是虚函数 D.构造函数可以声明为虚函数
正确答案:D 解析:构造函数的主要作用是对数据成员初始化。构造函数不能声明为虚函数,这是因为在执行构造函数时类对象还未完成建立过程,当然谈不上函数与类对象的关联。
25. 若有如下程序: #include<iostream> using namespace std; class TestClass { public: void who( ) {cout<<”TestClass”<<
endl;} }; class TestClass1:public TestClass { public: void who( ){cout<<”TestClass1”<<endl;} }; int main( ) { TestClass *p; TcstClass1 obj1; p=&obj1; p->who( ); return 0; } 则该程序运行后的输出结果是( )。
A.TestClass1 B.TestClass C.0
D.无输出
正确答案:A 解析:程序中的TestClas1为TestClass的派生类,主函数main中定义TestClass对象*p,TestClass1对象obj1,然后p引用obj1,执行p->who ( )则是调用基类中的who函数,输出TcstClass。
26. 下列有关继承和派生的叙述中,正确的是( )。
A.如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员
B.派生类的成员函数可以访问基类的所有成员 C.基类对象可以赋值给派生类对象
D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类
正确答案:D
解析:如果派生类私有继承基类,不能访问基类中的私有成员,所以选项A)、B)是错误的。派生类是对基类的具体化,所以选项C)错误。如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类,即选择选项D)。
27. 若有如下程序: #include<iostream> using namespace std; class TestClass1 { private: int a; public: TestClass1(int i) { a=i; } void disp( ) { cout<<a<<”,”; } }; class TestClass2 { private: int b; public: TestClass2(int j) { b=j; } void disp( ) { cout<<b<<”,”; } }; class TestClass3:public TestClass2,public TestClass1 { private: int c; public: TestClass3(int k):TestClass1(k-2),TestClass2(k+2) { c=k; } void disp( ) {TestClass1::disp( );TestClass2::disp( ); cout<<c<<endl; } }; int main( ) { TestClass3 obi(10); obj.disp( ); return 0; } 程序执行后的输出结果是( )。
A.10,10,10 B.10,12,14 C.8,10,12 D.8,12,10
正确答案:D
解析:由主函数mian入手,首先定义TestClass3的对象obj,参数为10。其中TestClass3为TestClass1和TestClass2的派生类。然后调用disp成员函数。Disp
中首先执行“TestClass1::disp( );”,然后执行“TestClass2::disp( );”,最后执行输出语句“cout<<c<<endl;”。TestClass1(k-2),所以第一个输出8,TestClass2(k+2),第二个输出12,最后一个本类中的输出即为10。
28. 在下列程序的横线处填上适当的内容,使程序执行后的输出结果为ABCD。 #include<iostream> using namespace std; class A { public:A( ){cout<<’A’;} }; class B: ______ { public:B( ){cout<<’B’;} }; class C:virtual public A { public:C( ){cout<<’C’;} }; class D:public B,public C { public:D( ){cout<<’D’;} }; void main( ){D obj;}
A.public A B.private A C.protected A D.virtual public A
正确答案:D
解析:由主函数mian入手,定义了类D对象obj。其中D为类B和C的公有继承,A是C的虚基类。题目中要求的输出结果为“ABCD”,依次为类A,类B,类C,类D中构造函数的输出语句。为了保证基类通过多条路径被派生类继承时,即保证A只被继承一次,输出一个A,所以不但需要声明A为C的虚基类,同样也要声明A为B的虚基类。
29. 用来派生新类的类称为( )。 A.新生类 B.派生类 C.基类 D.子类
正确答案:C
解析:此题考查的是继承与派生的概念。用来派生新类的类称为基类,而派生出来的新类称为它的子类或派生类。
30. 有如下程序; #include<iostream> using namespace std; class DA { int k; public: DA(int x=1):k (x){} ~DA( ){cout<<k;} }; int main( ){ DA d[]={DA(3),DA(3),DA(3)}; DA *p=new DA[2]; delete []p; return ( ); } 这个程序的输出结果是( )。
A.111 B.333 C.11333 D.11133
正确答案:C
解析:此题考查的是析构函数和对象的生存期。在主函数中,首先定义了一
个DA类对象数组d,从初始化列表中可以看出,它包含3个对象;然后通过new运算符动态创建了一个DA类的对象数组,并将首地址赋给DA类指针p;接着通过delete[]运算符销毁指针p所指向的数组,故此时会输出“11”。最后函数结束,销毁前面定义的对象数组d,会输出“333”。故最后的输出结果是11333。
31. 如果派生类以protected方式继承基类,则原基类的protected成员和public成员在派生类中的访问属性分别是( )。
A.public和public B.public和protected C.protected和public D.protected和protected
正确答案:D 解析:此题考查的是基类成员在派生类中的访问属性。派生类中的成员不能访问基类中的私有成员,可以访问基类中的公有成员和保护成员。派生类从基类公有继承时,基类的公有成员和保护成员在派生类中仍然是公有成员和保护成员;派生类从基类私有继承时,基类的公有成员和保护成员在派生类中都变成私有成员;派生类从基类保护继承时,基类的公有成员在派生类中变成保护成员,基类的保护成员在派生类中仍然是保护成员。
32. 必须用一对大括号括起来的程序段是( )。 A.switch语句中的case标号语句 B.if语句的分支
C.循环语句的循环体 D.函数的函数体
正确答案:D
解析:此题考查的是语句块和函数。if语句的分支和循环语句的循环体可以是一条语句也可以使一个语句块,所以不是必须用一个大括号括起来;switch语句中的case标号语句可以是一系列语句,也可以包含语句块,也不是必须用一对大括号括起来;函数的函数体必须用一对大括号括起来。
33. 有如下程序: #include<iostream> using namespace std; class MyClass{ public:MyClass(int x):val(x) {}void Print( ) const {cout<<”const:val=“<<val<<’\’;}void Print( ) {cout<<”val=“<<val<<’t’;} private:int val; }; int main( )const MyClass obj1(10);MyClass obi2(20);obj1.Print( );obj2.Print( );return 0; } 程序的输出结果是( )。
A.val=10 const:val=20
B.const:val=10 const:val=20 C.const:val=10 val=20 D.val=10 val=20
正确答案:C
解析:此题考查的是常成员函数的重载。常成员函数是使用const关键字说明的函数。COHM关键字可用于区分重载函数。此时,常对象调用常成员函数,一般对象调用一般成员函数;题目中的Print( )就是通过const重载的两个成员函数,主函数中声明的。obj1是常对象,obj2是一般对象。故输出结果是const::val=10 val=20。
34. 有如下程序: #include<iostream> using namespace std; class Part{ public: Part(int x=0):val(x) {cout<<val;} ~Part( ){cout<<val;} private: int val; }; class Whole{ public: Whole(int x ,int y, int z=0):p2(x),p1(y),val(z){cout<<val;} ~Whole( ){cout<<val;} private: Part p1,p2; int val; }; int main( ) Whole obj(1,2,3); return 0; } 程序的输出结果是( )。
A.123321 B.213312 C.213 D.123123
正确答案:B
解析:此题考查的是类的构造与析构。在建立类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右),接着执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序,最后执行自身的构造函数。析构顺序与之相反。本题中,Whole类中有两个Part类的成员p1和p2,根据它们定义的顺序,先构造p1再构造p2。所以,首先被构造的是p1(y),输出2;第二个被构造的是p2(x),输出1;最后调用析构函数,输出val的值3;析构函数调用顺序与构造函数相反。故最后输出213312。
35. 下列有关类成员的叙述中,正确的是( )。 A.友元函数是类的成员函数
B.类成员的默认访问权限是私有的 C.类成员函数必须声明为公有的 D.类的静态数据成员不能是常成员
正确答案:B 解析:此题考查的是类成员的有关概念。类的友元函数可以直接访问该类的所有成员,但它不是类的成员函数,故选项A)错误;类成员函数的访问权限可以声明为公有、保护、私有,故选项C)错误;静态数据成员的声明是使用关键字static,它可以是常成员,故选项D)错误。
填空题(每空2分,共30分)请将每一个空的正确答案写在答题卡上。注意:以命令关键字填空的必须拼写完整。
36. 在结构化设计方法中,数据流图表达了问题中的数据流与加工间的关系,并且每一个______实际上对应一个处理模块。
正确答案:加工 解析:数据流图是从数据传递和加工的角度,来刻画数据流从输入到输出的移动变换过程,其中的每一个加工对应一个处理模块。
37. 结构化程序设计的三种基本结构分别是顺序、选择和______。
正确答案:重复(或循环)
解析:结构化程序设计包括3种基本的结构:顺序结构、选择结构和重复结构(循环结构)。利用这3种结构就足以表达出各种其他结构形式的程序设计方法,其中利用循环结构,可以简化大量的程序执行。
38. 二分法查找仅限于这样的表:表中的数据元素必须有序,其存储结构必须是______。
正确答案:顺序存储(或顺序方式存储) 解析:二分法查找对表的要求是有序的顺序表,即第一要求是数据元素有序,第二要求是按顺序方式存储。
39. 一个模块直接调用的其他模块个数称为______。
正确答案:扇出
解析:在结构图中,调用一个给定模块的模块个数称为扇入,一个模块直接调用的其他模块个数称为扇出。
40. 数据库系统中实现各种数据管理功能的核心软件是______。
正确答案:数据库管理系统
解析:数据库管理系统是数据库的管理机构,它是一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等。
41. 下面程序的输出结果为【 】。#include <iostream> using namespace std; void initialize(int printNo, int state=0); void initialize(iht printNo= 1,int state); int main( ) { initialize( ); return 0; } void initialize(int printNo, int state) { cout<<printNo<<”,”<<state<<end1; }
正确答案:1, 0
42. 语句cout<<setiosflags(ios::showpos)<<38<<”“<<-38<<end1;的输出结果为【 】。
正确答案:+37-38
43. 友元类的所有成员函数都是另一个类的【 】函数。
正确答案:友元
44. 虚函数必须是类的【 】。
正确答案:成员函数
45. 类ostream的成员函数【 】用于执行无格式输出,成员函数put用于输出单个字符。
正确答案:write
46. C++本身没有定义I/O操作,但I/O操作包含在C++实现中。C++标准库iostream提供了基本的I/O类。I/O操作分别由类istream和【 】提供。
正确答案:ostream
47. 阅读下面程序: #include <iostream.h> int fun2(int m) { if(m%3==0) return 1; else return 0; } void fun1(int m, int &s) { int i; for (i=1; i<m; i++) if(fun2(i)) S=S*i; } void main( ) { int n=9, s=2; fun1(n, s); cout<<s<<end1; } 该程序的运行结果是【 】。
正确答案:36
48. 有如下程序: #include <iostream> using namespace std; class PARENT { public: PARENT( ) { cout<<”PARENT”; } }; class SON: public PARENT { public: SON( ) { cout<<”SON”; } }; int main( ) { SON son; PARENT *p; p=&son; return 0; } 执行上面程序的输出是【 】。
正确答案:PARENTSON
49. 虚基类说明格式如下:slass派生类名【 】<继承方式><基类名>。
正确答案:virtual 50. 下面程序的执行结果是【 】。#include <iostream.h> void main( ) { int n=0,x=0; do { n++; if(n%3==2&&n%5==3&&n%7==2) x=1; } while(x!=1); cout<<”n=“<<n<<end1; }
正确答案:n=23
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务