您的位置:首页 > 其它

分数运算符重载(3)

2016-05-31 16:01 211 查看

*Copyright (c) 2014,烟台大学计算机学院

*All right reserved.

*文件名称:test.cpp

*作    者:韩双志

*完成日期:2016年5月27日

*版本号:v1.0

*

*问题描述:实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算,定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算。

*输入描述:输入两组分数

*输出描述:输出6种的结果

*

/*

#include <iostream>

#include<cmath>

using namespace std;

class CFraction

 {

 private:

     int nume;

     int deno;

 public:

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

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

      CFraction(int nu=0,int de=1):nume(nu),deno(de){}

      CFraction operator+(const CFraction &c);

      CFraction operator-(const CFraction &c);

      CFraction operator*(const CFraction &c);

      CFraction operator/(const CFraction &c);

      CFraction operator+(const int i);

      CFraction operator-(const int i);

      CFraction operator*(const int i);

      CFraction operator/(const int i);

       CFraction operator+();  //取正一目运算

    CFraction operator-();  //取反一目运算

    CFraction operator~();  //取倒数一目运算

      bool operator>(const CFraction &c);

      bool operator==(const CFraction &c);

      bool operator<(const CFraction &c);

      void simplay();

 };

 void CFraction::simplay()

 {

    int m,n,r;

     n=fabs(deno);

     m=fabs(nume);

     while(r)  // 求m,n的最大公约数

    {

         m=n;

         n=r;

         r=m%n;

     }

     deno/=n;     // 化简

    nume/=n;

     if (deno<0)  // 将分母转化为正数

    {

         deno=-deno;

         nume=-nume;

     }

}

 CFraction CFraction:: operator+(const CFraction &c)

 {

     CFraction a;

     a.nume=nume*c.deno+c.nume*deno;

     a.deno=deno*c.deno;

     a.simplay();

     return a;

 }

 CFraction CFraction:: operator-(const CFraction &c)

 {

     CFraction a;

      a.nume=nume*c.deno-c.nume*deno;

     a.deno=deno*c.deno;

    a.simplay();

     return a;

 }

 CFraction CFraction:: operator*(const CFraction &c)

 {

     CFraction a;

     a.nume=nume*c.nume;

     a.deno=deno*c.deno;

     a.simplay();

     return a;

 }

 CFraction CFraction:: operator/(const CFraction &c)

 {

     CFraction a;

     a.nume=nume*c.deno;

     a.deno=deno*c.nume;

     a.simplay();

     return a;

 }

  CFraction CFraction:: operator+(const int i)

 {

     CFraction a;

     a.nume=nume+deno*i;

     a.deno=deno;

     a.simplay();

     return a;

 }

 CFraction CFraction:: operator-(const int i)

 {

     CFraction a;

      a.nume=nume-i*deno;

     a.deno=deno;

    a.simplay();

     return a;

 }

 CFraction CFraction:: operator*(const int i)

 {

     CFraction a;

     a.nume=nume*i;

     a.deno=deno;

     a.simplay();

     return a;

 }

 CFraction CFraction:: operator/(const int i)

 {

     CFraction a;

     a.nume=nume;

     a.deno=deno*i;

     a.simplay();

     return a;

 }

 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;

     else

     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;

     else

     return false;

 }

// 分数比较大小

bool CFraction::operator==(const CFraction &c)

{

    if (*this==c) return true;

    return false;

}

 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+()

{

    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;

}

int main()

 {

     CFraction x,y,s;

     int i;

     cout<<"输入x: ";

     cin>>x;

     cout<<"输入y: ";

     cin>>y;

     cout<<"输入i:"<<endl;

     cin>>i;

     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;

     s=x+i;

     cout<<"x+i="<<s<<endl;

     s=x-i;

     cout<<"x-i="<<s<<endl;

     s=x*i;

     cout<<"x*i="<<s<<endl;

     s=x/i;

     cout<<"x/i="<<s<<endl;

      cout<<"-x="<<-x<<endl;

    cout<<"+x="<<+x<<endl;

    cout<<"x的倒数: "<<~x<<endl;

     if (x<y) cout<<"小于";

     if (x>y) cout<<"大于";

    if (x==y) cout<<"等于";

     return 0;

 }

*/

运算结果:

  


知识点结构:

     运算符重载

学习心得

     能慢慢写出程序,但需要很长时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: