第八周项目三——分数类中的运算符重载(2)
2015-05-27 08:50
387 查看
(2)在(1)的基础上,实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。
![](http://img.blog.csdn.net/20150527134048352?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbnVmYW5nZG9uZ2Rl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
学习心得:代码大体的知道怎么弄,就是有点内容多,实际不是很难,谢谢老师的模板,下次尝试写写没有模板的程序。继续努力吧!
/* All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2015年 5 月 27 日 * 版 本 号: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(); void display(); 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,int m); friend CFraction operator-(const CFraction &c,int m); friend CFraction operator*(const CFraction &c,int m); friend CFraction operator/(const CFraction &c,int m); friend CFraction operator+(int m,const CFraction &c); friend CFraction operator-(int m,const CFraction &c); friend CFraction operator*(int m,const CFraction &c); friend CFraction operator/(int m,const CFraction &c); 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 m); friend bool operator<(const CFraction &c,int m); friend bool operator==(const CFraction &c,int m); friend bool operator>=(const CFraction &c,int m); friend bool operator<=(const CFraction &c,int m); friend bool operator!=(const CFraction &c,int m); friend bool operator>(int m,const CFraction &c); friend bool operator<(int m,const CFraction &c); friend bool operator==(int m,const CFraction &c); friend bool operator>=(int m,const CFraction &c); friend bool operator<=(int m,const CFraction &c); friend bool operator!=(int m,const CFraction &c); };\ //分数化简 void CFraction::simplify() { int m,n,r; n=fabs(nume); //分子 m=fabs(deno); //分母 while(n!=0) //while(r=m%n) 求m,n的最大公约数 { //{ m=n; r=m%n; // n=r;} m=n; // deno/=n; n=r; // nume/=n; } deno/=m; //化简分数 nume/=m; if(deno<0) //// 将分母转化为正数 { deno=-deno; nume=-nume; } } //显示分数 void CFraction::display() { cout<<"("<<nume<<"/"<<deno<<")"<<endl; //(分子/分母)的形式 } //分数相加 CFraction operator+(const CFraction &c1,const CFraction &c2) { CFraction t; t.nume=c1.nume*c2.deno+ c1.deno*c2.nume; t.deno=c1.deno*c2.deno; t.simplify(); return t; } //分数相减 CFraction operator-(const CFraction &c1,const CFraction &c2) { CFraction t; t.nume=c1.nume*c2.deno- c1.deno*c2.nume; t.deno=c1.deno*c2.deno; t.simplify(); return t; } //分数相乘 CFraction operator*(const CFraction &c1,const CFraction &c2) { CFraction t; t.nume=c1.nume*c2.nume; t.deno=c1.deno*c2.deno; t.simplify(); return t; } //分数相除 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,int m) { CFraction t(c.nume+m*c.deno,c.deno); t.simplify(); return t; } CFraction operator-(const CFraction &c,int m) { CFraction t(c.nume-m*c.deno,c.deno); t.simplify(); return t; } CFraction operator*(const CFraction &c,int m) { CFraction t(c.nume*m,c.deno); t.simplify(); return t; } CFraction operator/(const CFraction &c,int m) { CFraction t(c.nume,c.deno*m); t.simplify(); return t; } CFraction operator+(int m,const CFraction &c) { CFraction t(c.nume+m*c.deno,c.deno); t.simplify(); return t; } CFraction operator-(int m,const CFraction &c) { CFraction t(m*c.deno-c.nume,c.deno); t.simplify(); return t; } CFraction operator*(int m,const CFraction &c) { CFraction t(m*c.nume,c.deno); t.simplify(); return t; } CFraction operator/(int m,const CFraction &c) { CFraction t(m*c.deno,c.nume); t.simplify(); return t; } CFraction CFraction::operator+() { return *this; } CFraction CFraction::operator-() { CFraction c; c.nume=-nume; return c; } // 分数比较大小 bool operator>(const CFraction &c1,const CFraction &c2) { int c1_nume,c2_nume,common_deno; c1_nume=c1.nume*c2.deno; // 计算分数通分后的分子,同分母为deno*c.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; // 计算分数通分后的分子,同分母为deno*c.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 m) { if(c.deno>0) return c.nume>(m*c.deno); else return c.nume<(m*c.deno); } bool operator<(const CFraction &c,int m) { if(c.deno>0) return c.nume<(m*c.deno); else return c.nume>(m*c.deno); } bool operator==(const CFraction &c,int m) { return c.nume==(m*c.deno); } bool operator!=(const CFraction &c,int m) { return c.nume!=(m*c.deno); } bool operator>=(const CFraction &c,int m) { return !(c<m); } bool operator<=(const CFraction &c,int m) { return !(c>m); } bool operator>(int m,const CFraction &c) { if(c.deno>0) return (m*c.deno)>c.nume; else return (m*c.deno)<c.nume; } bool operator<(int m,const CFraction &c) { if(c.deno>0) return (m*c.deno)<c.nume; else return (m*c.deno)>c.nume; } bool operator==(int m,const CFraction &c) { return c.nume==(m*c.deno); } bool operator!=(int m,const CFraction &c) { return c.nume!=(m*c.deno); } bool operator>=(int m, const CFraction &c) { return !(m<c); } bool operator<=(int m, const CFraction &c) { return !(m>c); } int main() { CFraction x(1,3),y(-5,10),s; cout<<"分数x=1/3 y=-5/10"<<endl; s=+x+y; cout<<"+x+y="; s.display(); s=x-y; cout<<"x-y="; s.display(); s=x*y; cout<<"x*y="; s.display(); s=x/y; cout<<"x/y="; s.display(); s=-x+y; cout<<"-x+y="; s.display(); x.display(); if (x>y) cout<<"大于"<<endl; if (x<y) cout<<"小于"<<endl; if (x==y) cout<<"等于"<<endl; y.display(); cout<<endl; CFraction c1(5,3),c2; c2=c1+5; cout<<"c2="; c2.display(); c2=5+c1; cout<<"c2="; c2.display(); c2=c1-5; cout<<"c2="; c2.display(); c2=5-c1; cout<<"c2="; c2.display(); c2=c1*5; cout<<"c2="; c2.display(); c2=5*c1; cout<<"c2="; c2.display(); c2=c1/5; cout<<"c2="; c2.display(); c2=5/c1; cout<<"c2="; c2.display(); return 0; }
学习心得:代码大体的知道怎么弄,就是有点内容多,实际不是很难,谢谢老师的模板,下次尝试写写没有模板的程序。继续努力吧!
相关文章推荐
- 第八周——运算符重载——项目三(一)分数类
- 第八周 项目3 分数类中的运算符重载
- 第八周 【项目3-分数类中的运算符重载】(1)
- 第二学期第八周项目3--分数类中的运算符重载(2)
- 第八周 项目3-分数类中的运算符重载(1)加减乘除
- 第八周项目3-分数类中的运算符重载
- 第八周 项目三-分数类中的运算符重载(1)
- 第八周项目三 分数类中的运算符重载-(2)分数与分数、分数与整数的四则运算
- 第八周项目3-2:分数类中的运算符重载(涉及分数和整数的运算)
- 第八周项目3--分数类运算符重载
- 第八周 项目三(2)分数类中的运算符重载
- 第八周 项目三-分数类中的运算符重载(2)
- 第八周 项目三(2):分数类中的运算符重载
- 第八周 项目3-分数类中的运算符重载(1)
- 2013第八周上机任务【项目3-分数类中的运算符重载】
- 2014第八周项目三--分数类的运算符重载
- 第八周 项目三-分数类中的运算符重载(1)
- 第八周上机项目3分数类中的运算符重载
- 第八周上机实践项目——分数类中的运算符重载
- 第八周项目3(1)——分数类中的运算符重载