您的位置:首页 > 其它

第十一周项目1-分数类中的运算符重载(1)

2016-05-23 20:37 225 查看
问题及代码:

/*
*Copyright (c) 2016,烟台大学计算机学院
*All rights reserved.
*文件名称:zwj.cpp
*作    者:张伟晶
*完成日期:2016年5月23日
*版 本 号:v1.0
*
*问题描述:实现分数类中的运算符重载,完成加减乘除比较的运算
*输入描述:
*程序输出:
*/
#include<iostream>
#include<cmath>
using namespace std;
class CFraction
{
private:
int num;//分子
int deno;//分母
public:

//构造函数及运算符重载的声明
CFraction (int nu=0,int de=1):num(nu),deno(de){}
void huajian();

friend istream &operator>>(istream &in,CFraction &x);
friend ostream &operator<<(ostream &out,CFraction x);

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);

};
//重载函数的实现以及用于测试的main()函数
void CFraction::huajian()
{
int k;
if(num>0)
k=2;
else
{
k=1;
num=-num;
}

int m,n,r=1;
m=num;
n=deno;
while(r=m%n)
{
m=n;
n=r;
}
num=num/n*pow(-1,k);
deno=deno/n;
}

// 重载输入运算符>>
istream &operator>>(istream &in,CFraction &x)
{
char ch;
while(1)
{
cin>>x.num>>ch>>x.deno;
if (x.deno==0)
cerr<<"分母为0, 请重新输入\n";
else if(ch!='/')
cerr<<"格式错误(形如m/n)! 请重新输入\n";
else
break;
}
return cin;
}

// 重载输出运算符<<
ostream &operator<<(ostream &out,CFraction x)
{
cout<<x.num<<'/'<<x.deno;
return cout;
}

CFraction CFraction::operator+(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.deno+c.num*deno;
w.huajian();
return w;
}
CFraction CFraction::operator-(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.deno-c.num*deno;
w.huajian();
return w;
}
CFraction CFraction::operator*(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.num;
w.huajian();
return w;
}
CFraction CFraction::operator/(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.deno/c.num*deno;
w.huajian();
return w;
}
//比较大小
bool CFraction::operator>(const CFraction &c)
{
int m,n;
m=num*c.deno;
n=c.num*deno;
if((m-n)>0)
return true;
else
return false;
}
bool CFraction::operator<(const CFraction &c)
{

int m,n;
m=num*c.deno;
n=c.num*deno;
if((m-n)<0)
return true;
else
return false;
}
bool CFraction::operator==(const CFraction &c)
{
int m,n;
m=num*c.deno;
n=c.num*deno;
if((m-n)==0)
return true;
else
return false;
}
int main()
{
CFraction x,y,z;
cout<<"请输入x,y"<<endl;

cout<<"x:";
cin>>x;
cout<<"y:";
cin>>y;
cout<<"**********加减乘除**********"<<endl;
z=x+y;
cout<<"x+y="<<z<<endl;
z=x-y;
cout<<"x-y="<<z<<endl;
z=x*y;
cout<<"x*y="<<z<<endl;
z=x/y;
cout<<"x/y="<<z<<endl;
cout<<endl;

cout<<"**********比较大小**********"<<endl;
if(x>y) cout<<"x>y"<<endl;
if(x<y) cout<<"x<y"<<endl;
if(x==y) cout<<"x=y"<<endl;

return 0;
}


运行结果:



知识点总结:

运算符重载

学习心得:

分数化简的时候,while(r==0),这样的话,n=r,后面的运算就出错了。在纸上画一画比较好找问题所在。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: