c++分数类
2015-11-12 10:26
441 查看
以下这个代码是将头文件、对应的实现文件和main.cpp放在一起的,只要稍微改一下预处理指令就能拆成三部分。
#include<cstdio> #include<cassert> class fraction{ private: int numerator;//分子 int denominator;//分母 int gcd(int x,int y)const;//最大公约数 int lcm(int x,int y)const;//最小公倍数 void fixup();//维护分母始终为正数 public: //构造函数 fraction();//缺省构造函数 fraction(int numerator); //分母默认值为1 fraction(int numerator,int denominator); //运算符重载 friend const fraction operator +(const fraction &x,const fraction &y); friend const fraction operator -(const fraction &x,const fraction &y); friend const fraction operator *(const fraction &x,const fraction &y); friend const fraction operator /(const fraction &x,const fraction &y); const fraction operator -(); const fraction simplify()const; //化简 const fraction reciprocal()const;//倒数 friend bool operator >(const fraction &x,const fraction &y); friend bool operator >=(const fraction &x,const fraction &y); friend bool operator <(const fraction &x,const fraction &y); friend bool operator <=(const fraction &x,const fraction &y); friend bool operator !=(const fraction &x,const fraction &y); friend bool operator ==(const fraction &x,const fraction &y); fraction& operator =(const fraction &x); //输出 void print()const; }; //用初始化列表写构造函数 fraction::fraction(int x,int y):numerator(x),denominator(y){ assert(y!=0);//确保分母不为0,否则在运行过程中报错 } fraction::fraction(int x):numerator(x),denominator(1){ } fraction::fraction(){ } //最小公倍数 int fraction::lcm(int x,int y)const { //欧几里得算法 while(y){ int t=y; y=x%y; x=t; } return x; } //最大公约数 int fraction::gcd(int x,int y)const { int n=lcm(x,y); return x*y/n; } //维护分母为正 void fraction::fixup() { //如果分母为负,将分子分母同时取负 if(denominator<0){ denominator=-denominator; numerator=-numerator; } assert(denominator!=0); } //化简 const fraction fraction::simplify()const { fraction ans; int n=lcm(numerator,denominator);//得到最小公倍数 ans.denominator=denominator/n;//分子分母同时除以最小公倍数 ans.numerator=numerator/n; return ans; } const fraction operator +(const fraction &x,const fraction &y) { int n=x.gcd(x.denominator,y.denominator);//得到最大公约数 fraction ans; //将分母化为相同的再对分子进行加法运算 ans.numerator=n/x.denominator*x.numerator+n/y.denominator*y.numerator; ans.denominator=n; return ans.simplify(); } const fraction operator -(const fraction &x,const fraction &y) { int n=x.gcd(x.denominator,y.denominator);//得到最大公约数 fraction ans; //将分母化为相同的再对分子进行减法运算 ans.numerator=n/x.denominator*x.numerator-n/y.denominator*y.numerator; ans.denominator=n; return ans.simplify(); } const fraction operator *(const fraction &x,const fraction &y) { fraction ans; fraction tmp_x=x.simplify(); fraction tmp_y=y.simplify(); //分子分母对应相乘 ans.numerator=tmp_x.numerator*tmp_y.numerator; ans.denominator=tmp_x.denominator*tmp_y.denominator; return ans.simplify(); } const fraction operator /(const fraction &x,const fraction &y) { fraction ans; fraction tmp_x=x.simplify(); fraction tmp_y=y.simplify(); assert(tmp_y.denominator!=0);//分子为0不能作为除数 //分子乘分母,分母乘分子 ans.numerator=tmp_x.numerator*tmp_y.denominator; ans.denominator=tmp_x.denominator*tmp_y.numerator; ans=ans.simplify(); ans.fixup(); return ans; } const fraction fraction::operator -() { //分子变为相反数 fraction x; x.numerator=-numerator; x.denominator=denominator; return x; } fraction& fraction::operator =(const fraction &x) { if(this!=&x){ numerator=x.numerator; denominator=x.denominator; } return *this; } bool operator >(const fraction &x,const fraction &y) { if((x-y).numerator>0)return true; else return false; } bool operator >=(const fraction &x,const fraction &y) { if((x-y).numerator>=0)return true; else return false; } bool operator <(const fraction &x,const fraction &y) { if((x-y).numerator<0)return true; else return false; } bool operator <=(const fraction &x,const fraction &y) { if((x-y).numerator<=0)return true; else return false; } bool operator !=(const fraction &x,const fraction &y) { if((x-y).numerator!=0)return true; else return false; } bool operator ==(const fraction &x,const fraction &y) { if((x-y).numerator==0)return true; else return false; } const fraction fraction::reciprocal()const { return 1/(*this); } void fraction::print()const { if(numerator%denominator)printf("%d/%d\n",numerator,denominator); else printf("%d\n",numerator/denominator); } int main() { fraction x(1,4),y(7,16); //error:fraction t(1,0); int v=1; //测试分数运算 fraction ans1=x+y; fraction ans2=x-y; fraction ans3=x*y; fraction ans4=x/y; fraction ans5=-x; fraction ans6=x.reciprocal(); printf("x=1/4,y=7/16,v=1\n\n"); printf("x+y="); ans1.print(); printf("x-y="); ans2.print(); printf("x*y="); ans3.print(); printf("x/y="); ans4.print(); printf("-x="); ans5.print(); printf("1/x="); ans6.print(); printf("\nx>y? "); printf("%d\n",x>y); printf("x<y? "); printf("%d\n",x<y); printf("x==y? "); printf("%d\n",x==y); printf("x!=y? "); printf("%d\n",x!=y); printf("x>=y? "); printf("%d\n",x>=y); printf("x<=y? "); printf("%d\n",x<=y); printf("\n"); //测试分数与整数运算 fraction ans7=v+x; fraction ans8=x+v; fraction ans9=v-x; fraction ans10=x-v; fraction ans11=x*v; fraction ans12=v*x; fraction ans13=x/v; fraction ans14=v/x; printf("v+x="); ans7.print(); printf("x+v="); ans8.print(); printf("v-x="); ans9.print(); printf("x-v="); ans10.print(); printf("x*v="); ans11.print(); printf("v*x="); ans12.print(); printf("x/v="); ans13.print(); printf("v/x="); ans14.print(); printf("\nx>v? "); printf("%d\n",x>v); printf("x<v? "); printf("%d\n",x<v); printf("x==v? "); printf("%d\n",x==v); printf("x!=v? "); printf("%d\n",x!=v); printf("x>=v? "); printf("%d\n",x>=v); printf("x<=v? "); printf("%d\n",x<=v); printf("\nv>x? "); printf("%d\n",v>x); printf("v<x? "); printf("%d\n",v<x); printf("v==x? "); printf("%d\n",v==x); printf("v!=x? "); printf("%d\n",v!=x); printf("v>=x? "); printf("%d\n",v>=x); printf("v<=x? "); printf("%d\n",v<=x); return 0; }
相关文章推荐
- C/C++中空数组使用问题
- 反斜杠在c/c++的作用
- VC++ 在使用 CImage 的Draw 输入一个图像时,有时候会造成图像失真严重,解决的方法如下
- 关于C语言中scanf函数的讨论
- 关于C++内存越界访问的问题
- C++学习笔记 -- 虚析构函数与纯虚析构函数
- c++实现读写共享锁
- 倒置数组和链表(C++)
- C/C++常见指针错误 and 内存访问越界
- C++面试出现频率最高的30道题目(一)
- C++异常以及错误处理
- 全面整理的C++面试题
- C/C++面试题
- c++面试题2015
- C++ sizeof() 和一道面试题
- C++面试题之sizeof面试题
- C语言高频面试题之sizeof与指针和结构体专题总结
- C++中的explicit关键字
- C/C++中的柔性数组
- 遇见gtest--函数参数化测试