15第九周项目三——分数类中的运算符的重载(续)

/*
 * Copyright (c) 2014, 烟台大学计算机学院
 * All rights reserved.
 * 文件名称:test.cpp
 * 作    者:李晓凯
 * 完成日期:2015年 5 月 9 日
 * 版 本 号:v1.0
 *
 * 问题描述:在第八周项目三(2)的基础上,(1)定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算,(2)定义分数类中的<<和>>运算符运算,实现分数的输入和输出。

 * 输入描述:
 * 程序输出:运算结果

 */

代码:

#include <iostream>
#include <Cmath>
using namespace std;
int gcd(int a,int b);
class CFraction
{
private:
    int nume;  // 分子
    int deno;  // 分母
public:
    CFraction(int n=0,int d=1):nume(n),deno(d) {}
    void simplify();
    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);

    friend CFraction operator + (int i,const CFraction &c);
    friend CFraction operator + (const CFraction &c,int i);
    friend CFraction operator - (int i,const CFraction &c);
    friend CFraction operator - (const CFraction &c,int i);
    friend CFraction operator * (int i,const CFraction &c);
    friend CFraction operator * (const CFraction &c,int i);
    friend CFraction operator / (int i,const CFraction &c);
    friend CFraction operator / (const CFraction &c,int i);
    friend istream& operator>>(istream& ,CFraction& c);
    friend ostream& operator<<(ostream& ,CFraction& c);

    friend bool operator > (const CFraction &c1,const CFraction &c2);
    friend bool operator < (const CFraction &c1,const CFraction &c2);
    friend bool operator == (const CFraction &c1,const CFraction &c2);
    friend bool operator != (const CFraction &c1,const CFraction &c2);
    friend bool operator >= (const CFraction &c1,const CFraction &c2);
    friend bool operator <= (const CFraction &c1,const CFraction &c2);

    friend bool operator > (int i,const CFraction &c);
    friend bool operator > (const CFraction &c,int i);
    friend bool operator < (int i,const CFraction &c);
    friend bool operator < (const CFraction &c,int i);
    friend bool operator == (int i,const CFraction &c);
    friend bool operator == (const CFraction &c,int i);
    friend bool operator != (int i,const CFraction &c);
    friend bool operator != (const CFraction &c,int i);
    friend bool operator >= (int i,const CFraction &c);
    friend bool operator >= (const CFraction &c,int i);
    friend bool operator <= (int i,const CFraction &c);
    friend bool operator <= (const CFraction &c,int i);

    CFraction operator + ();//取正一目函数
    CFraction operator - ();//取反一目函数
    CFraction operator ~ ();//取倒数一目函数
};
void CFraction::simplify()
{
    int n;
    n=gcd(nume,deno);
    deno/=n;
    nume/=n;
    if (deno<0)
    {
        deno=-deno;
        nume=-nume;
    }
}

int gcd(int a,int b)
{
    int m;
    while(b!=0)
    {
        m=a%b;
        a=b;
        b=m;
    }
    return a;
}
CFraction operator + (const CFraction &c1,const CFraction &c2)
{
    CFraction d;
    d.nume=c1.nume*c2.deno+c2.nume*c1.deno;
    d.deno=c1.deno*c2.deno;
    d.simplify();
    return d;
}

CFraction operator - (const CFraction &c1,const CFraction &c2)
{
    CFraction d;
    d.nume=c1.nume*c2.deno-c2.nume*c1.deno;
    d.deno=c1.deno*c2.deno;
    d.simplify();
    return d;
}

CFraction operator * (const CFraction &c1,const CFraction &c2)
{
    CFraction d;
    d.nume=c1.nume*c2.nume;
    d.deno=c1.deno*c2.deno;
    d.simplify();
    return d;
}

CFraction operator / (const CFraction &c1,const CFraction &c2)
{
    CFraction d;
    if (c2.nume==0)
        return c1;
    d.nume=c1.nume*c2.deno;
    d.deno=c1.deno*c2.nume;
    d.simplify();
    return d;
}

CFraction operator + (int i,const CFraction &c)
{
    CFraction s(c.nume+i*c.deno,c.deno);
    s.simplify();
    return s;
}

