第十三周项目1——分数类中的运算符重载
2016-05-26 09:25
246 查看
问题及代码:
运行结果:
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:main.cpp * 作 者:赵志君 * 完成日期:2016年5月26日 * 版 本 号:v1.0 * * 问题描述:(1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算。 * (2)在(1)的基础上,实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。 * 例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。 * (3)定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算。 * (4)定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。 */ #include <iostream> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: //构造函数及运算符重载的函数声明 CFraction(int n=0,int d=0):nume(n),deno(d){}; 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); bool operator <= (const CFraction &c); bool operator == (const CFraction &c); bool operator != (const CFraction &c); friend ostream &operator<<(ostream &out,CFraction c); friend istream &operator>>(istream &input,CFraction c); CFraction operator+(int i); CFraction operator-(int i); CFraction operator*(int i); CFraction operator/(int i); friend CFraction operator+(int i,CFraction &c); friend CFraction operator-(int i,CFraction &c); friend CFraction operator*(int i,CFraction &c); friend CFraction operator/(int i,CFraction &c); CFraction operator+(); CFraction operator-(); CFraction operator~(); }; CFraction CFraction::operator+(const CFraction &c) { CFraction t; int y,m,n; m=t.nume=nume*c.deno+c.nume*deno; n=t.deno=deno*c.deno; n=t.nume%t.deno; while(y) { y=n%m; n=m; m=y; } t.nume=t.nume/n; t.deno=t.deno/n; return t; } CFraction CFraction::operator-(const CFraction &c) { CFraction t; int y,m,n; m=t.nume=nume*c.deno-c.nume*deno; n=t.deno=deno*c.deno; while(y) { y=n%m; n=m; m=y; } t.nume=t.nume/n; t.deno=t.deno/n; return t; } CFraction CFraction::operator*(const CFraction &c) { CFraction t; int y,m,n; m=t.nume=nume*c.nume; n=t.deno=deno*c.deno; while(y) { y=n%m; n=m; m=y; } t.nume=t.nume/n; t.deno=t.deno/n; return t; } CFraction CFraction::operator/(const CFraction &c) { CFraction t; int y,m,n; m=t.nume=nume*c.deno; n=t.deno=deno*c.nume; while(y) { y=n%m; n=m; m=y; } t.nume=t.nume/n; t.deno=t.deno/n; return t; } bool CFraction::operator>(const CFraction &c) { double a,b; a=(double)nume/deno; b=(double)c.nume/deno; if(a>b) return true; else return false; } bool CFraction::operator<(const CFraction &c) { double a,b; a=(double)nume/deno; b=(double)c.nume/deno; if(a<b) return true; else return false; } bool CFraction::operator>=(const CFraction &c) { double a,b; a=(double)nume/deno; b=(double)c.nume/deno; if(a>=b) return true; else return false; } bool CFraction::operator<=(const CFraction &c) { double a,b; a=(double)nume/deno; b=(double)c.nume/deno; if(a<=b) return true; else return false; } bool CFraction::operator!=(const CFraction &c) { double a,b; a=(double)nume/deno; b=(double)c.nume/deno; if(a!=b) return true; else return false; } bool CFraction::operator==(const CFraction &c) { double a,b; a=(double)nume/deno; b=(double)c.nume/deno; if(a==b) return true; else return false; } ostream &operator<<(ostream &out,CFraction c) { if(c.deno==1) out<<c.nume; else out<<c.nume<<"/"<<c.deno; return out; } istream &operator>>(istream &input,CFraction c) { char a; input>>c.nume>>a>>c.deno; return input; } CFraction CFraction::operator+(int i) { CFraction c; c.deno=deno; c.nume=nume+c.deno*i; return c; } CFraction CFraction::operator-(int i) { CFraction c; c.deno=deno; c.nume=nume-c.deno*i; return c; } CFraction CFraction::operator*(int i) { CFraction c; c.deno=deno; c.nume=nume*i; return c; } CFraction CFraction::operator/(int i) { CFraction c; c.deno=deno*i; c.nume=nume; return c; } CFraction operator+(int i,CFraction &c) { CFraction a; a.deno=c.deno; a.nume=c.nume+c.deno*i; return a; } CFraction operator-(int i,CFraction &c) { CFraction a; a.deno=c.deno; a.nume=c.deno*i-c.nume; return a; } CFraction operator*(int i,CFraction &c) { CFraction a; a.deno=c.deno; a.nume=c.nume*i; return a; } CFraction operator/(int i,CFraction &c) { CFraction a; a.deno=c.nume; a.nume=c.deno*i; return a; } CFraction CFraction::operator+() { return *this; } CFraction CFraction::operator-() { CFraction c; c.nume=-nume; c.deno=deno; return c; } CFraction CFraction::operator~() { CFraction c; c.nume=deno; c.deno=nume; if(c.deno==0) { cout<<"不可以取倒数!"<<endl; return *this; } else return c; } //重载函数的实现及用于测试的main()函数 int main() { CFraction a(5,6),b(2,3); cout<<"a="<<a<<" b="<<b<<endl; cout<<"a+b="<<a+b; cout<<" a-b="<<a-b; cout<<" a*b="<<a*b; cout<<" a/b="<<a/b<<endl<<endl; CFraction m(3,2),n(6,5); cout<<"m="<<m<<" n="<<n<<" a="<<a<<" b="<<b<<endl; if(m>b) cout<<"m>b "; if(b<a) cout<<"b<a "; if(m>=b) cout<<"m>=b "; if(b<=a) cout<<"b<=a "; if(m==n) cout<<"m==n "; if(n!=a) cout<<"n!=a"<<endl<<endl; cout<<"n="<<n<<" n+2="<<n+2<<endl; cout<<"n="<<n<<" n-2="<<n-2<<endl; cout<<"n="<<n<<" n*2="<<n*2<<endl; cout<<"n="<<n<<" n/2="<<n/2<<endl; cout<<"n="<<n<<" 2+n="<<2+n<<endl; cout<<"n="<<n<<" 2-n="<<2-n<<endl; cout<<"n="<<n<<" 2*n="<<2*n<<endl; cout<<"n="<<n<<" 2/n="<<2/n<<endl; cout<<"m="<<m<<" +m="<<+m<<endl; cout<<"m="<<m<<" -m="<<-m<<endl; cout<<"m="<<m<<" ~m="<<~m<<endl; return 0; }
运行结果:
相关文章推荐
- 测试阿里云OSS
- 临时
- eclipse3.7 安装github插件错误解决
- 根目录扩展
- AFNetwork 作用和用法详解
- YII页面缓存
- php 数组 常用函数
- java maven诡异的错误no class found
- velocity 利用 HttpServletRequest 参数
- C#清除HTML标签方法汇总
- 2 method http call in controller in AngularJS
- linux配置网络详细解析,上外网
- centos升级glibc过程
- PL/SQL Developer使用技巧、快捷键
- 窗体程序 (控件随窗体变化而变化)
- 《上古天真论》第十四讲文字版
- Leetcode 之Length of Last Word(37)
- 自定义BOL组件集
- 数据库sharding-基本策略和原理
- 第13周项目1:分数类中的运算符重载(1)