第十三周【项目 1分数类中的运算符重载】
2016-06-01 18:21
766 查看
/* *Copyright(c) 2016, 烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:main.cpp *作 者:张珩瑞 *完成日期:2016年6月1日 *版本号:v1.0 * *问题描述:分数类中的运算符重载 *输入描述:无 *输出描述:无 */ #include <iostream> #include <Cstring> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int a=0,int b=1); //构造函数及运算符重载的函数声明 CFraction operator+(const CFraction&p); CFraction operator-(const CFraction&p); CFraction operator*(const CFraction&p); CFraction operator/(const CFraction&p); void simplify(); friend ostream & operator<<(ostream&output,CFraction&p); friend istream & operator>>(istream&input,CFraction&p); bool operator>(const CFraction &p); bool operator<(const CFraction &p); bool operator==(const CFraction &p); bool operator!=(const CFraction &p); bool operator>=(const CFraction &p); bool operator<=(const CFraction &p); CFraction operator+(); //取正一目运算 CFraction operator-(); //取反一目运算 CFraction operator~(); //取倒数一目运算 }; ostream & operator<<(ostream &output,CFraction &p) { output<<p.nume<<"/"<<p.deno<<endl; return output; } istream & operator>>(istream &input,CFraction &p) { char c; cout<<"please input(a/b):"<<endl; input>>p.nume>>c>>p.deno; return input; } CFraction::CFraction(int a,int b) { nume=a; deno=b; } CFraction CFraction::operator+(const CFraction&p) { CFraction c; c.nume=nume+p.nume; c.deno=deno+p.deno; c.simplify(); return c; } CFraction CFraction::operator-(const CFraction&p) { CFraction t; t.nume=nume*p.deno-p.nume*deno; t.deno=deno*p.deno; t.simplify(); return t; } CFraction CFraction::operator*(const CFraction&p) { CFraction c; c.nume=nume*p.nume; c.deno=deno*p.deno; c.simplify(); return c; } CFraction CFraction::operator/(const CFraction&p) { CFraction c; if (!p.nume) return *this; c.nume=nume/p.nume; c.deno=deno/p.deno; c.simplify(); return c; } void CFraction::simplify() { int c,t,fen; fen=deno; if(nume<fen) { t=nume; nume=fen; fen=t; } c=nume%fen;//...... while(c!=0) { nume=fen; fen=c; c=nume%fen; } nume=nume/fen; deno=deno/fen; if (deno<0) // 将分母转化为正数 { deno=-deno; nume=-nume; } } bool CFraction::operator>(const CFraction &p) { //分母不相等先通分 int this_nume,c_nume,common_deno; this_nume=nume*p.deno; // 计算分数通分后的分子,同分母为deno*c.deno c_nume=p.nume*deno; common_deno=deno*p.deno; if ((this_nume-c_nume)*common_deno>0) return true; return false; } bool CFraction::operator<(const CFraction &p) { int this_nume,c_nume,common_deno; this_nume=nume*p.deno; c_nume=p.nume*deno; common_deno=deno*p.deno; if ((this_nume-c_nume)*common_deno<0) return true; return false; } bool CFraction::operator==(const CFraction &p) { if (*this!=p) return false; return true; } bool CFraction::operator!=(const CFraction &p) { if (*this>p|| *this<p) return true; return false; } // 分数比较大小 bool CFraction::operator>=(const CFraction &p) { if (*this<p) return false; return true; } // 分数比较大小 bool CFraction::operator<=(const CFraction &p) { if (*this>p) return false; return true; } // 分数取正号 CFraction CFraction:: operator+() { return *this; } // 分数取负号 CFraction CFraction:: operator-() { CFraction x; x.nume=-nume; x.deno=deno; return x; } // 分数取倒数 CFraction CFraction:: operator~() { CFraction x; x.nume=deno; x.deno=nume; //未对原分子为0的情况进行处理 if(x.deno<0) //保证负分数的负号在分子上 { x.deno=-x.deno; x.nume=-x.nume; } return x; } int main() { CFraction c1,c2,c3; cin>>c1>>c2; c3=c1+c2; cout<<"c1+c2="<<c3<<endl; c3=c1-c2; cout<<"c1-c2="<<c3<<endl; c3=c1*c2; cout<<"c1*c2="<<c3<<endl; c3=c1/c2; cout<<"c1/c2="<<c3<<endl; c3=-c1; cout<<"-c1="<<c3<<endl; c3=+c1; cout<<"+c1"<<c3<<endl; c3=~c1; cout<<"~c1"<<c3<<endl; cout<<c1; if (c1>c2) cout<<"大于"; if (c1<c2) cout<<"小于"; if (c1==c2) cout<<"等于"; cout<<c2<<endl; return 0; }