您的位置:首页 > 其它

(补)第十三周——分数的加减(运算符重载)

2016-06-09 08:42 465 查看
/*Copyright (c) 2016,烟台大学计算机学院
*All rights reserved.
*文件名称 :
*作    者 : 田志伟
*完成日期 : 2016年6月9号
*版 本 号 : v1.0
*问题描述 :
*输入描述 :
*程序输出 :
*/

#include<iostream>
using namespace std;

class CFraction
{
private:
int nume;  // 分子
int deno;  // 分母
public:
CFraction(int x=0,int y=1):nume(x),deno(y){};
void simplify();//化简
CFraction operator+(const CFraction &x);
CFraction operator-(const CFraction &x);
CFraction operator*(const CFraction &x);
CFraction operator/(const CFraction &x);//构造函数及运算符重载的函数声明
friend istream &operator>>(istream &in,CFraction &x);
friend ostream &operator<<(ostream &out,CFraction x);//输入输出重载
};
istream &operator>>(istream &in,CFraction &x)
{
char ch;
while(1)
{
cin>>x.nume>>ch>>x.deno;
if (x.deno==0)
cerr<<"分母为0, 请重新输入\n";
else if(x.nume == 0)
cerr<<"取倒数会出错,请重新输入\n";
else if(ch!='/')
cerr<<"格式错误(形如m/n)! 请重新输入\n";
else
break;
}
return cin;
}
ostream &operator<<(ostream &out,CFraction x)
{
cout<<x.nume<<'/'<<x.deno<<endl;
return cout;
}
void CFraction::simplify()
{
int m,n,r;
n=deno;
m=nume;
while(r=m%n)  // 求m,n的最大公约数
{
m=n;
n=r;
}
deno/=n;     // 化简
nume/=n;
}

CFraction CFraction::operator +(const CFraction &x)
{
CFraction t;
t.deno=x.deno*deno;
t.nume=x.nume*deno+nume*x.deno;
t.simplify();
return t;
}
CFraction CFraction::operator -(const CFraction &x)
{
CFraction t;
t.deno=x.deno*deno;
t.nume=nume*x.deno-x.nume*deno;									//n 分子   d分母
t.simplify();
return t;
}
CFraction CFraction::operator *(const CFraction &x)
{
CFraction t;
t.deno=x.deno*deno;
t.nume=nume*x.nume;
t.simplify();
return t;
}
CFraction CFraction::operator /(const CFraction &x)
{
CFraction t;
t.deno=x.nume*deno;
t.nume=nume*x.deno;
t.simplify();
return t;
}
int main()
{
CFraction x,y;

cin>>x;
cin>>y;
cout<<x+y<<endl;
cout<<x-y<<endl;
cout<<x*y<<endl;
cout<<x/y<<endl;
return 0;
}

运行结果:

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