资源描述
一、给出一个有理数类,实现 有理数的加法运算。请按后列恳求 作答。
1.仔细 、残缺地阅读 次序 ,对应题号填写注释。注释的内容包括 两部分:1.本行的语句是什么;2.简述其功能 或特征 。比如 ,注释可以 如斯 写:“友员函数;重载加法运算符(+)。〞
〔每题1分,共10 分〕
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
class Rational
{ private:
int numerator,denominator; //(例)数据成员;表示 一个有理数的分子、分母。
int maxcommonFactor(int,int); //(1)
void simplify( ); //(2)
void DtoF(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 &operator<< //(10)
(ostream &output, Rational &t);
};
2. 对应题号把函数的定义 补偿 残缺。〔每题3分,共9 分〕
int Rational::maxcommonFactor(int a,int b)
{if(a%b==0)return b; return (11) ;}
void Rational::simplify( )
{int temp=maxcommonFactor(abs(numerator),abs(denominator));
if(temp==1)return; numerator/=temp;denominator/=temp; return;}
void Rational::DtoF(double x,int & n,int & d)
{double s=fabs(x); d=1; while((s*d-int(s*d))>1e-15)d*=10;n=int(x*d);}
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+addend.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::showFraction( )
{if(numerator<0 && denominator<0 || numerator>=0 && denominator>0)
cout<<abs(numerator)<<"/"<<abs(denominator);
else cout<<"-"<<abs(numerator)<<"/"<<abs(denominator);}
Rational::operator double()
{return (13) ;}
ostream &operator <<(ostream &output, Rational &t)
{output<<t.numerator<<'/'<<t.denominator; return output;}
void main()
{ Rational a; cout<<double(a); cout<<endl;
Rational b(2,0); b.showFraction(); cout<<endl;
Rational c(3,4); c.showFraction(); cout<<endl;
Rational d(1.2); d.showFraction(); cout<<endl;
a=b+c; cout<<double(a); cout<<endl;
}
3. 按照题目 恳求 ,按对应题号作答。〔每题3分,共21分〕
·写出上述次序 的运行 结果。
(14)
·在上述次序 中,应用 成员函数重载加法运算符(+)。现假设 要改用友员函数重载加法运算符(+),下面给出了函数体,请写出呼应 的函数原型(声明 )跟 函数头。
函数原型 (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) ;
·在上述次序 中,请你补偿 一个复制构造函数的定义 ,恳求 用内联函数实现 。
(18)
复制构造函数跟 重载赋值运算符函数虽然根本上 实现 数据成员的复制,但实行 机会 差异 。复制构造函数素日 用于(19.a) 跟 转达 东西 参数,当函数前去 类典范 时,也要通过复制构造函数树破 临时 东西 ;重载赋值运算符函数用于(19.b) 。
·假设 在上述次序 的基础上,于main函数末了 处添加 一行:
for(int i=0;i<=1;i++)c.plus(c+d); cout<<double(c)<< ','<< double(d)<<endl;
写出这段语句的运行 结果。
(20)
二、给出一些类的定义 ,按恳求 作答。
1. 〔每题3分,共18分〕
//类A
#include<iostream.h>
class A
{ private: double x;
public:
A(double px=1):x(px){ }
double getx( ) const {return x;}
void show( ){cout<<"x="<<x<<endl;}
} ;
//类B公有承袭类A,类B的定义 及main函数如下:
class B: private A
{ private: double x;
public :
B(double px=2): x(px){ } //类B构造函数定义
void show( ){cout<<getx( )<<endl;}
} ;
void main( ) { A a; a.show( ); B b(3); b.show( ); }
·实行 上述次序 ,运行 结果为:
(21)
·假设 把类B构造函数定义 改为 B(double px=2):A(px){ } ,那么次序 运行 结果为:
(22)
· 改写上述次序 中的类B构造函数定义 B(double px=2): x(px){ }。恳求 不应用 “初始化式〞,但函数的功能 波动 ,且内联函数的方法 也波动 。按恳求 ,类B构造函数定义 可以 改写成:
(23)
·偶尔 需要 复制A类东西 的数据去创破 B类东西 ,请用内联函数的方法 写出类B的重载构造函数:
(24)
·假设 在上述main函数的末了 添加 一句:cout<<b.getx( )<<endl; 因getx( )公有,弗成 访征询 。请你在类B的定义 中作一声明 ,保持 getx( )仍为公有,使添加 的语句可以 运行 。该声明 为:
(25)
·在类B公有段添加 一个内联函数fetch的定义 ,其功能 是前去 B类东西 数据x的平方值。
(26)
2. 〔每题3分,共18分〕
以下次序 中,类B1,B2虚承袭类A,类C多承袭B1,B2。按题目 恳求 作答。留心 A为虚基类,树破 直截了当 派生类东西 时,只需一个a东西 的数据成员版本。
#include<iostream.h>
class A //长度x,y
{ public:
double x,y;
A(double px=1,double py=1):x(px),y(py){ }
virtual ~A( ){ }
void show( ){cout<<"[A ]=>"<<x<<","<<y<<endl;}
} ;
class B1: virtual public A //矩形面积
{ public :
B1(double px=2, double py=2):A(px,py){ }
void show(){cout<<"[B1]=>"<<x*y<<endl;}
} ;
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(){cout<<"[B2]=>"<<0.5*(x+y)*z<<endl;}
} ;
class C: public B1, public B2 //体积
{ public:
double h;
C(double px=4,double py=4,double pz=4,double ph=4):B2(px,py,pz),h(ph){}
void show(){cout<<"[C ]=>"<<x<<","<<y<<"/"<<x*y*h<<"/"<<0.5*(x+y)*z*h<<endl;}
} ;
void main()
{ A a; B1 b1; B2 b2; C c;
A* p=&a; p->show( );
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函数改写成纯虚函数。
(30)
·假设 类A的show函数改写成纯虚函数,原本 的main函数不克不迭 畸形 运行 ,什么缘故 ?请庞杂 说明因由 。
(31)
·类A的show函数改写成纯虚函数后,请你对原本 的main函数作庞杂 的删改 ,使其可以 输出派生类的数据。
(32)
三、给出一些关于 应用 模板的次序 段,按恳求 作答。
1.以下次序 用函数模板实现 两个数据的交换 ,请把有关的语句填充 残缺。
〔每题3分,共9分〕
#include<iostream.h>
template <(33) >
void swap((34) ) {(35) }
void main()
{ int j=1,k=3;
cout<<"int 数据典范 :\n"<<j<<","<<k<<"=>"; swap(j,k); cout<<j<<","<<k<<endl;
double x=1.23,y=9.87;
cout<<"double数据典范 : \n"<<x<<","<<y<<"=>"; swap(x,y); cout<<x<<","<<y<<endl;
char p='A',q='B';
cout<<"char 数据典范 :\n"<<p<<","<<q<<"=>"; swap(p,q); cout<<p<<","<<q<<endl ;
}
2.以下次序 应用 了向量vector跟 算法sort实现 数组的排序,请把有关的语句填充 残缺。
〔每题3分,共9分〕
#include<iostream>
#include<vector>
#include<algorithm>
using (36) ;
const int size=10;
void display(vector<int>V,int n)
{int i;for(i=0;i<size;i++) cout<<(37) <<" "; cout<<endl;}
bool down(int x,int y)
{return (38) ;}
void main( )
{ int a[size]={10,3,17,6,15,8,13,34,25,2};
vector<int>V(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 <iostream.h>
#include <fstream.h>
#include <stdlib.h>
void main( )
{ ofstream outstuf ; // 树破 输出文件流东西
outstuf.open("e:\\newfile.dat",(39) );
if(!outstuf){cerr<<"error!"<<endl;abort( );} // 调用 重载算符函数测试流
outstuf<<"This is a file of example.\n"; // 写入一行内容
outstuf (40) ;
}
精选可编辑
展开阅读全文