国家二级C++机试(选择题)-试卷29
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
国家二级C++机试(选择题)-试卷29
(总分:80.00,做题时间:90分钟)
一、选择题(总题数:40,分数:80.00)
1.下列叙述中正确的是( )。
(分数:2.00)
A.循环队列是队列的一种链式存储结构
B.循环队列是队列的一种顺序存储结构√
C.循环队列是非线性结构
D.循环队列是一种逻辑结构
解析:解析:在实际应用中,队列的顺序存储结构一般采用循环队列的形式。
2.下列关于线性链表的叙述中,正确的是( )。
(分数:2.00)
A.各数据结点的存储空间可以不连续,但它们的存储顺序与逻辑顺序必须一致
B.各数据结点的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续
C.进行插入与删除时,不需要移动表中的元素√
D.以上说法均不正确
解析:解析:一般来说,在线性表的链式存储结构中,各数据结点的存储序号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。
线性链表中数据的插入和删除都不需要移动表中的元素,只需改变结点的指针域即可。
3.一棵二叉树共有25个结点,其中5个是叶子结点,则度为1的结点数为( )
(分数:2.00)
A.16 √
B.10
C.6
D.4
解析:解析:根据二叉树的性质3:在任意一棵二叉树中,度为0的叶子结点总是比度为2的结点多一个,所以本题中度为2的结点是5-1=4个,所以度为1的结点的个数是25-5-4=16个。
4.在下列模式中,能够给出数据库物理存储结构与物理存取方法的是( )。
(分数:2.00)
A.外模式
B.内模式√
C.概念模式
D.逻辑模式
解析:解析:数据库系统的三级模式是概念模式、外模式和内模式。
概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户公共数据视图。
外模式也称子模式或用户模式,它是用户的数据视图,给出了每个用户的局部数据描述。
内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法,所以选择B。
5.在满足实体完整性约束的条件下( )。
(分数:2.00)
A.一个关系中应该有一个或多个候选关键字√
B.一个关系中只能有一个候选关键字
C.一个关系中必须有多关键字个候选
D.一个关系中可以没有候选关键字
解析:解析:实体完整性约束要求关系的主键中属性值不能为空值,所以选择A。
6.有三个关系R、S和T R和S得到关系T的操作是( )。
(分数:2.00)
B.交
C.除√
D.并
解析:解析:如果S=T/R,则S称为T除以R的商。
在除运算中S的域由T中那些不出现在R中的域所组成,对于S中的任一有序组,由它与关系R中每个有序组所构成的有序组均出现在关系T中。
所以本题选择C。
7.下面描述中,不属于软件危机表现的是( )。
(分数:2.00)
A.软件过程不规范√
B.软件开发生产率低
C.软件质量难以控制
D.软件成本不断提高
解析:解析:软件危机主要表现在:软件需求的增长得不到满足;软件开发成本和进度无法控制;软件质量难以保证;软件不可维护或维护程度非常低;软件的成本不断提高;软件开发生产率的提高赶不上硬件的发展和应用需求的增长。
所以选择A。
8.下面不属于需求分析阶段任务的是( )。
(分数:2.00)
A.确定软件系统的功能需求
B.确定软件系统的性能需求
C.需求规格说明书评审
D.制定软件集成测试计划√
解析:解析:需求分析阶段的工作有:需求获取;需求分析;编写需求规格说明书;需求评审,所以选择D。
9.在黑盒测试方法中,设计测试用例的主要根据是( )。
(分数:2.00)
A.程序内部逻辑
B.程序外部功能√
C.程序数据结构
D.程序流程图
解析:解析:黑盒测试是对软件已经实现的功能是否满足需求进行测试和验证,黑盒测试完全不考虑程序内部的逻辑结构和内部特性,只根据程序的需求和功能规格说明,检查程序的功能是否符合它的功能说明,所以本题选择B。
10.在软件设计中不使用的工具是( )。
(分数:2.00)
A.系统结构图
B.PAD图
C.数据流图(DFD图) √
D.程序流程图
解析:解析:系统结构图是对软件系统结构的总体设计的图形显示。
在需求分析阶段,已经从系统开发的角度出发,把系统按功能逐次分割成层次结构,是在概要设计阶段用到的。
PAD图是在详细设计阶段用到的。
程序流程图是对程序流程的图形表示,在详细设计过程中用到。
数据流图是结构化分析方法中使用的工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它是一种功能模型,是在可行性研究阶段用到的而非软件设计时用到,所以选择C。
11.下列术语中,能表明面向对象思想主要特征的是
(分数:2.00)
A.封装性√
B.灵活性
C.安全性
解析:解析:C++作为面向对象的语言,具有三种特点封装性、继承性、多态性。
所以答案为A。
12.有如下程序段: int i=2;int j=3; int main() { int i=9, j=i; cout<<i<<j<
(分数:2.00)
A.23
B.93
C.99 √
D.39
解析:解析:全局变量也称为外部变量,它是在函数外部定义的变量。
它不属于哪一个函数,它属于一个源程序文件。
其作用域是整个源程序。
在函数中使用全局变量,一般应作全局变量说明,本题中定义了两个全局变量i,j,所以主函数中对全局变量重新赋值输出后为99,所以答案为C。
13.有如下程序段: int i=9; while ( int i=0 ){ cout<<'*'; i--; }运行时输出 * 的个数是
(分数:2.00)
A.0 √
B.1
C.9
D.无穷
解析:解析:本题考查赋值运算和while循环,i被赋值为为0,所以while中的判断条件为假,不执行循环体,所以输出为0个。
14.已知有数组定义 char a[3][4];下列表达式中错误的是
(分数:2.00)
A.a[0]="AAA" √
B.strcpy(a[1], "BBB")
C.a[2][3]='C'
D.a[1][1]=a[2][2]
解析:解析:本题考查二维字符数组,a[0]="AAA"中a[0]表示一个地址,不能将字符串直接赋值给指针,所以A选项错误。
15.有如下程序段: int i=1; while(1) { i++; if(i == 100) break; if(i%2 == 0) cout << '*'; }执行这个程序段输出字符 * 的个数是
(分数:2.00)
A.100
B.48
C.49 √
D.50
解析:解析:本题中while循环中当i为偶数时输出*,而i为100时跳出循环,所以输出49个*,答案为C。
16.下列关于 return 语句的叙述中,正确的是
(分数:2.00)
A.任何函数的函数体中至少有一个 return 语句
B.任何函数的函数体中最后一条语句必须是 return 语句
C.如果函数的返回类型为 void,则其函数体中可以没有 return 语句√
D.如果函数的返回类型为 int,则其函数体中可以没有 return 语句
解析:解析:本题考查函数返回类型,函数如果返回为void,那么函数体内可以没有return语句,如果函数有返回值,那么在函数体中就必须有return语句。
17.下列关于运算符重载的叙述中正确的是
(分数:2.00)
A.跟普通函数一样,可以为重载的运算符函数的参数设置默认值
B.通过重载,可以改变一个运算符原有的优先级和操作数个数
C.只能重载 C++ 中已经有的运算符,不能定义新运算符√
D.C++ 中已有的运算符都可以重载
解析:解析:本题考查运算符重载,重载不能改变运算符运算对象的个数;不能改变运算符的优先级别;不能改变运算符的结合性;重载运算符的函数不能有默认值,否则就改变了运算符参数的个数;不能定义新的运算符,某些运算符不能重载。
所以答案为C。
18.下列关于内联函数的叙述中,正确的是
(分数:2.00)
A.内联函数就是在一个函数体内定义的函数
B.内联函数必须通过关键字 inline 来定义
C.在类体中定义的函数,都是内联函数√
D.内联函数不需要 return 语句
解析:解析:在类体中定义的成员函数,C++系统会自动将它们作为内联函数处理,而在类外定义的成员函数,系统并不把它们默认为内联函数,内联函数可以用return,以可以不用,所以只有选项C正确。
19.下列运算符只能重载为成员函数的一组是
(分数:2.00)
A.+ - * /
B.= () [] -> √
C.> < >= <=
D.+= -= *= /=
解析:解析:本题考查重载运算符,C++规定有的运算符(如赋值运算符、下标运算符、函数调用运算符)必须定义为类的成员函数。
所以本题选B。
20.已知函数 func 的原型为 int func(int,int);下列重载函数原型中错误的是
(分数:2.00)
A.char func(int,int); √
B.bool func(int,int,bool);
C.int func(int,char*);
D.float func(int,int,int);
解析:解析:本题考查函数重载相关知识,重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。
A选项的形参都与原函数相同,所以不能作为重载函数。
21.已知表达式 --a 中的"--"是作为成员函数重载的运算符,则与 --a 等效的运算符函数调用形式为(分数:2.00)
A.a.operator--(1)
B.operator--(a)
C.operator--(a,1)
D.a.operator--() √
解析:解析:本题考查重载自减运算符--,根据重载的规则,只有D选项能够正确调用重载函数。
22.计算数列第 n 项的函数定义如下: int a(int n){ if (n == 0) return 0; else if (n == 1) return 1; else if (n == 2) return 2; else return a(n-1)+a(n-3); }若执行函数调用表达式 a(4),函数 a 被调用的次数是
(分数:2.00)
A.3
B.4
C.5 √
D.6
解析:解析:本题考查递归函数调用,执行a(4)= a(3) + a(1),而a(3) = a(2) + a(0),总共执行函数为a(4)、a(3)、a(2)、a(0)、a(1)五次,所以答案C正确。
23.有如下类定义和变量定义:class A{ public: A() { data = 0; } ~A() {} int GetData() const { return data; } void SetData(int n) { data = n; } private: int data; }; const A a; A b;下列函数调用中
错误的是
(分数:2.00)
A.a.GetData();
B.a.SetData(10); √
C.b.GetData();
D.b.SetData(10);
解析:解析:本题考查常对象,如果一个对象被定义为常对象,那么它不能调用该对象的非const型的成员函数,所以B选项错误,a为常对象,调用了SetData这个非const型的成员函数。
24.建立一个类对象时,系统自动调用
(分数:2.00)
A.析构函数
B.构造函数√
C.静态函数
D.友元函数
解析:解析:本题考查默认构造函数,如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,建立一个对象时,系统会自动执行默认构造函数。
25.在 C++ 中,编译系统自动为一个类生成默认构造函数的条件是
(分数:2.00)
A.该类没有定义任何有参构造函数
B.该类没有定义任何无参构造函数
C.该类没有定义任何构造函数√
D.该类没有定义任何成员函数
解析:解析:本题考查默认构造函数,如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,所以C选项正确。
26.下列关于继承和派生的叙述中,正确的是
(分数:2.00)
A.派生类中新定义的成员函数可以访问基类的所有成员
B.在私有继承的情况下,派生类中新定义的成员函数不能访问基类的保护成员
C.基类对象可以赋值给派生类对象
D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类√
解析:解析:本题考查继承与派生,派生类中的成员访问基类中的成员由派生方式决定,如果派生类私有继承基类,那么就不能新定义的成员函数就不能访问基类的私有成员,所以A选项错误。
在私有继承的情况下,派生类中新定义的成员函数可以访问基类的保护成员。
基类对象在某种情况下可以赋值给派生类对象。
27.在公有继承的情况下,允许派生类中新定义的成员函数直接访问的基类成员只包括
(分数:2.00)
A.公有成员和保护成员√
B.公有成员
C.公有成员、保护成员和私有成员
D.保护成员
解析:解析:本题考查继承与派生,派生类中的成员访问基类中的成员由派生方式决定,本题主要考查公用继承方式对基类的访问权限,根据公用继承的特性,A选项正确。
28.有如下程序: #include using namespace std; class Base { public: void fun()
{ cout<<"Base::fun"<<<"Derived::fun"<
(分数:2.00)
A.Base.fun();
B.Base->fun();
C.Base::fun(); √
D.fun();
解析:解析:本题考查派生类对基类成员的访问属性,派生类公用继承基类,所以派生类可以直接使用基类的公用成员,题目中输出了Base::fun,所以可以推断派生类一定是调用了基类的fun函数,只有C选
项正确调用了基类的fun函数,所以C选项正确。
29.有如下类定义: class Cup{ public: void SetPrice(double val); private: double price; };若要在类体外给出对成员函数SetPrice的定义,下列选项中正确的是
(分数:2.00)
A.void Cup::SetPrice(double val) { price=val; } √
B.void Cup.SetPrice(double val) { price=val; }
C.void SetPrice(double val) { Cup::price=val; }
D.void SetPrice(double val) { Cup.price=val; }
解析:解析:本题考查如何在类体外定义成员函数,在类体外定义成员函数需要使用作用域运算符::,只有A选项符合定义格式,所以A选项正确。
30.有如下类定义: class Box{ public: Box(int h,int w,int l):width(w),length(l),height(h) { } private: int length,width,height; };Box 类中3个数据成员的初始化顺序为
(分数:2.00)
A.length,height,width
B.length,width,height √
C.height,width,lenth
D.width,length,height
解析:解析:本题考查派生类的构造函数,C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序,所以B选项正确。
31.有如下程序: #include #include using namespace std; class MyBag{ public: MyBag(string br,string cr):brand(br),color(cr) { ++count; } ~MyBag() { --count; } static int GetCount() { return count; } private: string brand,color; static int count; }; int MyBag::count=0; int main(){ MyBag
one("CityLife","Gray"),two("Micky","Red"); cout<<(分数:2.00)
A.111
B.132
C.232 √
D.233
解析:解析:本题考查构造函数和析构函数,以及静态数据成员,定义one,two时,构造函数被执行了两次,所以count为2,后续又定义了一个指针对象,所以count加1变为了3,当删除那个指针对象时,执行析构函数,count减1,所以是2,答案C正确。
32.有如下程序: #include #include using namespace std; class TV{ public: TV(int s=41):size(s) { cout<<'N'; } TV(const TV& t):size(t.size) { cout<<'C'; } ~TV() { cout<<'D'; } void Print() const { cout<Print(); delete room3; return 0; } 运行时的输出结果是
(分数:2.00)
A.NC54
B.NCN54D
C.NNN54DDD
D.NCN54DDD √
解析:解析:本题考查构造函数相关知识,本题中定义一个对象room1,输出N,定义room2时输出C,定义room3时输出N,然后执行room3.Print时,输出54,最后执行三个析构函数输出DDD,所以答案为D。
33.有如下类定义:class Point{ public: Point(int xx=0,int yy=0):x(xx),y(yy) { } private: int x,y; }; class Circle:public Point{ public: Circle(int r):radius(r) { } private: int radius; };派生类Circle中数据成员的个数为
(分数:2.00)
A.1
B.2
C.3 √
D.5
解析:解析:本题考查如何定义派生类以及派生类对基类成员的访问,声明派生类的一般形式为:class 派生类名:[继承方式] 基类名题目中公用继承,所以也继承基类的数据成员,所以总共有3个数据成员,所以C选项正确。
34.有如下程序: #include using namespace std; class Point{ public: Point(int xx=0,int
yy=0):x(xx),y(yy) { } void SetX(int xx) { x=xx; } void SetY(int yy) { y=yy; } private: int x,y; }; class Circle:public Point{ public: Circle(int r):radius(r) { } int GetRadius() { return radius; } private: void SetRadius(int r) { radius=r; } int radius; }; int main(){ Circle c1(5); c1.SetX(1); //① c1.SetY(2); //② c1.SetRadius(10); //③ cout<
(分数:2.00)
A.①
B.②
C.③√
D.④
解析:解析:本题考查对象成员的引用,在类外引用对象的数据成员时,只能访问public成员而不能访问private成员所以C选项错误。
35.有如下程序: #include #include using namespace std; class Person{ public: Person(string n):name(n) { } ~Person() { cout<<'P'; } private: string name; }; class Date{ public: Date(int y=2012,int m=12,int d=21):year(y),month(m),day(d) { } ~Date() { cout<<'D'; } private: int year,month,day; }; class Student:public Person{ public: Student(string n,int y,int m,int d,char c) :birthday(y,m,d),sex(c),Person(n) { } ~Student() { cout<<'S'; } private: Date birthday; char sex; }; int main(){ Student stu1("Zhang",1990,10,1,'F'); return 0; } 运行时的输出结果是
(分数:2.00)
A.S
B.SP
C.SPD
D.SDP √
解析:解析:本题考查派生类的析构函数,派生类的析构函数执行顺序为先构造的后析构,后构造的先析构,所以执行Student stu1("Zhang",1990,10,1,'F');时,依次执行person、Date 、Student构造函数,然后依次执行Student、Date 、person的析构函数,所以输出为SDP,D选项正确。
36.有如下程序: #include #include using namespace std; class Instrument{ public:
Instrument(string t="乐器",string n="无名"):type(t),name(n) { } string GetType() const { return "乐器"; } virtual string GetName() const { return "无名"; } protected: string type,name; }; class Piano:public Instrument{ public: Piano(string n,string t="钢琴"):Instrument(t,n) { } string GetType() const { return "钢琴"; } string GetName() const { return name; } }; int main(){ Instrument *pi=new Piano("星空"); cout<GetType()<<'-'<GetName(); delete pi; return 0; } 运行时的输出结果是
(分数:2.00)
A.乐器-星空√
B.乐器-无名
C.钢琴-星空
D.钢琴-无名
解析:解析:本题考查虚函数的运用,本题中基类Instrument,派生类Piano,其中虚函数为GetName,当定义Instrument *pi=new Piano("星空")时,调用派生类的GetType函数,得到type为乐器,name为星空,所以输出乐器-星空。
选项A正确。
37.下列关于函数模板的叙述中,错误的是
(分数:2.00)
A.从模板实参表和从模板函数实参表获得信息矛盾时,以模板实参的信息为准
B.对于常规参数所对应的模板实参,任何情况下都不能省略
C.虚拟类型参数没有出现在模板函数的形参表中时,不能省略模板实参
D.模板实参表不能为空√
解析:解析:虚拟类型参数出现在模板函数的形参表中时,可以省略模板实参。
所以D选项错误。
38.在定义一个类模板时,模板形参表是用一对括号括起来的,所采用的括号是
(分数:2.00)
A.( )
B.[ ]
C.< > √
D.{ }
解析:解析:本题考查模板的定义,使用的括号为<>,所以答案为C选项。
39.下列关于 C++ 流的叙述中,正确的是
(分数:2.00)
A.与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现√
B.从流中获取数据的操作称为插入操作,向流中添加数据的操作称为提取操作
C.cin 是一个预定义的输入流类
D.输出流有一个名为open的成员函数,其作用是生成一个新的流对象
解析:解析:本题考查输入输出流,从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作,cin 是一个标准输入流类,open并不是输出流的一个成员函数。
40.若磁盘上已存在某个文本文件,其全路径文件名为d:/ncre/test.txt ,下列语句中不能打开该文件的是
(分数:2.00)
A.ifstream file("d:/ncre/test.txt"); √
B.ifstream file("d://ncre//test.txt");
C.ifstream file; file.open("d://ncre//test.txt");
D.ifstream* pFile = new ifstream("d://ncre//test.txt");
解析:解析:本题考查文件流的一些操作,根据文件打开的相关知识,A选项中不能正确打开该文件。