分数类中的运算符重载(3)(4)

问题及代码:

/*
*copyright (t) 2016,烟台大学计算机学院
*All rights reserved.
*文件名称:test.cpp
*作者:张晴晴
*完成日期:2016年6月7日
*版本号:v1.0
*问题描述:
   (1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算。
     (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;


class CFraction
{
private:
    int nume;  // 分子
    int deno;  // 分母
public:
    friend istream &operator>>(istream&in,CFraction &x);
    friend ostream &operator<<(ostream&out,CFraction &x);
    CFraction(double nu=0,double de=1):nume(nu),deno(de){}
    int getnume(){return nume;}
    int getdeno(){return deno;}
    CFraction operator+();
    CFraction operator-();
    CFraction operator~();
   friend CFraction operator+(const CFraction&c1,const CFraction&c2);
   friend CFraction operator-(const CFraction&c1,const CFraction&c2);
   friend CFraction operator*(const CFraction&c1,const CFraction&c2);
   friend CFraction operator/(const CFraction&c1,const CFraction&c2);  //构造函数及运算符重载的函数声明
   void simplify();
};//重载函数的实现及用于测试的main()函数1


    CFraction  CFraction ::operator+()
    {
     CFraction c;
     if(nume<0)
     {
        c.nume=-nume;
        c.deno=deno;
     }
     else
     {
        c.nume=nume;
        c.deno=deno;
     }
       return c;
    }
    CFraction  CFraction ::operator-()
    {
        CFraction c;
        c.nume=-nume;
        c.deno=deno;
       return c;
    }
    CFraction  CFraction ::operator~()
    {
        CFraction c;
        c.nume=deno;
        c.deno=nume;
        if(c.deno<0)
        {
            c.nume=-c.nume;
            c.deno=-c.deno;
        }

       return c;
    }

    istream &operator>>(istream&in,CFraction &x)
    {
        char t;
        while(1)
        {
            cin>>x.nume>>t>>x.deno;
            if(x.deno==0)
                cerr<<"分母为0,请重新输入!"<<endl;//注意
            if(t!='/')
                cerr<<"格式错误,请重新输入!"<<endl;
            else
                break;
        }
        if(x.deno<0)//这的问题是为什么非得将分母转换为正数
       {
           x.deno=-x.deno;//把分母上的正号转换到分子上,因为分子要进行加减运算
           x.nume=-x.nume;
       }
        return in;
    }
    ostream &operator<<(ostream&out,CFraction &x)
    {
        if(x.deno!=1&&x.nume!=0)
            cout<<x.nume<<'/'<<x.deno<<endl;//这个地方就不能用t了,因为传参的时候没有传进t来
        if(x.deno==1)
        cout<<x.nume<<endl;
        if(x.nume==0)
        cout<<"0"<<endl;
        return out;
    }




  CFraction operator+(const CFraction&c1,const CFraction&c2)
   {
       CFraction c;
       c.nume=c1.nume*c2.deno+c2.nume*c1.deno;
       c.deno=c1.deno*c2.deno;
       c.simplify();
       return c;
   }
  CFraction operator-(const CFraction&c1,const CFraction&c2)
   {
       CFraction c;
       c.nume=c1.nume*c2.deno-c2.nume*c1.deno;
       c.deno=c1.deno*c2.deno;
       c.simplify();
       return c;
   }
   CFraction operator*(const CFraction&c1,const CFraction&c2)
   {
       CFraction c;
       c.nume=c1.nume*c2.nume;
       c.deno=c1.deno*c2.deno;
       c.simplify();
       return c;
   }
  CFraction operator/(const CFraction&c1,const CFraction&c2)
   {
       CFraction c;
       if(c2.nume==0||c1.nume==0)
       {
        c.nume=0;
        return c;
       }
       else
       {
       c.nume=c1.nume*c2.deno;
       c.deno=c1.deno*c2.nume;
       c.simplify();
      return c;
       }
   } //构造函数及运算符重载的函数声明
   void CFraction ::simplify()
   {


       int m,n,r;

       n=fabs(deno);
       m=fabs(nume);
       while(r=m%n)
       {
           m=n;
           n=r;
       }
       deno=deno/n;
       nume=nume/n;
       if(deno<0)//得将分母转换为正数
       {
           deno=-deno;//把分母上的正号转换到分子上,因为分子要进行加减运算
           nume=-nume;
       }

   }
   int main()
   {
    CFraction x,a1,a2,b1,b2,c1,c2,d1,d2;
    int y;
    cout<<"请输入分数x:";
    cin>>x;
    cout<<"请输入整数y:";
    cin>>y;
    a1=x+y;
    cout<<"x+y="<<a1<<endl;
    b1=x-y;
    cout<<"x-y="<<b1<<endl;
    c1=x*y;
    cout<<"x*y="<<c1<<endl;
    d1=x/y;
    cout<<"x/y="<<d1<<endl;
    a2=y+x;
    cout<<"y+x="<<a2<<endl;
    b2=y-x;
    cout<<"y-x="<<b2<<endl;
    c2=y*x;
    cout<<"y*x="<<c2<<endl;
    d2=y/x;
    cout<<"y/x="<<d2<<endl;
    x=-x;
    cout<<"x的相反数为:"<<x<<endl;
    x=+x;
    cout<<"x取正为:"<<x<<endl;
    x=~x;
    cout<<"x的倒数为:"<<x<<endl;
    return 0;
   }

运行结果:

学习心得:

这是比之前写的最简的步骤了吧,输出的对象分母等于1时是一个整数,分子等于0的时候输出的是0,这些输出结果的实现只要在重载的输出流的对象上进行判断就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早日退休过上不劳而获生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值