分数类中的运算符重载

  1. #ifndef FRACTION_H_INCLUDED  
  2. #define FRACTION_H_INCLUDED  
  3. #include <iostream>  
  4.   
  5. class CFraction  
  6. {  
  7.     //整数和分数的四则运算  
  8.     friend CFraction operator+(int ifrac, CFraction& ffrac);  
  9.     friend CFraction operator-(int ifrac, CFraction& ffrac);  
  10.     friend CFraction operator*(int ifrac, CFraction& ffrac);  
  11.     friend CFraction operator/(int ifrac, CFraction& ffrac);  
  12.   
  13.     friend std::istream& operator>>(std::istream& is, CFraction& obj);  
  14.     friend std::ostream& operator<<(std::ostream& os, CFraction& obj);  
  15. public:  
  16.     CFraction(int up = 0,int down = 1):nume(up),deno(down)  
  17.     {  
  18.         if(down == 0)  
  19.             std::cerr << "Deno Error" << std::endl;  
  20.         correct();  
  21.     }  
  22.     CFraction(const CFraction &fraction):nume(fraction.nume),deno(fraction.deno){}//拷贝构造函数  
  23.   
  24.     //分数的四则运算  
  25.     CFraction operator+(CFraction& frac);  
  26.     CFraction operator-(CFraction& frac);  
  27.     CFraction operator*(const CFraction& frac);  
  28.     CFraction operator/(const CFraction& frac);  
  29.   
  30.     //分数和整数的四则运算  
  31.     CFraction operator+(int frac);  
  32.     CFraction operator-(int frac);  
  33.     CFraction operator*(const int frac);  
  34.     CFraction operator/(const int frac);  
  35.   
  36.     //一目运算符  
  37.     CFraction operator+();//取正  
  38.     CFraction operator-();//取反  
  39.     CFraction operator~();//取倒数  
  40.   
  41. private:  
  42.     void correct();//保持负号在分子上  
  43.     void same(CFraction& num);//通分  
  44.     void reduction();//化简自己  
  45.     int greatestCommonDivisor(intint);//最大公约数  
  46.     int nume;//分子  
  47.     int deno;//分母  
  48. };  
  49.   
  50. #endif // FRACTION_H_INCLUDED  

