1、国家二级 C+机试(操作题)模拟试卷 337及答案与解析 一、基本操作题 1 请使用 VC6或使用【答题】菜单打开考生文件夹 pmjl下的工程 projl,此工程中含有一个源程序文件 pmjl cpp。其中位于每个注释 “ ERROR *found*”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: Constructor called The vahe is 10 Copy constructor called The value is 10 Destructor called Destructor called 注意:只修改注释 “ ERROR *found*”的下一行语句,不
2、要改动程序中的其他内容。 projl cpp #include using namespace std; class MyClass public: ERROR*found* MyClass(int i) value=i; cout using namespace std; class MyClass int i; friend void Increment(MyClas S f); public: const int NUM; ERROR*found* MyClass(int i=0)NUM=0; i=i; int GetValue()constreturn i; ) ; ERROR*fou
3、nd* VOid Increment()f i+; ) int main() MyClass obj; ERROR*found* MyClass: Increment(obj); cout using namespace std; class VectorBase 向量基类,一个抽象类 int len; public: VectorBase(int len): len(1en) int length()constreturn len; ) 向量长度,即向量中元素的个数 virtual double getElement(int i) const: 0;取第 i个元素的值 virtual dou
4、ble sum()const=0; /求所有元素的和 void show()const显示向量中所有元素 coutshow(); delete V; v=new ZeroVector(6); v一 show(); delete V; return 0; 三、综合应用题 4 请使用【答题】菜单命令或直接用 VC6打开考生文件夹下的工程 proj3,其中声明的是一个人员信息类,补充编制程序,使其功能完整。在 main函数中给出了一组测试数据,此种情况下程序的输出应该是: Zhang 20 TsinghHa。 注意:只能在函数 address_change的 “ *333* *”和 “ *666*”
5、之间填入若干语句,不要改动程序中的其他内容。 程序最后将结果输出到文件 out dat中。输出函数 writeToFile已经编译为 obj文件,并且在本程序中调用。 proj3 h #include #include using namespace std; class Person char name20; int age; char* address; public: Person()age=0; address=0; ) void name_change(char*_name); /名字修改函数 void age_change(int_age); 年龄修改函数 void address
6、_change(char*_add); 地址修改函数 void info_display(); 人员信息显示 一 Person(); /析构函数 ; void writeToFile(const char*path); proj3 cpp #include #include #include”proj 3 h” using namespace std; void Person: name change(char* _name) strcpy(name, _name); void Person: age_change(int_age) age=_age; void Person: address
7、_change(char*_ add) if(address!=NULL)deletead- dress; *333* *666* void Person: info_display() cout #include #include using namespace std; class doc private: char/str;文本字符串首地址 int length; /文本字符个数 public: 构造函数,读取文件内容,用于初始化新对象, filename是文件名字符串首地址 doc(char*filename); void reverse();将字符序列反转 一 doc(); void
8、 writeToFile(char*filename); ; doc: doc(char*filename) ifstream myFile(filename); int len=001, tmp; str=new charfen; length=0; while(tmp=myFile get()!=EOF) strlength+=tmp; strlength= 0; myFile close(); void doc: reverse() 将数组 str中的 length个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个 字符交换 *333* *666* doc:一 doc() d
9、eletestr; void doc: writeToFile (char * filename) ofstream outFile(filename); outFilestr; outFile close(); void main() doc myDoc(”in dat”); myDoc reverse(); myDoc writeToFile(”out dat”); 国家二级 C+机试(操作题)模拟试卷 337答案与解析 一、基本操作题 1 【正确答案】 (1)MyClass(int i=10) (2)MyClass(eonst MyClass&p) (3)一 MyClass() 【试题解
10、析】 (1)考查构造函数参数默认值,题目要求输出语句: The value is 10,从主函数中可以看出, obj1并没有初始化,但是 obj1调用 Print()函数时它的值为 10,由此可知构造函数的形参有默认值,且值为 10,因此得出语句MyClass(int i=10)。 (2)主要考查考生对复制构造函数的掌握,复制构造函数的形参都为引用,同时为了不改变形参的值要加上 const。因此得出语句 MyClass(const MyClass&p)。 (3)主要考查考生对析构函数的掌握,析构函数和构造函数一样,前面不能添加任何类型,要把 void去掉。 2 【正确答案】 (1)MyClas
11、s(int i=0): NUM(0) (2)void Increment(MyClass&f)f j+; (3)Increment(obj); 【试题解析】 (1)主要考查 考生对常量数据成员初始化方法的掌握,常量数据成员的初始化只能通过构造函数的成员初始化列表进行,并且要使用关键字 const修饰。该题的前一条语句 const int NUM;,说明 NUM是常量数据成员。 (2)主要考查考生对友元函数的掌握,友元函数的定义与声明要一致,先看该友元函数的声明部分: friend void Increment(MyClass&f);,返回类型为 void,函数参数为 MyClass&f;再比较
12、出错的语句: void Increment()f -i+; ,错误在于该函数没有参数,应 把 MyClass&f填在括号内。 (3)主要考查友元函数的调用,友元函数并不属于类,因此调用友元函数时不需要添加类名及作用域,只需要像调用普通函数一样即可。 二、简单应用题 3 【正确答案】 (1)getElement(length()一 1) (2)deleteval (3)s+=vali (4)return 0 0: 【试题解析】 (1)主要考查考生对成员函数的掌握,题目要求显示最后 个元素。前面有纯虚函数 virtual double getElement(int i)const=0,因此可以直接
13、调用getElement函数来取得最后一个元素,注意最后 个元素位置是 Ungth()一 1而不是 Length()。 (2)主要考查考生对析构函数的掌握,前面定义了类的私有成员 *val,因此析构函数要释放 val,使用 delete语句完成。 (3)主要考查考生对 for循环的掌握,由函数名 doublesum()const可知,该函数要求元素之和, for循环语句的作用是遍历整个数组,在此使用语句 S+=vali完成程序。 (4)主要考查考生对成员函数的掌握,由该类的注释: 零向量类,可以了解到该类的元素都为零,因此无论要取第几个元素都返回 0,由于数据类型为 double,所以为 re
14、turn0 0。 三、综合应用题 4 【正确答案】 address=new charstrlen(add)+ 1; 给类成员变量动态分配空间 strcpy(address, _add); 把字符串 add复制给 address 【试题解析】 函数 address_change(char*_add)的功能是地址修改,也就是说通过该函数把类的地址修改为 add字符串。类的私有成员 address是字符指针,因此首先要给 address分配空间,通过 new语句来实现: address=new charstrlen(_add)+1;。接下来就是要复制字符串,使用系统函数 strcpy,其用法为 st
15、rcpy(参数 1,参数 2),将参数 2的内容复制到参数 1中。 5 【正确答案】 int i, j; 定义两个整数临时变量 i j for(i=0, j=length一 1; ij; i+, j一一 ) char temp=stri; 把 Stri中的值保存在临时变量 temp stri=strj; 把 Strj值赋给 Stri,实现字符前后替换 strj=temp; 把保存在临时变量 temp中的值再赋值给 Strj 【试题解析】 题目要求将 myDoc中的字符序列反转,在 main函数中我们看到myDoc是 doc类,根据 doc类的定义可以知道它是把读取文件的字符串存到 str动态数组中。 reverse函数实现将数组 str中的 length个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个字符交换,依次类推。使用变量 i和 j,分别表示第一个字符和最后 一个字符的下标,定义 temp作为中间变量进行交换。