第九周上机实践项目3——分数类中的运算符重载(续)
来源:互联网 发布:数据库恢复的基本原则 编辑:程序博客网 时间:2024/05/16 07:13
在分数类中的运算符重载基础上
(1)定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算。
(2)定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
代码
/* * Copyright (c) 2015, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:辛彬 * 完成日期:2015 年 5 月 8 日 * 版 本 号:v1.0 */#include<iostream>using namespace std;class CFraction{private: int nume; // 分子 int deno; // 分母public: //构造函数及运算符重载的函数声明 CFraction() {} CFraction(int n,int d):nume(n),deno(d) {} void simplify(); CFraction operator+(CFraction &c); CFraction operator+(); friend CFraction operator+(CFraction &c,int a); friend CFraction operator+(int a,CFraction &c); CFraction operator-(CFraction &c); CFraction operator-(); CFraction operator~(); friend CFraction operator-(CFraction &c,int a); friend CFraction operator-(int a,CFraction &c); CFraction operator*(CFraction &c); friend CFraction operator*(CFraction &c,int a); friend CFraction operator*(int a,CFraction &c); CFraction operator/(CFraction &c); friend CFraction operator/(CFraction &c,int a); friend CFraction operator/(int a,CFraction &c); bool operator>(CFraction &c); bool operator<(CFraction &c); bool operator==(CFraction &c); bool operator>=(CFraction &c); bool operator<=(CFraction &c); bool operator!=(CFraction &c); friend ostream& operator<<(ostream&,const CFraction&); friend istream& operator>>(istream&,CFraction&);};//重载函数的实现及用于测试的main()函数void CFraction::simplify(){ int i=deno; for(; nume%i!=0||deno%i!=0; i--); nume=nume/i; deno=deno/i;}CFraction CFraction::operator+(CFraction &c){ int i=deno; if(deno==c.deno) return CFraction(nume+c.nume,deno); else { for(; i%deno!=0||i%c.deno!=0; i++); nume=nume*(i/deno); c.nume=c.nume*(i/c.deno); deno=i; c.deno=i; return CFraction(nume+c.nume,deno); }}CFraction operator+(CFraction &c,int a){ CFraction t(a,1); return c+t;}CFraction operator+(int a,CFraction &c){ CFraction t(a,1); return c+t;}CFraction operator-(CFraction &c,int a){ CFraction t(a,1); return c-t;}CFraction operator-(int a,CFraction &c){ CFraction t(a,1); return c-t;}CFraction operator*(CFraction &c,int a){ CFraction t(a,1); return c*t;}CFraction operator*(int a,CFraction &c){ CFraction t(a,1); return c*t;}CFraction operator/(CFraction &c,int a){ CFraction t(a,1); return c*t;}CFraction operator/(int a,CFraction &c){ CFraction t(a,1); return c/t;}CFraction CFraction::operator-(CFraction &c){ int i=deno; if(deno==c.deno) return CFraction(nume-c.nume,deno); else { for(; i%deno!=0||i%c.deno!=0; i++); nume=nume*(i/deno); c.nume=c.nume*(i/c.deno); deno=i; c.deno=i; return CFraction(nume-c.nume,deno); }}CFraction CFraction::operator*(CFraction &c){ return CFraction(nume*c.nume,deno*c.deno);}CFraction CFraction::operator/(CFraction &c){ if(deno*c.nume<0) return CFraction(-nume*c.deno,-deno*c.nume); else return CFraction(nume*c.deno,deno*c.nume);}bool CFraction::operator>(CFraction &c){ int i=deno; if(deno==c.deno) { if(nume>c.nume) return true; else return false; } else { for(; i%deno!=0||i%c.deno!=0; i++); nume=nume*(i/deno); c.nume=c.nume*(i/c.deno); if(nume>c.nume) return true; else return false; }}bool CFraction::operator<(CFraction &c){ int i=deno; if(deno==c.deno) { if(nume<c.nume) return true; else return false; } else { for(; i%deno!=0||i%c.deno!=0; i++); nume=nume*(i/deno); c.nume=c.nume*(i/c.deno); if(nume<c.nume) return true; else return false; }}bool CFraction::operator==(CFraction &c){ if(*this>c||*this<c) return false; else return true;}bool CFraction::operator>=(CFraction &c){ return !(*this<c);}bool CFraction::operator<=(CFraction &c){ return !(*this>c);}bool CFraction::operator!=(CFraction &c){ return !(*this==c);}CFraction CFraction::operator+(){ if(nume<0) nume=-nume; return *this;}CFraction CFraction::operator-(){ nume=-nume; return *this;}CFraction CFraction::operator~(){ CFraction t; if(nume<0) { t.deno=-nume; t.nume=-deno; } else { t.deno=nume; t.nume=deno; } return t;}ostream& operator<<(ostream& out,const CFraction& c){ out<<c.nume<<"/"<<c.deno; return out;}istream& operator>>(istream& in,CFraction& c){ cout<<"输入分子和分母:"; in>>c.nume>>c.deno; return in;}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.simplify(); cout<<s<<endl; s=x-y; cout<<"x-y="; s.simplify(); cout<<s<<endl; s=x*y; cout<<"x*y="; s.simplify(); cout<<s<<endl; s=x/y; cout<<"x/y="; s.simplify(); cout<<s<<endl; cout<<x<<endl; if (x>y) cout<<"大于"<<endl; if (x<y) cout<<"小于"<<endl; if (x==y) cout<<"等于"<<endl; cout<<y<<endl; cout<<endl; CFraction c1(5,3),c2,c3; cout<<"c1="<<c1<<endl; c2=c1+5; cout<<"c1+5="<<c2<<endl; c2=5+c1; cout<<"5+c1="<<c2<<endl; c2=c1-5; cout<<"c1-5="<<c2<<endl; c2=5-c1; cout<<"5-c1="<<c2<<endl; c2=c1*5; cout<<"c1*5="<<c2<<endl; c2=5*c1; cout<<"5*c1="<<c2<<endl; c2=c1/5; cout<<"c1/5="<<c2<<endl; c2=5/c1; cout<<"5/c1="<<c2<<endl; cin>>c3; cout<<"+c3="<<+c3<<endl; cout<<"-c3="<<-c3<<endl; cout<<"~c3="<<~c3<<endl; return 0;}
运行结果
学习感悟:发现前面两个定义了输入流,在测试函数里没有用到,于是现在加了上去
0 0
- 第九周上机实践项目3——分数类中的运算符重载(续)
- 第九周上机实践项目3-分数类中的运算符重载(续 重载输入输出流)
- 第九周 课后实践:项目三——分数类中的运算符重载(续)
- 第八周上机实践项目3——分数类中的运算符重载(2)
- 第九周上机项目3 分数类中的运算符重载(续)
- 第九周上机实践项目1——复数类中的运算符重载(续)
- 第九周上机实践项目2——Time类中的运算符重载(续)
- 第九周项目3——分数类中的运算符重载(续)
- 第九周项目3——分数类中的运算符重载(续)
- 第八周上机实践项目3——分数类的运算符重载(1)
- 第八周上机实践项目——分数类中的运算符重载
- 第十三周上机实践——项目1-分数类中的运算符重载
- 第八周上机实践项目3-分数类中的运算符重载(分数与分数、分数与整数)
- 第九周上机实践项目2-Time类中的运算符重载(续)
- 第九周上机实践项目——更自然实现复数类中的运算符重载
- 第九周上机实践项目1-复数类中的运算符重载(续 输出流运算符重载)
- 第九周项目3——分数中的运算重载符(续)
- 15第九周项目三——分数类中的运算符的重载(续)
- lua基本函数库
- 6.继承GenericServlet和继承HttpServlet
- BufferedReader和BufferedWriter
- Android实现Banner界面广告图片循环轮播(包括实现手动滑动循环)
- 蓝牙设备
- 第九周上机实践项目3——分数类中的运算符重载(续)
- Chef不爽的地方
- js去除空格
- 解决aapt "finished with non-zero exit value 1"问题
- Solaris10 SPARC操作系统中使用Nginx+Tomcat实现负载均衡,并实现websocket代理(三)
- java中Executor、ExecutorService、ThreadPoolExecutor介绍
- iOS 推送
- IBatis和Hibernate区别
- Javascript禁止鼠标和键盘