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

来源:互联网 发布:软件测试linux面试题 编辑:程序博客网 时间:2024/05/16 15:43

问题及代码:

/**Copyright (c) 2014,烟台大学计算机学院*All rights reserved.*文件名称:lily.cpp*作者:李莉*完成日期:2015年5月5日*版本号:v1.0**问题描述:实现分数类中的运算符重载,*程序输入:无输入*程序输出:如结果图*/#include <iostream>#include <Cmath>using namespace std;class CFraction{private:    int nume;  // 分子    int deno;  // 分母public:    CFraction(int nu=0,int de=1):nume(nu),deno(de) {}    void simplify();    friend istream&operator>>(istream&input,CFraction &f);    friend ostream&operator<<(ostream&outpur,CFraction f);    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+(const CFraction &c,const int i);    friend CFraction operator+(const int i,const CFraction &c);    friend CFraction operator-(const CFraction &c,const int i);    friend CFraction operator-(const int i,const CFraction &c);    friend CFraction operator*(const CFraction &c,const int i);    friend CFraction operator*(const int i,const CFraction &c);    friend CFraction operator/(const CFraction &c,const int i);    friend CFraction operator/(const int i,const CFraction &c);    CFraction operator+();  //取正一目运算    CFraction operator-();  //取反一目运算    CFraction operator~();//分数取倒数运算    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>(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);    friend bool operator<=(int i, const CFraction &c);};void CFraction::simplify(){    int m,n,r;    m=abs(deno);    n=abs(nume);    while((r=m%n))    {        m=n;        n=r;    }    deno/=n;    nume/=n;    if (deno<0)    {        deno=-deno;        nume=-nume;    }}istream&operator>>(istream& input,CFraction &f){    char s;    while(1)    {        cout<<"请输入一个分数(a/b):"<<endl;        cin>>f.nume>>s>>f.deno;        if(f.deno==0)        {            cerr<<"分母为0,请重新输入"<<endl;        }        else if(s!='/')        {            cerr<<"分数形式错误,请重新输入"<<endl;        }        else            break;    }    return input;}ostream&operator<<(ostream& output,CFraction f){    output<<f.nume<<"/"<<f.deno<<endl;}CFraction operator+(const CFraction &c1,const CFraction &c2){    CFraction c;    c.nume=c1.nume*c2.deno+c1.deno*c2.nume;    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=c2.deno*c2.deno;    c.simplify();    return c;}CFraction operator/(const CFraction &c1,const CFraction &c2){    CFraction t;    if (!c2.nume) return c1;    t.nume=c1.nume*c2.deno;    t.deno=c1.deno*c2.nume;    t.simplify();    return t;}CFraction operator+(const CFraction &c,const int i){    CFraction c1(c.nume+i*c.deno,c.deno);    c1.simplify();    return c1;}CFraction operator+(const int i,const CFraction &c){    CFraction c1(c.nume+i*c.deno,c.deno);    c1.simplify();    return c1;}CFraction operator-(const CFraction &c,const int i){    CFraction c1(c.nume-i*c.deno,c.deno);    c1.simplify();    return c1;}CFraction operator-(const int i,const CFraction &c){    CFraction c1(i*c.deno-c.nume,c.deno);    c1.simplify();    return c1;}CFraction operator*(const CFraction &c,const int i){    CFraction c1(c.nume*i,c.deno);    c1.simplify();    return c1;}CFraction operator*(const int i,const CFraction &c){    CFraction c1(c.nume*i,c.deno);    c1.simplify();    return c1;}CFraction operator/(const CFraction &c, int i){    CFraction c1(c.nume,c.deno*i);    c1.simplify();    return c1;}CFraction operator/(int i, const CFraction &c ){    CFraction c1(i*c.deno,c.nume);    c1.simplify();    return c1;}CFraction CFraction:: operator+(){    return *this;}// 分数取负号CFraction CFraction:: operator-(){    CFraction c;    c.nume=-nume;    c.deno=-deno;    return c;}//分数取倒数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;}// 分数比较大小bool operator>(const CFraction &c1, const CFraction &c2){    int c1_nume,c2_nume,common_deno;    c1_nume=c1.nume*c2.deno;        // 计算分数通分后的分子,同分母为c1.deno*c2.deno    c2_nume=c2.nume*c1.deno;    common_deno=c1.deno*c2.deno;    if ((c1_nume>c2_nume&&common_deno>0)||(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;}bool operator>(const CFraction &c, int i){    if(c.deno>0)        return c.nume>(i*c.deno);    else        return c.nume<(i*c.deno);}bool operator>(int i, const CFraction &c){    if(c.deno>0)        return (i*c.deno)>c.nume;    else        return (i*c.deno)<c.nume;}bool operator<(const CFraction &c, int i){    if(c.deno>0)        return c.nume<(i*c.deno);    else        return c.nume>(i*c.deno);}bool operator<(int i, const CFraction &c){    if(c.deno>0)        return (i*c.deno)<c.nume;    else        return (i*c.deno)>c.nume;}bool operator==(const CFraction &c, int i){    return c.nume==(i*c.deno);}bool operator==(int i, const CFraction &c){    return c.nume==(i*c.deno);}bool operator!=(const CFraction &c, int i){    return c.nume!=(i*c.deno);}bool operator!=(int i, const CFraction &c){    return c.nume!=(i*c.deno);}bool operator>=(const CFraction &c, int i){    return !(c<i);}bool operator>=(int i, const CFraction &c){    return !(i<c);}bool operator<=(const CFraction &c, int i){    return !(c>i);}bool operator<=(int i, const CFraction &c){    return !(i>c);}int main(){    CFraction x,y,s;    cin>>x;    cout<<"分数x是:"<<x<<endl;    cin>>y;    cout<<"分数y是:"<<y<<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/y;    cout<<"x/y="<<s<<endl;    s=-x+y;    cout<<"-x+y="<<s<<endl;    if(x>y)        cout<<"大于"<<endl;    if(x<y)        cout<<"小于"<<endl;    if(x==y)        cout<<"等于"<<endl;    if(x>=y)        cout<<"大于等于"<<endl;    if(x<=y)        cout<<"小于等于"<<endl;    if(x!=y)        cout<<"不等于"<<endl;    cout<<endl;    CFraction c1,c2;    cin>>c1;    c2=c1+5;    cout<<"c2="<<c2<<endl;    c2=5+c1;    cout<<"c2="<<c2<<endl;    c2=c1-5;    cout<<"c2="<<c2<<endl;    c2=5-c1;    cout<<"c2="<<c2<<endl;    c2=c1*5;    cout<<"c2="<<c2<<endl;    c2=5*c1;    cout<<"c2="<<c2<<endl;    c2=c1/5;    cout<<"c2="<<c2<<endl;    c2=5/c1;    cout<<"c2="<<c2<<endl;    cout<<"c1="<<c1<<endl;    cout<<"-c1="<<-c1<<endl;    cout<<"+c1="<<+c1<<endl;    cout<<"~c1="<<~c1<<endl;    bool b;    b=(c1>2);    b=(c1<2);    return 0;}


运行结果:

心得体会:

写到一半的时候突然发现了个问题,之前的类对象的数据都是直接在函数中初始化的,,,所以重载的输入流起不到作用。。。

0 0
原创粉丝点击