第13周-项目1-分数类中的运算符重载(2)
2016-05-25 20:38
211 查看
问题及代码:
运行结果:
/*Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:main.cpp *作 者:王艺霖 *完成日期:2016年5月25日 *版 本 号:v1.0 *问题描述:在(1)的基础上,实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。 *输入描述: *输出描述: */ #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(); //输入输出的重载 friend istream &operator>>(istream &in,CFraction &x); friend ostream &operator<<(ostream &out,CFraction x); friend CFraction operator + (double &d,CFraction &c); CFraction operator+(const CFraction &c); CFraction operator-(const CFraction &c); CFraction operator*(const CFraction &c); CFraction operator/(const CFraction &c); bool operator>(const CFraction &c); bool operator<(const CFraction &c); bool operator==(const CFraction &c); CFraction operator+(); //取正一目运算 CFraction operator-(); //取反一目运算 CFraction operator~(); //取倒数一目运算 CFraction operator + (double &d); CFraction operator - (double &d); CFraction operator * (double &d); CFraction operator / (double &d); }; // 分数化简 void CFraction::simplify() { int m,n,r; n=fabs(deno); m=fabs(nume); while(r=m%n) { m=n; n=r; } deno/=n; nume/=n; if (deno<0) { deno=-deno; nume=-nume; } } // 重载输入运算符>> 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; } // 分数相加 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; if (!c.nume) return *this; //除法无效(除数为)时,这种情况需要考虑,但这种处理仍不算合理 t.nume=nume*c.deno; t.deno=deno*c.nume; t.simplify(); return t; } // 分数比较大小 bool CFraction::operator>(const CFraction &c) { if (nume*c.deno>c.nume*deno) return true; else return false; } bool CFraction::operator<(const CFraction &c) { if (nume*c.deno<c.nume*deno) return true; else return false; } bool CFraction::operator==(const CFraction &c) { if (nume*c.deno==c.nume*deno) return true; else return false; } // 分数取正号 CFraction CFraction:: operator+() { return *this; } // 分数取负号 CFraction CFraction:: operator-() { CFraction x; x.nume=-nume; x.deno=deno; return x; } // 分数取倒数 CFraction CFraction:: operator~() { CFraction x; x.nume=deno; x.deno=nume; if(x.deno<0) //保证负分数的负号在分子上 { x.deno=-x.deno; x.nume=-x.nume; } return x; } //分数与整数相加 CFraction CFraction::operator+(double &d) { CFraction t; t.nume=nume+d*deno; t.deno=deno; t.simplify(); return t; } CFraction CFraction::operator-(double &d) { CFraction t; t.nume=nume-d*deno; t.deno=deno; t.simplify(); return t; } CFraction CFraction::operator*(double &d) { CFraction t; t.nume=nume*d; t.deno=deno; t.simplify(); return t; } CFraction CFraction::operator/(double &d) { CFraction t; t.nume=nume; t.deno=deno*d; t.simplify(); return t; } int main() { CFraction x,y,s; cout<<"x: "; cin>>x; cout<<"y: "; cin>>y; 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; if (x>y) cout<<"x大于y"<<endl; if (x<y) cout<<"x小于y"<<endl; if (x==y) cout<<"x等于y"<<endl; cout<<"-x="<<-x<<endl; cout<<"+x="<<+x<<endl; cout<<"x的倒数: "<<~x<<endl; int i=2; 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; return 0; }
运行结果:
相关文章推荐
- Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK黑屏问题
- Shell排序
- SGU 294 He's Circles
- 【转】jvm 内存模型及内存调优
- tomcat启动在80端口
- BZOJ2822 [AHOI2012]树屋阶梯
- android stuio中布局预览错误解决方法
- htc vive安装到玩流程体验
- opencv错误记录(1)计算机中丢失opencv_highgui249d.dll的解决方法
- HDU 1257 最少拦截系统(最长上升子序列)
- 【CodeForces】651B - Beautiful Paintings(暴力)
- 游戏知识略解
- http协商缓存VS强缓存
- 日常应用基础操作+常用问题总结
- Apkplug 开发常见问题解答
- 百度之星初赛B hdu5696 区间的价值 分治思想
- Android数据库 之 SQLite数据库
- Android屏幕适配总结
- Servlet中的Filter详解
- 自定义控件实现水波纹效果