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

来源:互联网 发布:两性情趣软件 编辑:程序博客网 时间:2024/05/17 04:19
在分数类中的运算符重载基础上
(1)定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算。

(2)定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。


#include <iostream>#include <cmath>using namespace std;class CFraction    {private:    int nume;  // 分子    int deno;  // 分母public:    CFraction(int nu=0,int de=1);   //构造函数,初始化用    void output();  //输出:以8/6为例,style为0时,原样输出8/6;    void simplify();    //分数大小的比较    bool operator > (CFraction &c);    bool operator < (CFraction &c);    bool operator >= (CFraction &c);    bool operator <= (CFraction &c);    bool operator == (CFraction &c);    bool operator != (CFraction &c);    //分数的运算    CFraction operator+(CFraction &c);    CFraction operator-(CFraction &c);    CFraction operator*(CFraction &c);    CFraction operator/(CFraction &c);    //新增:取反取正求倒数    CFraction operator+();    CFraction operator-();    CFraction operator~();    //新增:输入输出流的重载    friend istream &operator>>(istream &,CFraction &);    friend ostream &operator<<(ostream &,CFraction );    };int main()    {    cout<<"分数c1=8/6"<<endl<<"————————————————"<<endl<<"将c1化简输出:";    CFraction C1(8,6),C2,C;    C1.simplify();    C1.output();    cout<<"————————————————"<<endl<<"输入分数c2(按a/b形式输入):";    cin>>C2;    cout<<"将c2化简后输出:";    C2.simplify();    C2.output();    //进行大小比较与加减乘除    cout<<"————————————————"<<endl;    cout<<"比较c1与c2大小:"<<endl;    if (C1>C2)        cout<<"C1>C2"<<endl;    if (C1<C2)        cout<<"C1<C2"<<endl;    if (C1==C2)        cout<<"C1=C2"<<endl;    if (C1!=C2)        cout<<"C1≠C2"<<endl;    if (C1>=C2)        cout<<"C1≥C2"<<endl;    if (C1<=C2)        cout<<"C1≤C2"<<endl;    cout<<"————————————————"<<endl;    cout<<"进行c1与c2的加减乘除:"<<endl;    cout<<"c1+c2=";    C=C1+C2;    C.simplify();    C.output();    cout<<"将c1与c2的和取正:"<<+C;    cout<<"c1-c2=";    C=C1-C2;    C.simplify();    C.output();    cout<<"将c1与c2的差取反:"<<-C;    cout<<"c1*c2=";    C=C1*C2;    C.simplify();    C.output();    cout<<"将c1与c2的积取倒数:"<<~C;    cout<<"c1/c2=";    C=C1/C2;    C.simplify();    C.output();    return 0;    }istream &operator>>(istream &in,CFraction &c)    {    char d;    int nu,de;    while (1)//注意while(1)的使用        {        cin>>nu>>d>>de;        if (d=='/'&&de!=0)            {            c.nume=nu;            c.deno=de;            break;            }        else            {            cout<<"格式错误,请重新输入!"<<endl;            }        }    return cin;    }ostream &operator<<(ostream &out,CFraction c)//!!!!!!!千万不能写CFraction &c!!!!!!    {    cout<<c.nume<<"/"<<c.deno<<endl;    return cout;    }CFraction CFraction::operator+()    {    return *this;    }CFraction CFraction::operator-()    {    CFraction c;    c.deno=-deno;    c.nume=-nume;    return c;    }CFraction CFraction::operator~()    {    CFraction c;    c.deno=nume;    c.nume=deno;    if (c.deno<0)//如果分母为正,分子是负数,需要把分母转化为正数。当分子分母均为负或均为正时,除法运算后都为正,不用再考虑。        {        c.deno=-c.deno;        c.nume=-c.nume;        }    return c;    }//分数的运算CFraction CFraction::operator+(CFraction &c)    {    CFraction a;    a.nume=deno*c.nume+nume*c.deno;    a.deno=deno*c.deno;    return a;    }CFraction CFraction::operator-(CFraction &c)    {    CFraction a;    a.nume=nume*c.deno-deno*c.nume;    a.deno=deno*c.deno;    return a;    }CFraction CFraction::operator*(CFraction &c)    {    CFraction a;    a.nume=nume*c.nume;    a.deno=deno*c.deno;    return a;    }CFraction CFraction::operator/(CFraction &c)    {    CFraction a;    a.nume=nume*c.deno;    a.deno=deno*c.nume;    return a;    }//实现分数大小的比较bool CFraction::operator > (CFraction &c)    {    if ((nume/deno)>(c.nume/c.deno))return true;    else return false;    }bool CFraction::operator < (CFraction &c)    {    if ((nume/deno)<(c.nume/c.deno))return true;    else return false;    }bool CFraction::operator >= (CFraction &c)    {    if (*this<c)return false;    else return true;    }bool CFraction::operator <= (CFraction &c)    {    if (*this>c)return false;    else return true;    }bool CFraction::operator == (CFraction &c)    {    if (*this<c||*this>c)return false;    else return true;    }bool CFraction::operator != (CFraction &c)    {    if (*this==c)return false;    else return true;    }//实现分数格式的判断CFraction::CFraction(int nu,int de)    {    while (1)//注意while(1)的使用        {        if (de!=0)            {            nume=nu;            deno=de;            break;            }        else            cout<<"分子不能为0,请重新输入!"<<endl;        }    }//化简和输出void CFraction::simplify()//!!记住如何求最大公约数    {    int r,x=nume,y=deno;    while (y!=0)        {        r=x%y;        x=y;        y=r;        }    nume/=x;    deno/=x;    return;    }void CFraction::output()    {    if (deno<0)//如果分母为正,分子是负数,需要把分母转化为正数。当分子分母均为负或均为正时,除法运算后都为正,不用再考虑。        {        deno=-deno;        nume=-nume;        }    cout<<nume<<"/"<<deno<<endl;    return;    }

运行结果


0 0
原创粉丝点击