九周任务三:定义分数类中的<<和>>的重载,实现分数的输入和输出

来源:互联网 发布:sql insert into date 编辑:程序博客网 时间:2024/05/16 08:41
/* (程序头部注释开始)     * 程序的版权和版本声明部分     * Copyright (c) 2011, 烟台大学计算机学院学生      * All rights reserved.     * 作    者:       田庆                            * 完成日期:  2012     年   4    月   18  日     * 版 本 号:                    * 对任务及求解方法的描述部分     * 输入描述:      * 问题描述:  定义分数类中的<<和>>运算符的重载,实现输入和输出, * 程序输出:      * 程序头部的注释结束     */  #include <iostream>      using namespace std;    int gcd(int x,int y);    //求最大公约数    class CFraction      {      private:          int nume;  // 分子          int deno;  // 分母      public:          CFraction(int nu=0,int de=1):nume(nu),deno(de){}          void simplify();          void display();          CFraction operator+(const CFraction &c);  //两个分数相加,结果要化简          CFraction operator-(const CFraction &c);  //两个分数相减,结果要化简          CFraction operator*(const CFraction &c);  //两个分数相乘,结果要化简          CFraction operator/(const CFraction &c);  //两个分数相除,结果要化简          CFraction operator+();  //取正一目运算          CFraction operator-();  //取反一目运算          bool operator>(const CFraction &c);          bool operator<(const CFraction &c);          bool operator==(const CFraction &c);          bool operator!=(const CFraction &c);          bool operator>=(const CFraction &c);          bool operator<=(const CFraction &c); //重载流插入运算符“<<”            friend ostream& operator << (ostream&,CFraction &);          //重载流提取运算符“>>”            friend istream& operator >> (istream&,CFraction &); };            //化简(使分子分母没有公因子)       void CFraction::simplify()      {          int n=gcd(nume,deno);          nume/=n;          deno/=n;         if (deno<0)  // 将分母转化为正数          {              deno=-deno;              nume=-nume;          }          }      //求最大公约数;       int gcd(int x,int y)      {          int r;          while(y!=0)          {              r=x%y;              x=y;              y=r;          }          return x;      }                //显示分数      void CFraction::display()      {          cout<<"("<<nume<<"/"<<deno<<")"<<endl;      }            // 分数相加      CFraction CFraction::operator+(const CFraction &c)      {          CFraction t;          t.nume=nume*c.deno+c.nume*deno;          t.deno=deno*c.deno;          t.simplify();          return t;      }            // 分数相减      CFraction CFraction:: operator-(const CFraction &c)      {          CFraction t;          t.nume=nume*c.deno-c.nume*deno;          t.deno=deno*c.deno;          t.simplify();          return t;      }            // 分数相乘      CFraction CFraction:: operator*(const CFraction &c)      {          CFraction t;          t.nume=nume*c.nume;          t.deno=deno*c.deno;          t.simplify();          return t;      }            // 分数相除      CFraction CFraction:: operator/(const CFraction &c)      {          CFraction t;          t.nume=nume*c.deno;          t.deno=deno*c.nume;          t.simplify();          return t;      }            // 分数取正号      CFraction CFraction:: operator+()      {          return *this;      }            // 分数取负号      CFraction CFraction:: operator-()      {          CFraction x;          x.nume=-nume;          x.deno=-deno;          return x;           }            // 分数比较大小      bool CFraction::operator>(const CFraction &c)      {          int this_nu,c_nu,com_de;          this_nu=nume*c.deno;        // 计算分数通分后的分子,同分母为deno*c.deno          c_nu=c.nume*deno;           com_de=deno*c.deno;          if (this_nu>c_nu&&com_de>0||this_nu<c_nu&&com_de<0) return true; // 将通分后的分子比较大小          return false;      }            // 分数比较大小      bool CFraction::operator<(const CFraction &c)      {          int this_nu,c_nu,com_de;          this_nu=nume*c.deno;                c_nu=c.nume*deno;          com_de=deno*c.deno;          if ((this_nu-c_nu)*com_de<0) return true;           return false;      }            // 分数比较大小      bool CFraction::operator==(const CFraction &c)      {          if (*this!=c)             return false;          else            return true;      }            // 分数比较大小      bool CFraction::operator!=(const CFraction &c)      {          if (*this>c || *this<c)             return true;          else             return false;      }            // 分数比较大小      bool CFraction::operator>=(const CFraction &c)      {          if (*this<c)             return false;          else            return true;      }            // 分数比较大小      bool CFraction::operator<=(const CFraction &c)      {          if (*this>c)             return false;          else            return true;      }        //下面定义成员函数       istream& operator >> (istream& input,CFraction & c)    {         input>>c.nume>>c.deno;        return input;    }    ostream& operator << (ostream& output,CFraction & c)    {        output<<c.nume<<"/"<<c.deno<<endl;        return output;    }  int main()      {          CFraction x,y,s;          cout<<"请输入分数x以2 3的形式输入:";        cin>>x;cout<<"请输入分数y以2 3的形式输入:";cin>>y;cout<<"x=";    x.display();cout<<"y=";y.display();    s=+x+y;          cout<<"分数相加即+x+y=";          s.display();        cout<<endl;        s=x-y;          cout<<"分数相减即x-y=";          s.display();        cout<<endl;        s=x*y;          cout<<"分数相乘即x*y=";          s.display();        cout<<endl;        s=x/y;          cout<<"分数相除即x/y=";          s.display();        cout<<endl;        s=-x+y;          cout<<"分数相减取负即-x+y=";          s.display();        cout<<endl;        cout<<"x和y比较大小得: "<<endl;        x.display();          if (x>y) cout<<"大于";          if (x<y) cout<<"小于";          if (x==y) cout<<"等于";cout<<endl;    y.display();          cout<<endl;          system("pause");          return 0;      }