题目描述
设计一个分数类rationalNumber,该类中包括分子和分母两个成员数据,并具有下述功能:
(1)建立构造函数,它能防止分母为零(分母为0时,输出"denominator equal zero"),当分数不是最简形式时进行约分,并避免分母为负数。
(2)重载加法运算符。
输入
输入数据第一行为一个整数T,表示有T组数据。每组数据一行,包含四个整数,分别表示两个分数a,b的分子和分母:分子 分母 分子 分母。
输出
对于每一组数据,输出两个分数相加的结果,格式参照样例输出。
样例输入 Copy
4
2 -4 1 4
2 -4 1 -2
2 -4 1 2
2 0 4 6
样例输出 Copy
-1/2+1/4=-1/4
-1/2-1/2=-1
-1/2+1/2=0
denominator equal zero
# include <iostream>
using namespace std;
class rationalNumber
{
public:
bool FzMoreThanZero()
{
return fz >= 0;
}
bool FmEqZero()
{
return fm == 0;
}
rationalNumber(int p1, int p2)//构造函数
{
fz = p1;
fm = p2;
if (fm == 0)//分母不为零
{
cout << "denominator equal zero" << endl;
return;
}
for (int i = abs(p1); i > 1; i--)//约分
{
if (fz % i == 0 && fm % i == 0)
{
fz = fz / i;
fm = fm / i;
}
}
if (fm < 0)
{
fm = -fm;
fz = -fz;
}
}
void show()
{
if (fm == 1 || fz == 0)
cout << fz;
else
cout << fz << "/" << fm;
}
rationalNumber operator+(rationalNumber& b)//运算符重载
{
int fz1 = fz * b.fm + fm * b.fz;
int fm1 = fm * b.fm;
return rationalNumber(fz1, fm1);
}
private:
int fz;
int fm;
};
int main()
{
int T;
int a, b, c, d;
cin >> T;
while (T-- > 0)
{
cin >> a >> b >> c >> d;
rationalNumber r1(a, b);
rationalNumber r2(c, d);
if (r1.FmEqZero() || r2.FmEqZero())
{
continue;
}
rationalNumber r3 = r1 + r2;
r1.show();
if (r2.FzMoreThanZero())
cout << "+";
r2.show();
cout << "=";
r3.show();
cout << endl;
}
return 0;
}