CFraction operator + (const CFraction &c,int i)
{
    CFraction s(c.nume+i*c.deno,c.deno);
    s.simplify();
    return s;
}
CFraction operator - (int i,const CFraction &c)
{
    CFraction s(c.nume-i*c.deno,c.deno);
    s.simplify();
    return s;
}
CFraction operator - (const CFraction &c,int i)
{
    CFraction s(c.nume-i*c.deno,c.deno);
    s.simplify();
    return s;
}
CFraction operator * (int i,const CFraction &c)
{
    CFraction s(c.nume*i,c.deno);
    s.simplify();
    return s;
}
CFraction operator * (const CFraction &c,int i)
{
    CFraction s(c.nume*i,c.deno);
    s.simplify();
    return s;
}
CFraction operator / (int i,const CFraction &c)
{
    CFraction s(c.nume,c.deno*i);
    s.simplify();
    return s;
}

CFraction operator / (const CFraction &c,int i)
{
    CFraction s(c.nume,c.deno*i);
    s.simplify();
    return s;
}
bool operator > (const CFraction &c1,const CFraction &c2)
{
    int c1_nume,c2_nume,common_deno;
    c1_nume=c1.nume*c2.deno;
    c2_nume=c2.nume*c1.deno;
    common_deno=c1.deno*c2.deno;
    if ((c1_nume-c2_nume)*common_deno>0)
        return true;
    return false;
}

bool operator<(const CFraction &c1,const CFraction &c2)
{
    int c1_nume,c2_nume,common_deno;
    c1_nume=c1.nume*c2.deno;
    c2_nume=c2.nume*c1.deno;
    common_deno=c1.deno*c2.deno;
    if ((c1_nume-c2_nume)*common_deno<0)
        return true;
    return false;
}

bool operator==(const CFraction &c1,const CFraction &c2)
{
    if (c1!=c2)
        return false;
    return true;
}

bool operator!=(const CFraction &c1,const CFraction &c2)
{
    if (c1>c2 || c1<c2)
        return true;
    return false;
}

bool operator>=(const CFraction &c1,const CFraction &c2)
{
    if (c1<c2)
        return false;
    return true;
}

bool operator<=(const CFraction &c1,const CFraction &c2)
{
    if (c1>c2)
        return false;
    return true;
}

CFraction CFraction::operator+()
{
    CFraction c;
    c.nume=nume;
    c.deno=deno;
    c.simplify();
    return c;
}
CFraction CFraction::operator-()
{
    CFraction c;
    c.nume=-nume;
    c.deno=deno;
    c.simplify();
    return c;
}
CFraction CFraction::operator~()
{
    CFraction t;
    t=-*this;
    t.simplify();
    return t;
}
istream& operator>>(istream& input,CFraction& c)
{
    char ch;
    while(1)
    {
        input>>c.nume>>ch>>c.deno;
        if(c.deno==0)
            cout<<"分母为0,请重新输入!"<<endl;
        else if(ch!='/')
            cout<<"格式不正确,请重新输入!"<<endl;
        else
            break;

    }
    return input;

}
ostream& operator<<(ostream& output,CFraction& c)
{
    output<<c.nume<<"/"<<c.deno;
}
int main()
{
    CFraction c1,c2,s;
    cin>>c1;
    cin>>c2;
    cout<<"分数:"<<endl<<"c1="<<c1;
    cout<<'\t'<<"c2="<<c2<<endl;
    s=+c1+c2;
    cout<<endl;
    cout<<"+c1+c2="<<s;
    cout<<endl;
    s=c1-c2;
    cout<<"c1-c2="<<s;
    cout<<endl;
    s=c1*c2;
    cout<<"c1*c2="<<s;
    cout<<endl;
    s=c1/c2;
    cout<<"c1/c2="<<s;
    cout<<endl;
    s=-c1-c2;
    cout<<"-c1-c2="<<s;
    cout<<endl<<endl;

    cout<<c1;
    if (c1>c2) cout<<"大于";
    if (c1<c2) cout<<"小于";
    if (c1==c2) cout<<"等于";
    cout<<c2;
    cout<<endl;

    CFraction c3(7,4),c4;
    cout<<"c3="<<c3<<endl;
    c4=c3+4;
    cout<<"c3+4="<<c4;
    c4=4+c3;
    cout<<'\t'<<"4+c3="<<c4<<endl;
    c4=c3-2;
    cout<<"c3-2="<<c4;
    c4=2-c3;
    cout<<'\t'<<"3-c3="<<c4;
    cout<<endl;
    c4=c3*2;
    cout<<"c3*2="<<c4;
    c4=2*c3;
    cout<<'\t'<<"2*c3="<<c4;
    cout<<endl;
    c4=c3/2;
    cout<<"c3/2="<<c4;
    c4=2/c3;
    cout<<'\t'<<"2/c3="<<c4;
    cout<<endl;

    c4=-c3;
    cout<<"-c3="<<c4<<endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值