1、二级 C+-45及答案解析(总分:100.00,做题时间:90 分钟)一、B基本操作题/B(总题数:1,分数:30.00)1.请使用 VC6或使用答题菜单打开考生文件夹 proj1下的工程 proj1,其中有点类 Point和线段类 Line和主函数 main的定义,程序中位于每个“/ERROR*found*”之后的一行语句有错误,请加以改正。改正后程序的输出应为: p1=(8, 4)p2=(3, 5) 注意:只修改两个“/ERROR*found*”下的那一行,不要改动程序中的其他内容。 #includeiostream #includecmath using namespace std; c
2、lass Point double x, y; public: Point(double x=0.0, double y=0.0) /ERROR*found* x=x; y=y; double getX()constreturn x; double getY()const return y; /ERROR*found* void show()constcout(x,y) ; class Line Point p1, p2; public: Line(Point pt1, Point pt2) /ERROR*found* pt1=p1; pt2=p2; Point getP1()constret
3、urn p1; Point getP2()constreturn p2; ; int main() Line line(Point(8, 4), Point(3, 5); cout“p1=“; line.getP1().show(); cout“p2=“; line.getP2().show(); coutendl; return 0; (分数:30.00)_二、B简单应用题/B(总题数:1,分数:30.00)2.请使用 VC6或使用答题菜单打开考生文件夹 proj2下的工程 proj2,其中有整数栈类 IntList、顺序栈类 SeqList和链接栈类 LinkList的定义。请在程序中的横
4、线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 4 6 3 1 8 4 6 3 1 8 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动/“*found*”。 #includeiostream using namespace std; class IntStack/整数栈类 public: virtual void push(int)=0; /入栈 virtual int pop()=0; /出栈并返回出栈元素 virtual int topElement()const=0; /返回栈顶元素,但不出栈 virtual bool isEmp
5、ty()const=0; /判断是否栈空 ; class SeqStack: public IntStack int data100; /存放栈元素的数组 int top; /栈顶元素的下标 public: /*found* SeqStack(): _/把 top初始化为-1 表示栈空 void push(int n)(data+top=n; /*found* int pop()return_; int topElement()constreturn datatop; bool isEmptyoconstreturn top=-1; ; Struct Node int data; Node *
6、 next; ; class LinkStack: public IntStack Node*top; public: /*found* LinkStack(): _)/把 top初始化为 NULL表示栈空 void push(int n) Node*p=new Node; p-data=n; /*found* _; top=p; int pop() int d=top-data; top=top-next; return d; int topElement()constreturn top-data; bool isEmpty()constreturn top=NULL; ;void pus
7、hData(IntStack st.push(1); st.push(3); st.push(6); st.push (4); void popData (IntStack int main() SeqStack st1; pushData (st1); popData (st1); cout endl; LinkStack st2; pushData (st2); popData (st2); coutendl; return 0; (分数:30.00)_三、B综合应用题/B(总题数:1,分数:40.00)3.请使用 VC6或使用答题菜单打开考生文件夹 proj3下的工程 proj3,其中声
8、明 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已经编译为 obj文件,并且在本
9、程序中调用。 /Intset.h #include iostream using namespace std; const int Max=100; class 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是否为集合中一个元素 for(int i=
10、0; i=end; i +) if(elementi=a) return true; return false; int GetEnd() return end; int GetElement (int i) return elementi; /返回下标为 i的元素 IntSet Intersection(IntSet /求当前集合与集合 set的交 void Print () /输出集合中的所有元素 for(int i=0; i=end; i+) if(i +1)% 20=0) coutelementiendl; else coutelementi; coutendl; private: i
11、nt elementMax; int end; ; void writeToFile (const char *); /main.cpp #include “IntSet.h“ IntSet IntSet:Intersection(IntSet /*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 (b,7), set3; cout “求交集前:“endl; set1. Print ();
12、 set2. Print (); set3. Print (); set3 = set1. Intersection (set2); coutendl“求交集后:“endl; set1. Print (); set2. Print (); set3. Print (); writeToFile (“); return 0; (分数:40.00)_二级 C+-45答案解析(总分:100.00,做题时间:90 分钟)一、B基本操作题/B(总题数:1,分数:30.00)1.请使用 VC6或使用答题菜单打开考生文件夹 proj1下的工程 proj1,其中有点类 Point和线段类 Line和主函数 m
13、ain的定义,程序中位于每个“/ERROR*found*”之后的一行语句有错误,请加以改正。改正后程序的输出应为: p1=(8, 4)p2=(3, 5) 注意:只修改两个“/ERROR*found*”下的那一行,不要改动程序中的其他内容。 #includeiostream #includecmath using namespace std; class Point double x, y; public: Point(double x=0.0, double y=0.0) /ERROR*found* x=x; y=y; double getX()constreturn x; double ge
14、tY()const return y; /ERROR*found* void show()constcout(x,y) ; class Line Point p1, p2; public: Line(Point pt1, Point pt2) /ERROR*found* pt1=p1; pt2=p2; Point getP1()constreturn p1; Point getP2()constreturn p2; ; int main() Line line(Point(8, 4), Point(3, 5); cout“p1=“; line.getP1().show(); cout“p2=“
15、; line.getP2().show(); coutendl; return 0; (分数:30.00)_正确答案:(1):x(x),y(y)或this-x=x, this-y=y; (2)void show()const cout(x,y); (3):p1(pt1),p2(pt2)或p1=pt1; p2=pt2)解析:考点 本题考查的是 Point类和 Line类,其中涉及构造函数、const 函数和成员函数。构造函数一般使用成员列表初始化,语句最后有个“;”作为结束符。 解析 (1)主要考查考生对构造函数的掌握,因为形参名和私有成员名称一样,因此不能直接赋值,在这里使用成员列表初始化,也
16、可以使用this指针赋值。 (2)主要考查考生对语句基本语法的掌握,根据语句:void show()const cout(x,y)。可看出函数体内并没有“;”作为 cout语句的结束符,因此程序错误。 (3)主要考查考生对构造函数的掌握,形参是 pt1和 pt2,这里写反了,也可以使用成员列表初始化法,可以避免这种错误。二、B简单应用题/B(总题数:1,分数:30.00)2.请使用 VC6或使用答题菜单打开考生文件夹 proj2下的工程 proj2,其中有整数栈类 IntList、顺序栈类 SeqList和链接栈类 LinkList的定义。请在程序中的横线处填写适当的代码并删除横线,以实现上述
17、类定义。此程序的正确输出结果应为: 4 6 3 1 8 4 6 3 1 8 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动/“*found*”。 #includeiostream using namespace std; class IntStack/整数栈类 public: virtual void push(int)=0; /入栈 virtual int pop()=0; /出栈并返回出栈元素 virtual int topElement()const=0; /返回栈顶元素,但不出栈 virtual bool isEmpty()const=0; /判断是否栈空
18、 ; class SeqStack: public IntStack int data100; /存放栈元素的数组 int top; /栈顶元素的下标 public: /*found* SeqStack(): _/把 top初始化为-1 表示栈空 void push(int n)(data+top=n; /*found* int pop()return_; int topElement()constreturn datatop; bool isEmptyoconstreturn top=-1; ; Struct Node int data; Node * next; ; class LinkS
19、tack: public IntStack Node*top; public: /*found* LinkStack(): _)/把 top初始化为 NULL表示栈空 void push(int n) Node*p=new Node; p-data=n; /*found* _; top=p; int pop() int d=top-data; top=top-next; return d; int topElement()constreturn top-data; bool isEmpty()constreturn top=NULL; ;void pushData(IntStack st.pu
20、sh(1); st.push(3); st.push(6); st.push (4); void popData (IntStack int main() SeqStack st1; pushData (st1); popData (st1); cout endl; LinkStack st2; pushData (st2); popData (st2); coutendl; return 0; (分数:30.00)_正确答案:(1)top(-1) (2)datatop- (3)top(NULL) (4)p-next=top)解析:考点 本题考查的是 IntStack类及其派生类 SeqSta
21、ck类和 LinkStack类,其中涉及纯虚函数、数组、构造函数和动态数组。本题对栈的知识要求很高,栈的特点是先进后出,后进先出。 解析 (1)主要考查考生对构造函数的掌握情况,先看语句注释:把 top初始化为-1 表示栈空,即要把 top赋值为-1即可。 (2)主要考查考生对纯虚函数的掌握情况,先看纯虚函数在基类的注释:出栈并返回出栈元素。要返回栈顶元素可以通过 datatop得到,出栈同时要使得 top往下移动,即 top-。 (3)主要考查考生对构造函数的掌握情况,先看语句注释:把 top初始化为 NULL表示栈空,因此使用成员列表初始化直接把 top赋值为 NULL即可。 (4)主要考
22、查考生对栈的掌握,push 为入栈函数,top 指向栈顶元素,因此新添加的指针的 next要指向 top,即 p-next=top;。三、B综合应用题/B(总题数:1,分数:40.00)3.请使用 VC6或使用答题菜单打开考生文件夹 proj3下的工程 proj3,其中声明 IntSet是一个用于表示正整数集合的类。IntSet 的成员函数 Intersection的功能是求当前集合与另一个集合的交集。请完成成员函数 Intersection。在 main函数中给出了一组测试数据,此时程序的输出应该是: 求交集前: 1 2 3 5 8 10 2 8 9 11 30 56 67 求交集后: 1
23、2 3 5 8 10 2 8 9 11 30 56 67 2 8 要求: 补充编制的内容写在“/*333*”与“/*666*”之间,不得修改程序的其他部分。 注意:程序最后将结果输出到文件 out.dat中。输出函数 writeToFile已经编译为 obj文件,并且在本程序中调用。 /Intset.h #include iostream using namespace std; const int Max=100; class IntSet public: IntSet() /构造一个空集合 end=-1; IntSet(int a, int size) /构造一个包含数组 a中 size个
24、元素的集合 if (size=Max) end =Max-1; else end=size-1; for(int i=0; i=end; i+) elementi=ai; bool IsMemberOf (int a) /判断 a是否为集合中一个元素 for(int i=0; i=end; i +) if(elementi=a) return true; return false; int GetEnd() return end; int GetElement (int i) return elementi; /返回下标为 i的元素 IntSet Intersection(IntSet /求当
25、前集合与集合 set的交 void Print () /输出集合中的所有元素 for(int i=0; i=end; i+) if(i +1)% 20=0) coutelementiendl; else coutelementi; coutendl; private: int elementMax; int end; ; void writeToFile (const char *); /main.cpp #include “IntSet.h“ IntSet IntSet:Intersection(IntSet /*333* /*666* return IntSet (a, size); in
26、t main () int a=1, 2, 3, 5, 8, 10; int b=2, 8, 9, 11, 30, 56, 67; IntSet set1 (a,6), set2 (b,7), set3; cout “求交集前:“endl; set1. Print (); set2. Print (); set3. Print (); set3 = set1. Intersection (set2); coutendl“求交集后:“endl; set1. Print (); set2. Print (); set3. Print (); writeToFile (“); return 0; (
27、分数:40.00)_正确答案:(for(int i=0; i=set.GetEnd(); i+) /遍对象 set数组 if (IsMemberOf (set.GetElement (i) /判断对象 Set数组第 i个值是不 是集合中的值,如果是则把它插入到 a中 asize+=set.GetElement (i);)解析:考点 本题考查的是 IntSet类,其中涉及构造函数、bool 函数和成员函数。本类是一个用于表示正整数集合的类,题目要求填写的函数能实现交集的功能,也就是将两个数组内的元素进行比较,将一样的元素提取出来。 解析 主要考查考生对数组的掌握,根据 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中。 主要考查考生对数组的掌握,集合可以用数组来实现,交集就是将两个数组中相等的元素提取出来放入一个新建立的数组。