题目大意:求分数的最简形式和判断大小
分析:由于题目中已经给我们写好了部分函数,所以我们只要将运算符重载的几个友元函数补充完整即可。
值得注意的是,在比较分数大小时,要将其中的某个数转化成float型,否则会强制转化为int型,导致部分数据出错。
第二个运算符>>,好像对于解答题目没什么用处。 主函数中的输入>>并没有使用重载的形式。
代码展示:
ostream& operator<<(std::ostream& os, const zrf_Ratio& zrf){
os<<zrf.num<<"/"<<zrf.den;
}
bool operator==(const zrf_Ratio& zrf, const zrf_Ratio& ssh){
if(zrf.num==ssh.num && zrf.den==ssh.den)
return 1;
else
return 0;
}
bool operator<(const zrf_Ratio& zrf,const zrf_Ratio& ssh){
if(float(zrf.num)/zrf.den<float(ssh.num)/ssh.den)
return 1;
else
return 0;
}
完整代码展示:
#include <iostream>
#include <cassert>
using namespace std;
class zrf_Ratio
{
friend std::ostream& operator<<(std::ostream&, const zrf_Ratio&);
friend std::istream& operator>>(std::istream&, zrf_Ratio&);
friend bool operator==(const zrf_Ratio&, const zrf_Ratio&);
friend bool operator<(const zrf_Ratio&, const zrf_Ratio&);
public:
zrf_Ratio(int=0,int=1);
zrf_Ratio(const zrf_Ratio&);
private:
int num;
int den;
void reduce();//化为最简分数
};
//补充完整构造函数
ostream& operator<<(std::ostream& os, const zrf_Ratio& zrf){
os<<zrf.num<<"/"<<zrf.den;
}
bool operator==(const zrf_Ratio& zrf, const zrf_Ratio& ssh){
if(zrf.num==ssh.num && zrf.den==ssh.den)
return 1;
else
return 0;
}
bool operator<(const zrf_Ratio& zrf,const zrf_Ratio& ssh){
if(float(zrf.num)/zrf.den<float(ssh.num)/ssh.den)
return 1;
else
return 0;
}
//公有成员函数:
zrf_Ratio::zrf_Ratio(int num, int den) : num(num), den(den)
{
reduce();
}
zrf_Ratio::zrf_Ratio(const zrf_Ratio& r) : num(r.num), den(r.den)
{
}
//私有成员函数:
void swap(int &m, int &n)
{
int t;
t=m;
m=n;
n=t;
}
int zrf_Gcd(int m, int n)
{
if (m<n)
swap(m,n);
assert(n>=0);
while (n>0)
{
int r=m%n;
m = n;
n = r;
}
return m;
}
void zrf_Ratio::reduce()
{
if (num == 0 || den == 0)
{
num = 0;
den = 1;
return;
}
if (den < 0)
{
den *= -1;
num *= -1;
}
if (num == 1)
return;
int sgn = (num<0?-1:1);
int g = zrf_Gcd(sgn*num,den);
num /= g;
den /= g;
}
int main()
{
int a = 0, b = 0, c = 0, d = 0;
cin >> a >> b >> c >> d;
zrf_Ratio zrf(a, b),ssh(c, d);
cout<<"zrf is:"<<zrf<<"; ssh is:"<<ssh<<endl;
cout<<"(zrf==ssh) is:"<<(zrf==ssh)<<"; (zrf<ssh) is:"<<(zrf<ssh) <<endl;
return 0;
}