第九周实验报告(三)

来源:互联网 发布:漳州seo 编辑:程序博客网 时间:2024/06/07 03:48

/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称: 分数类中运算符的重载
* 作 者: 苗向前
* 完成日期: 2012 年 04 月 18 日
* 版 本 号: v9.3

* 对任务及求解方法的描述部分
* 问题描述:

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

#include<iostream>     using namespace std;    class CFraction  {  private:      int nume;  // 分子       int deno;  // 分母       int gcd(int nu, int de);  public:      //构造函数及运算符重载的函数声明       CFraction(int nu = 0, int de = 1):nume(nu), deno(de){}; //构造函数,初始化用          friend CFraction operator + (CFraction &c1,CFraction &c2);      friend CFraction operator - (CFraction &c1,CFraction &c2);      friend CFraction operator * (CFraction &c1,CFraction &c2);      friend CFraction operator / (CFraction &c1,CFraction &c2);      friend CFraction operator - (CFraction &c);        bool operator > (CFraction &t);      bool operator < (CFraction &t);      bool operator >= (CFraction &t);      bool operator <= (CFraction &t);      bool operator == (CFraction &t);      bool operator != (CFraction &t);        void Simplify();   //化简函数(使分子分母没有公因子)       friend ostream& operator << (ostream&,CFraction&);      friend istream& operator >> (istream&,CFraction&);        };  //重载函数的实现及用于测试的main()函数   ostream& operator << (ostream&output,CFraction&f)  {      output << f.nume << "/" << f.deno;        return output;  }    istream& operator >> (istream&input,CFraction&f)  {      char c;      do      {      input >> f.nume >> c >> f.deno;      }while(c != '/');        return input;  }  void CFraction::Simplify() //化简函数(使分子分母没有公因子)   {        int n ;        if(nume < 0  && deno > 0)      {          n = gcd(-nume, deno);      }      else if(nume > 0  && deno > 0)      {          n = gcd(nume, deno);      }      else if(nume > 0  && deno < 0)      {          n = gcd(nume, -deno);      }      else if(nume < 0  && deno < 0)      {          n = -gcd(-nume, -deno);      }      nume = nume / n;          deno = deno / n;     }        int CFraction::gcd(int nu, int de)    //辗转相除法,求最大公约数     {          int t, r, a, b;           a = nu;          b = de;          if (a < b)           {              t = a;              a = b;                                               b = t;          }           while (b != 0)          {              r = a % b;              a = b;              b = r;          }          return a;      }      CFraction operator + (CFraction &c1,CFraction &c2)  {      CFraction c;//先通分,再相加         c.nume = c1.nume * c2.deno + c2.nume * c1.deno;        c.deno = c1.deno * c2.deno;        return c;  }    CFraction operator - (CFraction &c1,CFraction &c2)  {      CFraction c;//先通分,再相减         c.nume = c1.nume * c2.deno - c2.nume * c1.deno;        c.deno = c1.deno * c2.deno;        return c;  }    CFraction operator * (CFraction &c1,CFraction &c2)  {      CFraction c;//分子分母分别相乘         c.nume = c1.nume * c2.nume;        c.deno = c1.deno * c2.deno;        return c;  }    CFraction operator / (CFraction &c1,CFraction &c2)  {      CFraction c;//相除即乘以倒数         c.nume = c1.nume * c2.deno;        c.deno = c1.deno * c2.nume;        return c;  }    CFraction operator - (CFraction &c)  {      c.nume = 0 - c.nume;            return c;        }    bool CFraction::operator > (CFraction &t)  {      if(nume * t.deno > t.nume * deno)//先通分,在比较       {          return true;      }      else      {          return false;      }  }    bool CFraction::operator < (CFraction &t)  {      if(nume * t.deno < t.nume * deno)//先通分,在比较       {          return true;      }      else      {          return false;      }  }  bool CFraction::operator >= (CFraction &t)  {      if(nume * t.deno >= t.nume * deno)//先通分,在比较       {          return true;      }      else      {          return false;      }  }  bool CFraction::operator <= (CFraction &t)  {      if(nume * t.deno <= t.nume * deno)//先通分,在比较       {          return true;      }      else      {          return false;      }  }  bool CFraction::operator == (CFraction &t)  {      if(nume * t.deno == t.nume * deno)//先通分,在比较       {          return true;      }      else      {          return false;      }  }  bool CFraction::operator != (CFraction &t)  {      if(nume * t.deno != t.nume * deno)//先通分,在比较       {          return true;      }      else      {          return false;      }  }    void main()  {      CFraction c1, c2, c;        cout << "请输入你要输入的分数:(例:3/7)" <<endl;        cin >> c1 >>c2 ;        c1.Simplify();        cout << "c1 =" << c1 << endl;        c2.Simplify();        cout << "c2 =" << c2 << endl;        c = c1 + c2;        c.Simplify();        cout << "c1 + c2 =" << c <<endl;        c = c1 - c2;        c.Simplify();        cout << "c1 - c2 =" << c <<endl;        c = c1 * c2;        c.Simplify();        cout << "c1 * c2 =" << c <<endl;        c = c1 / c2;        c.Simplify();        cout << "c1 / c2 =" << c << endl;        c = - c1;        cout << "-c1 =" << c << 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;      }      system("pause");  }  


运行结果:

 

原创粉丝点击