7-13 分数加法运算重载(30 分)
相信同学们对复数运算符重载已经相当熟悉啦,那今天那我们来看看分数又该如何处理呢?定义一个分数类FS,有私有成员分子fz,分母fm。另有公有成员函数FS operator + (const FS &f)对运算符“+”进行重载,实现两个分数相加。题目首先给出一个整型数n,紧跟着2n行输入,输入形如3z4m,代表分子为3,分母为4。其中分母不为0,输入时分母可以为负数,但输出时分母必须为正数。 要求对分数进行两两求和,并化简。(备注说明:分数为0时,表示成0z1m,如果结果为负数,那么分子取负数,分母为正数)
示例如下:
输入:
3
4z9m
2z9m
4z5m
5z4m
2z-5m
1z-5m
输出:
2z3m
41z20m
-3z5m
程序如下:
#include <iostream>
using namespace std;
class FS
{
private:
int fz;
int fm;
public:
FS(){} //必须要写上无参构造函数
FS(int z,int m):fz(z),fm(m){}
void set(int x,int y) {fz=x; fm=y;}
int measure(int x,int y);
void show() const
{
cout <<fz<<"z"<<fm<<"m"<<endl;
}
FS operator + (const FS &f)
{
int y=fm*f.fm;
int x=fz*f.fm+f.fz*fm;
int a=measure(x,y); ///求最大公约数
x=x/a;
y=y/a;
if(y<0)
{
x=-x;
y=-y; ///如果结果为负数,那么分子取负数,分母为正数
}
return FS(x,y);
}
};
int FS::measure(int x,int y)
{
int z = y;
while(x%y!=0)
{
z = x%y;
x = y;
y = z;
}
return z;
}
int main()
{
int n;
cin>>n;
int i;
int fz,fm;
//int x[50],y[50];
char a,b;
FS *f = new FS[n*2];
FS *f1 = new FS[n]; 构建对象数组
for(i=0;i<n*2;i++)
{
cin>>fz>>a>>fm>>b;
f[i].set(fz,fm);
}
int j=0;
for(i=0;i<n*2;i++)
{
f1[j]=f[i]+f[i+1];
i++;
j++;
}
for(i=0;i<n;i++)
{
f1[i].show();
}
return 0;
}