您的位置:首页 > 编程语言 > C语言/C++

第十二周【项目1-实现复数类中的运算符重载】

2016-05-26 08:50 267 查看
/*
*Copyright(c) 2016, 烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:main.cpp
*作    者:张珩瑞
*完成日期:2016年5月26日
*版本号: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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 编程