您的位置:首页 > 其它

第十三周项目1——分数类中的运算符重载

2016-05-26 09:25 246 查看
问题及代码:

/*
* Copyright (c) 2016,烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:main.cpp
* 作    者:赵志君
* 完成日期:2016年5月26日
* 版 本 号:v1.0
*
* 问题描述:(1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算。
*           (2)在(1)的基础上,实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。
*                例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。
*           (3)定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算。
*           (4)定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
*/
#include <iostream>
using namespace std;

class CFraction
{
private:
int nume;  // 分子
int deno;  // 分母
public:
//构造函数及运算符重载的函数声明
CFraction(int n=0,int d=0):nume(n),deno(d){};
CFraction operator+(const CFraction &c);
CFraction operator-(const CFraction &c);
CFraction operator*(const CFraction &c);
CFraction operator/(const CFraction &c);

//比较运算符
bool operator > (const CFraction &c);
bool operator < (const CFraction &c);
bool operator >= (const CFraction &c);
bool operator <= (const CFraction &c);
bool operator == (const CFraction &c);
bool operator != (const CFraction &c);

friend ostream &operator<<(ostream &out,CFraction c);
friend istream &operator>>(istream &input,CFraction c);

CFraction operator+(int i);
CFraction operator-(int i);
CFraction operator*(int i);
CFraction operator/(int i);
friend CFraction operator+(int i,CFraction &c);
friend CFraction operator-(int i,CFraction &c);
friend CFraction operator*(int i,CFraction &c);
friend CFraction operator/(int i,CFraction &c);

CFraction operator+();
CFraction operator-();
CFraction operator~();
};
CFraction CFraction::operator+(const CFraction &c)
{
CFraction t;
int y,m,n;
m=t.nume=nume*c.deno+c.nume*deno;
n=t.deno=deno*c.deno;
n=t.nume%t.deno;
while(y)
{
y=n%m;
n=m;
m=y;
}
t.nume=t.nume/n;
t.deno=t.deno/n;
return t;
}
CFraction CFraction::operator-(const CFraction &c)
{
CFraction t;
int y,m,n;
m=t.nume=nume*c.deno-c.nume*deno;
n=t.deno=deno*c.deno;
while(y)
{
y=n%m;
n=m;
m=y;
}
t.nume=t.nume/n;
t.deno=t.deno/n;
return t;
}
CFraction CFraction::operator*(const CFraction &c)
{
CFraction t;
int y,m,n;
m=t.nume=nume*c.nume;
n=t.deno=deno*c.deno;
while(y)
{
y=n%m;
n=m;
m=y;
}
t.nume=t.nume/n;
t.deno=t.deno/n;
return t;
}
CFraction CFraction::operator/(const CFraction &c)
{
CFraction t;
int y,m,n;
m=t.nume=nume*c.deno;
n=t.deno=deno*c.nume;
while(y)
{
y=n%m;
n=m;
m=y;
}
t.nume=t.nume/n;
t.deno=t.deno/n;
return t;
}

bool CFraction::operator>(const CFraction &c)
{
double a,b;
a=(double)nume/deno;
b=(double)c.nume/deno;
if(a>b)
return true;
else
return false;
}
bool CFraction::operator<(const CFraction &c)
{
double a,b;
a=(double)nume/deno;
b=(double)c.nume/deno;
if(a<b)
return true;
else
return false;
}
bool CFraction::operator>=(const CFraction &c)
{
double a,b;
a=(double)nume/deno;
b=(double)c.nume/deno;
if(a>=b)
return true;
else
return false;
}
bool CFraction::operator<=(const CFraction &c)
{
double a,b;
a=(double)nume/deno;
b=(double)c.nume/deno;
if(a<=b)
return true;
else
return false;
}
bool CFraction::operator!=(const CFraction &c)
{
double a,b;
a=(double)nume/deno;
b=(double)c.nume/deno;
if(a!=b)
return true;
else
return false;
}
bool CFraction::operator==(const CFraction &c)
{
double a,b;
a=(double)nume/deno;
b=(double)c.nume/deno;
if(a==b)
return true;
else
return false;
}

ostream &operator<<(ostream &out,CFraction c)
{
if(c.deno==1)
out<<c.nume;
else
out<<c.nume<<"/"<<c.deno;
return out;
}
istream &operator>>(istream &input,CFraction c)
{
char a;
input>>c.nume>>a>>c.deno;
return input;
}

CFraction CFraction::operator+(int i)
{
CFraction c;
c.deno=deno;
c.nume=nume+c.deno*i;
return c;
}
CFraction CFraction::operator-(int i)
{
CFraction c;
c.deno=deno;
c.nume=nume-c.deno*i;
return c;
}
CFraction CFraction::operator*(int i)
{
CFraction c;
c.deno=deno;
c.nume=nume*i;
return c;
}
CFraction CFraction::operator/(int i)
{
CFraction c;
c.deno=deno*i;
c.nume=nume;
return c;
}

CFraction operator+(int i,CFraction &c)
{
CFraction a;
a.deno=c.deno;
a.nume=c.nume+c.deno*i;
return a;
}
CFraction operator-(int i,CFraction &c)
{
CFraction a;
a.deno=c.deno;
a.nume=c.deno*i-c.nume;
return a;
}
CFraction operator*(int i,CFraction &c)
{
CFraction a;
a.deno=c.deno;
a.nume=c.nume*i;
return a;
}
CFraction operator/(int i,CFraction &c)
{
CFraction a;
a.deno=c.nume;
a.nume=c.deno*i;
return a;
}

CFraction CFraction::operator+()
{
return *this;
}
CFraction CFraction::operator-()
{
CFraction c;
c.nume=-nume;
c.deno=deno;
return c;
}
CFraction CFraction::operator~()
{
CFraction c;
c.nume=deno;
c.deno=nume;
if(c.deno==0)
{
cout<<"不可以取倒数!"<<endl;
return *this;
}
else
return c;
}
//重载函数的实现及用于测试的main()函数
int main()
{
CFraction a(5,6),b(2,3);
cout<<"a="<<a<<"  b="<<b<<endl;
cout<<"a+b="<<a+b;
cout<<"  a-b="<<a-b;
cout<<"  a*b="<<a*b;
cout<<"  a/b="<<a/b<<endl<<endl;
CFraction m(3,2),n(6,5);
cout<<"m="<<m<<"  n="<<n<<"  a="<<a<<"  b="<<b<<endl;
if(m>b)
cout<<"m>b  ";
if(b<a)
cout<<"b<a  ";
if(m>=b)
cout<<"m>=b  ";
if(b<=a)
cout<<"b<=a  ";
if(m==n)
cout<<"m==n  ";
if(n!=a)
cout<<"n!=a"<<endl<<endl;
cout<<"n="<<n<<"  n+2="<<n+2<<endl;
cout<<"n="<<n<<"  n-2="<<n-2<<endl;
cout<<"n="<<n<<"  n*2="<<n*2<<endl;
cout<<"n="<<n<<"  n/2="<<n/2<<endl;
cout<<"n="<<n<<"  2+n="<<2+n<<endl;
cout<<"n="<<n<<"  2-n="<<2-n<<endl;
cout<<"n="<<n<<"  2*n="<<2*n<<endl;
cout<<"n="<<n<<"  2/n="<<2/n<<endl;
cout<<"m="<<m<<"  +m="<<+m<<endl;
cout<<"m="<<m<<"  -m="<<-m<<endl;
cout<<"m="<<m<<"  ~m="<<~m<<endl;
return 0;
}


运行结果:

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