1、二级 C+分类模拟 114 及答案解析(总分:100.00,做题时间:90 分钟)一、基本操作题(总题数:1,分数:30.00)1.请使用 VC6 或使用【答题】菜单打开 proj1 下的工程 proj1,该工程含有一个源程序文件 proj1.cpp。其中位于每个注释“/ ERROR *found*”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: The value is 10 注意:只修改注释“/ ERROR *found*”的下一行语句,不要改动程序中的其他内容。 / proj1.cpp #include iostream using namespace std; class
2、 MyClass int value; public: / ERROR *found* void MyClass(int val) : value(val) int GetValue() const return value; void SetValue(int val); ; / ERROR *found* inline void SetValue (int val) value = val; int main() MyClass obj(0); obj.SetValue(10); / ERROR *found* 下列语句功能是输出 obj 的成员 value 的值 cout “The va
3、lue is“ obj.value endl; return 0; (分数:30.00)_二、简单应用题(总题数:1,分数:30.00)2.请使用 VC6 或使用【答题】菜单打开 proj2 下的工程 proj2,此工程包含有一个源程序文件proj2.cpp,其中定义了 Stack 类和 ArrayStack 类。 Stack 是一个用于表示数据结构“栈”的类,栈中的元素是字符型数据。Stack 为抽象类,它只定义了栈的用户接口,如下所示: 公有成员函数 功能 push 入栈:在栈顶位置添加个元素 pop 退栈:取出并返回栈顶元素 ArrayStack 是 Stack 的派生类,它实现了 St
4、ack 定义的接口。ArrayStack 内部使用动态分配的字符数组作为栈元素的存储空间。数据成员 maxSize 表示的是栈的最大容量,top 用于记录栈顶的位置。成员函数push 和 pop 分别实现具体的入栈和退栈操作。 请在程序中的横线处填写适当的代码,然后删除横线,以实现上述功能。此程序的正确输出结果应为: a,b,c c,b,a 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“/ *found*”。 / proj2.cpp #include iostream using namespace std; class Stack public: virtual
5、 void push(char c) = 0; virtual char pop() = 0; ; class ArrayStack : public Stack char * p; int maxSize; int top; public: ArrayStack(int s) top = 0; maxSize = s; / *found* p =_; ArrayStack() / *found* _; void push (char c) if (top = maxSize) cerr “Overflow! /n“; return; / *found* _; top +; char pop(
6、) if (top = 0) cerr “Underflow! /n“; return “/0“; top -; / *found* _; ; void f(Stack cout ch0 “,“ ch1 “,“ ch2 endl; sRef.push(ch0); sRef.push(ch1); sRef.push(ch2); cout sRef.pop() “,“; cout sRef.pop() “,“; cout sRef.pop() endl; int main() ArrayStack as(10); f(as); return 0; (分数:30.00)_三、综合应用题(总题数:1,
7、分数:40.00)3.请使用 VC6 或使用【答题】菜单打开 proj3 下的工程文件 proj3,此工程中包含一个源程序文件proj3.cpp,补充编制 C+程序 proj3.cpp,其功能是读取文本文件 in.dat中的全部内容,将文本存放到 doc 类的对象 myDoc 中。然后将 myDoc 中的字符序列反转,并输出到文件 out.dat 中。文件 in.dat 的长度不大于 1000 字节。 要求: 补充编制的内容写在“/ *333*”与“/ *66666*”两行之间。实现将 myDoc 中的字符序列反转,并将反转后的序列在屏幕上输出。不得修改程序的其他部分。 注意:程序最后已将结果
8、输出到文件 out.dat 中,输出函数 writeToFile 已经给出并且调用。 / proj3.cpp #include iostream #include fstream #include cstring using namespace std; class doc private: char * str; /文本字符串首地址 int length; /文本字符个数 public: /构造函数,读取文件内容,用于初始化新对象,filename 是文件名字符串首地址 doc(char * filename); void reverse(); /将字符序列反转 doc(); void wr
9、iteToFile (char * filename); ; doc:doc(char * filename) if stream myFile (filename); int len = 1001, tmp; str = new charlen; length = 0; while (tmp = myFile.get()!=EOF) strlength + = tmp; strlength = “/0“; myFile.close(); void doc:reverse() /将数组 str 中的 length 个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个 /字符交换 /
10、*333* / *666* doc:doc() delete str; void doc:writeToFile (char * filename) ofstream outFile(filename); outFile str; outFile.close(); void main() doc myDoc(“in.dat“); myDoc.reverse(); myDoc.writeToFile(“out.dat“); (分数:40.00)_二级 C+分类模拟 114 答案解析(总分:100.00,做题时间:90 分钟)一、基本操作题(总题数:1,分数:30.00)1.请使用 VC6 或使用
11、【答题】菜单打开 proj1 下的工程 proj1,该工程含有一个源程序文件 proj1.cpp。其中位于每个注释“/ ERROR *found*”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: The value is 10 注意:只修改注释“/ ERROR *found*”的下一行语句,不要改动程序中的其他内容。 / proj1.cpp #include iostream using namespace std; class MyClass int value; public: / ERROR *found* void MyClass(int val) : value(val
12、) int GetValue() const return value; void SetValue(int val); ; / ERROR *found* inline void SetValue (int val) value = val; int main() MyClass obj(0); obj.SetValue(10); / ERROR *found* 下列语句功能是输出 obj 的成员 value 的值 cout “The value is“ obj.value endl; return 0; (分数:30.00)_正确答案:()解析:(1)MyClass(int val):va
13、lue(val) (2)vold MyClass:SetValue(int val) value=val; (3)cout“The value is“obj.GetValue()endl; 答案考生文件夹 考点 本题主要考查 MyClass 类、构造函数、成员函数及成员函数的调用。 解析 (1)考查构造函数,定义构造函数时不能使用 void,直接使用 MyClass(int val)即可。 (2)主要考查成员函数定义,类的成员函数定义时要使用前缀 MyClass,而 inline 是内联函数的关键字,在此是错误的,应该删掉 inline 并在函数名前加上前缀 MyClass,即 void My
14、Class:SetValue(int val)value=val;。 (3)考查成员函数调用,value 是私有成员,在主函数中不能直接调用 value,可以使用成员函数GetValue()来得到 value 的值。 构造函数前不能添加任何类型,如 void,int,double 等。类的成员函数定义时要加上前缀,即类的名字。私有成员只能被类的成员函数调用。二、简单应用题(总题数:1,分数:30.00)2.请使用 VC6 或使用【答题】菜单打开 proj2 下的工程 proj2,此工程包含有一个源程序文件proj2.cpp,其中定义了 Stack 类和 ArrayStack 类。 Stack
15、是一个用于表示数据结构“栈”的类,栈中的元素是字符型数据。Stack 为抽象类,它只定义了栈的用户接口,如下所示: 公有成员函数 功能 push 入栈:在栈顶位置添加个元素 pop 退栈:取出并返回栈顶元素 ArrayStack 是 Stack 的派生类,它实现了 Stack 定义的接口。ArrayStack 内部使用动态分配的字符数组作为栈元素的存储空间。数据成员 maxSize 表示的是栈的最大容量,top 用于记录栈顶的位置。成员函数push 和 pop 分别实现具体的入栈和退栈操作。 请在程序中的横线处填写适当的代码,然后删除横线,以实现上述功能。此程序的正确输出结果应为: a,b,c
16、 c,b,a 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“/ *found*”。 / proj2.cpp #include iostream using namespace std; class Stack public: virtual void push(char c) = 0; virtual char pop() = 0; ; class ArrayStack : public Stack char * p; int maxSize; int top; public: ArrayStack(int s) top = 0; maxSize = s; / *
17、found* p =_; ArrayStack() / *found* _; void push (char c) if (top = maxSize) cerr “Overflow! /n“; return; / *found* _; top +; char pop() if (top = 0) cerr “Underflow! /n“; return “/0“; top -; / *found* _; ; void f(Stack cout ch0 “,“ ch1 “,“ ch2 endl; sRef.push(ch0); sRef.push(ch1); sRef.push(ch2); c
18、out sRef.pop() “,“; cout sRef.pop() “,“; cout sRef.pop() endl; int main() ArrayStack as(10); f(as); return 0; (分数:30.00)_正确答案:()解析:(1)new chars (2)deletep (3)ptop=c (4)return ptop 答案考生文件夹 考点 本题主要考查的是表示栈的抽象类 Stack 类及它的派生类 ArrayStack 类、纯虚函数和成员函数。栈的节点一般使用指针表示,定义构造函数时要给指针分配空间,使用 new 语句来完成。ArrayStack()是析
19、构函数,因为前面已经使用 new 来分配空间了,因此在这里要用 delete 语句来释放指针。 解析 (1)主要考查的是 ArrayStack 类的构造函数,在函数中要为 p 申请 s 个 chin。型空间,应使用语句 p=new chars;。 (2)主要考查析构函数,使用 delete 语句释放指针,即 deletep;。 (3)主要考查 push 函数,top 表示栈顶元素下标,添加的数据放到栈顶,因此使用语句 ptop=c;。 (4)主要考查 pop 函数,输出栈顶数据,top 表示栈顶元素下标,因此使用语句 return ptop;。 在构造函数时,要先给动态数组分配空间,使用 ne
20、w 语句。在析构函数时,要将分配的空间释放,使用delete 语句。三、综合应用题(总题数:1,分数:40.00)3.请使用 VC6 或使用【答题】菜单打开 proj3 下的工程文件 proj3,此工程中包含一个源程序文件proj3.cpp,补充编制 C+程序 proj3.cpp,其功能是读取文本文件 in.dat中的全部内容,将文本存放到 doc 类的对象 myDoc 中。然后将 myDoc 中的字符序列反转,并输出到文件 out.dat 中。文件 in.dat 的长度不大于 1000 字节。 要求: 补充编制的内容写在“/ *333*”与“/ *66666*”两行之间。实现将 myDoc
21、中的字符序列反转,并将反转后的序列在屏幕上输出。不得修改程序的其他部分。 注意:程序最后已将结果输出到文件 out.dat 中,输出函数 writeToFile 已经给出并且调用。 / proj3.cpp #include iostream #include fstream #include cstring using namespace std; class doc private: char * str; /文本字符串首地址 int length; /文本字符个数 public: /构造函数,读取文件内容,用于初始化新对象,filename 是文件名字符串首地址 doc(char * fi
22、lename); void reverse(); /将字符序列反转 doc(); void writeToFile (char * filename); ; doc:doc(char * filename) if stream myFile (filename); int len = 1001, tmp; str = new charlen; length = 0; while (tmp = myFile.get()!=EOF) strlength + = tmp; strlength = “/0“; myFile.close(); void doc:reverse() /将数组 str 中的
23、 length 个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个 /字符交换 / *333* / *666* doc:doc() delete str; void doc:writeToFile (char * filename) ofstream outFile(filename); outFile str; outFile.close(); void main() doc myDoc(“in.dat“); myDoc.reverse(); myDoc.writeToFile(“out.dat“); (分数:40.00)_正确答案:()解析:int i, j; /定义两个整数临
24、时变量 i.j. for(i = 0, j = length -1; i j; i+, j-) char temp = stri; /把 Stri中的值保存在临时变量 temp stri = strj; /把 Strj值赋给 Stri,实现字符前后替换 strj = temp; /把保存在临时变量 temp 中的值再赋值给 Strj 答案考生文件夹 考点 本题主要考查的是 doc 类、构造函数、成员函数和析构函数。 解析 题目要求将 myDoc 中的字符序列反转,在 main 函数中我们看到 myDoc 是 doc 类,根据 doc 类的定义可以知道它是把读取文件的字符串存到 str 动态数组中。reverse 函数实现将数组 str 中的 length 个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个字符交换,依次类推。使用变量 i和 j,分别表示第一个字符和最后一个字符的下标,定义 temp 作为中间变量进行交换。