64,666
社区成员
发帖
与我相关
我的任务
分享
#ifndef _RNUMBER_
#define _RNUMBER_
#include<iostream>
using namespace std;
class RNumber
{
int numerator,//分子
denominator;//分母
public:
void reduction();//约分
void setNumerator(int m) { numerator = m; }//设置分子
void setDenominator(int n) { denominator = n; }//设置分母
int getNumerator()const { return numerator; }//返回分子
int getDenominator()const { return denominator; }//返回分母
friend RNumber operator+(RNumber fraction1, RNumber fraction2);
friend RNumber operator-(RNumber fraction1, RNumber fraction2);
friend RNumber operator*(RNumber fraction1, RNumber fraction2);
friend RNumber operator/(RNumber fraction1, RNumber fraction2);
friend istream& operator>>(istream& in, RNumber &a);
friend ostream& operator<<(ostream& out, RNumber &a);
};
void RNumber::reduction()
{
int n = numerator;
if (n != 0)
{
//排除分数为负数的情况
if (n < 0)
{
n = abs(n);
}
int d = denominator;
if (d < 0)
{
d = abs(d);
}
while (n!=0&&n != d)//若分子为0,不约分
{//辗转相减法求公约数
if (n > d)
n-=d;
else
d-=n;
}
numerator /= n;
denominator /= d;
}
}
istream& operator>>(istream &in, RNumber& a)
{
int m, //记录分子
n;//记录分母
char ch;
in >> m >> ch >> n;
if (n == 0)
{
cout<<"分母不能为0!\n";
exit(0);
}
a.setNumerator(m);
a.setDenominator(n);
a.reduction();
return in;
}
ostream& operator<<(ostream& out, RNumber &a)
{
out << a.numerator << "/" << a.denominator;
return out;
}
RNumber operator+(RNumber fraction1, RNumber fraction2)
{
RNumber end;
end.denominator = fraction1.denominator*fraction2.denominator;
end.numerator = fraction1.denominator*fraction2.numerator + fraction1.numerator*fraction2.denominator;
end.reduction();
return end;
}
RNumber operator-(RNumber fraction1, RNumber fraction2)
{
RNumber end;
end.denominator = fraction1.denominator*fraction2.denominator;
end.numerator = fraction1.numerator*fraction2.denominator - fraction1.denominator*fraction2.numerator;
end.reduction();
return end;
}
RNumber operator*(RNumber fraction1, RNumber fraction2)
{
RNumber end;
end.denominator = fraction1.denominator * fraction2.denominator;
end.numerator = fraction2.numerator * fraction1.numerator;
end.reduction();
return end;
}
RNumber operator/(RNumber fraction1, RNumber fraction2)
{
RNumber end;
end.denominator = fraction1.denominator * fraction2.numerator;
end.numerator = fraction1.numerator * fraction2.denominator;
end.reduction();
return end;
}
#endif
#include<iostream>
#include"RNumber.h"
using namespace std;
int main()
{
RNumber fraction1;//分数运算左操作数
RNumber fraction2;//右操作数
char ch;//运算符
RNumber end;//结果
cout << "请输入表达式:";
cin >> fraction1>>ch>>fraction2;//cin>>fraction1调用重载>>运算符,>>fraction2调用重载运算符>>,给分数的分母分子相应的数
cout << fraction1 << ch << fraction2 << "=";//输出格式,调用重载<<运算符,以分数格式输出
switch (ch)
{
case '+':end = fraction1 + fraction2;//调用重载+
break;
case '-':end = fraction1 - fraction2;//调用重载-
break;
case '*':end = fraction1 * fraction2;//调用重载*
break;
case '/':end = fraction1 / fraction2;//调用重载/
break;
}
if (abs(end.getNumerator()) % abs(end.getDenominator()) == 0)//处理结果为整数的情况
{
cout << end.getNumerator() / end.getDenominator();
}
else
cout << end;//结果为分数
return 0;
}
while (n!=0&&n != d)//若分子为0,不约分
{//辗转相减法求公约数
if (n > d)
n-=d;
else
d-=n;
}