第十三周项目1-分数类中的运算符重载(改进)

原创 2016年06月02日 08:47:41

问题及代码:

/*
 *Copyright (c) 2016,烟台大学计算机学院
 *All rights reserved.
 *文件名称:zwj.cpp
 *作    者:张伟晶
 *完成日期:2016年6月2日
 *版 本 号:v1.0
 *
 *问题描述:实现分数类中的运算符重载,加减乘除比较;在此基础上增加取正求反,求倒数运算,交换律
 *输入描述:
 *程序输出:
 */
#include<iostream>
#include<cmath>
using namespace std;
class CFraction
{
private:
    int num;//分子
    int deno;//分母
public:

    //构造函数及运算符重载的声明
    CFraction (int nu=0,int de=1):num(nu),deno(de){}
    void huajian();

   friend istream &operator>>(istream &in,CFraction &x);
   friend ostream &operator<<(ostream &out,CFraction x);

   ///下面!!!
   friend CFraction operator + (double d,const CFraction &c);
   friend CFraction operator - (double d,const CFraction &c);
   friend CFraction operator * (double d,const CFraction &c);
   friend CFraction operator / (double d,const CFraction &c);



    CFraction operator +(const CFraction &c);
    CFraction operator -(const CFraction &c);
    CFraction operator *(const CFraction &c);
    CFraction operator /(const CFraction &c);

    //分数比较大小
    bool operator>(const CFraction &c);
    bool operator<(const CFraction &c);
    bool operator==(const CFraction &c);
    //按位取反运算符
    CFraction operator+();
    CFraction operator-();
    CFraction operator~();

    ///分数与整数
    CFraction operator + (double &d);
    CFraction operator - (double &d);
    CFraction operator * (double &d);
    CFraction operator / (double &d);


};
CFraction  operator + (double d,const CFraction &c)
{
    CFraction n;
    n.num=c.num+d*c.deno;
    n.deno=c.deno;
    return n;
}
CFraction operator - (double d,const CFraction &c)
{
    CFraction n;
    n.num=d*c.deno-c.num;
    n.deno=c.deno;
    return n;
}
CFraction operator * (double d,const CFraction &c)
{
    CFraction n;
    n.num=c.num*d;
    n.deno=c.deno;
    return n;
}
CFraction operator / (double d,const CFraction &c)
{
    CFraction n;
    n.num=c.deno*4;
    n.deno=c.num;
    return n;
}
 /**************************   */
 /*
CFraction operator+(double &d,CFraction &c)
{
    CFraction n;
    n.num=c.num+c.deno*d;
    n.deno=c.deno;
    return n;
}
*/
CFraction CFraction::operator+(double &d)
{
    CFraction n;
    n.num=num+d*deno;
    n.deno=deno;
    n.huajian();
    return n;
}

