1、二级 C+-54及答案解析(总分:100.00,做题时间:90 分钟)一、B基本操作题/B(总题数:1,分数:30.00)1.请使用 VC6或使用答题菜单打开考生文件夹 proj1下的工程 proj1,此工程中含有一个源程序文件proj1.cpp。其中位于每个注释“/ERROR*found*”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: There are 2 object(s). 注意:只修改注释“/ERROR *found*”的下一行语句,不要改动程序中的其他内容。 /proj1.cpp #include iostream using namespace std; clas
2、s MyClass public: / ERROR *found* MyClass(int i = 0) value = i count +; void Print() cout “There are“ count “object(s).“ endl; private: const int value; static int count; ; / ERROR *found* static int MyClass:count = 0; int main() MyClass obj1, obj2; / ERROR *found* MyClass.Print(); return 0; (分数:30.
3、00)_二、B简单应用题/B(总题数:1,分数:30.00)2.凡是使用过 C语言标准库函数 strcpy(char*s1,char*s2)的程序员都知道,使用该函数时有一个安全隐患,即当指针 s1所指向的空间不能容纳字符串 s2的内容时,将发生内存错误。类 Stung的 Strcpy成员函数能进行简单的动态内存管理,其内存管理策略为:若已有空间能容纳新字符串,则直接进行字符串复制;若已有空间不够时,将重新申请一块内存空间(能容纳下新字符串),并将新字符串内容复制到新申请的空间中,释放原字符串空间。 请使用 VC6或使用答题菜单打开考生文件夹 proj2下的工程proj2,此工程中含有一个源程
4、序文件 proj2.cpp。其中定义了类 String和用于测试该类的主函数 main,且成员函数 Strepy的部分实现代码也已在该文件中给出,请在标有注释“/TODO:”的行中添加适当的代码,将这个函数补充完整,以实现其功能。 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“/*found*”。 / proj2.cpp #include iostream using namespace std; class String private: int size; /缓冲区大小 char * buf; /缓冲 public: String(int bufsize);
5、void Strcpy(char * s); /将字符串 s 复制到 buf中 void Print() const; String() if (buf != NULL) delete buf; ; String:String (int bufsize) size = bufsize; bur = new charsize; * buf = /0; void String:Strcpy (char * s) char * p,* q; int fen = strlen(s); if (len+1 size) /缓冲区空间不够,须安排更大空间 size = len+1; p = q = new
6、char size; /* found* while(* q=* s) !=0) _ /TODO: 添加代码将字符串 s复制到字符指针 q中 delete buf; buf = p; else /*found* for(p=buf; _; p+, s+); /TODO: 添加代码将字符串 s复制到buf中 void String:Print() const cout size /t buf endl; int main () char s100; String str (32); cin.getline(s, 99); str.Strcpy(s); str.Print (); return 0
7、; (分数:30.00)_三、B综合应用题/B(总题数:1,分数:40.00)3.请使用 VC6或使用答题菜单打开考生目录 proj3下的工程文件 proj3,该工程中包含一个源程序文件proj3.cpp,其中定义了用于表示平面坐标系中的点的类 MyPoint和表示圆形的类 MyCircle;程序应当显示: (1,2),5,31.4159,78.5398 但程序中有缺失部分,请按照以下提示,把缺失部分补充完整: (1)在“/*1* *found*”的下方是构造函数的定义,它用参数提供的圆心和半径分别对 cen和 rad进行初始化。 (2)在“/*2* *found*”的下方是非成员函数 per
8、imeter的定义,它返回圆的周长。(3)在“/*3* *found*”的下方是友元函数 area的定义,它返回圆的面积。 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。 / proj3.cpp #include iostream #include cmath using namespace std; class MyPoint /表示平面坐标系中的点的类 double x; double y; public: MyPoint (double x, double y) this-x=x; this-y=y; double getX()const
9、return x; double getY()const return y; void show()const cout (x, y); ; class MyCircle /表示圆形的类 MyPoint cen; /圆心 double rad; /半径 public: MyCircle(MyPoint,double); MyPoint center () const return cen; /返回圆心 double radius()const return fad; /返回圆半径 friend double area (MyCircle); /返回圆的面积 ; /*1* *found* MyC
10、ircle:MyCircle(MyPoint p, doubler) : cen(p), _ #define PI 3.1415926535 double perimeter(MyCircle c) /返回圆 c的周长 /*2* *found* return PI*_; /*3* *found* double area(_) /返回圆 a的面积 return PI* a.rad* a.rad; int main() MyCircle c(MyPoint(1, 2), 5.0); c.center().show(); cout ,c.radius() ,perimeter(c) ,area(c)
11、endl; return 0; (分数:40.00)_二级 C+-54答案解析(总分:100.00,做题时间:90 分钟)一、B基本操作题/B(总题数:1,分数:30.00)1.请使用 VC6或使用答题菜单打开考生文件夹 proj1下的工程 proj1,此工程中含有一个源程序文件proj1.cpp。其中位于每个注释“/ERROR*found*”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: There are 2 object(s). 注意:只修改注释“/ERROR *found*”的下一行语句,不要改动程序中的其他内容。 /proj1.cpp #include iostream
12、 using namespace std; class MyClass public: / ERROR *found* MyClass(int i = 0) value = i count +; void Print() cout “There are“ count “object(s).“ endl; private: const int value; static int count; ; / ERROR *found* static int MyClass:count = 0; int main() MyClass obj1, obj2; / ERROR *found* MyClass.
13、Print(); return 0; (分数:30.00)_正确答案:(1)MyClass(int i=0):value(i) (2)int MyClass:count=0; (3)obj2.Print();)解析:考点 本题考查 MyClass类,其中涉及构造函数、成员函数、常变量和静态数据成员。 解析 (1)主要考查考生对构造函数的掌握,使用成员列表初始化给常变量赋初始值。 (2)主要考查考生对静态数据成员的掌握,静态数据成员的赋值不需要使用 static关键字。 (3)主要考查考生对成员函数调用的掌握,MyClass 是类名,不能调用函数,应使用对象 obj2调用函数。二、B简单应用题/
14、B(总题数:1,分数:30.00)2.凡是使用过 C语言标准库函数 strcpy(char*s1,char*s2)的程序员都知道,使用该函数时有一个安全隐患,即当指针 s1所指向的空间不能容纳字符串 s2的内容时,将发生内存错误。类 Stung的 Strcpy成员函数能进行简单的动态内存管理,其内存管理策略为:若已有空间能容纳新字符串,则直接进行字符串复制;若已有空间不够时,将重新申请一块内存空间(能容纳下新字符串),并将新字符串内容复制到新申请的空间中,释放原字符串空间。 请使用 VC6或使用答题菜单打开考生文件夹 proj2下的工程proj2,此工程中含有一个源程序文件 proj2.cpp
15、。其中定义了类 String和用于测试该类的主函数 main,且成员函数 Strepy的部分实现代码也已在该文件中给出,请在标有注释“/TODO:”的行中添加适当的代码,将这个函数补充完整,以实现其功能。 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“/*found*”。 / proj2.cpp #include iostream using namespace std; class String private: int size; /缓冲区大小 char * buf; /缓冲 public: String(int bufsize); void Strcpy(c
16、har * s); /将字符串 s 复制到 buf中 void Print() const; String() if (buf != NULL) delete buf; ; String:String (int bufsize) size = bufsize; bur = new charsize; * buf = /0; void String:Strcpy (char * s) char * p,* q; int fen = strlen(s); if (len+1 size) /缓冲区空间不够,须安排更大空间 size = len+1; p = q = new char size; /*
17、 found* while(* q=* s) !=0) _ /TODO: 添加代码将字符串 s复制到字符指针 q中 delete buf; buf = p; else /*found* for(p=buf; _; p+, s+); /TODO: 添加代码将字符串 s复制到buf中 void String:Print() const cout size /t buf endl; int main () char s100; String str (32); cin.getline(s, 99); str.Strcpy(s); str.Print (); return 0; (分数:30.00)_
18、正确答案:(1)+q;+s; (2)(*p=*s)!=0)解析:考点 本题考查 string类,其中涉及动态数组、构造函数、成员函数、const 函数和析构函数。 解析 (1)主要考查考生对 while循环的掌握,先看语句注释:添加代码将字符串 s复制到字符指针 q中。程序已经给出了赋值语句,这里只要使 q和 s递增即可。 (2)主要考查考生对 for循环的掌握,先看语句注释:添加代码将字符串 s复制到 bur中。因为循环体中没有语句,直接用分号结束,因此需要在循环条件中完成赋值,同时进行条件判断,赋值语句为*p=*s,判断条件为当前字符不是字符串结束符。三、B综合应用题/B(总题数:1,分数
19、:40.00)3.请使用 VC6或使用答题菜单打开考生目录 proj3下的工程文件 proj3,该工程中包含一个源程序文件proj3.cpp,其中定义了用于表示平面坐标系中的点的类 MyPoint和表示圆形的类 MyCircle;程序应当显示: (1,2),5,31.4159,78.5398 但程序中有缺失部分,请按照以下提示,把缺失部分补充完整: (1)在“/*1* *found*”的下方是构造函数的定义,它用参数提供的圆心和半径分别对 cen和 rad进行初始化。 (2)在“/*2* *found*”的下方是非成员函数 perimeter的定义,它返回圆的周长。(3)在“/*3* *fou
20、nd*”的下方是友元函数 area的定义,它返回圆的面积。 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。 / proj3.cpp #include iostream #include cmath using namespace std; class MyPoint /表示平面坐标系中的点的类 double x; double y; public: MyPoint (double x, double y) this-x=x; this-y=y; double getX()const return x; double getY()const ret
21、urn y; void show()const cout (x, y); ; class MyCircle /表示圆形的类 MyPoint cen; /圆心 double rad; /半径 public: MyCircle(MyPoint,double); MyPoint center () const return cen; /返回圆心 double radius()const return fad; /返回圆半径 friend double area (MyCircle); /返回圆的面积 ; /*1* *found* MyCircle:MyCircle(MyPoint p, double
22、r) : cen(p), _ #define PI 3.1415926535 double perimeter(MyCircle c) /返回圆 c的周长 /*2* *found* return PI*_; /*3* *found* double area(_) /返回圆 a的面积 return PI* a.rad* a.rad; int main() MyCircle c(MyPoint(1, 2), 5.0); c.center().show(); cout ,c.radius() ,perimeter(c) ,area(c)endl; return 0; (分数:40.00)_正确答案:(1)rad(r) (2)2*c.radius() (3)MyCircle a)解析:考点 本题考查 MyPoint类和 MyCircle类,其中涉及构造函数、成员函数、const 函数和友元函数。 解析 (1)主要考查考生对构造函数的掌握,使用成员列表初始化给 rad赋初始值。 (2)主要考查考生对成员函数的掌握,函数功能为返回圆 c的周长。要返回圆的周长,应利用公式 PI*2*c.radius()完成。 (3)主要考查考生对成员函数的掌握,因为函数功能为返回圆 a的面积,所以函数的形参应该为MyCircle a。