第十三周项目一 分数类运算符重载

来源:互联网 发布:淘宝美工宣传视频 编辑:程序博客网 时间:2024/05/24 05:07
/*   *Copyright(c) 2016,烟台大学计算机学院   *作    者:刘金石   *完成日期:2016年5月23日   *问题描述:(1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算。  class CFraction  {  private:      int nume;  // 分子      int deno;  // 分母  public:      //构造函数及运算符重载的函数声明  };  //重载函数的实现及用于测试的main()函数(2)在(1)的基础上,实现分数类中的对象和整型数的四则运算。    分数类中的对象可以和整型数进行四则运算,且运算符合交换律。    例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。 (3)定义分数的一目运算+和-,分别代表分数取正和求反,    将“按位取反运算符”~重载为分数的求倒数运算。 (4)定义分数类中<<和>>运算符重载,实现分数的输入输出,     改造原程序中对运算结果显示方式,使程序读起来更自然。 */   #include <iostream>#include <Cmath>using namespace std;int fac(int x,int y);class CFraction{private:    int nume;  // 分子    int deno;  // 分母public:    CFraction(int nu=0,int de=1):nume(nu),deno(de) {}    void simplify();    //输入输出的重载    friend istream &operator>>(istream &in,CFraction &x);    friend ostream &operator<<(ostream &out,CFraction x);    CFraction operator+(const CFraction &c);  //两个分数相加,结果要化简    CFraction operator-(const CFraction &c);  //两个分数相减,结果要化简    CFraction operator*(const CFraction &c);  //两个分数相乘,结果要化简    CFraction operator/(const CFraction &c);  //两个分数相除,结果要化简    CFraction operator+();  //取正一目运算    CFraction operator-();  //取反一目运算    CFraction operator~();  //取倒数一目运算    bool operator>(const CFraction &c);    bool operator<(const CFraction &c);    bool operator==(const CFraction &c);    bool operator!=(const CFraction &c);    bool operator>=(const CFraction &c);    bool operator<=(const CFraction &c);};void CFraction::simplify(){    int m,n,y;    m=fabs(deno);    n=fabs(nume);    y=fac(m,n);    deno=deno/y;    nume=nume/y;    if (deno<0)  // 将分母转化为正数    {        deno=-deno;        nume=-nume;    }}int fac(int x,int y){int t;if(x<y){t=x;x=y;y=t;}// 25 15while(y>0){t=x%y;x=y;y=t;}return x;}// 重载输入运算符>>istream &operator>>(istream &in,CFraction &x){    char ch;    while(1)    {        cin>>x.nume>>ch>>x.deno;        if (x.deno==0)            cerr<<"分母为0, 请重新输入\n";        else if(ch!='/')            cerr<<"格式错误(形如m/n)! 请重新输入\n";        else            break;    }    return cin;}// 重载输出运算符<<ostream &operator<<(ostream &out,CFraction x){    cout<<x.nume<<'/'<<x.deno;    return cout;}CFraction CFraction::operator+(const CFraction &c)  //两个分数相加{    CFraction t;    t.nume=nume*c.deno+deno*c.nume;    t.deno=deno*c.deno;    t.simplify();    return t;}CFraction CFraction::operator-(const CFraction &c) //两个分数相减{    CFraction t;    t.nume=nume*c.deno-deno*c.nume;    t.deno=deno*c.deno;    t.simplify();    return t;}CFraction CFraction::operator*(const CFraction &c)//两个分数相乘{    CFraction t;    t.nume=nume*c.nume;    t.deno=deno*c.deno;    t.simplify();    return t;}CFraction CFraction::operator/(const CFraction &c) //两个分数相除{    CFraction t;    t.nume=nume*c.deno;    t.deno=deno*c.nume;    return t;}// 分数取正号CFraction CFraction:: operator+(){    return *this;}// 分数取负号CFraction CFraction:: operator-(){    CFraction x;    x.nume=-nume;    x.deno=deno;    return x;}// 分数取倒数CFraction CFraction:: operator~(){    CFraction x;    x.nume=deno;    x.deno=nume;   //未对原分子为0的情况进行处理    if(x.deno<0)    {        x.deno=-x.deno;        x.nume=-x.nume;    }    return x;}bool CFraction::operator>(const CFraction &c){    int this_nume,c_nume,common_deno;    this_nume=nume*c.deno;        // 计算分数通分后的分子,同分母为deno*c.deno    c_nume=c.nume*deno;    common_deno=deno*c.deno;    if ((this_nume-c_nume)*common_deno>0) return true;    return false;}// 分数比较大小bool CFraction::operator<(const CFraction &c){    int this_nume,c_nume,common_deno;    this_nume=nume*c.deno;    c_nume=c.nume*deno;    common_deno=deno*c.deno;    if ((this_nume-c_nume)*common_deno<0) return true;    return false;}bool CFraction::operator==(const CFraction &c){    if (*this>c||*this<c)        return true;    return false;}bool CFraction::operator!=(const CFraction &c){    if(*this==c)        return false;    return true;}bool CFraction::operator>=(const CFraction &c){    if (*this<c)        return false;    return true;}bool CFraction::operator<=(const CFraction &c){    if (*this>c)        return false;    return true;}int main(){    CFraction x,y,s;    cout<<"输入x: ";    cin>>x;    cout<<"输入y: ";    cin>>y;    s=+x+y;    cout<<"+x+y="<<s<<endl;    s=x-y;    cout<<"x-y="<<s<<endl;    s=x*y;    cout<<"x*y="<<s<<endl;    s=x/y;    cout<<"x/y="<<s<<endl;    cout<<"-x="<<-x<<endl;    cout<<"+x="<<+x<<endl;    cout<<"x的倒数: "<<~x<<endl;    cout<<x;    if (x>y) cout<<"大于";    if (x<y) cout<<"小于";    if (x==y) cout<<"等于";    cout<<y<<endl;    return 0;}
运行结果:
<img src="http://img.blog.csdn.net/20160523201130664?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

1 0