1、国家二级 C+机试(操作题)模拟试卷 489及答案与解析 一、基本操作题 1 请打开考生文件夹下的解决方案文件 proj1,该工程中包含程序文件main cpp,其中有类 Door(“门 ”)和主函数 main的定义。程序中位于每个 “ERROR*found*”之后的一行语句有错误,请加以改正。改正后程序的输出结果应为: 打开 503号门门是锁着的,打不开。 打开 503号门的锁锁开了。 打开 503号门门打开了。 打开 503号门门是开着的,无须再开门。 锁上 503号门先关 门门锁上了。 注意:只参改每个 “ ERROR*found*”下的那一行,不要改动程序中的其他内容。 #includ
2、e iostream using namespace std; class Door int num;门号 bool closed; true表示门关着 bool locked; true表示门锁着 public: Door(int num) ERROR*found* num=this- num; closed=locked=true; bool isClosed( )constreturnclosed; 门关着时返回 true,否则返回 false bool isOpened( )constTel2L1rn!closed; 门开着时返回 true,否则返回 false bool isLock
3、ed( )constreturn locked; 门锁着时返回 true,否则返回 false bool isunlocked( )constreturn!locked; 门未锁时返回 true,否则返回 false void open( )开门 cout endl “打开 “ num “号门 “; ERROR*found* if(Closed) cout “门是开着的,无须再开门。 “; else if(locked) cout “门是锁着的,打不开。 “; else closed=false; cout “门打开了。 “; void close( )关门 cout endl “关上 “ n
4、um “号门 “; if(closed) tout “门是关着 的,无须再关门。 “; else closed=true; cout “门关上了。 “; ERROR*found* void lock( )const锁门 cout; endl “锁上 num “号门 “; if(locked) cout “门是锁着的,无须再锁门。 “; else if(!closed) cout “先关门 “; closed=true; locked=true; cout; “门锁上了。 “; void unlock( )开锁 cout; endl “开 “ num “号门的锁 “ ; if(!locked)
5、cout “门没有上锁,无须再开锁。 “; else locked=false; tout “锁开了。 “; ; int main( ) Door door(503); door open( ); door unlock( ); door open( ); door open( ); door lock( ); return0; 二、简单应用题 2 请打开考生文件夹下的解 决方案文件 proj2,其中定义了 Employee类和 Manager类。 Employee用于表示某公司的雇员,其属性包括姓名 (name)和工作部分 (dept)。Manager是 Employee的公有派生类,用于表
6、示雇员中的经理。除了姓名和工作部分之外, Manager的属性还包括级别 (1evel)。 Employee类的成员函数 print用于输出雇员的信息; Manager类的成员函数 print负责输出经理的信息。请在横线处填写适当的代码,然后删除横线,以实现上述类定义。此程序的正确输出结果应为: Name: Sally Smith Dept: Sales Level: 2 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动 “ *found*”。 #include iostream #include string using namespace std; class
7、Employee public: Employee(string name, string dept): *found* _ Virtual void print( )const; string dept( )const返回 部门名称 *found* _ virtual Employee( ) private: string name_; string dept_; , class Manager: public Employee public: Manager(string name, stringdept, int level): *found* _ virtual voidprint(
8、)const; private: int level; ; void Employee: print( )const cout “Name: “ name endl; cout “Dept: “ dept endl; void Manager: print( )const *found* _ cout “Level: “ 1evel endl; o int main( ) Employee*emp=new Manager(“Sally Smith“, “Sales“, 2); emp- print( ); delete emp; return0; 三、综合应用题 3 请打开考生文件夹下的解决方
9、案文件 proj3,其中声明 IntSet是一个用于表示正整数集合的类。 IntSet的成员函数 Intersection的功能是求当前集合与另一个集合的交集。请完成成员函数 Intersection。在 main函数中给出了一组测试数据,此时程序的输出应该是: 求交集前: 1 2 3 5 8 10 2 8 9 11 30 56 67 求交集后: 1 2 3 5 8 10 2 8 9 11 30 56 67 2 8 要求: 补充编制的内容写在 “ *333*”与 “ *666*”之间,不得修改程序的其他部分。 注意:程序最后将结果输出到文件 out dat中。输出函数 writeToFile已
10、经编译为obj文件,并且在本程序中调用。 IntSet h #include iostream using namespace std; const int Max=100; C1ass IntSet public: IntSet( ) 构造一个空集合 end=-1; ) IntSet(int a , int size)构造一个包含数组 a中 size个元素的集合 if(size =Max) end=Max-1; else end=size-1; for(int i=0; i =end; i+) elementi=ai; bool IsMemberOf(int a) 判断 a是否为集合中的一个
11、元素 for(int i=0; i =end; i+) if(elementi=a) return true; return false; int GetEnd( )return end; 返回最后一个元素的下标 int GetElement(int i)returnelementi; 返回下标为 i的元素 IntSet Intersection(IntSet&set); 求当前集合与集合 set的交 void Print( ) 输出集合中的所有元素 for(int i=0; i =end; i+) if(i+1) 20=0) cout elementi endl; else cout ele
12、menti ; tout endl; private: int elementMax; int end; ; void writeToFile(constchar*); main cpp #include“IntSet h“ IntSet IntSet: Intersection (IntSet&set) intaMax, size=0; *333* *666* return IntSet(a, size); int main( ) int a =1, 2, 3, 5, 8, 10; int b =2, 8, 9, 11, 30, 56, 67; IntSet set1(a, 6), set2
13、(b, 7), set3; cout “求交集前: “ endl; set1 Print( ); set2 Print( ); set3 Print( ); set3=set1 Intersection(set2); cout endl “求交集后: “ endl; set1 Print( ); set2 Print( ); set3 Print( ); writeToFile(“ “); return0; 国家二级 C+机试(操作题)模拟试卷 489答案与解析 一、基本操作题 1 【正确答案】 (1)this- num=num; (2)if(!closed) (3)void lock( )
14、【试题解析】 (1)主要考查考生对 this指针的掌握,在构造函数中 this指针指向的是当前类,因此要给 num赋值使用语句 this- num=num;完成 (2)主要考查考生对 if语句的掌握,先看类的私有成员中关于 closed的定义: bool closed; true表示门关着。再看下一条语句: cout “门是开着的,无须再开门。 “;。即满足条件时就会输出:门是开着的,无须再开门。因此 if括号内应该是 !closed。 (3)主要考查考生对 const函数的掌握, lock函数体中存在语句 locked=true即有参数发生改变,因此不能用 const。 二、简单应用题 2
15、【正确答案】 (1)name_(name), dept_(dept) (2)return dept_; (3)Employee(name, dept), level_(level) (4)Employee: print( ); 【试题解析】 (1)主要考查考生对构造函数的掌握,这里使用成员列表初始化法对私有成员初始化。 (2)主要考查考生对成员函数的掌握,题目要求返回部门名称,因此这里是一条返回语句。函数要求返回的类型为 string,因此直接返回 dept_即可。 (3)主要考查考生对构造函数的掌握,因为 Manager类是 Employee类的派生类,因此它的构造函数要先对基类初始化, 应
16、使用成员列表初始化。 (4)主要考查考生对虚函数的掌握,因为 Manager类是 Employee类的派生类,因此它的 print函数可以先调用基类的 print函数,再输出自身要输出的数据,故为Employee: print( );。 三、综合应用题 3 【正确答案】 for(int i=0; i =set GetEnd( ); i+)遍对象 set数组 if(IsMemberOf(set GetElement(i)判断对象 Set数组第 i个值是不是集合中的值,如果是则把它插入到 a中 asize+=set GetEiement(i); 【试题解析】 主要考查考生对数组的掌握,根据 IntSet类的构造函数: IntSet(int a , int size) 构造一个包含数组 a中 size个元素的集合 if(size =Max) end=Max-1; else end=size-1; for(int i=0; i =end; i+) elementi=ai; 可知数组 element用来装载集合, end表示数组长度,因此调用函数 IsMemberOf来判断 set中的元素是否存在 于集合中,如果存在则放入数组 a中。