1、二级 C+机试-87 及答案解析(总分:100.00,做题时间:90 分钟)一、1改错题(总题数:1,分数:30.00)1.使用 VC6 打开考生文件夹下的工程 test32_1,此工程包含一个源程序文件 test32_1.cpp,但该程序运行有问题,请改正函数中的错误,使该程序的输出结果为:Added Result for this C+tutorial:3源程序文件 test32_1.cpp 清单如下:/* found */#includeiostreamclass CPP_Tutorialint private_data;/* found */class friendclass;publ
2、ic:CPP_Tutorial()private_data = 5;class friendclasspublic:int subtractfrom(int x)CPP_Tutorial var2;/* found */return var2 - x;void main()friendclass var3;cout “Added Result for this C+ tutorial: “ var3.subtractfrom(2)end1;(分数:30.00)填空项 1:_二、2简单应用题(总题数:1,分数:40.00)2.请编写一个函数 fun(char*num),该函数返回与传入的二进制数
3、相应的十进制数,参数 num 指向存放 8位二进制数的字符数组。二进制数转换为十进制数的方法是将二进制数的每一位乘以该位的权然后相加,如二进制数 10010100=1*27+0*26 +0*25+1*24+0*23+1*22+0*21+2*0=148。注意:部分源程序已存在文件 test32_2.cpp 中。请勿修改主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填写若干语句。文件 test32_2.cpp 的内容如下:#includeiostream.hint fun(char *num)void main ( )char num8,ch;cout“Enter an 8
4、 bit binary number“;for(int i=0;i8;i+)cinch;numi=ch;coutfun(num)end1;(分数:40.00)_三、3综合应用题(总题数:1,分数:30.00)3.使用 VC6 打开考生文件夹下的工程 test32_3。此工程包含一个 test32_3.cpp,其中定义了复数类complex,但该类的定义并不完整。请按要求完成下列操作,将程序补充完整。(1)定义复数类 complex 的私有数据成员 real 和 image,用来分别表示复数的实部和虚部,它们都是double 型的数据。请在注释“/*1*”之后添加适当的语句。(2)添加复数类 c
5、omplex 的带一个参数的构造函数,分别将 real 和 image 赋值为参数 r 的值和 0.0,请在注释“/*2*”之后添加适当的语句。(3)完成复数类 complex 的“+”运算符重载成员函数的定义,两个复数相加是将复数的实部和虚部分别进行相加,请在注释“/*3*”之后添加适当的语句。(4)完成复数类 complex 的友元函数 isequal(complex *cl,complex *c2)的定义,如果复数 c1 与 c2 相等即 c1 与 c2 的实部和虚部分别相等,则返回 1,否则返回 0。请在注释“/*4*”之后添加适当的语句。程序输出结果如下:36+0i=36+0i注意:
6、除在指定位置添加语句之外,请不要改动程序中的其他内容。源程序文件 test32_3.cpp 清单如下:#include iostream.hclass complex/* 1 *public:complex()real=image=O.O;complex(double r)/* 2 *complex operator+(const complex friend bool isequal(complex *c1,complex *c2void display();complex complex:operator+(const complex temp.image=image+c.image;re
7、turn temp;bool isequal(complex *c1,complex *c2)/ /* 4 *return 1;elsereturn 0;void complex: display()coutreal;if (image=0) cout“+“image“i“;else if (image0) coutimage“i“;void main()complex c1,c2(36.0);c1=c1+c2;c1.display();if (isequal(else coat“;c2.display();coutend1;(分数:30.00)_二级 C+机试-87 答案解析(总分:100.
8、00,做题时间:90 分钟)一、1改错题(总题数:1,分数:30.00)1.使用 VC6 打开考生文件夹下的工程 test32_1,此工程包含一个源程序文件 test32_1.cpp,但该程序运行有问题,请改正函数中的错误,使该程序的输出结果为:Added Result for this C+tutorial:3源程序文件 test32_1.cpp 清单如下:/* found */#includeiostreamclass CPP_Tutorialint private_data;/* found */class friendclass;public:CPP_Tutorial()private
9、_data = 5;class friendclasspublic:int subtractfrom(int x)CPP_Tutorial var2;/* found */return var2 - x;void main()friendclass var3;cout “Added Result for this C+ tutorial: “ var3.subtractfrom(2)end1;(分数:30.00)填空项 1:_ (正确答案:(1) 错误:gincludeiostream正确:#includeiostream.h(2) 错误:class friendclass;正确:friend
10、 class friendclass;(3) 错误:return var2-x;正确;return var2.private_data-x;)解析:解析 (1)主要考查考生是否理解头文件的概念,在 C+中可以把已经定义好的或者系统自带的类定义引入自建的工程中,其方式就是通过使用头文件,把要引入的结构放在头文件(.h 结尾的)中,在自建工程的开头使用#include 加入即可,不过应该使用头文件的全名,题目中错误的丢掉了扩展名.h;(2)主要考查考生是否掌握了友元类的定义,友元类是声明在一个类内的新的类,友元类的所有成员都可以访问原来类的所有成员,所以友元类破坏了程序的封装性,不过只有友元类和友
11、元函数能够直接访问所在类的私有成员,题目中的类 friendclass 将要访问所在类的私有成员,所以应该被定义成友元类;(3)主要考查考生对于对象和对象成员操作的掌握,var2 是类 CPP_Tutorial 的对象,它不能直接和数据成员操作,应该使用对象访问成员的操作符“.”操作它的数据成员 private_data 和 x 进行操作。二、2简单应用题(总题数:1,分数:40.00)2.请编写一个函数 fun(char*num),该函数返回与传入的二进制数相应的十进制数,参数 num 指向存放 8位二进制数的字符数组。二进制数转换为十进制数的方法是将二进制数的每一位乘以该位的权然后相加,如
12、二进制数 10010100=1*27+0*26 +0*25+1*24+0*23+1*22+0*21+2*0=148。注意:部分源程序已存在文件 test32_2.cpp 中。请勿修改主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填写若干语句。文件 test32_2.cpp 的内容如下:#includeiostream.hint fun(char *num)void main ( )char num8,ch;cout“Enter an 8 bit binary number“;for(int i=0;i8;i+)cinch;numi=ch;coutfun(num)end1
13、;(分数:40.00)_正确答案:(int fun(char *num)int result=0;int middle;for(int i7;i=0;i-)if (humi = 1 )middle=l;for(iht k=l;k=(7-i);k+)middle=middle*2;result =result+middle;return result)解析:解析 本题为条件判断语句、循环语句和数组的综合应用。需要注意的是数组下标为 0 的元素存放的为二进制数中权最大的位,而数组下标为 7 的元素存放的为二进制数中权最小的位,而且在数组中存放的是二进制数的字符串,需要将每个字符转换成相应的整型数字
14、才能乘以相应的权。三、3综合应用题(总题数:1,分数:30.00)3.使用 VC6 打开考生文件夹下的工程 test32_3。此工程包含一个 test32_3.cpp,其中定义了复数类complex,但该类的定义并不完整。请按要求完成下列操作,将程序补充完整。(1)定义复数类 complex 的私有数据成员 real 和 image,用来分别表示复数的实部和虚部,它们都是double 型的数据。请在注释“/*1*”之后添加适当的语句。(2)添加复数类 complex 的带一个参数的构造函数,分别将 real 和 image 赋值为参数 r 的值和 0.0,请在注释“/*2*”之后添加适当的语句
15、。(3)完成复数类 complex 的“+”运算符重载成员函数的定义,两个复数相加是将复数的实部和虚部分别进行相加,请在注释“/*3*”之后添加适当的语句。(4)完成复数类 complex 的友元函数 isequal(complex *cl,complex *c2)的定义,如果复数 c1 与 c2 相等即 c1 与 c2 的实部和虚部分别相等,则返回 1,否则返回 0。请在注释“/*4*”之后添加适当的语句。程序输出结果如下:36+0i=36+0i注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。源程序文件 test32_3.cpp 清单如下:#include iostream.hc
16、lass complex/* 1 *public:complex()real=image=O.O;complex(double r)/* 2 *complex operator+(const complex friend bool isequal(complex *c1,complex *c2void display();complex complex:operator+(const complex temp.image=image+c.image;return temp;bool isequal(complex *c1,complex *c2)/ /* 4 *return 1;elseret
17、urn 0;void complex: display()coutreal;if (image=0) cout“+“image“i“;else if (image0) coutimage“i“;void main()complex c1,c2(36.0);c1=c1+c2;c1.display();if (isequal(else coat“;c2.display();coutend1;(分数:30.00)_正确答案:(1)double real,image;(2)realr;image=0.0;(3)complex temp;(4)if(c1-real=c2-real)&(c1-image=c2-image)解析:解析 本题主要考查了类的定义、类构造函数的重载、运算符重载和友元函数等知识点。特别是在重载运算符“+”中临时复数类的申请,相加的两个复数实部与虚部数值的获取,都是需要牢记的,这是运算符重载函数编写的核心所在。