关闭

分数中的运算符重载(2)

371人阅读 评论(1) 收藏 举报

*Copyright (c) 2014,烟台大学计算机学院

*All right reserved.

*文件名称:test.cpp

*作    者:韩双志

*完成日期:2016年5月31日

*版本号:v1.0

*

*问题描述:实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算,,实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。

*输入描述:输入两组分数

*输出描述:输出6种的结果

/*

#include <iostream>
#include<cmath>
using namespace std;
class CFraction
 {
 private:
     int nume;
     int deno;
 public:
      friend istream &operator>>(istream &in,CFraction &x);
      friend ostream &operator<<(ostream &out,CFraction x);
      CFraction(int nu=0,int de=1):nume(nu),deno(de){}
      CFraction operator+(const CFraction &c);
      CFraction operator-(const CFraction &c);
      CFraction operator*(const CFraction &c);
      CFraction operator/(const CFraction &c);
      CFraction operator+(const int i);
      CFraction operator-(const int i);
      CFraction operator*(const int i);
      CFraction operator/(const int i);
      bool operator>(const CFraction &c);
      bool operator==(const CFraction &c);
      bool operator<(const CFraction &c);
      void simplay();
 };
 void CFraction::simplay()
 {

    int m,n,r;
     n=fabs(deno);
     m=fabs(nume);
     while(r)  // 求m,n的最大公约数
    {
         m=n;
         n=r;
         r=m%n;
     }
     deno/=n;     // 化简
    nume/=n;
     if (deno<0)  // 将分母转化为正数
    {
         deno=-deno;
         nume=-nume;
     }

}
 CFraction CFraction:: operator+(const CFraction &c)
 {
     CFraction a;
     a.nume=nume*c.deno+c.nume*deno;
     a.deno=deno*c.deno;
     a.simplay();
     return a;
 }
 CFraction CFraction:: operator-(const CFraction &c)
 {
     CFraction a;
      a.nume=nume*c.deno-c.nume*deno;
     a.deno=deno*c.deno;

    a.simplay();
     return a;
 }
 CFraction CFraction:: operator*(const CFraction &c)
 {
     CFraction a;
     a.nume=nume*c.nume;
     a.deno=deno*c.deno;
     a.simplay();
     return a;
 }
 CFraction CFraction:: operator/(const CFraction &c)
 {
     CFraction a;
     a.nume=nume*c.deno;
     a.deno=deno*c.nume;
     a.simplay();
     return a;
 }
  CFraction CFraction:: operator+(const int i)
 {
     CFraction a;
     a.nume=nume+deno*i;
     a.deno=deno;
     a.simplay();
     return a;
 }
 CFraction CFraction:: operator-(const int i)
 {
     CFraction a;
      a.nume=nume-i*deno;
     a.deno=deno;

    a.simplay();
     return a;
 }
 CFraction CFraction:: operator*(const int i)
 {
     CFraction a;
     a.nume=nume*i;
     a.deno=deno;
     a.simplay();
     return a;
 }
 CFraction CFraction:: operator/(const int i)
 {
     CFraction a;
     a.nume=nume;
     a.deno=deno*i;
     a.simplay();
     return a;
 }
 bool CFraction::operator>(const CFraction &c)
 {
     int this_nume,c_nume,common_deno;
     this_nume=nume*c.deno;        // 计算分数通分后的分子,同分母为deno*c.deno
     c_nume=c.nume*deno;
     common_deno=deno*c.deno;
     if ((this_nume-c_nume)*common_deno>0) return true;
     else
     return false;
 }

// 分数比较大小
bool CFraction::operator<(const CFraction &c)
 {
     int this_nume,c_nume,common_deno;
     this_nume=nume*c.deno;
     c_nume=c.nume*deno;
     common_deno=deno*c.deno;
     if ((this_nume-c_nume)*common_deno<0) return true;
     else
     return false;
 }

// 分数比较大小
bool CFraction::operator==(const CFraction &c)
{
    if (*this==c) return true;
    return false;
}
 istream &operator>>(istream &in,CFraction &x)
 {
     char ch;
     while(1)
     {
         cin>>x.nume>>ch>>x.deno;
         if (x.deno==0)
             cerr<<"分母为0, 请重新输入\n";
         else if(ch!='/')
             cerr<<"格式错误(形如m/n)! 请重新输入\n";
         else
             break;
     }
     return cin;
 }

// 重载输出运算符<<
ostream &operator<<(ostream &out,CFraction x)
 {
     cout<<x.nume<<'/'<<x.deno;
     return cout;
 }

int main()
 {
     CFraction x,y,s;
     int i;
     cout<<"输入x: ";
     cin>>x;
     cout<<"输入y: ";
     cin>>y;
     cout<<"输入i:"<<endl;
     cin>>i;
     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+i;
     cout<<"x+i="<<s<<endl;
     s=x-i;
     cout<<"x-i="<<s<<endl;
     s=x*i;
     cout<<"x*i="<<s<<endl;
     s=x/i;
     cout<<"x/i="<<s<<endl;
     if (x<y) cout<<"小于";
     if (x>y) cout<<"大于";
    if (x==y) cout<<"等于";
     return 0;
 }

*/

