1、二级 C+分类模拟 124 及答案解析(总分:100.00,做题时间:90 分钟)一、基本操作题(总题数:1,分数:30.00)1.请使用 VC6 或使用【答题】菜单打开 proj1 下的工程 proj1。其中有线段类 Line 的定义。程序中位于每个“/ ERROR *found*”之后的一行语句有错误,请加以改正。改正后程序的输出结果应该是: End point 1 = (1,8),End point 2 = (5,2),length = 7.2111。 注意:只修改每个“/ ERROR *found*”下的那一行,不要改动程序中的其他内容。 #include iostream #incl
2、ude cmath using namespace std; class Line; double length(Line); class Line /线段类 double x1,y1; /线段端点 1 double x2,y2; /线段端点 2 public: / ERROR *found* Line (double x1, double y1, double x2, double y2) const this - x1 = x1; this - y1 = y1; this - x2 = x2; this - y2 = y2; double getX1() const return x1;
3、double getY1() const return y1; double getX2() const return x2; double getY2() const return y2; void show() const cout “End point 1 = (“ x1 “,“ y1; cout “), End point 2 = (“ x2 “,“ y2; / ERROR *found* cout “), length = “ length (this) “。“ endl; ; double length (Line i) / ERROR *found* return sqrt (1
4、.x1 - 1.x2) * (1.x1 - 1.x2) + (1.y1 - 1.y2) * (1.y1 - 1.y2); int main() Line r1(1.0,8.0,5.0,2.0); r1.show(); return 0; (分数:30.00)_二、简单应用题(总题数:1,分数:30.00)2.请使用 VC6 或使用【答题】菜单打开 proj2 下的工程 proj2。其中有向量基类 VectorBase、向量类Vector 和零向量类 ZeroVector 的定义。请在横线处填写适当的代码并删除横线,以实现上述类定义。该程序正确输出结果应为: (1,2,3,4,5) (0,0,0
5、,0,0,0) 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“/ *found*”。 #include iostream using namespace std; class VectorBase /向量基类,一个抽象类 int len; public: VectorBase (int fen): len(len) int length() const return len; /向量长度,即向量中元素的个数 virtual double getElement (int i) const = 0; /取第 i 各元素的值 virtual double sum()
6、const = 0; /求所有元素的和 void show() const /显示向量中所有元素 cout “(“; for (int i =0; i length() - 1; i+) cout getElement(i) “,“; / *found* cout _ “)“ endl; /显示最后一个元素 ; class Vector:public VectorBase /向量类 double * val; public: Vector(int fen, double v = NULL):VectorBase(len) val = new doublelen; for(int i = 0;
7、i len; i+) vali = (v = NULL? 0.0:vi); / *found* Vector() _; double getElement(int index) const return valindex; double sum() const double s = 0.0; / *found* for (int i = 0; i length(); i+) return s; ; class ZeroVector: public VectorBase /零向量类 public: ZeroVector(int len):VectorBase(len) / *found* dou
8、ble getElement(int index) const _; double sum() const return 0.0; ; int main() VectorBase * v; double d = 1,2,3,4,5; v = new Vector(5,d); v - show(); delete v; v = new ZeroVector(6); v - show(); delete v; return 0; (分数:30.00)_三、综合应用题(总题数:1,分数:40.00)3.请使用 VC6 或使用【答题】菜单打开 proj3 下的工程 proj3,其中声明了 Sorted
9、List 类,是一个用于表示有序数据表的类。其成员函数 insert 的功能是将一个数据插入到一个有序表中,使得该数据表仍然保持有序。请编写这个 insert 函数。程序的正确输出应为: 插入前: 1,2,4,5,7,8,10 插入 6 和 3 后: 1,2,3,4,5,6,7,8,10 要求: 补充编制的内容写在“/ *333*”与“/ *666*”之间。不得修改程序的其他部分。 注意:程序最后将结果输出到文件 out.dat 中。输出函数 writeToFile 已经编译为 obj 文件,并且在本程序中调用。 /SortedList.h #include iostream using na
10、mespace std; class SortedList /有序数据表类 int len; double * d; public: SortedList (int len, double data = NULL); SortedList() delete d; int length() const return len; /有序数据表长度(即元素的个数) double getElement (int i) const return di; void insert (double data); void show() const; /显示有序数据表 ; void writeToFile (ch
11、ar *, const SortedList /main.cpp #include “SortedList.h“ SortedList:SortedList (int len, double data):len(len) d = new doublelen; for(int k = 0; k len; k+) dk = (data = NULL? 0.0:datak); for(int i = 0; i len-1; i+) int m=i; for(int j = i; j len; j +) if(dj dm) m=j; if (m i) double t = dm; dm = di; d
12、i = t; void SortedList:insert (double data) / *333* / *666* void SortedList:show() const /显示有序数据表 for(int i = 0; i len - 1; i+) cout di “,“; cout dlen - 1 endl; int main() double s = 5,8,1,2,10,4,7; SortedList list(7,s); cout “插入前:“ endl; list.show(); list.insert(6.0); list.insert(3.0); cout “插入 6 和
13、 3 后:“ endl; list.show(); writeToFile(“ “, list); return 0; (分数:40.00)_二级 C+分类模拟 124 答案解析(总分:100.00,做题时间:90 分钟)一、基本操作题(总题数:1,分数:30.00)1.请使用 VC6 或使用【答题】菜单打开 proj1 下的工程 proj1。其中有线段类 Line 的定义。程序中位于每个“/ ERROR *found*”之后的一行语句有错误,请加以改正。改正后程序的输出结果应该是: End point 1 = (1,8),End point 2 = (5,2),length = 7.2111
14、。 注意:只修改每个“/ ERROR *found*”下的那一行,不要改动程序中的其他内容。 #include iostream #include cmath using namespace std; class Line; double length(Line); class Line /线段类 double x1,y1; /线段端点 1 double x2,y2; /线段端点 2 public: / ERROR *found* Line (double x1, double y1, double x2, double y2) const this - x1 = x1; this - y1
15、= y1; this - x2 = x2; this - y2 = y2; double getX1() const return x1; double getY1() const return y1; double getX2() const return x2; double getY2() const return y2; void show() const cout “End point 1 = (“ x1 “,“ y1; cout “), End point 2 = (“ x2 “,“ y2; / ERROR *found* cout “), length = “ length (t
16、his) “。“ endl; ; double length (Line i) / ERROR *found* return sqrt (1.x1 - 1.x2) * (1.x1 - 1.x2) + (1.y1 - 1.y2) * (1.y1 - 1.y2); int main() Line r1(1.0,8.0,5.0,2.0); r1.show(); return 0; (分数:30.00)_正确答案:()解析:(1)Line(double x1,double y1,double x2,double y2) (2)cout “),length =“ length(* this) “。“ e
17、ndl; (3)return sqrt(l.getX1() - l.getX2() * (l.getX1() - l.getX2() + (l.getY1() - l.getY2() * (l.getY1() - l.getY2(); 答案考生文件夹 考点 本题考查 Line 类,其中涉及构造函数、this 指针和 const 函数。判断一个函数是否为 const 函数,就要观察该函数体内是否有变量值发生改变,若有变量值发生改变,则该函数不是const 函数。一般构造函数不能用 const,因为要给私有成员赋初始值。类的私有成员不能被类外函数调用,只能通过成员函数调用。 解析 (1)主要考查考
18、生对构造函数的掌握,构造函数要给私有成员赋初始值,因此不能使用 const 来限制。 (2)主要考查考生对 this 指针的掌握,由函数 length 的声明 double length(Line);可知,length 函数的形参是 Line 类,在 void show() const 函数里,this 指针指向的是当前 Line 类,因此可以用*this 表示当前 Line 类。 (3)主要考查考生对成员函数的掌握,length 函数是类外函数,不能直接调用类的私有成员,因此要通过成员函数取得对应的值。 this 是指向自身对象的指针,它是一个指针类型,因此要使用标识符“*”来取出它所指向的
19、值。二、简单应用题(总题数:1,分数:30.00)2.请使用 VC6 或使用【答题】菜单打开 proj2 下的工程 proj2。其中有向量基类 VectorBase、向量类Vector 和零向量类 ZeroVector 的定义。请在横线处填写适当的代码并删除横线,以实现上述类定义。该程序正确输出结果应为: (1,2,3,4,5) (0,0,0,0,0,0) 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“/ *found*”。 #include iostream using namespace std; class VectorBase /向量基类,一个抽象类 i
20、nt len; public: VectorBase (int fen): len(len) int length() const return len; /向量长度,即向量中元素的个数 virtual double getElement (int i) const = 0; /取第 i 各元素的值 virtual double sum() const = 0; /求所有元素的和 void show() const /显示向量中所有元素 cout “(“; for (int i =0; i length() - 1; i+) cout getElement(i) “,“; / *found*
21、cout _ “)“ endl; /显示最后一个元素 ; class Vector:public VectorBase /向量类 double * val; public: Vector(int fen, double v = NULL):VectorBase(len) val = new doublelen; for(int i = 0; i len; i+) vali = (v = NULL? 0.0:vi); / *found* Vector() _; double getElement(int index) const return valindex; double sum() con
22、st double s = 0.0; / *found* for (int i = 0; i length(); i+) return s; ; class ZeroVector: public VectorBase /零向量类 public: ZeroVector(int len):VectorBase(len) / *found* double getElement(int index) const _; double sum() const return 0.0; ; int main() VectorBase * v; double d = 1,2,3,4,5; v = new Vec
23、tor(5,d); v - show(); delete v; v = new ZeroVector(6); v - show(); delete v; return 0; (分数:30.00)_正确答案:()解析:(1)getElement(length()-1) (2)deleteval (3)s+=vali (4)return 0.0; 答案考生文件夹 考点 主要考查的是抽象基类 VectorBase 类及其派生类 Vector 和 ZeroVector,其中涉及构造函数、纯虚函数、const 函数、动态数组和析构函数。 解析 (1)主要考查考生对成员函数的掌握,题目要求显示最后一个元素
24、。前面有纯虚函数 virtual double getElement(int i) const=0,因此可以直接调用 getElement 函数来取得最后一个元素,注意最后一个元素位置是 Length()-1 而不是 Length()。 (2)主要考查考生对析构函数的掌握,前面定义了类的私有成员*val,因此析构函数要释放 val,使用delete 语句完成。 (3)主要考查考生对 for 循环的掌握,由函数名 double sum() const 可知,该函数要求元素之和,for 循环语句的作用是遍历整个数组,在此使用语句 s+=vali完成程序。 (4)主要考查考生对成员函数的掌握,由该类
25、的注释:零向量类,可以了解到该类的元素都为零,因此无论要取第几个元素都返回 0,由于数据类型为 double,所以为 return0.0。三、综合应用题(总题数:1,分数:40.00)3.请使用 VC6 或使用【答题】菜单打开 proj3 下的工程 proj3,其中声明了 SortedList 类,是一个用于表示有序数据表的类。其成员函数 insert 的功能是将一个数据插入到一个有序表中,使得该数据表仍然保持有序。请编写这个 insert 函数。程序的正确输出应为: 插入前: 1,2,4,5,7,8,10 插入 6 和 3 后: 1,2,3,4,5,6,7,8,10 要求: 补充编制的内容写
26、在“/ *333*”与“/ *666*”之间。不得修改程序的其他部分。 注意:程序最后将结果输出到文件 out.dat 中。输出函数 writeToFile 已经编译为 obj 文件,并且在本程序中调用。 /SortedList.h #include iostream using namespace std; class SortedList /有序数据表类 int len; double * d; public: SortedList (int len, double data = NULL); SortedList() delete d; int length() const return
27、 len; /有序数据表长度(即元素的个数) double getElement (int i) const return di; void insert (double data); void show() const; /显示有序数据表 ; void writeToFile (char *, const SortedList /main.cpp #include “SortedList.h“ SortedList:SortedList (int len, double data):len(len) d = new doublelen; for(int k = 0; k len; k+) d
28、k = (data = NULL? 0.0:datak); for(int i = 0; i len-1; i+) int m=i; for(int j = i; j len; j +) if(dj dm) m=j; if (m i) double t = dm; dm = di; di = t; void SortedList:insert (double data) / *333* / *666* void SortedList:show() const /显示有序数据表 for(int i = 0; i len - 1; i+) cout di “,“; cout dlen - 1 en
29、dl; int main() double s = 5,8,1,2,10,4,7; SortedList list(7,s); cout “插入前:“ endl; list.show(); list.insert(6.0); list.insert(3.0); cout “插入 6 和 3 后:“ endl; list.show(); writeToFile(“ “, list); return 0; (分数:40.00)_正确答案:()解析:for(int i = 0; i len; +i) /遍历数组 d if(data di) /如果 data 小于 di len+; /数组 d 的长度
30、自加 1 double * dd = new doublelen; /分配长度为 len 空间 for (int k = len; ki; k-) /在数组 d 中从 k 等于 len 到 i 做遍历 ddk = dk-1; /把 dk-1赋值给 ddk ddi = data; /把 data 赋值给 ddi for (int j = 0; j i; j +) /把数组 d 从 0 到 i 做遍历 ddj = dj; /把 dj赋值给 ddj delete d; /删 d 分配的空间 d = new doublelen; /给 d 分配长度为 len 的空间 for (int index =
31、0; index len; +index) /遍历数组 dd 从 0 到 len dindex = ddindex; /地 ddindex赋值给 dindex delete dd; /删 dd 分配的空间 break; /跳出循环 答案考生文件夹 考点 主要考查 SortedList 类,其中涉及动态数组、构造函数、析构函数、const 函数和排序算法。插入算法有两个步骤,一是比较,即要插入的元素在哪里;二是插入元素,后面的元素要逐个后移一位,为新加入的元素空出位置。 解析 主要考查考生对插入算法的掌握,题目要求 insert 函数的功能是将一个数据插入到一个有序表中,使得该数据表仍保持有序。可以知道数据表 d 是一组有序的数组,那么就采取先比较再插入的步骤完成即可。 要注意动态数组 d 的长度是确定的,要添加元素,就要重新分配空间。