1、国家二级( C+)机试模拟试卷 40及答案与解析 一、程序改错题( 30分) 1 使用 VC6打开考生文件夹下的工程 test26_1,此工程包含一个源程序文件test26_1.cpp,但该程序运行有问题,请改正 函数中的错误,使该程序的输出结果为: Values are: 1, 2 and 3 源程序文件 test26_1.cpp清单如下; #include iostream.h class CommonBase public: int x; ; /*found*/ class DeriveCommonA:public CommonBase public: int y; ; class De
2、riveCommonB:public CommonBase public: int z; ; /*found*/ class Overlapping:public DeriveCommonA; public DeriveCommonB public: void Display() cout “Values are: “ DeriveCommonA:x “, “ y “ and “ z end1; ; int main ( ) Overlapping ov; /*found*/ ov.x=1; ov.y=2; ov.z=3; ov.Display(); return 0; 二、简单应用题( 40
3、分) 2 请编写函数 fun(),其功能是将 s所指字符串中除了下标为奇数、同时 ASCII值也为奇数的字符之外,其余的所有字符都删除。字符串中剩余的字符所形成的一个新的字符串放在 t所指的数组中。 例如: s所指字符串中的内容为 ABCDEFG12345,其中字符 A,的 ASCII码值虽为奇数,但元素所在的下标为偶数,因此必需删除;字符 1的 ASCII码值为奇数,所在数组中的 下标也为奇数,不删除,最后 t所指的数组中的内容应是 135。 请勿修改主函数 main和其他函数中的任何内容,仅在函数 su的花括号中填写若干语句。 文件 test 27_2.cpp的内容如下; #include
4、 conio.h #include stdio.h #include iostream.h #include string.h void fun(char *s,char t ) void main ( ) char s100,t100; cout “Please enter string S: “ end1; gets(s); fun(s, t); puts(t); 三、综合应用题( 30分) 3 使用 VC6打开考生文件夹下的工程 test25_3,此工程包含一个源程序文件test25_3.cpp,其中定义了用于表示堆的类 Set,但 它的定义并不完整。请按要求完成下列操作,将程序补充完整
5、。 (1)完成成员函数 int IsMemberOf(int n)的定义,该函数检查参数 n是否在类的数据成员数组 elems中,如果在返回 1,反之返回 0。请在注释 “/*1*”之后添加适当的语句。 (2)完成成员函数 int Add(int n)的定义,如果参数 n包含在类的数据成员数组elems中则返回 1如果数组超界则返回 0,如果都不是,则将参数 n插入到 elems中 ,下标大小为类的数据成员 PC,之后 PC自加一。请在注释 “/*2*”之后添加 适当的语句。 (3)完成拷贝初始化构造函数 Set(Set Set(Set void Empty() PC=O; int IsEmp
6、ty() return PC=O; int IsMemberOf(int n); int Add(int n); void Print(); private: int elems100; int PC; ; int Set:IsMemberOf(int n) /*1* if(elemsi=n) return 1; return O; int Set:Add(int n) /*2* return 1; else if(PC =100) return O; else elemsPC+=n; return 1; Set:Set(Set i PC; i+) elemsi=s.elemsi; void
7、Set:Print() cout “; for(int i=O; i PC-1; i+) cout elemsi “,“; if(PC O) cout elemsPC-1; cout “ endl; void main() Set A; cout A.IsEmpty() endl; A.Print(); Set B; for(int i=l; i =8; i+) B.Add(i); B.Print(); 国家二级( C+)机试模拟试卷 40答案与解析 一、程序改错题( 30分) 1 【正确答案】 (1)错误: class DeriveCommonA:public CommonBase 正确:
8、class DeriveCommonA:public CommonBase (2)错误: class Overlapping:public DeriveCommonA; public DeriveCommonB 正确: class Overlapping:public DeriveCommonA, public DeriveCommonB (3)错误: ov.x=1; 正确: ov.DeriveCommonA:x=1; 【试题解析】 (1)主要考查考生对于派生类定义的理解, C+规定的继承格式是在类名 的后面加冒号,之后是继承方式和继承类的名称,题目中错误的使用了作用域运算符 ; (2)主要考
9、查考生是否掌握了多继承的定义,多继承的格式基本上和单继承相同,不过在多个基类之间应该使用逗号分开,题目中错误的使用了分号,分号在 C+中是结束标志; (3)主要考查考生对于派生类的对象访问的掌握, x是类 CommonBase的成员,如果不加限制的访问就会产生二义性 ,编译程序不知道这个 x是 A类的,还是 B类的,所以必须使用作用域限制符 “:”,为了解决这个问题可以使用虚基类。 二、简单应用题( 40分) 2 【正确答案】 void fun(char *s,char t ) int i,j=0,n; n=strlen(s); for(i=0;i n;i+) if(i%2!=0j+; tj=0; 【试题解析】 在解答本题时,首先要清楚一点:那就是在字符参与数值运算时,用的是其 ASCII码值来进行计算。另外的一个考查点是判断某数是奇数的方法,即判断该数与 2的余数是否为 0。 三、综合 应用题( 30分) 3 【正确答案】 (1) for(int i=O; i PC; i+) (2) if(IsMemberOf(n) (3) PC=s.PC; 【试题解析】 本题主要考查考生对于类的成员函数的定义和拷贝初始化函数的理解。