第九周——运算符重载——项目三分数类(续)
来源:互联网 发布:软件测试linux面试题 编辑:程序博客网 时间:2024/05/16 15:43
问题及代码:
/**Copyright (c) 2014,烟台大学计算机学院*All rights reserved.*文件名称:lily.cpp*作者:李莉*完成日期:2015年5月5日*版本号: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(); friend istream&operator>>(istream&input,CFraction &f); friend ostream&operator<<(ostream&outpur,CFraction f); 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,const int i); friend CFraction operator+(const int i,const CFraction &c); friend CFraction operator-(const CFraction &c,const int i); friend CFraction operator-(const int i,const CFraction &c); friend CFraction operator*(const CFraction &c,const int i); friend CFraction operator*(const int i,const CFraction &c); friend CFraction operator/(const CFraction &c,const int i); friend CFraction operator/(const int i,const CFraction &c); CFraction operator+(); //取正一目运算 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 i); friend bool operator>(int i, const CFraction &c); friend bool operator<(const CFraction &c, int i); friend bool operator<(int i, const CFraction &c); friend bool operator==(const CFraction &c, int i); friend bool operator==(int i, const CFraction &c); friend bool operator!=(const CFraction &c, int i); friend bool operator!=(int i, const CFraction &c); friend bool operator>=(const CFraction &c, int i); friend bool operator>=(int i, const CFraction &c); friend bool operator<=(const CFraction &c, int i); friend bool operator<=(int i, const CFraction &c);};void CFraction::simplify(){ int m,n,r; m=abs(deno); n=abs(nume); while((r=m%n)) { m=n; n=r; } deno/=n; nume/=n; if (deno<0) { deno=-deno; nume=-nume; }}istream&operator>>(istream& input,CFraction &f){ char s; while(1) { cout<<"请输入一个分数(a/b):"<<endl; cin>>f.nume>>s>>f.deno; if(f.deno==0) { cerr<<"分母为0,请重新输入"<<endl; } else if(s!='/') { cerr<<"分数形式错误,请重新输入"<<endl; } else break; } return input;}ostream&operator<<(ostream& output,CFraction f){ output<<f.nume<<"/"<<f.deno<<endl;}CFraction operator+(const CFraction &c1,const CFraction &c2){ CFraction c; c.nume=c1.nume*c2.deno+c1.deno*c2.nume; c.deno=c1.deno*c2.deno; c.simplify(); return c;}CFraction operator-(const CFraction &c1,const CFraction &c2){ CFraction c; c.nume=c1.nume*c2.deno-c2.nume*c1.deno; c.deno=c1.deno*c2.deno; c.simplify(); return c;}CFraction operator*(const CFraction &c1,const CFraction &c2){ CFraction c; c.nume=c1.nume*c2.nume; c.deno=c2.deno*c2.deno; c.simplify(); return c;}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,const int i){ CFraction c1(c.nume+i*c.deno,c.deno); c1.simplify(); return c1;}CFraction operator+(const int i,const CFraction &c){ CFraction c1(c.nume+i*c.deno,c.deno); c1.simplify(); return c1;}CFraction operator-(const CFraction &c,const int i){ CFraction c1(c.nume-i*c.deno,c.deno); c1.simplify(); return c1;}CFraction operator-(const int i,const CFraction &c){ CFraction c1(i*c.deno-c.nume,c.deno); c1.simplify(); return c1;}CFraction operator*(const CFraction &c,const int i){ CFraction c1(c.nume*i,c.deno); c1.simplify(); return c1;}CFraction operator*(const int i,const CFraction &c){ CFraction c1(c.nume*i,c.deno); c1.simplify(); return c1;}CFraction operator/(const CFraction &c, int i){ CFraction c1(c.nume,c.deno*i); c1.simplify(); return c1;}CFraction operator/(int i, const CFraction &c ){ CFraction c1(i*c.deno,c.nume); c1.simplify(); return c1;}CFraction CFraction:: operator+(){ return *this;}// 分数取负号CFraction CFraction:: operator-(){ CFraction c; c.nume=-nume; c.deno=-deno; return c;}//分数取倒数CFraction CFraction::operator~(){ CFraction x; x.nume=deno; x.deno=nume; //未对原分子为0的情况进行处理 if(x.deno<0) //保证负分数的负号在分子上 { x.deno=-x.deno; x.nume=-x.nume; } return x;}// 分数比较大小bool operator>(const CFraction &c1, const CFraction &c2){ int c1_nume,c2_nume,common_deno; c1_nume=c1.nume*c2.deno; // 计算分数通分后的分子,同分母为c1.deno*c2.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; 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 i){ if(c.deno>0) return c.nume>(i*c.deno); else return c.nume<(i*c.deno);}bool operator>(int i, const CFraction &c){ if(c.deno>0) return (i*c.deno)>c.nume; else return (i*c.deno)<c.nume;}bool operator<(const CFraction &c, int i){ if(c.deno>0) return c.nume<(i*c.deno); else return c.nume>(i*c.deno);}bool operator<(int i, const CFraction &c){ if(c.deno>0) return (i*c.deno)<c.nume; else return (i*c.deno)>c.nume;}bool operator==(const CFraction &c, int i){ return c.nume==(i*c.deno);}bool operator==(int i, const CFraction &c){ return c.nume==(i*c.deno);}bool operator!=(const CFraction &c, int i){ return c.nume!=(i*c.deno);}bool operator!=(int i, const CFraction &c){ return c.nume!=(i*c.deno);}bool operator>=(const CFraction &c, int i){ return !(c<i);}bool operator>=(int i, const CFraction &c){ return !(i<c);}bool operator<=(const CFraction &c, int i){ return !(c>i);}bool operator<=(int i, const CFraction &c){ return !(i>c);}int main(){ CFraction x,y,s; cin>>x; cout<<"分数x是:"<<x<<endl; cin>>y; cout<<"分数y是:"<<y<<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/y; cout<<"x/y="<<s<<endl; s=-x+y; cout<<"-x+y="<<s<<endl; if(x>y) cout<<"大于"<<endl; if(x<y) cout<<"小于"<<endl; if(x==y) cout<<"等于"<<endl; if(x>=y) cout<<"大于等于"<<endl; if(x<=y) cout<<"小于等于"<<endl; if(x!=y) cout<<"不等于"<<endl; cout<<endl; CFraction c1,c2; cin>>c1; c2=c1+5; cout<<"c2="<<c2<<endl; c2=5+c1; cout<<"c2="<<c2<<endl; c2=c1-5; cout<<"c2="<<c2<<endl; c2=5-c1; cout<<"c2="<<c2<<endl; c2=c1*5; cout<<"c2="<<c2<<endl; c2=5*c1; cout<<"c2="<<c2<<endl; c2=c1/5; cout<<"c2="<<c2<<endl; c2=5/c1; cout<<"c2="<<c2<<endl; cout<<"c1="<<c1<<endl; cout<<"-c1="<<-c1<<endl; cout<<"+c1="<<+c1<<endl; cout<<"~c1="<<~c1<<endl; bool b; b=(c1>2); b=(c1<2); return 0;}
运行结果:
心得体会:
写到一半的时候突然发现了个问题,之前的类对象的数据都是直接在函数中初始化的,,,所以重载的输入流起不到作用。。。
0 0
- 第九周——运算符重载——项目三分数类(续)
- 第九周项目三分数类运算符重载
- 第九周项目三分数类中的运算符重载(续)(1)
- 第九周项目三分数类中的运算符重载(续)(2)
- 第八周项目三分数类中的运算符重载
- 第九周——运算符重载——项目一复数类(续)
- 第九周上机实践项目1——复数类中的运算符重载(续)
- 第九周上机实践项目2——Time类中的运算符重载(续)
- 第九周上机实践项目3——分数类中的运算符重载(续)
- 第九周项目一——复数类中的运算符重载(续)
- 15第九周项目一——复数类中的运算符重载(续)
- 15第九周项目二——复数类中的运算符重载(续)2
- 15第九周项目二——Time类中的运算符的重载(续)
- 15第九周项目三——分数类中的运算符的重载(续)
- 第九周 课后实践:项目一——复数类中的运算符重载(续)
- 第九周 课后实践:项目二——Time类中的运算符重载(续)
- 第九周 课后实践:项目三——分数类中的运算符重载(续)
- 第九周项目1——附属类中的运算符重载(续)
- 使用Block模拟网络请求回调
- 2.面向对象之继承
- 链式二叉树的实现
- Oracal导出dmp文件
- C++中小数点引用和箭头的区别
- 第九周——运算符重载——项目三分数类(续)
- Some notes on shared libraries with ld
- OpenCV学习笔记(2)边缘检测与滑动条的创建
- Linux(ARM)下目录含义
- 【Tools.PowerDesigner】概念数据模型
- mybatis实战教程(mybatis in action),mybatis入门到精通
- Async I/O and Python
- 临时图片
- 使用VS搭建三层结构