1、国家二级 C+机试(操作题)模拟试卷 146及答案与解析 一、基本操作题 1 请使用 VC6或使用【答题】菜单打开考生文件夹 projl下的工程 proj1。该工程中包含程序文件 mmn cpp,其中有类 CDate(“日期 ”)和主函数 main的定义。程序中位于每个 “ ERROR*found*”之后的一行语句有错误,请加以改正。改正后程序的输出结果应为: 原日期: 2005925 更新后的日期: 200641 注意:只修改每个 “ ERROR*fould*”下的那一行,不要改动程序中 的其他内容。 #include #include using namespace std; class
2、CDate日期类 ERROR*found* protected: CDate(); CDate(int d, int m, int y) ERROR* found* SetDate(int day=d, int month=m, int year=y); ; void Display();显示日期 void SetDate(int day, int month, int year) 设置日期 m_nDay=day; m nNonth=month; mnYear=year; ) private: int m_nDay;日 int m nNonth;月 int m nYear;年 ; void C
3、Date: Display()显示日期 ERROR*found* cout #include using namespace std; class Employee public: Employee(string name, string dept): *found* virtual void print()const; string dept()const返回部门名称 *found* virtualEmployee() private: string name一; string dept一; ; class Manager: public Employee public: Manager(s
4、tring name, string dept, int level): *found* virtual void print()const; private: int level; , void Employee: print()const coutprint(); delete emp; return 0; 三、综合应用题 3 请使用 VC6或使用【答题】菜单打开考生目录 proj3下的工程文件 proj3,其中该工程中包含定义了用于表示姓名的抽象类 Name、表示 “先名后姓 ”的姓名类Namel(名、姓之间用空格隔开 )和表示 “先姓后名 ”的姓名类 Name2(姓、名之间用逗号隔开
5、);程序应当显示: John Smith Smith, John 但程序 中有缺失部分,请按照以下提示,把缺失部分补充完整: (1)在 “ *1* *found*”的下方是函数 show中的一个语句,它按先名后姓的格式输出姓名。 (2)在 “ *2* *found*”的下方是函数 getWord中的一个语句,它把一个字符序列复制到 head所指向的字符空间中,复制从 start所指向的字符开始,共复制 end一 8tart个字符。 (3)在 “ *3* *found*”的下方是函数 ereateName中的语句,它根据指针 P的值决定返回何种对 象:如果 P为空,直接返回一个 Name1对象,
6、否则直接返回一个 Name2对象。注意:返回的 Name1或 Name2对象必须是动态对象,返回的实际是指向它的指针。 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动 “*found*”。填写的内容必须在一行中完成,否则评分将产生错误。 proj3 cpp #include using namespace std; clasS Name protected: char*surname; 姓 char*firstname; 4 public: 一 Name()deletesurname; delete firstname; ) virtual void show()=
7、0; ; class Namel: public Name public: Namel(const char*name); *1* *found* void show()_; ) ; clasS Name2: public Name public: Name2(const char*name); VOid show() cout show(); coutshow(); coutendl; delete n; return 0; 国家二级 C+机试(操作题)模拟试卷 146答案与解析 一、基本操作题 1 【正确答案】 (1)public: (2)SetDate(d, m, y); (3)cout
8、m_nYear”一 ”mnMonth ”一 ”mnDay; 【试题解析】 本题考查 CDate类,其中涉及构造函数和成员函 数。判断函数是公有成员还是保护成员,主要通过在主函数中函数的调用来确定,如果函数在主函数中被调用则说明是公有成员,否则为私有成员或者保护成员。 【解题思路】 (1)通过主函数中成员函数的调用可知这里应该为公有成员,而且构造函数必须为公有继承。 (2)主要考查考生对成员函数的掌握,程序在这里调用成员函数 SetDate,直接把形参代入即可。 (3)题目要求输出原日期: 2005 9 25。可以知道输出顺序为:先输出年,其次月,最后是日。 【解题宝典】 主要考查考生对公有成员
9、,成员函数的掌握,构造函数一般情况下肯定 是公有成员,当涉及派生类时才会使用保护成员。 二、简单应用题 2 【正确答案】 (1)name_(name), dept一 (dept) (2)return dept一; (3)Employee(name, dept), level一 (1evel) (4)Employee: print(); 【试题解析】 本题考查 Employee类及其派生类 Manager,其中涉及构造函数、虚函数和 cosnt函数。构造函数使用成员列表初始化,特别是派生类的构造函数要先调用基类的构造函数。 【解题思路】 (1)主要考查考生对构造函数的掌握,这里使用成员列表初始化
10、法对私有成员初始化。 (2)主要考查考生对成员函数的掌握,题目要求返回部门名称,因此这里是一条返回语句。函数要求返回的类型为 string,因此直接返回 dept一即可。 (3)主要考查考生对构造函数的掌握,因为 Manager类是 Employee类的派生类,因此它的构造函数要先对基类初始化,应使用成员列表初始化。 (4)主要考查考生对虚函数的掌握,因为 Manager类是 EInployee类的派生类,因此它的 print函数可以先调用基类的 Print函数,再输出 自身要输出的数据,故为Employee:一 nt();。 三、综合应用题 3 【正确答案】 (1)coutfirstname
11、“”surname (2)laeadi=starti (3)return new Name2(s); else return new Namel(s) 【试题解析】 本题考查 Name类及其派生类 Namel和 Name2,其中涉及动态数组、析构函数、纯虚函数和构造函数。 【解题思路】 (1)主要考查考生对成员函数的掌握,题目要求按先名后姓的格式输出姓名,因此输 出语句的顺序应该是先输出 first name,然后再输出 surname,注意它们之间还要输出 个空格。 (2)主要考查考生对字符串复制的掌握,题目要求把一个字符序列复制到 head所指向的字符空间中,复制从 start所指向的字符开始,共复制 end start个字符。程序已经把 for循环语句写好了,此处只要把复制语句完成即可,即headi=starti。 (3)主要考查考生对动态分配的掌握,题目要求对象必须是动态对象,因此使用new来分配空间,建立动态对象: if(p)return new Name2(s); else return new Namel(s);。