1、一、给出一个有理数类,实现 有理数的加法运算。请按后列恳求 作答。1仔细 、残缺地阅读 次序 ,对应题号填写注释。注释的内容包括 两部分:1.本行的语句是什么;2.简述其功能 或特征 。比如 ,注释可以 如斯 写:“友员函数;重载加法运算符(+)。 每题1分,共10 分#include#include#includeclass Rational private:int numerator,denominator; /(例)数据成员;表示 一个有理数的分子、分母。int maxcommonFactor(int,int); /(1) void simplify( ); /(2) void DtoF
2、(double,int&,int&); /(3) public: Rational(int n,int d=1); /(4) Rational(double x=0); /(5) Rational(); /(6) void plus(const Rational&); /(7) Rational operator + (const Rational&); /(例)公有成员函数;重载加法运算符(+)。 void showFraction( ); /(8) operator double( ); /(9) friend ostream &operator1e-15)d*=10;n=int(x*d)
3、;Rational:Rational(int n,int d) if(d=0) cout差错 ! 分母不克不迭 为0。有理数将置为0。endl; numerator=0; denominator=1; else (12) ; ; simplify(); Rational:Rational(double x) DtoF(x,numerator,denominator);simplify();Rational:Rational( ) void Rational:plus(const Rational& addend) numerator=addend.numerator*denominator+a
4、ddend.denominator*numerator; denominator*=addend.denominator; simplify();Rational Rational:operator + (const Rational& t) Rational temp(0,1); temp.numerator=numerator*t.denominator+denominator*t.numerator; temp.denominator=denominator*t.denominator; temp.simplify(); return temp;void Rational:showFra
5、ction( ) if(numerator0 & denominator=0 & denominator0) coutabs(numerator)/abs(denominator); else cout-abs(numerator)/abs(denominator);Rational:operator double() return (13) ;ostream &operator (ostream &output, Rational &t) outputt.numerator/t.denominator; return output;void main() Rational a; coutdo
6、uble(a); coutendl; Rational b(2,0); b.showFraction(); coutendl; Rational c(3,4); c.showFraction(); coutendl; Rational d(1.2); d.showFraction(); coutendl; a=b+c; coutdouble(a); coutendl;3. 按照题目 恳求 ,按对应题号作答。每题3分,共21分写出上述次序 的运行 结果。 (14) 在上述次序 中,应用 成员函数重载加法运算符(+)。现假设 要改用友员函数重载加法运算符(+),下面给出了函数体,请写出呼应 的函数
7、原型(声明 )跟 函数头。函数原型 (15) 函数头 (16) 函数体 Rational temp(0,1); temp.simplify(); return temp; 在上述次序 中,构造函数出现重载,我们 按其定义 的先后分不称为构造函数1跟 构造函数2。留心 到main函数中依次定义 了东西 a,b,c,d。请你分不写出这四个东西 的初始化各自调用 的是哪一个构造函数。 东西 a初始化: (17.a) ; 东西 b初始化: (17.b) ;东西 c初始化: (17.c) ; 东西 d初始化: (17.d) ;在上述次序 中,请你补偿 一个复制构造函数的定义 ,恳求 用内联函数实现 。(
8、18) 复制构造函数跟 重载赋值运算符函数虽然根本上 实现 数据成员的复制,但实行 机会 差异 。复制构造函数素日 用于(19.a) 跟 转达 东西 参数,当函数前去 类典范 时,也要通过复制构造函数树破 临时 东西 ;重载赋值运算符函数用于(19.b) 。假设 在上述次序 的基础上,于main函数末了 处添加 一行:for(int i=0;i=1;i+)c.plus(c+d); coutdouble(c) , double(d)endl; 写出这段语句的运行 结果。 (20) 二、给出一些类的定义 ,按恳求 作答。1. 每题3分,共18分/类A#includeclass A private:
9、 double x;public: A(double px=1):x(px) double getx( ) const return x; void show( )coutx=xendl; ;/类B公有承袭类A,类B的定义 及main函数如下:class B: private A private: double x;public : B(double px=2): x(px) /类B构造函数定义 void show( )coutgetx( )endl; ;void main( ) A a; a.show( ); B b(3); b.show( ); 实行 上述次序 ,运行 结果为: (21)
10、假设 把类B构造函数定义 改为 B(double px=2):A(px) ,那么次序 运行 结果为: (22) 改写上述次序 中的类B构造函数定义 B(double px=2): x(px) 。恳求 不应用 “初始化式,但函数的功能 波动 ,且内联函数的方法 也波动 。按恳求 ,类B构造函数定义 可以 改写成:(23) 偶尔 需要 复制A类东西 的数据去创破 B类东西 ,请用内联函数的方法 写出类B的重载构造函数:(24) 假设 在上述main函数的末了 添加 一句:coutb.getx( )endl; 因getx( )公有,弗成 访征询 。请你在类B的定义 中作一声明 ,保持 getx( )
11、仍为公有,使添加 的语句可以 运行 。该声明 为:(25) 在类B公有段添加 一个内联函数fetch的定义 ,其功能 是前去 B类东西 数据x的平方值。(26) 2 每题3分,共18分以下次序 中,类B1,B2虚承袭类A,类C多承袭B1,B2。按题目 恳求 作答。留心 A为虚基类,树破 直截了当 派生类东西 时,只需一个a东西 的数据成员版本。#includeclass A/长度x,y public: double x,y; A(double px=1,double py=1):x(px),y(py) virtual A( ) void show( )coutx,yendl; ;class B
12、1: virtual public A /矩形面积 public : B1(double px=2, double py=2):A(px,py) void show()coutx*yendl; ;class B2: virtual public A /梯形面积 public: double z; B2(double px=3, double py=3, double pz=3):A(px,py),z(pz)void show()cout0.5*(x+y)*zendl; ;class C: public B1, public B2 /体积 public:double h;C(double px=
13、4,double py=4,double pz=4,double ph=4):B2(px,py,pz),h(ph)void show()coutx,y/x*y*h/0.5*(x+y)*z*hshow( ); p=&b1; p-show( ); p=&b2; p-show( ); p=&c; p-show( );写出上述次序 的运行 结果。 (27) 在类A的show函数之前加上关键 字virtual,再写出上述次序 的运行 结果。 (28) 在(28)题基础上,于原main 函数的末了 添加 (B2)c).show( ); 结果将多表示 一行: (29) 把类A的show函数改写成纯虚函数。
14、(30) 假设 类A的show函数改写成纯虚函数,原本 的main函数不克不迭 畸形 运行 ,什么缘故 ?请庞杂 说明因由 。 (31) 类A的show函数改写成纯虚函数后,请你对原本 的main函数作庞杂 的删改 ,使其可以 输出派生类的数据。 (32) 三、给出一些关于 应用 模板的次序 段,按恳求 作答。1以下次序 用函数模板实现 两个数据的交换 ,请把有关的语句填充 残缺。每题3分,共9分#includetemplate void swap(34) ) (35) void main() int j=1,k=3; coutint 数据典范 :nj,k; swap(j,k); coutj,
15、kendl; double x=1.23,y=9.87; coutdouble数据典范 : nx,y; swap(x,y); coutx,yendl; char p=A,q=B; coutchar 数据典范 :np,q; swap(p,q); coutp,qendl ;2以下次序 应用 了向量vector跟 算法sort实现 数组的排序,请把有关的语句填充 残缺。每题3分,共9分#include#include#includeusing (36) ;const int size=10;void display(vectorV,int n) int i;for(i=0;isize;i+) cou
16、t(37) ; coutendl;bool down(int x,int y) return (38) ;void main( ) int asize=10,3,17,6,15,8,13,34,25,2; vectorV(a,a+size); / 用数组对模板向量赋初值 cout输出原始数组: n; display(V,size); sort(V.begin( ),V.end( ); / 对向量按升序排序 cout输出升序摆设 后的数组: n ; display(V,size); sort(V.begin( ),V.end( ),down); / 对向量按落序排序 cout输出落序摆设 后的数组: n ; display(V,size);四、给出一个输出输出流把持 的次序 段,请把有关的语句填充 残缺。每题3分,共6分#include #include #include void main( ) ofstream outstuf ; / 树破 输出文件流东西 outstuf.open(e:newfile.dat,(39) ); if(!outstuf)cerrerror!endl;abort( ); / 调用 重载算符函数测试流 outstufThis is a file of example.n; / 写入一行内容 outstuf (40) ; 精选可编辑