1、国家二级 C+机试(操作题)模拟试卷 493及答案与解析 一、基本操作题 1 请打开考生文件夹下的解决方案文件 proj1,此工程中含有一个源程序文件proj1 cpp。其中位于每个注释 “ ERROR*found*”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: NUM=0 Value=1 注意:只修改注释 “ ERROR*found*”的下一行语句,不要改动程序中的其他内容。 proj1 cpp #include lostEeam using namespace std; class MyClass int_i; friend VOid Increment; (MyClass
2、&f); public: const int NUN; ERROR*found* NyClass(int i=0)NUM=0; _i=i; int GetValue( )constreturn_i; ; ERROR*found* void Increment( )f _i+; ) int main( ) HyClass obj; ERROR*found* NyClass: TncEement(ohj); cout “NUN=“ oh3 NUN endl “Value=“ obj GetValLie( ) endl; retuEn0; 二、简单应用题 2 请打开考生文件夹下的解决方案文件 pro
3、j2,该工程中包含一个程序文件main cpp,其中有坐标点类 point、线段类 Line和三角形类 Triangle的定义,还有main函数的定义。程序中两点间距 离的计算是按公式 d= 实现的,三角形面积的计算是按公式 f= 实现的,其中 s= 请在程序中的横线处填写适当的代码,然后删除横线,以实现上述类定义。此程序的正确输出结果应为: Side1: 9 43398Side2: 5Side3: 8area: 20注意:只在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动 “*found*”。 #include iostEeam #include cmath using n
4、amespace std; class Point坐标点类 public: const double x, y; Point(double x=0 0,doubley=0 0): x(x), y(y) *found*double distanceTo(_)const到指定点的距离 return sqrt(x-p x)*(x-p x)+(y-p y)*(y-p y); ; class Line线段类 public: const Point p1, p2线段的两个端点 *found*Line(Point p1, Pointp2): _double length( )constreturnp1 di
5、stanceTo(p2); 线段的长度 ; class Triangle三角形类 public: const Point p1, p2, p3;三角形的三个顶点*found*Triangle(_): p1(p1), p2(p2), p3(p3)double lengthl( )const边 p1, p2的长度 return Line(p1, p2) length( ); double length2( )const边 p2, p3的长度 return Line(p2, p3) length( ); double length3( )const边 p3, p1的长度 return Line(p3
6、, p1) length( ); double area( )const三角形面积 *found*double s=_; return sqrt(s*(s-lengthl( )*(s-length2( )*(s-length3( ); ; int main( )Triangle r(Point(0 0, 8 0), Point(5 0, 0 0), Point(0 0, 0 0); cout “Side1: “ r length1( ) endl; cout “Side2: “ r length2( ) endl; cout“Side3: “ r length3( ) endl; cout “
7、area: “ r area( ) endl;return0; 三、综合应用题 3 请打开考生文件夹下的解决方案文件 proj3,其中定义了一个字符串 变量类StringVar。类成员的说明在程序注释中。请在 *333*和*666*之间填写 StringVar成员函数和友元函数的实现代码。在main函数中给出了一组测试数据,运行时输入: Hello Kitty 此情况下程序的输出应该是: Hello Kitty Borg Borg 注意:只需在 *333*和 *666*之间填入 所编写的若干语句,不要改动程序中的其他内容。 StringVar h #include ioStream #incl
8、ude cstdlib #include cstddef #include cstring using namespace std; VOid writeToFile(const char*path); class StringVar public: StringVar(int size);构造函数, size为字符串长度 (字符个数 )初始值;字符串内容初始化为空串 StringVar(const char a );构造函数,用 参数数组 a的内容初始化当前对象 StringVar(const StringVar&strobj);复制构造函数 StringVar( )delete value
9、; ;析构函数 int length( )constreturnstrlen(value); 从输入流 ins输入一个字符串,其中可以包括空格 void input_line(istream&ins); 返回字符串首地址 char*getValue( )constreturn value; private: char*value;字符串首地址 int max_length;字符串最大长度 (字符个数最大值 ) ; 将 the string通过输出流 outs输出 ostream&operator (ostream&outs, const StringVar the_string); main
10、cpp #include iostream #include string #include“StringVar h“ *333* *666* int main( ) StringVar namel(30), name2(“Borg“); name1 input_line(cin); StringVar name3(name2); cout name1 endl; cout name2 endl; cout name3 endl; writeToFile(“ “); return0; writeToFile cpp #include iostream #include fstream #inc
11、lude SStream #include string using namespace std; #include“StringVar h“ void writeToFile(const char*path) char filename30; strcpy(filename, path); strcat(filename, “out dat“); ofstream fout(filename); istringstream is (string(“Jenny Zheng“); StringVar name1(40), name2(“John“); name1 input line(is);
12、StringVar name3(name2); fout name1 name2 name3; fout close( ); 国家二级 C+机试(操作题)模拟试卷 493答案与解析 一、基本操作题 1 【正确答案】 (1)MyClass(int i=0): NUM(0) (2)void Increment(MyClass&f)f _i+; (3)Increment(obj); 【试题解析】 (1)主要考查考生对常量数据成员初始化方法的掌握,常量数据成员的初始化只能通过构造函数的成员初始化列表进行,并且要使用关键字 const修饰。该题的前一条语句 const int NUM;,说明 NUM是常
13、量数据成员。 (2)主要考查考生对友元函数的掌握,友元函数的定义与声明要一致,先看该友元函数的声明部分: friend void Increment(MyClass&f);,返回类型为 void,函数参数为 MyClass&f;再比较出错的语句: void Increment( )f _i+; , 错误在于该函数没有参数,应把 MyClass&f填在括号内。 (3)主要考查友元函数的调用,友元函数并不属于类,因此调用友元函数时不需要添加类名及作用域,只需要像调用普通函数一样即可。 二、简单应用题 2 【正确答案】 (1)const Point&p (2)pl(p1), p2(p2) (3)Po
14、int p1, Point p2, Point p3 (4)(length1( )+length2( )+length3( ) 2 【试题解析】 (1)主要考查考生对函数形参的掌握,由函数的注释可知有本坐标点到达某个坐标点类的距离,再根据函数体 return sqrt(x-p x)*(x-p x)+(y-p y)*(y-p y);可知,该坐标点类名为 p,因此可以知道形参为 Point&p,为了不改变该坐标点的值,前面要加上 const。 (2)主要考查考生对构造函数的掌握,对于常变量型私有成员 const Point p1,p2,只能用成员初始化列表进行赋值。 (3)主要考查考生对构造函数的
15、掌握,由空格后面的语句: p1(p1), p2(p2), p3(p3)可知,该构造函数需要进行成员列表初始化,再看类的私有成员 const Point p1,p2, p3,可知 p1, p2, p3是 Point类型,因此形参为 Point p1, Point p2, Point p3。 (4)主要考查考生对成员函数的掌握,根据函数注释,可知本函数要求计算三角形面积,再看题目的提示: s=(a+b+c) 2。可知空格处要填的是三角形的三条边之和除以 2,而求边长的函数已经给出,这里直接调用即可。 三、综合应用题 3 【正确答案】 StringVar: StringVar(int size):
16、max_length(size)使用成员初始化列表初 始化 max_length value=new charsize; value0= 0; StringVar: StringVar(constchar a ) max_length=strlen(a)+1; value=new charmax_length; Strcpy(value, a); StringVar: StringVar(constStringVar&strobj) max_length=strobj max_length; value=new charstrlen(strobj value)+1; strcpy(value,
17、 strobj value); void StringVar: input_line(istream&ins) int i=0; char ch; while(i max length-1&(ch=ins get( )!= n) valuei+=ch; valuei= 0; ostream&operator (ostream&outs, const StringVar the_string) outs the_string getValue( ) endl; return outs; 【试题解析】 由 StringVar h这个头文件可知:头文件中定义了 StringVar类,它包含的成员信息
18、如下: 两个数据成员: char*类型的 value,指向字符串的首地址; int类型的max_length,表示字符串的最大长度。两个构造函数:接收 int类型的构造函数和接收 const char a 的构造函数。一个复制构造函数:用参数 strobj对象的成员值给当前对象的成员赋值; 析构函数:使 用 delete 释放 value指向的地址空间; length( )成员函数:返回成员 value指向的字符串长度; input_line( )成员函数:使用输入流参数输入一个字符串,保存到 value指向的内存空间; getValue( )成员函数:常成员函数,返回value的值。 另外类
19、定义体外部还声明一个重载 “ ”运算符函数,将 StringVar对象中 value指向的字符串输出,并返回输出流 outs的引用 StringVar h中,已经给出的定义有:析构函数、 length( )函数和 getValue( )函数,所以需要我们完成的函数定义有:构造函数、复制构造函数、 input_line( )函数和重载的 “ ”运算符函数 StringVar(int size); 题意指出, size为字符串长度 (字符个数 )初始值,字符串内容初始化为空串,所以需要使用 size设置成员 max_length,为 value申请 size个字符的存储空间,并把value的第一个
20、字符设置为 0表示空串,这样保证析构函数的 delete 也是正确的。 StringVar(const char a ); 题意指出,使用参数数组 a的内 容初始化对象的成员,即将数组 a中的内容,存放到 value指向的内存空间,由于 value是使用 new分配的 (保证析构函数的delete 是正确的 ),所以不能简单的把数组 a的首地址赋给 value,需要将数组 a的内容复制到 value指向的内存空间中,另外成员 max_length,初值最小必须是value指向的内存空间长度,即 value指向的字符串长度 +l(题意中 max_length表示字符个数的最大值,所以需要包含字符
21、串结束符 0)(此构造函数的形参必须传人的是字符串,如果是字符数组,必须传入数组的长度, 以防数组 a的最后一个字符不是结束符 0,此时 strlen( )函数获取的长度,就不是字符数组 a的字符个数 ) slringVar(const slringVar&strobj); 复制构造函数需要将形参 strobj的成员赋给当前调用该复制构造函数的对象成员,在赋值 value时,同样需要为 value分配足够的内存空间。 input_line(istrearn&ins); input_line( )函数需要使用形参 ins输入流,输入一个字符串存放到 value中,题意要求可以输入空格,所以我们不
22、能直接用输人 流 ins和输入运算符,因为输入运算符会丢弃空白符、空格符和制表符,可以使用输入流 ins的成员函数: get( )和while循环,逐个输入字符存放到 value下标 i的字符中,直到输入的字符为换行符或 value存满 (i=max_length)为止,当这两个条件满足其一,那么就应该停止输入,另外需要注意: value指向的字符串结尾,必须包含空字符 0,所以下标。max_length-1必须是空字符,循环输入时, i取值最大为 max_length-2。 ostream&operator (oStream&outs, const stringVar the_string); 输出运算符重载函数,题意要求将 the-string通过输出流 outs输出,由于the_string是 StringVar对象,所以输出的应该是对象的成员 value指向的字符串,根据返回值可知,函数必须返回输入流 ostream的引用;另外由于第一形参是输入流 outs,所以无法通过 stringVar对象来调用,该函数不是类的成员函数,函数定义时,不能限定 stringVar作用域,由于该函数不是类的成员函数,所以使用输出流 outs输出 value指向的字 符串时,不能直接使用私有成员 value,而是应该使用 getValue( )公有成员函数,返回 value的值,再输出。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1