运算结果:

知识点结构:

       运算符重载

学习心得:

    好难好难啊!!!!!!!!!!!!!!!!!!!

0
0
查看评论

C++实践参考——分数类中的运算符重载

【项目1-分数类中的运算符重载】   (1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算。class CFraction { private: int nume; // 分子 int deno; // 分母 public: ...
  • sxhelijian
  • sxhelijian
  • 2016-05-19 21:44
  • 3253

第八周-运算符重载-分数类的运算符重载(1)-加减乘除以及大小比较

/* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:刘畅 * 完成日期:2015 年 4 月 25 日 * 版 本 号:v1.0 * * 问题描述:...
  • Liuchang54
  • Liuchang54
  • 2015-04-25 13:20
  • 889

C++之运算符重载(分数的运算)

今天在小甲鱼老师的视频中学到了运算符重载知识,并通过实例进行了讲解,先将源代码向大家分享 至今扔没有完全搞懂欧几里得的具体原理,欢迎大家多多交流。 部分转载:http://blog.csdn.net/zjsxzjb/article/details/6262667 求两个数的最大公约数: (1)迭代版...
  • xk_snail
  • xk_snail
  • 2015-04-17 22:10
  • 492

分数类中运算符重载

/* * 程序的版权和版本声明部分 * Copyright (c)2013, 烟台大学计算机学院学生 * All rightsreserved. * 文件名称:score.cpp * 作 者: 赵 洋 * 完成日期: 2013 年 03 月 28 日 * 版本号: v1.0...
  • CXZHAOYANG12
  • CXZHAOYANG12
  • 2013-04-19 14:55
  • 526

分数类中的运算符重载

29行的函数应该注意下。。。 #include using namespace std; enum number{zero,one,two,three,four}; class CFraction { private: int nume; // 分子 int deno; // 分母 publ...
  • u012519969
  • u012519969
  • 2014-01-20 19:51
  • 545

分数中的运算符重载(1)

 *Copyright (c) 2014,烟台大学计算机学院 *All right reserved. *文件名称:test.cpp *作    者:韩双志 *完成日期:2016年5月27日 *版本号:v1.0 * *问题...
  • hanshuangzhi
  • hanshuangzhi
  • 2016-05-27 17:53
  • 258

C++实现:分数类

花了几个小时敲代码——测试——修改…… 总算搞定了 好累,睡觉去的 有问题欢迎提出,继续修改 首先是头文件CFraction.h:   #ifndef CFRACTION_H_ #define CFRACTION_H_ #include using namespace...
  • mfcing
  • mfcing
  • 2012-03-05 22:20
  • 5505

《C++第八周实验报告3-1》---实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算

//【任务3】实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。 /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * ...
  • w695050167
  • w695050167
  • 2012-04-09 23:30
  • 2434

类的运算符重载

<br />类的运算符重载 <br />参考书籍 :C++ 世界的两本世界名著 [C++ 程序设计语言 ] 和 [C++primer]<br />重载知识点 <br />1. 重载运算符 <br />1.1 引言 <br />1...
  • smy0816
  • smy0816
  • 2011-05-06 19:15
  • 3733

分数类的运算符重载

问题及代码: /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:李盈盈 * 完成日期:2015年 05 月 07 日 * 版 本 号:v1.0 * ...
  • LY_624
  • LY_624
  • 2015-05-07 15:51
  • 204
    个人资料
    • 访问:26765次
    • 积分:1325
    • 等级:
    • 排名:千里之外
    • 原创:110篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论