Fraction.cpp

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "Fraction.h"  
  2.   
  3. //输入输出运算符的重载放在头文件会出错  
  4. std::istream& operator>>(std::istream& is, CFraction& obj)  
  5. {  
  6.     char temp;  
  7.     is >> obj.nume >> temp >> obj.deno;  
  8.     return is;  
  9. }  
  10.   
  11. std::ostream& operator<<(std::ostream& os, CFraction& obj)  
  12. {  
  13.     //如果分母是1  
  14.     if(obj.deno == 1)  
  15.         os << obj.nume;  
  16.     //如果分子是0  
  17.     else if(obj.nume == 0)  
  18.         os << obj.nume;  
  19.     else  
  20.         os << obj.nume << "/" << obj.deno;  
  21.     return os;  
  22. }  
  23.   
  24.   
  25. //通分是两个分数对象,化简是一个分数  
  26. int CFraction::greatestCommonDivisor(int num1, int num2)//最大公约数  
  27. {  
  28.     int temp;  
  29.     num1 = num1 > 0 ? num1:-num1;  
  30.     num2 = num2 > 0 ? num2:-num2;  
  31.     while(num1 % num2)  
  32.     {  
  33.         temp = num1;  
  34.         num1 = num2;  
  35.         num2 = temp%num2;  
  36.     }  
  37.     return num2;  
  38. }  
  39.   
  40. void CFraction::reduction()//化简自己  
  41. {  
  42.     int re = greatestCommonDivisor(nume,deno);  
  43.     nume /= re;  
  44.     deno /= re;  
  45. }  
  46.   
  47. void CFraction::same(CFraction& num)//通分  
  48. {  
  49.     int re = greatestCommonDivisor(this->deno,num.deno);  
  50.     re = (this->deno * num.deno) / re;//最小公倍数  
  51.     int mul = re / this->deno;  
  52.     this->deno *= mul;  
  53.     this->nume *= mul;  
  54.     mul = re / num.deno;  
  55.     num.deno *= mul;  
  56.     num.nume *= mul;  
  57. }  
  58.   
  59. void CFraction::correct()  
  60. {  
  61.     if((deno < 0 && nume < 0) ||(deno < 0 && nume > 0))  
  62.     {  
  63.         deno = -deno;  
  64.         nume = -nume;  
  65.     }  
  66. }  
  67.   
  68. //分数和之间的四则元算  
  69. CFraction CFraction::operator*(const CFraction& frac)  
  70. {  
  71.     CFraction temp;  
  72.     temp.nume = this->nume * frac.nume;  
  73.     temp.deno = this->deno * frac.deno;  
  74.     temp.reduction();  
  75.     temp.correct();  
  76.     return temp;  
  77. }  
  78.   
  79. CFraction CFraction::operator/(const CFraction& frac)  
  80. {  
  81.     CFraction temp;  
  82.     temp.nume = this->nume * frac.deno;  
  83.     temp.deno = this->deno * frac.nume;  
  84.     temp.reduction();  
  85.     temp.correct();  
  86.     return temp;  
  87. }  
  88.   
  89. CFraction CFraction::operator+(CFraction& frac)  
  90. {  
  91.     CFraction temp;  
  92.     if(this->deno != frac.deno)  
  93.         (*this).same(frac);  
  94.     temp.nume = this->nume + frac.nume;  
  95.     temp.deno = this->deno;  
  96.     temp.reduction();  
  97.     this->reduction();  
  98.     frac.reduction();  
  99.     return temp;  
  100. }  
  101.   
  102. CFraction CFraction::operator-(CFraction& frac)  
  103. {  
  104.     CFraction temp;  
  105.     if(this->deno != frac.deno)  
  106.         (*this).same(frac);  
  107.     temp.nume = this->nume - frac.nume;  
  108.     temp.deno = this->deno;  
  109.     temp.reduction();  
  110.     this->reduction();  
  111.     frac.reduction();  
  112.     return temp;  
  113. }  
  114.   
  115. //分数和整数的四则运算  
  116. CFraction CFraction::operator*(int frac)  
  117. {  
  118.     CFraction temp;  
  119.     temp.nume = this->nume * frac;  
  120.     temp.deno = this->deno;  
  121.     temp.reduction();  
  122.     temp.correct();  
  123.     return temp;  
  124. }  
  125.   
  126. CFraction CFraction::operator/(int frac)  
  127. {  
  128.     CFraction temp;  
  129.     temp.deno = this->deno * frac;  
  130.     temp.nume = this->nume;  
  131.     temp.reduction();  
  132.     temp.correct();  
  133.     return temp;  
  134. }  
  135.   
  136. CFraction CFraction::operator+(int frac)  
  137. {  
  138.     CFraction temp;  
  139.     frac *= this->deno;  
  140.     temp.nume = this->nume + frac;  
  141.     temp.deno = this->deno;  
  142.     temp.reduction();  
  143.     return temp;  
  144. }  
  145.   
  146. CFraction CFraction::operator-(int frac)  
  147. {  
  148.     CFraction temp;  
  149.     frac *= this->deno;  
  150.     temp.nume = this->nume - frac;  
  151.     temp.deno = this->deno;  
  152.     temp.reduction();  
  153.     return temp;  
  154. }  
  155.   
  156. //整数和分数的四则运算  
  157. CFraction operator*(int ifrac, CFraction& ffrac)  
  158. {  
  159.     CFraction temp;  
  160.     temp.nume = ifrac * ffrac.nume;  
  161.     temp.deno = ffrac.deno;  
  162.     temp.reduction();  
  163.     temp.correct();  
  164.     return temp;  
  165. }  
  166.   
  167. CFraction operator/(int ifrac, CFraction& ffrac)  
  168. {  
  169.     CFraction temp;  
  170.     temp.nume = ifrac * ffrac.deno;  
  171.     temp.deno = ffrac.nume;  
  172.     temp.reduction();  
  173.     temp.correct();  
  174.     return temp;  
  175. }  
  176.   
  177. CFraction operator+(int ifrac, CFraction& ffrac)  
  178. {  
  179.     CFraction temp;  
  180.     ifrac *= ffrac.deno;  
  181.     temp.nume = ffrac.nume + ifrac;  
  182.     temp.deno = ffrac.deno;  
  183.     temp.reduction();  
  184.     return temp;  
  185. }  
  186.   
  187. CFraction operator-(int ifrac, CFraction& ffrac)  
  188. {  
  189.     CFraction temp;  
  190.     ifrac *= ffrac.deno;  
  191.     temp.nume = ifrac - ffrac.nume;  
  192.     temp.deno = ffrac.deno;  
  193.     temp.reduction();  
  194.     return temp;  
  195. }  
  196.   
  197. //一目运算符  
  198. CFraction CFraction::operator+()  
  199. {  
  200.     return *this;  
  201. }  
  202.   
  203. CFraction CFraction::operator-()  
  204. {  
  205.     CFraction temp;  
  206.     temp.nume = -this->nume;  
  207.     temp.deno = this->deno;  
  208.     return temp;  
  209. }  
  210.   
  211. CFraction CFraction::operator~()  
  212. {  
  213.     CFraction temp;  
  214.     temp.nume = this->deno;  
  215.     temp.deno = this->nume;  
  216.     temp.correct();  
  217.     return temp;  
  218. }  

main.cpp

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "Fraction.h"  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.     CFraction n1(1,-2),n2(1,2);  
  7.     CFraction n3 = n2 * n1;  
  8.     cout << n3 << endl;  
  9.     n3 = n1 / n2;  
  10.     cout << n3 << endl;  
  11.     n3 = n1 + n2;  
  12.     cout << n3 << endl;  
  13.     n3 = n1 - n2;  
  14.     cout << n3 << endl;  
  15.   
  16.     n3 = 1 + n1;  
  17.     cout << n3 << endl;  
  18.     n3 = 3 * n2;  
  19.     cout << n3 << endl;  
  20.     n3 = 1 / n1;  
  21.     cout << n3 << endl;  
  22.     n3 = 1 - n1;  
  23.     cout << n3 << endl;  
  24.     return 0;  
  25. }  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值