第八周项目三分数类中的运算符重载
2014-04-16 19:55
459 查看
/* * 程序的版权和版本声明部分 * Copyright (c)2013, 烟台大学计算机学院学生 * All rightsreserved. * 文件名称: * 作 者: 纪丽娜 * 完成日期: 2014 年 04月 16 日 * 版本号: v1.0 * 问题描述:实现分数类中的运算符重载, 在分数类中可以完成分数的加减乘除(运算后再化简)、 比较(6种关系)的运算。 * */ #include <iostream> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int nu=0,int de=1):nume(nu),deno(de){} void simplify(); //化简! void display(); CFraction operator+(CFraction &c2); //两个分数相加,结果要化简 CFraction operator-(CFraction &c2); //两个分数相减,结果要化简 CFraction operator*(CFraction &c2); //两个分数相乘,结果要化简 CFraction operator/(CFraction &c2); //两个分数相除,结果要化简 bool operator>(CFraction &c2); bool operator<(CFraction &c2); bool operator==(CFraction &c2); bool operator!=(CFraction &c2); bool operator>=(CFraction &c2); bool operator<=(CFraction &c2); }; // 分数化简 void CFraction::simplify() { int i,min; CFraction &c=*this; if(c.deno<0) c.deno=-1*c.deno; if(c.nume<0) c.nume=-1*c.nume; c.nume>=c.deno?min=c.deno:min=c.nume; for(i=min;i>0;i--) { if((c.deno%i==0)&&(c.nume%i==0)) { c.deno/=i; c.nume/=i; } } } //显示分数 void CFraction::display() { cout<<"("<<nume<<","<<deno<<")"<<endl; } // 分数相加 CFraction CFraction::operator+(CFraction &c2) { CFraction &c1=*this; CFraction t; t.nume=c1.nume*c2.deno+c2.nume*c1.deno; t.deno=c1.deno*c2.deno; t.simplify(); return t; } // 分数相减 CFraction CFraction::operator-(CFraction &c2) { CFraction &c1=*this; CFraction t; t.nume=c1.nume*c2.deno-c2.nume*c1.deno; t.deno=c1.deno*c2.deno; t.simplify(); return t; } // 分数相乘 CFraction CFraction::operator*(CFraction &c2) { CFraction &c1=*this; CFraction t; t.nume=c1.nume*c2.nume; t.deno=c1.deno*c2.deno; t.simplify(); return t; } // 分数相除 CFraction CFraction::operator/(CFraction &c2) { CFraction &c1=*this; CFraction t; t.nume=c1.nume*c2.deno; t.deno=c1.deno*c2.nume; t.simplify(); return t; } // 分数比较大小 bool CFraction::operator>(CFraction &c2) { CFraction &c1=*this; int cdeno,c1nume,c2nume; c1nume=c1.nume*c2.deno; // 计算分数通分后的分子,同分母为c1.deno*c2.deno c2nume=c2.nume*c1.deno; cdeno=c1.deno*c2.deno; if (((c1nume>c2nume)&&(cdeno>0))||((c1nume<c2nume)&&(cdeno<0)) )return true; // 将通分后的分子比较大小 return false; } // 分数比较大小 bool CFraction::operator<(CFraction &c2) { CFraction &c1=*this; int cdeno,c1nume,c2nume; c1nume=c1.nume*c2.deno; // 计算分数通分后的分子,同分母为c1.deno*c2.deno c2nume=c2.nume*c1.deno; cdeno=c1.deno*c2.deno; if (((c1nume<c2nume)&&(cdeno>0))||((c1nume>c2nume)&&(cdeno<0))) return true; // 将通分后的分子比较大小 return false; } // 分数比较大小 bool CFraction::operator==(CFraction &c2) { CFraction &c1=*this; int c2nume,c1nume; c1nume=c1.nume*c2.deno; c2nume=c2.nume*c1.deno; if(c1nume==c2nume)return true; return false; } // 分数比较大小 bool CFraction::operator!=(CFraction &c2) { CFraction &c1=*this; if (c1==c2)return false; return true; } // 分数比较大小 bool CFraction::operator>=(CFraction &c2) { CFraction &c1=*this; if (c1<c2) return false; return true; } // 分数比较大小 bool CFraction::operator<=(CFraction &c2) { CFraction &c1=*this; if (c1>c2) return false; return true; } int main() { CFraction x(1,3),y(-2,4),s; x.display(); y.display(); s=x+y; cout<<"x+y="; s.display(); s=x-y; cout<<"x-y="; s.display(); s=x*y; cout<<"x*y="; s.display(); s=x/y; cout<<"x/y="; s.display(); if (x>y) cout<<"x>y"<<endl; if (x<y) cout<<"x<y"<<endl; if (x==y) cout<<"x==y"<<endl; if(x!=y)cout<<"x!=y"<<endl; if (x>=y) cout<<"x≥y"<<endl; if (x<=y) cout<<"x≤y"<<endl; cout<<endl; return 0; }
心得:不能直接用分数与0相比因为分数是类里面的,要是一定要比的话就命名一个重载!分数与int类型的比大小!!
相关文章推荐
- 第八周项目三-实现分数类的运算符的重载
- 第八周项目1复数类运算符的重载
- 第八周项目1-实现复数类中运算符的重载
- 第八周项目四 【炒鸡难!!高能预警!】String类的构造(重载双目运算符)
- 第八周项目2-Time类中的运算符重载
- 第八周 项目一:任务一(成员函数完成运算符的重载)
- 第八周 项目一:任务二(友元函数完成运算符的重载)
- 第八周 项目二:Time类中的运算符重载
- 第八周项目二——Time类中的运算符重载
- 第八周项目1.2--用类的友元函数完成运算符的重载
- 第八周项目二——Time类中的运算符重载
- C++程序设计----- 运算符的重载 【项目3-分数类中的运算符重载】
- 第八周项目一:用类的成员函数完成运算符的重载(任务一)
- 第八周-项目一-复数类中的运算符的重载
- 第八周项目一の任务一----用类的成员函数完成运算符的重载
- /项目3-分数类中的运算符重载
- 第八周项目一(2)友元函数对运算符的重载
- 第八周上机项目一(1):用类的成员函数完成运算符的重载
- C++第8周(春)项目3 分数类中的运算符重载
- 第八周项目一の任务二----用类的友元函数来完成运算符的重载