1、国家二级(C+)机试-试卷 25 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.要建立文件流并打开当前目录下的文件 file.dat 用于输入,下列语句中错误的是( )。(分数:2.00)A.ifstreamfin=ifstream.open(“file.dat“);B.ifstream*fin=newifstream(“file.dat“);C.ifstreamfin;fin.open(“file.dat“);D.ifstream*fin=newifstream();fin-open(“file.dat“);2.有如下程序段:int i
2、= 0, j = 1;nt / r = j; / int *p = / *p = / 其中会产生编译错误的语句是( )。(分数:2.00)A.B.C.D.3.下列有关继承和派生的叙述中,正确的是( )。(分数:2.00)A.派生类不能访问基类的保护成员B.作为虚基类的类不能被实例化C.派生类应当向基类的构造函数传递参数D.虚函数必须在派生类中重新实现4.下列关于栈叙述正确的是( )。(分数:2.00)A.算法就是程序B.设计算法时只需要考虑数据结构的设计C.设计算法时只需要考虑结果的可靠性D.以上三种说法都不对5.有如下程序段: int i=1; while(1) i+; if(i = 100
3、) break; if(i%2 = 0) cout open(“file.dat“);解析:解析:本题考查对文件流输入的操作,可以调用文件流的成员函数 pen,一般形式如下:文件流对象.open(磁盘文件名,输入/输出方式)。根据以上格式,可以判断 A 选项错误。2.有如下程序段:int i = 0, j = 1;nt / r = j; / int *p = / *p = / 其中会产生编译错误的语句是( )。(分数:2.00)A. B.C.D.解析:解析:本题考查指针和引用。为引用,使用正确;中 while(1) i+; if(i = 100) break; if(i%2 = 0) cout
4、 “括起来,这个表被称为类模板的模板参数表。类模板是类的抽象,类是类模板的实例。类模板使类中的一些数据成员和成员函数的参数或返回值可以取任意的数据类型。所以 B 选项正确。16.下列描述中,属于面向对象思想主要特征的是(分数:2.00)A.继承性 B.灵活性C.可重用性D.健壮性解析:解析:面向对象思想的主要特征有:封装、继承和多态。答案选 A。17.有如下类声明和函数声明 class Base int m; public: int n; protected: int p; ; class Derived: public Base int k; friend void f(Derived d)
5、; ;则在函数 f 中通过 d 可访问类数据成员的个数是(分数:2.00)A.1B.2C.3 D.4解析:解析:公有继承中,派生类不改变基类的成员访问权限(private 成员除外),即基类的 public 成员在派生类中是 public 成员,基类的 protected 成员在派生类中是 protected 成员;另外友元函数可以访问类的 private 成员、protected 成员和 public 成员,所以 f 函数中 d 可以访问的数据成员有:n、p、k;m 对派生类不可见;答案为 C。18.软件需求分析阶段的主要任务是(分数:2.00)A.确定软件开发方法B.确定软件开发工具C.确
6、定软件开发计划D.确定软件系统的功能 解析:解析:需求分析阶段的工作可以分为个方面:需求获取、需求分析、编写需求规格说明书和需求评审,包括确定软件系统的功能,D 选项正确。A、B、C 选项均为开发阶段工作。19.有如下类定义: class MyClass public: MyClass(double d=0.0):val(d) _ /类型转换运算符 int 的声明 private: double val; ;若要使语句序列 MyClass x(2.1); coutdata=100) (2)Score*s=newScore(); (3)S-setData(100);)解析:解析:(1)主要考查考
7、生对赋值运算符与相等运算符的掌握,在 if 判断条件中,赋值运算符始终为真,这里需要比较是否相等,使用相等运算符。 (2)主要考查考生对动态分配的掌握,由下面语句 s 通过箭头访问运算符访问成员函数可以判断,s 属于指针,new 运算符返回的是指针,所以修改为Score*s=new Score() (3)主要考查考生对类成员访问权限的掌握,不能通过 S 指针直接访问私有变量data,修改为通过成员函数 setData 来修改 data 值。三、简单应用题(总题数:1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj2 下的工程 proj2,此工程中含有一个源程序
8、文件 proj2epp,其中定义了 Array 类。在 C+程序中访问数组元素时,如果索引值(下标)小于 0 或者大于元素个数减 1,就会产生越界访问错误。Array 是一个带有检查越界访问功能的数组类,其成员列表如下:公有成员函数功能 GetValue 获取指定元素的值 SetValue 将指定元素设置为指定值 GetLength 获取元素个数私有成员函数功能 IsOutOfRange 检查索引是否越界私有数据成员功能_p 指向动态分配的整型数组的指针 size 存放元素个数 Array 类的构造函数会动态分配一个 int 类型数组,以存储给定数量的元素。在公有成员函数 GetValue 和
9、 SetValue 中,首先调用私有成员函数 IsOutOfRange 检查用于访问数组元素的索引是否越界,只有当索引值在有效范围内时,才能进行元素访问操作。请在横线处填写适当的代码,然后删除横线,以实现 Array 类的功能。此程序的正确输出结果应为:1,2,3,4,5,6,7,8,9,10 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。proj2cpp#includeiostreamusingnamespacestd;classArraypublic:Array(intsize)构造函数*found*下列语句动态分配一个 int 类型数组_p
10、=_;size=size;Array()delete_p;)析构函数 voidSetValue(intindex,intvalue)设置指定元素的值if(IsOutOfRange(index)ceEE“Indexoutofrange!“end1;reLurn;*found*_;intGetValue(intindex)const获取指定元素的值if(IsOutOfRange(index)cerE“Indexoutofrange!“end1;return-1;*fOUnd*_;intGetLength()constreturn_size;)获取元素个数private:int*p;intsize;
11、boolIsOutOfRange(intindex)const检查索引是否越界*found*if(index0|_)returntrue;elsereturnfalse;intmain()Arraya(10);for(inti=0;iaGetLength();i+)aSetValue(i,i+1);for(intj=0;jaGetLength()-1;j+)toutaGetValue(j)“,“;coutaGetValue(aGetLength()-1)end1;return0;(分数:2.00)_正确答案:(正确答案:(1)new int size (2)_pindex = value (3
12、)return _pindex (4)index _size)解析:解析:(1)主要考查考生对动态分配的掌握,题目要求分配一个 int 类型数组,数组长度为 size,应使用 new 语句分配空间,因此为 new intsize。 (2)主要考查考生对成员函数的掌握,先看函数功能:设置指定元素的值。index 为指定的下标,value 为指定的值,因此使用语句: _pindex = value;。 (3)主要考查考生对成员函数的掌握,函数功能为获取指定元素的值,index 为要求返回的元素的下标,直接使用return 语句返回数组元素即可。 (4)主要考查考生对 if 语句的掌握,函数功能是检
13、查索引是否越界,当index size 时,index 越界,返回 true。四、综合应用题(总题数:1,分数:2.00)43.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj3 下的工程 pl,og3,其中声明了 ValArray 类,该类在内部维护一个动态分配的 int 型数组 v。ValArr类的成员函数 cycle 用于对数组元素进行向左循环移动。调用一次 cycle 后,数组的第二个元素至最后一个元素都将向左移动一个位置,而最左端的元素将循环移动到最右端位置上。例如,若 ValArray 表示的数组为1,2,3,4,5,则第一次调用 cycle 后,数组变为2,3,4,5,
14、1,第二次调用 cycle 后,数组变为3,4,5,1,2,依次类推。请编写成员函数 cycle。在 main 函数中给出了一组测试数据,此情况下程序的输出应该是:v=1,2,3,4,5v=2,3,4,5,1v=3,4,5,l,2v=4,5,1,2,3v=5,1,2,3,4要求:补充编制的内容写在“*333*”与“*666*”之间,不得修改程序的其他部分。注意:程序最后将结果输出到文件 outdat 中。输出函数 writeToFfle 已经编译为 obj 文件,并且在本程序中调用。VaiArrayh#includeiostreamusingnamespacestd;classVaiArray
15、int*v;intsize;pubiic:VaiArray(constint*p,intn):size(n)v=newintsize;for(inti=0;isize;i+)vi=Pi;VaiArray()deletev;voidcycle();voidprint(ostream i size-1; i+) int temp = vi; vi = vi+1; vi+1 = temp; )解析:解析:程序要将数组 v 中的 size 个整数依次移动到它的前一个单元,其中第一个整数移到原来最后元素所在单元。for 循环语句用于遍历整个数组,每循环一次便将当前元素与后一个元素互换,因此循环变量的取值范围是 0 size-2,最后一个元素不需遍历。