1、国家二级 C+机试(操作题)模拟试卷 497及答案与解析 一、基本操作题 1 请打开考生文件夹下的解决方案文件 proj1,此工程包含有一个源程序文件proj1 cpp。其中位于每个注释 “ ERROR*found*”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: (4, 4) 注意:只修改注释 “ ERROR*found*”的下一行语句,不要改动程序中的其他内容。 proj1 cpp include iostream using namespace std; class Point publiC: ERROR*found* Point(double x, double y)_x
2、(x), _y(y) double GetX( )constreturn_x; double GetY( )constreturn_y; ERROR*found* void Nove(doublexOff, double yOff)const x+=xOff; y+=yOff; protected: double x, y; ; int main( ) Point pt(1 5, 2 5); pt Nove(2 5, 1 5); ERROR*ound* 以下语句输出 pt成员 _x和 _y的值 cout ( pt _x , pt _y ) endl; return0; 二、简单应用题 2 请打
3、开考生文件夹下的解决方案文件 proj2,此工程中包含一个程序文件main cpp,其中有 “部门 ”类 Department和 “职工 ”类 Staff的定义,还有主函数main的定义。在主 函数中定义了两个 “职工 ”对象,他们属于同一部门。程序展示,当该部门改换办公室后,这两个人的办公室也同时得到改变。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 改换办公室前: 职工号: 0789 姓名:张三 部门:人事处办公室: 521 职工号: 0513 姓名:李四 部门:人事处办公室: 521 改换办公室后: 职工号: 0789 姓名:张三 部门:人事处
4、办公室: 311 职工号: 0513 姓名:李四 部门:人事处办公室: 311 注意:只在横线处填写适当的代码 ,不要改动程序中的其他内容。 #include iostream using namespace std; class Department “部门 ”类 public: Department(const char*name, const char*office) strcpy(this- name, name); *found* _ const char*getName( )constreturn name; )返回部门名称 *found* const char*getOffice
5、( )const_返回办公室房号 void changeOfficeTo(constchar*office)改换为指定房号的另一个办公室 strcpy(this- office, office); private: char name20;部门名称 char office20;部门所在办公室房号 ; class Staff “职工 ”类 public: *found* Staff(const char*my_id, const char*my_name, Department&my_dept): _ Strcpy(this- staff_id, my_id); strcpy(this- nam
6、e, my_name); const char*getID( )constreturn Staff_id; const char*getName( )constreturn name; Department getDepartment( ) constreturn dept; private: char staff id10;职工号 char name20;姓名 Department&dept;所在部门 ; void showStaff(Staff&staff) cout “职工号: “ staff getID( ) “ “; cout “姓名: “ staff getName( ) “ “;
7、 cout “部门: “ staff getDepartment( ) getName( ) “; cout “办公室: “ staff getDeartment( ) getOffice( ) endl; int main( ) Department dept(“人事处 “, “521“); StaffZhang(“0789“, “张三 “, dept), Li(“0513“, “李四 “, dept); cout “改换办公室前: “ endl; showStaff(Zhang); showStaff(Li); 人事处办公室由 521搬到 311 *found* _ cout “改换办公室
8、后: “ endl; showStaff(Zhang); showStaff(Li); return0; 三、综合应用题 3 请打开考生文件夹下的解决方案文件 proj3,其中声明了 MiniComplex是一个用于表示复数的类。请编写这个 operator+运算符函数,以实现复数的求和运算。两个复数的和是指这样一个复数:其实部等于两个复数的实部之和,其虚部等于两个复数的虚部之和。例如, (23+34i)+(56+35i)等于 (79+69i)。 要求: 补充编制的内容写在 “ *333*”与 “ *666*”之间,不得修改程序的其他部分。 注意:程序最后将结果输出到文件 out dat中。输
9、出函数 writeToFile已经编译为obj文件,并且在本程序中调用。 Minicomplex h #include iostream using namespace std; class MiniComplex复数类 public: 重载流插入和提取运算符 friend ostream&operator (ostream& osObject, constMiniComplex&complex) osobject “f“ complex realPart “+“ complex imagPart “i“)“; return osObject; friend istream& operator
10、 (istream&isObject, MiniComplex&complex) char ch; isObject complex realPart ch complex imagPart ch; return isObject; MiniComplex(double real=0, double imag=0); 构造函数 MiniComplex operator+(constMiniComplex&otherComplex)const; 重载运算符 + private: double realPart;存储实部变量 double imagPart;存储虚部变量 ; void writeT
11、oFile(char*); main cpp #include“MiniC0mplex h“ MiniComplex: MiniComplex(double real, double imag)realPart=real;imagPart=imag; MiniComplex MiniComplex: operator+(const MiniComplex&otherComplex)const *333* *666* int main( ) void writeToFile(char*); MiniComplex num1(23, 34), num2(56, 35); cout “Initial
12、 Value of Num1=“ num1 “ nlnitial Value of Num2=“num2 endl; cout num1 “+“ num2 “=“ num1+num2 endl;使用重载的加号运算符 writeToFile(“ “); return0; 国家二级 C+机试(操作题)模拟试卷 497答案与解析 一、基本操作题 1 【正确答案】 (1)Point(double x, double y): _x(x), _y(y)或 Point(double x,double y)_x=x; _y=y; (2)void Move(dotlble xOff, double yoff)
13、(3)cout ( pt GetX( ) , pt GetY( ) ) endl; 【试题解析】 (1)主要考查的是构造函数的成员初始化列表的语法,在成员列表之前必须加 “: ”。 (2)主要考查成员函数中 const的使用,先 看 Move函数的函数体: _x+=xOff; _y+=yoff; 可以看到 Point类的两个私有成员 _x和 _y的值都发生了变化,因此 Move函数不能使用 const,因为只有在函数内不改变类的成员的值时才能使用 const。 (3)主要考查私有成员不能被类外函数调用的知识。题目要求输出 pt成员 _x和 _y的值,从 Point类中的函数 double Ge
14、tx( )constreturn_x; 和 double GetY( )constreturn_y; ,可以分别得到 _x和 _y的值,因此这里使用语句 cout ( pt Cetx( ) , pt GetY( ) ) endl;调用成员函数Getx( )和 GelY( )来实现题目要求。 二、简单应用题 2 【正确答案】 (1)strcpy(this- office, office); (2)return office; (3)dept(my_dept) (4)dept change( )fficeTo(“311“); 【试题解析】 (1)主要考查考生对 strcpy函数的掌握情况,根据上一
15、条语句:strcpy(this- name, name);可知,这条语句复制的是 office,即 strcpy(this-office, office);。 (2)主要考查考生对成员函数的掌握情况,根据语句的注释:返回办公室房号可知,要填写的是一条 return语句。在私有成员里: char office20;部门所在办公室房号,表明 office即为办公室房号。因此直接返回 office即可。 (3)主要考查考生对构造函数的掌握情况,根据函数体: strcpy(this- staff_id, my_id); strcpy(this- Dame, my_name); 可知,只有 dept没有
16、初始化,而空格前有字符 “: ”,这是成员列表初始化的标识符,因此填写 dept(my_dept)即可。 (4)主要考查考生对成员函数的调用的掌握情况,根据题目要求:人事处办公室由521搬到 311。在 Department类中有函数 void changeOfficeTo(const char*office)可以修改办公室的房间号,直接调用即可。 三、综合应用题 3 【正确答案】 MiniComplex sum;定义复数对象 Sum sum imagPart=this- imagPart+otherComplex imagPart;把 this中的虚部(this- imagPart)和 ot
17、hercomplex虚部相加赋值给 Sum虚部 sum realPart=this- realPart+otherComplex realPart;把 this中的实部 (this-reapart)加上 othercomplex实部赋值给 Sum实部 return sum;返回对象 sum 【试题解析】 主要考查考生对运算符重载的掌握,题目要求编写 operater+运算符函数,以实现复数的求和与 运算。复数的和的实部等于两个复数的实部之和,虚部等于两个复数的虚部之和。函数要返回的类型是 MiniComplex,因此要先定义一个 MiniComplex类型变量 sum,然后对它们的实部和虚部各自求和,返回sum即可。