1、二级 C+机试-101 及答案解析(总分:100.00,做题时间:90 分钟)一、1改错题(总题数:1,分数:30.00)1.使用 VC6 打开考生文件夹下的工程 test38_1,此工程包含一个源程序文件 test38_1.cpp,但该程序运行有问题,请改正函数中的错误,使该程序的输出结果为:2 is a factor of 10源程序文件 test38_1.cpp 清单如下:#include iostream.hclass myclass/* found */int n,dpublic:myclass(int i, int j) n=i; d=j; friend int factor( m
2、yclass ob);/* found */int myclass:factor(myclass ob)/* found */if(ob.n%ob.d)return 1;elsereturn 0;void main()myclass ob1(10,2),ob2(13,3);if(factor(ob1)cout“2 is a factor of 10/n“;if(factor(ob2)cout“3 is not a factor of 13/n“;(分数:30.00)填空项 1:_二、2简单应用题(总题数:1,分数:40.00)2.请编写函数 fun(),其功能是计算并输出当 x0.97 时下列
3、多项式的值,直到|Sn-Sn-1|0.000001 为止。Sn=1+0.5x+0.5(0.5-1)x2/2!+0.5(0.5-1)(0.5-2)x3/3!+0.5(0.5-1)(0.5-2)(0.5-n+1)xn/n!例如:主函数从键盘给 x 输入 0.21 后,则输出为 s=1.100000。注意:部分源程序以存在文件 test38_2.cpp 中。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。文件 test38_2.cpp 的内容如下:#includestdio.h#includeiostream.h#includemath.hdoub
4、le fun(double x)void main( )double x, s;cout“Input x:“endl;cinx;s=fun(x);cout“s=“sendl;(分数:40.00)_三、3综合应用题(总题数:1,分数:30.00)3.使用 VC6 打开考生文件夹下的工程 test38_3。此工程包含一个 test38_3.cpp,其中定义了类complex,但类的定义并不完整。请按要求完成下列操作,将程序补充完整。(1)添加类 complex 的无参数的构造函数的定义,将私有成员 real 和 imag 都初始化为 0。请在注释“/*1*”之后添加适当的语句。(2)添加类 com
5、plex 的带两个参数的重载构造函数,两个参数 r 和 i 都是 double 类型,要求将 r 赋值给私有成员 real, i 赋值给私有成员 imag,同时允许调用时参数 i 可是省略,请在注释“/*2*”之后添加适当的语句。(3)完成类 complex 重载加法函数的定义,该函数直接返回一个类 complex 的对象,同时把参数对象 c 的实部 real 和虚部 imag 分别与当前对象对应部分分别相加,请在注释“/*3*”之后添加适当的语句。(4)完成类 complex 的友元函数 print 的定义,使其以格式“real+imagi”输出,请在注释“/*4*”之后添加适当的语句。源程
6、序文件 test38_3.cpp 清单如下;#include iostream.hclass complexpublic:/ * 1 */ * 2 *real=r;imag=i;complex operator+(complex friend void print(complex private:double real,imag;complex complex:operator+(complex void main( )complex c1(2.0,3.0),c2(4.0,-2.0),c3;c3=c1+c2;print(c3);c3=c3+complex(3.5);print(c3);(分数:
7、30.00)_二级 C+机试-101 答案解析(总分:100.00,做题时间:90 分钟)一、1改错题(总题数:1,分数:30.00)1.使用 VC6 打开考生文件夹下的工程 test38_1,此工程包含一个源程序文件 test38_1.cpp,但该程序运行有问题,请改正函数中的错误,使该程序的输出结果为:2 is a factor of 10源程序文件 test38_1.cpp 清单如下:#include iostream.hclass myclass/* found */int n,dpublic:myclass(int i, int j) n=i; d=j; friend int fac
8、tor( myclass ob);/* found */int myclass:factor(myclass ob)/* found */if(ob.n%ob.d)return 1;elsereturn 0;void main()myclass ob1(10,2),ob2(13,3);if(factor(ob1)cout“2 is a factor of 10/n“;if(factor(ob2)cout“3 is not a factor of 13/n“;(分数:30.00)填空项 1:_ (正确答案:(1) 错误:int n,d正确;int n,d;(2) 错误:int myclass:f
9、actor(myclass ob)正确:int factor(myclass ob)(3) 错误:if(ob.n%ob.d)正确:if(!(ob.n%ob.d))解析:解析(1)主要考查考生对于变量定义的理解,同类型的变量定义中间使用逗号分开,同时可以进行初始化,但是在整个定义的结尾必须使用分号,这是 C+的规定:(2)主要考查考生是否掌握了友元函数的定义,友元是在类的内部声明,类的外部实现的一种特殊的函数,它可以访问类内的所有成员,不过在类外的实现和调用的时候均不需要使用作用域符号“:”限制:(3)主要考查考生对于 if 条件语句的掌握,只有括号内的条件为真,即值为 1 时,才执行 if 后
10、面的语句,根据题目要求应该执行的是对象 ob1,即 2 可以整除 10,所以应该定义函数 factor 的返回值为能整除返回 1,否则为 0,而能够整除即取余运算值为 0,所以在判断前应该加上非运算。二、2简单应用题(总题数:1,分数:40.00)2.请编写函数 fun(),其功能是计算并输出当 x0.97 时下列多项式的值,直到|Sn-Sn-1|0.000001 为止。Sn=1+0.5x+0.5(0.5-1)x2/2!+0.5(0.5-1)(0.5-2)x3/3!+0.5(0.5-1)(0.5-2)(0.5-n+1)xn/n!例如:主函数从键盘给 x 输入 0.21 后,则输出为 s=1.1
11、00000。注意:部分源程序以存在文件 test38_2.cpp 中。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。文件 test38_2.cpp 的内容如下:#includestdio.h#includeiostream.h#includemath.hdouble fun(double x)void main( )double x, s;cout“Input x:“endl;cinx;s=fun(x);cout“s=“sendl;(分数:40.00)_正确答案:(double fun (double x)double s1=1.0,p=1
12、.0,sum=0.0,s0,t=1.0;int n=1;dos0=s1;sum+=s0;t*=n;P*= (0.5-n+1)*x;s1=p/t;n+;while (fabs(s1-s0)=le-6);return sum;)解析:解析 解答本题的关键是观察所给的多项式,并从中找出变化规律。观察得出,每一项分子的变化规律是每一项比前一项多乘一项“(0.5-n+1)*x”。分母的变化规律是每一项比前一项多乘一个 n(即在不断变化的各项的编号)。三、3综合应用题(总题数:1,分数:30.00)3.使用 VC6 打开考生文件夹下的工程 test38_3。此工程包含一个 test38_3.cpp,其中定
13、义了类complex,但类的定义并不完整。请按要求完成下列操作,将程序补充完整。(1)添加类 complex 的无参数的构造函数的定义,将私有成员 real 和 imag 都初始化为 0。请在注释“/*1*”之后添加适当的语句。(2)添加类 complex 的带两个参数的重载构造函数,两个参数 r 和 i 都是 double 类型,要求将 r 赋值给私有成员 real, i 赋值给私有成员 imag,同时允许调用时参数 i 可是省略,请在注释“/*2*”之后添加适当的语句。(3)完成类 complex 重载加法函数的定义,该函数直接返回一个类 complex 的对象,同时把参数对象 c 的实部
14、 real 和虚部 imag 分别与当前对象对应部分分别相加,请在注释“/*3*”之后添加适当的语句。(4)完成类 complex 的友元函数 print 的定义,使其以格式“real+imagi”输出,请在注释“/*4*”之后添加适当的语句。源程序文件 test38_3.cpp 清单如下;#include iostream.hclass complexpublic:/ * 1 */ * 2 *real=r;imag=i;complex operator+(complex friend void print(complex private:double real,imag;complex co
15、mplex:operator+(complex void main( )complex c1(2.0,3.0),c2(4.0,-2.0),c3;c3=c1+c2;print(c3);c3=c3+complex(3.5);print(c3);(分数:30.00)_正确答案:(1)complex( ) real=imag=0; (2)complex(double r, double i=0)(3)return complex(real+c.real,imag+c.imag);(4)void print(complex &c)解析:解析 主要考查考生对于类的构造函数重载、缺省参数的设置、运算符的重载和友元函数的定义的掌握,其中(2)使用了参数赋初值的方式使得带两个参数的构造函数可以省略后一个参数,这是一种重要的方法,(3)直接返回类的一个使用带两个参数的构造函数生成的临时对象,这是把运算符重载为类的成员函数时经常使用的方式,(4)友元函数应该在类内声明,类外定义调用时和普通函数样,这点要切记。