1、国家二级( C+)机试模拟试卷 164及答案与解析 一、选择题 1 下列叙述中正确的是 ( )。 ( A)算法的时间复杂度与算法程序中的语句条数成正比 ( B)算法的时间复杂度与计算机的运行速度有关 ( C)算法的时间复杂度与运行算法时特定的输入有关 ( D)算法的时间复杂度与算法程序编制者的水平有关 2 下列各排序法中,最坏情况下的时间复杂度最低的是 ( )。 ( A)希尔排序 ( B)快速排序 ( C)堆排序 ( D)冒泡排序 3 设栈的存储空间为 S(1: 50),初始状态为 top=51。现经过一系列正常的入栈与退栈操作后, top=50,则栈中的元素个数为 ( )。 ( A) 1 (
2、 B) 0 ( C) 50 ( D) 49 4 某二叉树共有 399个结点,其中有 199个度为 2的结点,则该二叉树中的叶子结点数为 ( )。 ( A)不存在这样的二叉树 ( B) 200 ( C) 198 ( D) 199 5 结构化程序的三种基本结构是 ( )。 ( A)递归、迭代和回溯 ( B)过程、函数和子程序 ( C)顺序、选择和循环 ( D)调用、返回和选择 6 某系统结构图如下图所示 (n5) 该系统结构图的最大扇出数是 ( )。 ( A) n ( B) 3 ( C) 2 ( D) n+1 7 软件需求规格说明的内容不包括 ( )。 ( A)运行环境 ( B)软件的主要功能 (
3、 C)软件的性能 ( D)算法详细设计 8 在数据库管理技术发展的三个阶段中,没有专门的软件对数据进行管理的是( )。 ( A)人工管理阶段 ( B)文件系统阶段 ( C)文件系统阶段和数据库阶段 ( D)人工管理阶段和文件系统阶段 9 建立表示学生选修课程活动的实体联系模型,其中的两个实体分别是 ( )。 ( A)课程和课程号 ( B)学生和课程 ( C)学生和学号 ( D)课程和成绩 10 定义学生、教师和课程的关系模式 S(S#, Sn, Sd, Dc, SA) (其属性分别为学号、姓名、所在系、所在系的系主任、年龄 ); C(C#, Cn, P#)(其属性分别为课程号、课程名、先修课
4、); SC(S#, C#, G)(其属性分别为学号、课程号和成绩 ),则该关系为 ( )。 ( A)第二范式 ( B)第一范式 ( C)第三范式 ( D) BCNF范式 11 下列语句中,能够进行正确赋值的是 ( )。 ( A) char str=abcde; ( B) char str=“abcde“; ( C) char str4: “abode“; ( D) char str6=“abcde“; 12 有如下枚举类型定义: enum DAYSUN MON=10 TUE, WED, THU, FRI=20, SAT; 执行下列程序段 for(int i=0; i THU; i+) cout
5、 a endl; 输出字符 a的个数是 ( )。 ( A) 13 ( B) 16 ( C) 19 ( D) 22 13 若对数组 进行初始化,下列选项中,错误的是 ( )。 ( A) char name310=“Tracy“, “Lamar“, “McGrady“; ( B) char team7=“Rockets“; ( C) double score=25 6, 32 1, 28 0; ( D) int matrix33=1, 2, 3, 4, 5, 6, 7, 8, 9; 14 下列有关指针的操作中,正确的是 ( )。 ( A) int a=10; void*ptr=&a; cout *
6、(ptr); ( B) int*ptr=new int10; delete ptr; ( C) int Array4; *(Array+3)=10; ( D) int*ptr=new int*10; 15 有如下程序: #include iostream using namespace std; int main() int i=1, s=0; while(s 30) s+=i*i: i+; cout s endl: return0; 运行后的输出结果是 ( )。 ( A) 32 ( B) 30 ( C) 31 ( D) 55 16 下列关于函数的叙述中,错误的是 ( )。 ( A)一个函数很
7、可能既调用别的函数又被别的函数调用 ( B)一个函数可以不返回任何值 ( C) C+允许函数定义嵌套 ( D) C+中函数在使用之前要预先声明 17 若已经声明了函数原型 “void fun(int a, double b=0 0)”,则下列重载函数声明中正确的是 ( )。 ( A) void fun(int a=90, double b=0 0); ( B) int fun(int a, double B); ( C) void fun(double a, int B); ( D) bool fun(int a, double b=0 0); 18 下列关于运算符重载的叙述中,错误的是 (
8、)。 ( A)运算符既可以重载为类成员函数,也可以重载为非成员函数 ( B) C+中运算符重载只能重载已有的运算符 ( C)双目运算符的重载函数的形参必须有两个 ( D)运算符重载不能改变运算符的优先级 19 下列选项中不能用于区分重载函数的是 ( )。 ( A)形参的个数 ( B)形参的类型 ( C)函数的返回值类型 ( D)常函 数关键字 const 20 计算数列第 n项的函数定义如 F: int fa(int n) if(n=1)return1; else return3*fa(n-1)+2; 若执行函数调用表达式 fa(4)时,返回的函数值为 ( )。 ( A) 53 ( B) 17
9、 ( C) 23 ( D) 49 21 有如下程序: #include iostream using namespace std; int fun(char x, char y) if(x y) return x: return y; int main() int a(9), b(8), c(7); cout fun(fun(a, b), fun(b, c); return0; 运行后的输出结果是 ( )。 ( A) 8 ( B) 9 ( C) 7 ( D)函数调用出错 22 有如下程序: #include iostream using namespace std; double add(do
10、uble a, double b, double c=1) return a+b+c: int main() int result=add(2, 3); cout result endl: return0; 运行后的输出结果是 ( )。 ( A) 3 ( B) 5 ( C) 6 ( D)编译出错 23 有如下程序: #include iostream using namespace std; class clock public: clock(): seeonds(0); clock&: operator+() this- seconds+: return*this: void display
11、() cout this- seconds : private: int second8; ; int main() clock c; +c: c display(); (+(+c) display(); c display(); return0; 运行后的输出结果是 ( )。 ( A) 1 3 2 ( B) 1 3 3 ( C) 1 2 3 ( D) 1 2 2 24 下列关于构造函数的叙述中,错误的是 ( )。 ( A)构造函数名与类名相同 ( B)构造函数可以有返回值 ( C)构造函 数可以重载 ( D)每个类都有构造函数 25 下列关于 this指针的叙述中,错误的是 ( )。 ( A
12、) this指针只能在类的非静态成员函数中使用 ( B) this指针存储着对象的地址 ( C) this指针不需要显式定义 ( D)在构造函数中不能使用 this指针 26 当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的 ( )。 ( A)公有成员 ( B)私有成员 ( C)保护成员 ( D)友元 27 下列关于 C+类的叙述中,错误的是 ( )。 ( A)类与 类之间可以互为友元 ( B)类用于描述事物的属性和对事物的操作 ( C)类与类之间不能有组合关系 ( D)类与类之间可以通过封装而具有相对独立性 28 已知类 XX中声明了如下的公有虚函数: virtua
13、l voidf()const; XX的派生类 YY重定义了这个虚函数, XX和 YY都有默认的构造函数,且有如下定义: YY YY: XX xx, *px=&xx, &rx=Yyy, *pp=&yy; 则下列对函数 f的调用中,属于非多态调用的是 ( )。 ( A) px- f() ( B) rx f() ( C) xx f() ( D) pp- f() 29 有如下类定义: class Piano public: int GetPrice()const; private: int price; ; 若要在类体外定义常成员函数 GetPrice,下列选项中正确的是 ( )。 ( A) int
14、GetPrice()return price; ( B) int GetPrice()constreturn price; ( C) int Piano: GetPrice()return price; ( D) int Piano: GetPrice()constreturn price; 30 有如下程序: #include iostream using namespace std; class Apartment public: Apartment(int Rum=2): bedroom(num)cout bedroom; private: int bedroom; ; int main
15、() Apartment Alice, Bill(3), Twins2; return0: 运行时的输出结果为 ( )。 ( A) 222 ( B) 232 ( C) 2322 ( D) 2232 31 有如下类定义: class Girl; class Bov public: Boy(double h); void Show(const Gid&g); void Print()const; private: double height; ; class Girl friend class Boy; friend void Display(coflst Girl&); public: Girl
16、(double h); private: double height; ; 下列叙述中,错误的是 ( )。 ( A)类 Boy是类 Girl的友元类 ( B)函数 Display是类 Girl的友元函数 ( C)类 Boy的成员函数 Print是类 Girl的友元函数 ( D)类 Boy的成员函数 Show中不能访问类 Girl的私有成员 height 32 有如下程序: #include iostream #include string using namespace std; class Bedroom public: Bedroom(int s=12): size(s)cout size
17、; private: int size; ; class Apartment public: Apartment(int s1, int s2, int s3): b2(s2), b1(s1), size(s3)cout size; private: int size; Bedroom b1, b2; ; int main() Apartment*p=new Apartment(12, 18, 75); delete p; return0: 运行时的输出结果是 ( )。 ( A) 121875 ( B) 181275 ( C) 751218 ( D) 751812 33 有如下类定义: cla
18、ss Piano public: _纯虚函数 Type ; 下列选项中,能够正确表示纯虚函数 Type的是 ( )。 ( A) void Type()virtual; ( B) virtual void Tvpe(); ( C) virtual void Type()=0; ( D) virtual void Type()=0; 34 有如下程序: #include iostream #include string using namespace std; class Apple public: Apple()cout A; ; class IPhone: public Apple publi
19、c: IPhone(): ver(4)cout I; IPhone(int n): ver(n)cout n; private: int ver; ; int main() IPhone Ellen(6), Jack; return 0; 运行时的输出结果是 ( )。 ( A) 6I ( B) A6I ( C) AIAI ( D) A6AI 35 有如下程序: #include iostream #include string using namespace std; class Publication public: Publication(string n=“Unknown“): name
20、(n) const string getName()constreturn name; virtual const string getType()constreturn“Unknown“; private: string name; ; class Book: publicPublication public: Book(string name): Publication(name) virtual const string getType()constreturn“Book“; ; void showPublication(Publication&p) cout p getType() “
21、: “ P getName() endl; int main() Book book(“C+“); showPublication(book); return0; 运行时的输出结果是 ( )。 ( A) Book: C+ ( B) Book: Unknown ( C) Unknown: C+ ( D) Unknown: Unknown 36 有如下程序: #include iostream #include cmath using namespace std; class Power幂类 doutfie base;底数 double expo;指数 public: Power(double v
22、, double p): base(v), expo(p) double getBase()constreturn base; double getExponent()constreturn expo; ; class Square: public Power public: Square(double x): Power(x, 2 0) ; class Cubic: public Power public: Cubic(double x): Power(x, 3 0) ; ostream & operator (ostream&os, cons(Power&p) os pow(_); ret
23、urn os; int main() cout Square(3) Cubic(5); return0; 运行后的输出结果是 9125,则下划线处缺失的部分是 ( )。 ( A) p base, p expo ( B) p expo, p base ( C) p getBase(), p getExponent() ( D) p getExponent(), p getBase() 37 下列关于类模板的叙述中,正确的是 ( )。 ( A)类模板实例化时,编译器会根据给出的模板实参生成一个类 ( B)类模板中的成员函数没有返回值 ( C)类模板的主要作用是生成抽象类 ( D)类模板中的数据成员
24、具有同样类型 38 下列关于 C+输入输出流的叙述中,错误的是 ( )。 ( A)输入输出流提供了对各种外部设备的抽象 ( B) cout, cerr, clog默认情况下都会输出到系统的标准输出设备 ( C) C+输入输出流类库中含有一组类模板 ( D)使用输入输出流必须显式用 open函数打开文件 39 下列选项中,只能用于处理文件输入的是 ( )。 ( A) ostream ( B) fstream ( C) ofstream ( D) ifstream 40 已知函数模板定义如下: template typename T T max(T x, T y) return x y?x: y;
25、 下列叙述中,错误的是 ( )。 ( A)此函数模 板有一个模板形参 ( B)此馍板实参类型必须可以用运算符比较大小 ( C)此函数模板实例化时,模板实参只能是基本类型 ( D)编泽时遇到对 max的调用表达式,将生成模板实例 二、基本操作题 41 请使用 VC6或使用【答题】菜单打开考生文件夹 proj1下的工程 proj1,该工程中包含程序文件 main cpp,其中有类 Door(“门 ”)和主函数 main的定义。程序中位于每个 “ ERROR*found*”之后的一行语句有错误,请加以改正。改正后程序的输出结果应为: 打开 503号门 门是锁着的 ,打不开。 打开 503号门的锁 锁
26、开了。 打开 503号门 门打开了。 打开 503号门 门是开着的,无须再开门。 锁上 503号门 先关门 门锁上了。 注意:只修改每个 “ ERROR*found*”下的那一行,不要改动程序中的其他内容。 #include iostream using namespace std; class Door int num;门号 bool closed; true表示门关着 bool locked; true表示门锁着 public: Door(int num) ERROR*found* sum=this- num; closed=locked=true; bool isClosed()cons
27、treturn closed; 门关着时返回 true,否则返回 false bool isOpened()constreturn!closed; 门开着时返回 true,否则返回 false bool isLocked()constreturn locked; 门锁着时返回 true, 否则返回 false bool isUnlocked()constreturn!locked; 门未锁时返回 true,否则返回 false void open()开门 cout endl “打开 “ num “号门 “ ; ERROR*found* if(closed) cout “门是开着的,无须再开门。
28、 “; else if(locked) cout “门是锁着的,打不开。 “; else closed=false; cout “门打开了。 ”; void close()关门 cout endl “关上 “ num “号门 “ ; if(closed) cout “门是关着的,无须再关门。 “; else closed=true; cout “门关上了。 “; ERROR*found* void lock()const锁门 cout endl “锁上 “ hum “号门 “ ; if(locked) cout “门是锁着的,无须再锁门。 “; else if(!closed) cout “先
29、关门 “ ; closed=true; locked=true; cout “门锁上了。 “; void unlock()开锁 cout endl “开 “ Hum “号门的锁 “ ; if(!locked) cout “门没有上锁,无须再开锁。 “; else locked=false; cout “锁开了。 “; ; int main() Door door(503); door open(); door unlock(); door open(); door open(); door lock(): return0; 三、简单应用题 42 请使用 VC6或使用【答题】菜单打开考生文件夹
30、proj2下的工程 proj2,该工程中包含一个程序文件 main cpp,其中有坐标点类 point、线段类 Line和三角形类Triangle的定义,还有 main函数的定义。程序中两点间距离的计算是按公式d= 实现的,三角形面积的计算是按公式 f=实现的,其中 s= 。请在程序中的横线处填写适当的代码,然后删除横线,以实现上述类定义。此程序的正确输出结果应为: side1: 9 43398Side2:5Side3: 8area: 20注意:只在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动 “ *found*”。 #include iostream #include c
31、math using namespace std; class Point坐标点类 public: const doublex, y;Point(double x=0 0, double y=0 0): x(x), y(y)*found*double distanceTo(_)const到指定点的距离return sqrt(x-p x)*(x-p x)+(y-p y)*(y-p y); ; class Line线段类public: const Point p1, p2;线段的两个端点*found*Line(Point p1, Point p2): _double length()constre
32、turn p1 distanceTo(p2); 线段的长度 ; class Triangle =角形类 public: const Point p1, p2, p3;三角形的三个顶点*found*Triangle(_): p1(p1), p2(p2),p3(p3)double length1()const边 p1, p2的长度 return Line(p1,p2) length(); double length2()const边 p2, p3的长度 return Line(p2,p3) length(); double length3()const边 p3, p1的长度 return Line
33、(p3,p1) length(); double area()const三角形面积*found*double s=_; return sqrt(s*(s-lengthl()*(s-length2()*(s-length3(); ; int main()Triangle r(Point(0 0, 8 0),Point(5 0, 0 0), Point(0 0, 0 O); cout “Side1: “ r length1()endl; cout “Side2: “ r lngth2() endl; cout “Side3: “r length3() endl; cout “area: “ r a
34、rea() endl; return0; 四、综合应用题 43 请使用 VC6或使用【答题】菜单打开考生文件夹 proj3下的工程 proj3,其中声明的 DataList类,是一个用于表示数据表的类。 DataList的重载运算符函数operator+,其功能是求当前数据表与另一个相同长度的数据表之和;即它返回一个数据表,其每个元素等于相应两个数据表对应元素之和。请编写这个 operator+函数。程序的正确输出应该是: 两个数据表: 1, 2, 3, 4, 5, 6 3, 4, 5, 6, 7, 8 两个数据表之和: 4, 6, 8, 20, 12, 14 要求: 补充编制的内容写在 “
35、*333*”与 “*666*”之间,不得修改程序的其他部分。 注意:程序最后将结果输出到文件 out dat中。输出函数 writeToFile已经编译为obj文件,并且在本程序中调用。 DataList h #include iostream using namespace std; class DataList数据表类 int len; double*d; public: DataList(int len, double data=NULL); DataList(DataList &data); int length()constreturn len; double getElement(
36、int i)constreturn di; DataList operator+(const DataList& list)const;两个数据表求和 void show()const;显示数据表 ; void writeToFile(char*, const DataList&); main cpp #include“DataList h“ DataList: DataList(int len, double data): len(len) d=new doublelen; for(int i=0; i len; i+) di=(data=NULL?0 0: datai); DataList
37、: DataList(DataList&data): len(data len) d=new doublelen; for(int i=0; i len; i+) di=data di; DataList DataList: operator+(const DataList&list)const两个数据表求和 double*dd=new doublelist length(); *333* *666* return DataList(list length(), dd); void DataList: show()const显示数据表 for(int i=0; i len-1; i+) cou
38、t di “, “; cout dlen-1 endl; int main() double s1=1, 2, 3, 4, 5, 6; double s2=3, 4, 5, 6, 7, 8; DataList list1(6, s1), list2(6, s2);定义两个数据表对象 cout “两个数据表: “ endl: list1 show(); list2 show(); cout endl “两个数据表之和 “ end!; (list1+list2) show(); writeToFile(“ “, list1+list2); return0; 国家二级( C+)机试模拟试卷 164答
39、案与解析 一、选择题 1 【正确答案 】 C 【试题解析】 算法的时间复杂度是指执行算法所需要的计算工作量。为了能够比较客观地反映出一个算法的效率,在度量一个算法的工作量时,不仅应该与所使用的计算机、程序设计语言以及程序编制者无关,而且还应该与算法实现过程中的许多细节无关。为此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。算法所执行的基本运算次数还与问题的规模有关;对应一个固定的规模,算法所执行的基本运算次数还可能与特定的输入有关。故本题答案为C选项。 2 【正确答案】 C 【试题解析】 堆排序最坏情况时间下的时 间复杂度为 O(nlog2n);希尔排序最坏情况时间下的时间
40、复杂度为 O(n1 5);快速排序、冒泡排序最坏情况时间下的时间复杂度为 O(n2)。故本题答案为 C选项。 3 【正确答案】 A 【试题解析】 栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即取出栈顶元素赋予指定变量。栈为空时,栈顶指针 top=0,经过入栈和退栈运算,指针始终指向栈顶元素。初始状态为 top=51。当 top=50时,则栈中 S(50: 51)存储着元素, 51-50=1,元素 个数为 1。故本题答案为 A选项。 4 【正确答案】 B 【试题解析】 根据二叉树的基本性质,对任何一棵二叉树,度为 O的结点 (即叶子
41、结点 )总是比度为 2的结点多一个。题目中度为 2的结点为 199个,则叶子结点为 199+l=200。故本题答案为 B选项。 5 【正确答案】 C 【试题解析】 仅使用顺序、选择、循环三种基本控制结构就足以表达出各种其他形式结构的程序设计方法。故本题答案为 C选项。 6 【正确答案】 A 【试题解析】 模块的扇出是指本模块的直属下层模块的个数,或者说是由一个模块直 接调用的其他模块数。题干中某系统为一个模块,其扇出数目为 n(n5),功能 2模块扇出数为 3,功能 n模块扇出数为 2,则该系统结构图的最大扇出数是n。故本题答案为 A选项。 7 【正确答案】 D 【试题解析】 软件需求规格说明
42、应重点描述软件的目标,软件的功能需求、性能需求、外部接口、属性及约束条件等。功能需求是软件需求规格说明,给出软件要执行什么功能的详尽描述。性能需求是指定量的描述软件系统应满足的具体性能需求,即各种软件功能的速度、响应时间、恢复时间。外部接口指软件如何与人、系统的硬件及其他硬件和其他 软件进行交互。属性是指与软件有关的质量属性,如正确性、可用性、可靠性、安全性、可维护性等。约束条件包括影响软件实现的各种设计约束,如使用的标准、编程语言、数据库完整性方针、资源限制、运行环境等方面的要求。故本题答案为 D选项。 8 【正确答案】 A 【试题解析】 数据库管理技术的三个阶段是人工管理阶段、文件系统阶段
43、和数据库系统阶段。人工管理阶段没有专门的软件对数据进行管理。故本题答案为 A选项。 9 【正确答案】 B 【试题解析】 实体是概念世界中的基本单位,是客观存在并可以相互区别的事物。 要建立表示学生选修课程活动的实体联系模型,能互相区别并可以联系起来的实体是学生和课程。故本题答案为 B选项。 10 【正确答案】 A 【试题解析】 范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式。目前关系数据库有六种范式:第一范式 (1NF)、第二范式 (2NF)、第三范式 (3NF)、 Boyce-Codd范式(BCNF)、第四范式 (4NF)和第五范式
44、(5NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二 范式 (2NF),其余范式以次类推。一般说来,数据库只需满足第三范式 (3NF)就行了。 第一范式:主属性 (主键 )不为空且不重复,字段不可再分 (存在非主属性对主属性的部分依赖 )。 第二范式:如果关系模式是第一范式,每个非主属性都没有对主键的部分依赖。 第三范式:如果关系模式是第二范式,没有非主属性对主键的传递依赖和部分依赖。 BCNF范式:所有属性都不传递依赖于关系的任何候选键。 题目中关系模式满足第二范式,但在关系模式 s中,学生所在系依赖于学号(S#Sd) ,但系本身确定了系主任 (
45、sdDc) ,存在传递依赖, 不满足第三范式。故本题答案为 A选项。 11 【正确答案】 D 【试题解析】 字符常量是单个字符,单引号 中只能有 1个字符,选项 A错误;字符串常量不能赋给字符变量,选项 B错误;常量字符串 “abede”包含 5个字符和1个空字符 0,需要 6个字节存放,选项 C错误;选项 D正确。本题答案为 D选项。 12 【正确答案】 A 【试题解析】 枚举类型中,如果当前枚举成员的值显示初始化,那么后一个枚举成员的值比当前枚举成员的直大 1,所以枚举类型 DAY中, SUN的值为 0, MON的值显示为 10, TUE的值为 11, WED的值为 12, THU的值为
46、13, FRI的值显示初始化为 20, SAT的值为 21,所以 for循环会执行 13次,输出 13个字符 a。本题答案为 A选项。 13 【正确答案】 B 【试题解析】 c类型字符串的结尾必须有空字符 0,所以常量字符串 “Rockets”包含 7个字符和 1个空字符 0,所以需要 8个字节空间来存放,选项 B错误。本题答案为 B选项。 14 【正确答案】 C 【试题解析】 变量 a是整型,所以地址为整型指针,不能赋给 void*类型,选项A错误;使用 new分配数 组空间时,必须使用 delete来释放数组空间,选项 B错误; new int*10是分配了 lO个整型指针数组,数组的每个元素都是整型指针,它无法赋给整型指针变量 ptr,选项 D错误。本题答案为 C选项。 15 【正确答案】 B 【试题解析】 程序通过 while循环,将 s累加为 i的平方,每次循环后