1、国家二级(C+)机试模拟试卷 158 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列叙述中正确的是( )。(分数:2.00)A.算法就是程序B.设计算法时只需要考虑数据结构的设计C.设计算法时只需要考虑结果的可靠性D.以上三种说法都不对2.下列叙述中正确的是( )。(分数:2.00)A.有一个以上根结点的数据结构不一定是非线性结构B.只有一个根结点的数据结构不一定是线性结构C.循环链表是非线性结构D.双向链表是非线性结构3.下列关于二叉树的叙述中,正确的是( )。(分数:2.00)A.叶子结点总是比度为 2 的结点少一个B.叶子结点总是
2、比度为 2 的结点多一个C.叶子结点数是度为 2 的结点数的两倍D.度为 2 的结点数是度为 l 的结点数的两倍4.软件生命周期中的活动不包括( )。(分数:2.00)A.市场调研B.需求分析C.软件测试D.软件维护5.某系统总体结构图如下图所示: (分数:2.00)A.7B.6C.3D.26.程序调试的任务是( )。(分数:2.00)A.设计测试用例B.验证程序的正确性C.发现程序中的错误D.诊断和改正程序中的错误7.下列关于数据库设计的叙述中,正确的是( )。(分数:2.00)A.在需求分析阶段建立数据字典B.在概念设计阶段建立数据字典C.在逻辑设计阶段建立数据字典D.在物理设计阶段建立数
3、据字典8.数据库系统的三级模式不包括( )。(分数:2.00)A.概念模式B.内模式C.外模式D.数据模式9.有三个关系 R、S 和 T 如下: (分数:2.00)A.自然连接B.交C.投影D.并10.下列选项中属于面向对象设计方法主要特征的是( )。(分数:2.00)A.继承B.自顶向下C.模块化D.逐步求精11.下列字符串中不能作为 C+标识符使用的是( )。(分数:2.00)A.INTB.testC._1481D.1temp12.下列语句中错误的是( )。(分数:2.00)A.const int*p=0;B.const int y=99;C.const int x;D.const int
4、*p=new int(100);13.有如下程序: #includeiostream using namespace std;int main() int sum; for(int i=0;i3;i+=1) sum:i; for(int j=i;j9;j+)sum+=j; coutsumend1; return 0; 运行时的输出结果是( )。(分数:2.00)A.39B.17C.110D.3714.下列语句中,正确的是( )。(分数:2.00)A.char str=”abcde”;B.char*str=”abcde”;C.char str5=”abcde”;D.char* str5=”abe
5、de”;15.有如下程序段: int i=1;int j=4; int main() int i=8,j=i; coutijendl; 运行时的输出结果是( )。(分数:2.00)A.14B.81C.88D.1816.下列关于函数参数的叙述中,正确的是( )。(分数:2.00)A.在函数原型中不必声明形参类型B.在调用一个函数时,若函数中修改了形参变量的值,则对应的实参变量的值也被修改C.函数形参的生存期与整个程序的运行期相同D.函数的形参在函数被调用时获得初始值17.下列关于赋值运算符“=”重载的叙述中,正确的是( )。(分数:2.00)A.赋值运算符只能作为类的成员函数重载B.默认的赋值运
6、算符实现了”深层复制”功能C.重载的赋值运算符函数有两个本类对象作为形参D.如果已经定义了复制(拷贝)构造函数,就不能重载赋值运算符18.在对函数进行原型声明时,下列语法成分中不需要的是( )。(分数:2.00)A.函数返回类型B.函数参数列表C.函数名D.函数体19.在为一个类重载下列运算符时,只能作为该类成员函数重载的运算符是( )。(分数:2.00)A.+B.()C.D.+20.若已经声明了函数原型“bool fun(beol a,int b=0);”,则下列重载函数声明中正确的是( )。(分数:2.00)A.bool fun(bed a=true,int b=0);B.int fun(
7、bool a,int B);C.void fun(double a,int B);D.void fun(bool a,int b=0);21.下列运算符函数中,肯定不属于类 Number 的成员函数的是( )。(分数:2.00)A.Number operator+(Number);B.Number operator 一(Number);C.Number operator*(int);D.Number operator(Number,Number);22.已知函数 f 的原型为: void f(int int main() ERROR*found*MyClass obj;objPrint();r
8、eturn 0;(分数:2.00)_三、简单应用题(总题数:1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj2 下的工程 proj2,此工程包含有一个源程序文件 proj2cpp。其中定义了 Basel 类、Base2 类和 Derived 类。 Basel 是一个抽象类,其类体中声明了纯虚函数 Show。Base2 类的构造函数负责动态分配一个字符数组,并将形参指向的字符串复制到该数组中,复制功能要求通过调用 strcpy 函数来实现。Derived 类以公有继承方式继承 Basel 类,以私有继承方式继承 Base2 类。在 Derived 类的构造函数
9、的成员初始化列表中调用 Base 类的构造函数。 请在程序中的横线处填写适当的代码,然后删除横线,以完成 Base1、Base2 和 Derived 类的功能。此程序的正确输出结果应为: Im a derived class 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。/proj2,cpp#includeiostream#includecstringusing namespace std;class Baselpublic:*found*下列语句需要声明纯虚函数Show_; , clasS Base2 protected: char*p; Ba
10、se2(const char*s) _P=new charstrlen(s)+1;*found*下列语句将形参指向的字符串常量复制到该类的字符数组中_;一 Base2()delete_P; ; *found*Derived 类 公有继承Base1,私有继承 Base2 类 class Derived:_ public: *found*以下构造函数 调用 Base2 类构造函数 Derived(const char*s):_ void Show()cout_pendl;;int main()Base1*pb=new Derived(“Im a derived class”); pb-Show()
11、; delete pb; return 0;(分数:2.00)_四、综合应用题(总题数:1,分数:2.00)43.请使用 VC6 或使用【答题】菜单打开考生目录 proj3 下的工程文件 proj3,此工程中包含一个源程序文件 proj3cpp,补充编制 C+程序 proj3cpp,其功能是读取文本文件 indat 中的全部内容,将文本存放到 doc 类的对象 myD0c 中。然后将 myDoc 中的字符序列反转,并输出到文件 outdat 中。文件indat 的长度不大于 1000 字节。 要求: 补充编制的内容写在“*333*”与“*66666*”两行之间。实现将 myDoc 中的字符序列
12、反转,并将反转后的序列在屏幕上输出。不得修改程序的其他部分。 注意:程序最后已将结果输出到文件 outdat 中,输出函数 writeToFile 已经给出并且调用。/proj 3,cpp#includeiostream#includefstream#includecstringusing namespace std;class docprivate: char/str;文本字符串首地址 int length;/文本字符个数 public:构造函数,读取文件内容,用于初始化新对象,filename 是文件名字符串首地址 doc(char*filename); void reverse();将字
13、符序列反转 一 doc(); void writeToFile(char*filename);;doc:doc(char*filename) ifstream myFile(filename); int len=001,tmp; str=new charfen;length=0; while(tmp=myFileget()!=EOF) strlength+=tmp; strlength=0; myFileclose(); void doc:reverse() 将数组 str 中的 length 个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个 字符交换 *333* *666* d
14、oc:一 doc() deletestr; void doc:writeToFile (char * filename) ofstream outFile(filename); outFilestr; outFileclose(); void main() doc myDoc(”indat”); myDocreverse(); myDocwriteToFile(”outdat”); (分数:2.00)_国家二级(C+)机试模拟试卷 158 答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列叙述中正确的是( )。(分数:2.00)A.算法就是程
15、序B.设计算法时只需要考虑数据结构的设计C.设计算法时只需要考虑结果的可靠性D.以上三种说法都不对 解析:解析:算法是指解题方案的准确而完整的描述,算法不等于程序,也不等于计算方法,所以 A)错误。设计算法时不仅要考虑对数据对象的运算和操作,还要考虑算法的控制结构。2.下列叙述中正确的是( )。(分数:2.00)A.有一个以上根结点的数据结构不一定是非线性结构B.只有一个根结点的数据结构不一定是线性结构 C.循环链表是非线性结构D.双向链表是非线性结构解析:解析:线性结构应满足:有且只有一个根结点与每个结点最多有一个前件,也最多有一个后件,所以 B)正确。所以有一个以上根结点的数据结构一定是非
16、线性结构,所以 A)错误。循环链表和双向链表都是线性结构的数据结构。3.下列关于二叉树的叙述中,正确的是( )。(分数:2.00)A.叶子结点总是比度为 2 的结点少一个B.叶子结点总是比度为 2 的结点多一个 C.叶子结点数是度为 2 的结点数的两倍D.度为 2 的结点数是度为 l 的结点数的两倍解析:解析:根据二叉树的基本性质 3:在任意一棵二叉树中,度为 0 的叶子结点总是比度为 2 的结点多一个。所以选择 B)。4.软件生命周期中的活动不包括( )。(分数:2.00)A.市场调研 B.需求分析C.软件测试D.软件维护解析:解析:软件生命周期可以分为软件定义、软件开发与软件运行维护三个阶
17、段。主要活动阶段是:可行性研究与计划阶段、需求分析、软件设计、软件实现、软件测试、运行和维护,所以选择 A)。5.某系统总体结构图如下图所示: (分数:2.00)A.7B.6C.3 D.2解析:解析:根据总体结构图可以看出该树的深度为 3,比如:XY 系统一功能 2 一功能 21,就是最深的度数的一个表现。6.程序调试的任务是( )。(分数:2.00)A.设计测试用例B.验证程序的正确性C.发现程序中的错误D.诊断和改正程序中的错误 解析:解析:程序调试的任务是诊断和改正程序中的错误。7.下列关于数据库设计的叙述中,正确的是( )。(分数:2.00)A.在需求分析阶段建立数据字典 B.在概念设
18、计阶段建立数据字典C.在逻辑设计阶段建立数据字典D.在物理设计阶段建立数据字典解析:解析:数据字典是在需求分析阶段建立,在数据库设计过程中不断修改、充实和完善的。8.数据库系统的三级模式不包括( )。(分数:2.00)A.概念模式B.内模式C.外模式D.数据模式 解析:解析:数据库系统的三级模式是概念模式、外模式和内模式,所以选择 D.9.有三个关系 R、S 和 T 如下: (分数:2.00)A.自然连接 B.交C.投影D.并解析:解析:自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据 T 中元组可以判断 R 和 S 做的
19、是自然连接操作。10.下列选项中属于面向对象设计方法主要特征的是( )。(分数:2.00)A.继承 B.自顶向下C.模块化D.逐步求精解析:解析:面向对象基本方法的基本概念有对象、类和实例、消息、继承与多态性,所以选择 A.11.下列字符串中不能作为 C+标识符使用的是( )。(分数:2.00)A.INTB.testC._1481D.1temp 解析:解析:用来表示变量、符号常量、函数、数组类型等实体名字的有效字符序列称为标识符,标识符由字母、数字和下划线 3 种字符组成,且第一个字符必须为字母或者下划线。所以 D 选项错误。12.下列语句中错误的是( )。(分数:2.00)A.const i
20、nt*p=0;B.const int y=99;C.const int x; D.const int*p=new int(100);解析:解析:const 是一个 C+语言的关键字,它限定一个变量不允许被改变,const 常量、常量指针赋值时,均必须同时初始化。所以 C 选项错误。13.有如下程序: #includeiostream using namespace std;int main() int sum; for(int i=0;i3;i+=1) sum:i; for(int j=i;j9;j+)sum+=j; coutsumend1; return 0; 运行时的输出结果是( )。(分
21、数:2.00)A.39B.17C.110D.37 解析:解析:考查 for 循环语句,本题中两层 for 循环,每次 i 循环,sum 都被重新赋值,所以当 i=2 时,执行完 j 循环后瞰 m 为 37。所以答案为 D。14.下列语句中,正确的是( )。(分数:2.00)A.char str=”abcde”;B.char*str=”abcde”; C.char str5=”abcde”;D.char* str5=”abede”;解析:解析:本题考查字符串的定义,A 选项中,定义了一个字符,而用字符串赋值,所以错误,c 选项定义了字符数组,一个字符所占空间是 1 位,再加上隐含的“0”,一共是
22、 6 位,所以字符数组的大小应该为 6,D 选项定义了一个字符串指针数组,是指一个数组里面装着指针,赋值错误。所以答案为 B。15.有如下程序段: int i=1;int j=4; int main() int i=8,j=i; coutijendl; 运行时的输出结果是( )。(分数:2.00)A.14B.81C.88 D.18解析:解析:全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内部。在函数中使用全局变量,一般应作全局变量说明,本题中定义了两个全局变量 i,j,但
23、 main 函数中又对 i、j 进行了定义,所以输出为 88,所以答案为 C。16.下列关于函数参数的叙述中,正确的是( )。(分数:2.00)A.在函数原型中不必声明形参类型B.在调用一个函数时,若函数中修改了形参变量的值,则对应的实参变量的值也被修改C.函数形参的生存期与整个程序的运行期相同D.函数的形参在函数被调用时获得初始值 解析:解析:本题考查函数参数的相关知识,函数原型中必须声明形参类型,所以 A 选项错误,调用一个函数时如果修改了形参值,那么实参可能改变也可能不改变,所以 B 选项错误,函数形参的生存期一般在函数执行整个函数中存在,除了静态变量,所以 c 选项错误。17.下列关于
24、赋值运算符“=”重载的叙述中,正确的是( )。(分数:2.00)A.赋值运算符只能作为类的成员函数重载 B.默认的赋值运算符实现了”深层复制”功能C.重载的赋值运算符函数有两个本类对象作为形参D.如果已经定义了复制(拷贝)构造函数,就不能重载赋值运算符解析:解析:重载赋值运算符必须定义为类的成员函数,所以选项 A 正确。重载赋值运算符时应返回一个类的对象,所以 c 选项错误。如果已经定义了复制(拷贝)构造函数,仍然可以重载赋值运算符,所以 D 选项错误。18.在对函数进行原型声明时,下列语法成分中不需要的是( )。(分数:2.00)A.函数返回类型B.函数参数列表C.函数名D.函数体 解析:解
25、析:函数原型中,函数名、函数返回值、函数参数列表是需要的,而函数体在函数声明时不需要。所以答案为 D。19.在为一个类重载下列运算符时,只能作为该类成员函数重载的运算符是( )。(分数:2.00)A.+B.() C.D.+解析:解析:本题考查重载运算符,C+规定有的运算符(如赋值运算符、下标运算符、函数调用运算符)必须定义为类的成员函数。所以本题选 B。20.若已经声明了函数原型“bool fun(beol a,int b=0);”,则下列重载函数声明中正确的是( )。(分数:2.00)A.bool fun(bed a=true,int b=0);B.int fun(bool a,int B)
26、;C.void fun(double a,int B); D.void fun(bool a,int b=0);解析:解析:本题考查函数重载相关知识,重载函数是函数的一种特殊情况,为方便使用,C+允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。A、B、D 选项的部分形参都与原函数相同,所以不能作为重载函数,选项 C 正确。21.下列运算符函数中,肯定不属于类 Number 的成员函数的是( )。(分数:2.00)A.Number operator+(Number);B.Number oper
27、ator 一(Number);C.Number operator*(int);D.Number operator(Number,Number); 解析:解析:选项 D 的形式是重载为友元函数,而友元函数不属于类的成员函数。所以重载为友元函数需要两个参数,通过参数传递的方式得到参加运算的两个对象。其他的是重载为类的成员函数,由于对象本身代表了一个操作数,所以其参数只需要一个,其为参加运算的另一个操作数。22.已知函数 f 的原型为: void f(int int main() ERROR*found*MyClass obj;objPrint();return 0;(分数:2.00)_正确答案:(
28、正确答案:deletearray; COUtarrayi解析:解析:(1)语法错误,使用 delete 语句删除一个指针时,直接把指针变量的名称放在 delete后面即可。 (2)考查考生对输入、输出语句的运用。使用 cout 进行数据输出操作,一般格式为:COUtExpr;。其中,Expr 代表一个表达式,“”称为插入运算符,该语句的含义是,将表达式Expr 的值输出到屏幕上。使用 cin 进行数据输入操作,一般格式为:cinvar;。其中,vat 代表一个变量,“”称为提取运算符,该语句的含义是,将用户输入的数据保存到 var 中。 (3)考查语句的初始化,我们来看 MyClass 类的构
29、造函数: MyClass(lnt len) array=new intlen; 给数组动 态分配空间,大小为 len arraysize=len; 赋值 for(int i=0;iarraySize;i+) arrayi=i+1; 循环给数组赋 值,从 1 到 10 三、简单应用题(总题数:1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj2 下的工程 proj2,此工程包含有一个源程序文件 proj2cpp。其中定义了 Basel 类、Base2 类和 Derived 类。 Basel 是一个抽象类,其类体中声明了纯虚函数 Show。Base2 类的构造函数
30、负责动态分配一个字符数组,并将形参指向的字符串复制到该数组中,复制功能要求通过调用 strcpy 函数来实现。Derived 类以公有继承方式继承 Basel 类,以私有继承方式继承 Base2 类。在 Derived 类的构造函数的成员初始化列表中调用 Base 类的构造函数。 请在程序中的横线处填写适当的代码,然后删除横线,以完成 Base1、Base2 和 Derived 类的功能。此程序的正确输出结果应为: Im a derived class 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。/proj2,cpp#includeiostre
31、am#includecstringusing namespace std;class Baselpublic:*found*下列语句需要声明纯虚函数Show_; , clasS Base2 protected: char*p; Base2(const char*s) _P=new charstrlen(s)+1;*found*下列语句将形参指向的字符串常量复制到该类的字符数组中_;一 Base2()delete_P; ; *found*Derived 类 公有继承Base1,私有继承 Base2 类 class Derived:_ public: *found*以下构造函数 调用 Base2
32、类构造函数 Derived(const char*s):_ void Show()cout_pendl;;int main()Base1*pb=new Derived(“Im a derived class”); pb-Show(); delete pb; return 0;(分数:2.00)_正确答案:(正确答案:(I)virtual void Show()=0 (2)strcpy(_p,S) (3)public Basel,private Base2 (4)Base2(S)解析:解析:(1)主要考查的是纯虚函数的定义。题目要求声明纯虚函数 Show,因此首先看 Base1 类的派生类 De
33、rived 类中 Show 函数的定义: void Show() cout_p四、综合应用题(总题数:1,分数:2.00)43.请使用 VC6 或使用【答题】菜单打开考生目录 proj3 下的工程文件 proj3,此工程中包含一个源程序文件 proj3cpp,补充编制 C+程序 proj3cpp,其功能是读取文本文件 indat 中的全部内容,将文本存放到 doc 类的对象 myD0c 中。然后将 myDoc 中的字符序列反转,并输出到文件 outdat 中。文件indat 的长度不大于 1000 字节。 要求: 补充编制的内容写在“*333*”与“*66666*”两行之间。实现将 myDoc
34、 中的字符序列反转,并将反转后的序列在屏幕上输出。不得修改程序的其他部分。 注意:程序最后已将结果输出到文件 outdat 中,输出函数 writeToFile 已经给出并且调用。/proj 3,cpp#includeiostream#includefstream#includecstringusing namespace std;class docprivate: char/str;文本字符串首地址 int length;/文本字符个数 public:构造函数,读取文件内容,用于初始化新对象,filename 是文件名字符串首地址 doc(char*filename); void rever
35、se();将字符序列反转 一 doc(); void writeToFile(char*filename);;doc:doc(char*filename) ifstream myFile(filename); int len=001,tmp; str=new charfen;length=0; while(tmp=myFileget()!=EOF) strlength+=tmp; strlength=0; myFileclose(); void doc:reverse() 将数组 str 中的 length 个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个 字符交换 *333*
36、*666* doc:一 doc() deletestr; void doc:writeToFile (char * filename) ofstream outFile(filename); outFilestr; outFileclose(); void main() doc myDoc(”indat”); myDocreverse(); myDocwriteToFile(”outdat”); (分数:2.00)_正确答案:(正确答案:int i,j; 定义两个整数临时变量 ij for(i=0,j=length 一1;ij;i+, j 一一) char temp=stri; 把 Stri中
37、的值保存在临时变量 temp stri=strj; 把 Strj值赋给 Stri,实现字符前后替换 strj=temp; 把保存在临时变量temp 中的值再赋值给 Strj )解析:解析:题目要求将 myDoc 中的字符序列反转,在 main 函数中我们看到 myDoc 是 doc 类,根据 doc类的定义可以知道它是把读取文件的字符串存到 str 动态数组中。reverse 函数实现将数组 str 中的length 个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个字符交换,依次类推。使用变量 i 和 j,分别表示第一个字符和最后一个字符的下标,定义 temp 作为中间变量进行交换。