第7周-项目3-分数类中的运算符重载-拓展分数的加减乘除(分数与整型 )
2015-04-27 22:36
381 查看
问题及代码:
运行结果:
知识点总结:
拓展分数的加减乘除(分数与整型 )。
学习心得:
就是拿上一个项目来改,把成员函数声明为友元函数,分多种情况考虑。
/* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:Fraction.cpp *作 者:单昕昕 *完成日期:2015年4月27日 *版 本 号:v1.0 *问题描述:在(1)的基础上,实现分数类中的对象和整型数的四则运算。分数类中的对象可以和 整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a +i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。 *程序输入:无。 *程序输出:分数。 */ #include <iostream> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int nu=0,int de=1); //构造函数,初始化用 void set(int nu=0,int de=1); //置值,改变值时用 void input(); //按照"nu/de"的格式,如"5/2"的形式输入 void simplify(); //化简(使分子分母没有公因子) void display(); 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 CFraction operator+(const CFraction &c1,const CFraction &c2); friend CFraction operator+(const double &d,const CFraction &c2); friend CFraction operator+(const CFraction &c2,const double &d); //减法拓展运算 friend CFraction operator-(const CFraction &c1,const CFraction &c2); friend CFraction operator-(const double &d,const CFraction &c2); friend CFraction operator-(const CFraction &c2,const double &d); //乘法拓展运算 friend CFraction operator*(const CFraction &c1,const CFraction &c2); friend CFraction operator*(const double &d,const CFraction &c2); friend CFraction operator*(const CFraction &c2,const double &d); //除法拓展运算 friend CFraction operator/(const CFraction &c1,const CFraction &c2); friend CFraction operator/(const double &d,const CFraction &c2); friend CFraction operator/(const CFraction &c2,const double &d); }; int gys(int a,int b) { return (a%b!=0?(gys(b,a%b)):b); } int gbs(int u,int v) { int h; h=gys(u,v); return (u*v/h); } CFraction::CFraction(int nu,int de) { if(de!=0) { nume=nu; deno=de; } } void CFraction::set(int nu,int de)//置值,改变值时用 { if(de!=0) { nume=nu; deno=de; } } bool CFraction::operator > (CFraction &c) { int r; if (deno!=c.deno) //将分数化成相同分母便于比较 { r=gbs(deno,c.deno); if(nume*r/deno>c.nume*r/c.deno) return true; else return false; } else { if(nume>c.nume) return true; else return false; } } bool CFraction::operator < (CFraction &c) { int r; if (deno!=c.deno) //将分数化成相同分母便于比较 { r=gbs(deno,c.deno); if(nume*r/deno<c.nume*r/c.deno) return true; else return false; } else { if(nume<c.nume) return true; else return false; } } bool CFraction::operator >= (CFraction &c) { return !(*this < c); } bool CFraction::operator <= (CFraction &c) { return !(*this > c); } bool CFraction::operator == (CFraction &c) { return !((*this > c)||(*this < c)); } bool CFraction::operator != (CFraction &c) { return ((*this > c)||(*this < c)); } //加法拓展运算 CFraction operator+(const CFraction &c1,const CFraction &c2) { CFraction c; int r; if (c1.deno!=c2.deno) //取分母的最大公倍数 { r=gbs(c1.deno,c2.deno); c.nume=(c1.nume*r/c1.deno)+(c2.nume*r/c2.deno); c.deno=r; } else { c.nume=c1.nume+c2.nume; c.deno=c1.deno; } return c; } CFraction operator+(const double &d,const CFraction &c2) { CFraction c; c.nume=d*c2.deno+c2.nume; c.deno=c2.deno; return c; } CFraction operator+(const CFraction &c2,const double &d) { CFraction c; c.nume=d*c2.deno+c2.nume; c.deno=c2.deno; return c; } //减法拓展运算 CFraction operator-(const CFraction &c1,const CFraction &c2) { CFraction c; int r; if (c1.deno!=c2.deno) //取分母的最大公倍数 { r=gbs(c1.deno,c2.deno); c.nume=(c1.nume*r/c1.deno)-(c2.nume*r/c2.deno); c.deno=r; } else { c.nume=c1.nume-c2.nume; c.deno=c1.deno; } return c; } CFraction operator-(const double &d,const CFraction &c2) { CFraction c; c.nume=d*c2.deno-c2.nume; c.deno=c2.deno; return c; } CFraction operator-(const CFraction &c2,const double &d) { CFraction c; c.nume=c2.nume-d*c2.deno; c.deno=c2.deno; return c; } //乘法拓展运算 CFraction operator*(const CFraction &c1,const CFraction &c2) { CFraction c; c.nume=c1.nume*c2.nume; c.deno=c1.deno*c2.deno; return c; } CFraction operator*(const double &d,const CFraction &c2) { CFraction c; c.nume=d*c2.nume; c.deno=c2.deno; return c; } CFraction operator*(const CFraction &c2,const double &d) { CFraction c; c.nume=d*c2.nume; c.deno=c2.deno; return c; } //除法拓展运算 CFraction operator/(const CFraction &c1,const CFraction &c2) { CFraction c; c.nume=c1.nume*c2.deno; c.deno=c1.deno*c2.nume; return c; } CFraction operator/(const double &d,const CFraction &c2) { CFraction c; c.nume=d*c2.deno; c.deno=c2.nume; return c; } CFraction operator/(const CFraction &c2,const double &d) { CFraction c; c.nume=c2.deno; c.deno=c2.nume*d; return c; } void CFraction::simplify()//化简(使分子分母没有公因子) { int r; r=gys(nume,deno); nume/=r; deno/=r; } void CFraction::display() { simplify(); if(deno!=1) cout<<nume<<"/"<<deno; else cout<<nume; } int main() { CFraction x(-5,6),y(3,9),z(4,10),s; cout<<"两个分数是:"<<endl; x.display(); cout<<'\t'; y.display(); cout<<endl; cout<<"下面比较两个分数的大小:"<<endl; if (x>y) { x.display(); cout<<">"; y.display(); cout<<endl; } if (x<y) { x.display(); cout<<"<"; y.display(); cout<<endl; } if (x==y) { x.display(); cout<<"="; y.display(); cout<<endl; } if (x!=y) { x.display(); cout<<"≠"; y.display(); cout<<endl; } if (x>=y) { x.display(); cout<<"≥"; y.display(); cout<<endl; } if (x<=y) { x.display(); cout<<"≤"; y.display(); cout<<endl; } cout<<"下面对两个分数进行计算:"<<endl; s=x+y; cout<<"x+y="; s.display(); cout<<endl; s=x-y; cout<<"x-y="; s.display(); cout<<endl; s=x*y; cout<<"x*y="; s.display(); cout<<endl; s=x/y; cout<<"x/y="; s.display(); cout<<endl; //拓展运算 cout<<"一个新的分数:"; z.display(); cout<<endl; cout<<"下面进行拓展运算:"<<endl; s=z+2; cout<<"z+2="; s.display(); cout<<endl; s=3+z; cout<<"3+z="; s.display(); cout<<endl; s=z-1; cout<<"z-1="; s.display(); cout<<endl; s=5-z; cout<<"5-z="; s.display(); cout<<endl; s=3*z; cout<<"3*z="; s.display(); cout<<endl; s=z*2; cout<<"z*2="; s.display(); cout<<endl; s=z/3; cout<<"z/3="; s.display(); cout<<endl; s=6/z; cout<<"6/z="; s.display(); cout<<endl; return 0; }
运行结果:
知识点总结:
拓展分数的加减乘除(分数与整型 )。
学习心得:
就是拿上一个项目来改,把成员函数声明为友元函数,分多种情况考虑。
相关文章推荐
- 第7周-项目3-分数类中的运算符重载-分数的加减乘除
- 第八周项目三 分数类中的运算符重载-(1)分数的加减乘除
- 2015年大一下第6周项目3-分数类中的运算符重载(2)分数与整数的加减乘除
- 第八周项目三(1)(2)分数类的运算符重载(加减乘除分数以及整数)附加输出流。
- 第八周项目3-2:分数类中的运算符重载(涉及分数和整数的运算)
- 第八周 项目3-分数类中的运算符重载(1)加减乘除和6种比较关系
- 第八周任务三实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。
- 第8周项目3(2)分数类的运算符重载(拓展)
- 第7周项目4-分数类中的运算符重载(2)
- c++第八周【任务3】实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。
- 第八周实验任务三--实现分数类中的运算符重载并可以完成分数的加减乘除、求反、比较的运算
- 第八周项目三 分数类中的运算符重载-(2)分数与分数、分数与整数的四则运算
- 第八周 项目3-分数类中的运算符重载(1)加减乘除
- 2015年大一下第6周项目3-分数类中的运算符重载(1)分数类的加减乘除
- 2015年大一下第7周项目3-分数类中的运算符重载(续)
- 第7周项目4-分数类中的运算符重载(1)
- 《C++第八周实验报告3-1》---实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算
- 实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算
- 第八周实验报告任务3 实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除,求反,比较6种关系的运算。
- 第八周上机实践项目3-分数类中的运算符重载(分数与分数、分数与整数)