CFraction CFraction::operator-(double &d)
{
    CFraction n;
    n.num=num-d*deno;
    n.deno=deno;
    n.huajian();
    return n;
}
CFraction CFraction::operator*(double &d)
{
    CFraction n;
    n.num=num*d;
    n.deno=deno;
    n.huajian();
    return n;
}
CFraction CFraction::operator/(double &d)
{
    CFraction n;
    n.num=num;
    n.deno=deno*d;
    n.huajian();
    return n;
}
//重载函数的实现以及用于测试的main()函数
void CFraction::huajian()
{

        int k;
        if(num>0)
            k=2;
        else
        {
            k=1;
            num=-num;
        }
        int m,n,r=1;
        m=num;
        n=deno;
        while(r=m%n)
        {
            m=n;
            n=r;
        }
        num=num/n*pow(-1,k);
        deno=deno/n;


}
/*
CFraction operator+(double &d,CFraction &c)
{
    CFraction n;
    n.num=c.num+c.deno*d;
    n.deno=c.deno;
    return n;
}
*/
// 重载输入运算符>>
istream &operator>>(istream &in,CFraction &x)
{
    char ch;
    while(1)
    {
        cin>>x.num>>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.num<<'/'<<x.deno;
    return cout;
}

CFraction CFraction::operator+(const CFraction &c)
{
    CFraction w;
    w.deno=deno*c.deno;
    w.num=num*c.deno+c.num*deno;
    w.huajian();
    return w;
}
CFraction CFraction::operator-(const CFraction &c)
{
    CFraction w;
    w.deno=deno*c.deno;
    w.num=num*c.deno-c.num*deno;
    w.huajian();
    return w;
}
CFraction CFraction::operator*(const CFraction &c)
{
    CFraction w;
    w.deno=deno*c.deno;
    w.num=num*c.num;
    w.huajian();
    return w;
}
CFraction CFraction::operator/(const CFraction &c)
{
    CFraction w;
    w.deno=deno*c.deno;
    w.num=num*c.deno/c.num*deno;
    w.huajian();
    return w;
}
//比较大小
bool CFraction::operator>(const CFraction &c)
{
    int m,n;
    m=num*c.deno;
    n=c.num*deno;
    if((m-n)>0)
        return true;
    else
        return false;
}
bool CFraction::operator<(const CFraction &c)
{

    int m,n;
    m=num*c.deno;
    n=c.num*deno;
    if((m-n)<0)
        return true;
    else
        return false;
}
bool CFraction::operator==(const CFraction &c)
{
    int m,n;
    m=num*c.deno;
    n=c.num*deno;
    if((m-n)==0)
        return true;
    else
        return false;
}
//按位取反
CFraction CFraction::operator+()
{
    return *this;
}
CFraction CFraction ::operator-()
{
    CFraction n;
    n.num=-num;
    n.deno=deno;
    return n;
}
CFraction CFraction::operator~()
{
    CFraction n;


    if(num<0)
    {
        n.deno=-num;
        n.num=-deno;
    }
    else
    {
        n.num=deno;
        n.deno=num;
    }
    return n;
}
int main()
{
    CFraction x,y,z;
    cout<<"请输入x,y"<<endl;

    cout<<"x:";
    cin>>x;
    cout<<"y:";
    cin>>y;
    cout<<"**********加减乘除**********"<<endl;
    z=x+y;
    cout<<"x+y="<<z<<endl;
    z=x-y;
    cout<<"x-y="<<z<<endl;
    z=x*y;
    cout<<"x*y="<<z<<endl;
    z=x/y;
    cout<<"x/y="<<z<<endl;
    cout<<endl;

    cout<<"**********比较大小**********"<<endl;
    if(x>y) cout<<"x>y"<<endl;
    if(x<y) cout<<"x<y"<<endl;
    if(x==y) cout<<"x=y"<<endl;
    cout<<endl;

    cout<<"**********分数取正反倒数**********"<<endl;
    cout<<+x<<endl;
    cout<<-x<<endl;
    cout<<~x<<endl;

    cout<<"**********交换律**********"<<endl;
    z=x+3;
    cout<<"x+3="<<z<<endl;
    z=x-3;
    cout<<"x-3="<<z<<endl;
    z=x*3;
    cout<<"x*3="<<z<<endl;
    z=x/3;
    cout<<"x/3="<<z<<endl;
    cout<<"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
    z=4+x;
    cout<<"4+x="<<z<<endl;
    z=4-x;
    cout<<"4-x="<<z<<endl;
    z=4*x;
    cout<<"4*x="<<z<<endl;
    z=4/x;
    cout<<"4/x="<<z<<endl;

    return 0;
}


 

运行结果:

知识点:

运算符重载中加减乘除的运算,分数加实数和实数加分数都要分别定义,而且实数加分数的运算需要定义友元函数的运算。

   friend CFraction operator + (double d,const CFraction &c);
   friend CFraction operator - (double d,const CFraction &c);
   friend CFraction operator * (double d,const CFraction &c);
   friend CFraction operator / (double d,const CFraction &c);


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

第十三周项目二:分数类中的运算符重载(1)

问题及代码: /*Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:main.cpp *作 者:崔青青 *完成日...
  • cqqdck
  • cqqdck
  • 2016年05月31日 14:07
  • 143

第十三周上机实践——项目1-分数类中的运算符重载

/* *Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:main.cpp,Fraction.h,Fraction....

第十三周实践项目1————分数类运算符重载(4)

问题及代码: /*copyright(c)2016.烟台大学计算机学院 * All rights reserved, * 文件名称:text.Cpp * 作者:吴敬超 * 完成日期:2016...

第十三周实践项目1————分数类的运算符重载(2)

问题及代码: /*copyright(c)2016.烟台大学计算机学院 * All rights reserved, * 文件名称:text.Cpp * 作者:吴敬超 * 完成日期:2016...

第十三周项目 1分数类中的运算符重载

/* *Copyright(c) 2016, 烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:main.cpp *作 者:李德坤 *完成日期:20...

第十三周实践项目1————分数类运算符重载(3)

问题及代码: /*copyright(c)2016.烟台大学计算机学院 * All rights reserved, * 文件名称:text.Cpp * 作者:吴敬超 * 完成日期:2016...

第十三周项目1——分数类中的运算符重载

问题及代码: /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:main.cpp * 作 者:赵志...

第十三周项目三 分数类中的运算符重载 (1)

/*copyright(c)2016.烟台大学计算机学院 * All rights reserved, * 文件名称:text.Cpp * 作者:舒文超 * 完成日期:2016年5月22日 ...

第十三周【项目 1分数类中的运算符重载】

/* *Copyright(c) 2016, 烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:main.cpp *作 者:张珩瑞 *完成日期:20...

第十三周项目1-分数类中的运算符重载(1)

*文件名称:test.cpp *作 者:陈文浩 *完成日期:2016年6月5日 */ 问题及代码: (1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第十三周项目1-分数类中的运算符重载(改进)
举报原因:
原因补充:

(最多只允许输入30个字)