2 summer wxx summer_WXX 于 2015.06.03 12:08 提问

一个c++运算符重载问题,希望得到完整代码
c++

题目如下:
已知一个有理数类zrf_Ratio,包含私有数据成员:分子num和分母den, 以及公有函数成员

friend ostream& operator<<(ostream& ostr, const zrf_Ratio& r)

{ return ostr << r.num << "/" << r.den;}

请补充该类的构造函数,并实现如下的操作符重载形式:

friend zrf_Ratio operator-(const zrf_Ratio&);

friend zrf_Ratio operator+(const zrf_Ratio&, const zrf_Ratio&);

friend zrf_Ratio operator-(const zrf_Ratio&, const zrf_Ratio&);

friend zrf_Ratio operator*(const zrf_Ratio&, const zrf_Ratio&);

friend zrf_Ratio operator/(const zrf_Ratio&, const zrf_Ratio&);

6个回答

VisualEleven
VisualEleven   Ds   Rxr 2015.06.03 13:46
已采纳

先计算最大公约数和最小公倍数,剩下的都是数学问题了吧~

91program
91program   Ds   Rxr 2015.06.03 12:38

看来又是作业题了
建议你还是自己去做,有具体的问题再来

91program
91program 回复summer_WXX: 好像少了什么呢?这个只有看代码才知道。
2 年多之前 回复
summer_WXX
summer_WXX 确实是作业题,我自己也有写,这些函数我会写,但好像少了什么总是不对。
2 年多之前 回复
summer_WXX
summer_WXX 确实是作业题,我自己也有写,这些函数我会写,但好像少了什么总是不对。
2 年多之前 回复
u012061345
u012061345   2015.06.04 17:00

先把自己的答案拿出来看看。

cuiwei1026522829
cuiwei1026522829   Ds   Rxr 2015.06.04 17:06

楼下旁观者,求做题思路啊 ~~~~(>_<)~~~~

AQ_WHH
AQ_WHH   2015.06.05 20:28

自己写的,求指出不足,谢谢~

#include<iostream>
#define p(x)    cout<<#x "="<<x<<endl;
using namespace std;
int min_divisor(int x,int y)    {
    while(x%y!=0)   {
        int c=y;
        y=x%y;
        x=c;
    }
    return y;
}
class zrf_Ratio {
    int num,den;
    void isLegal()const {//判断有理数是否合法 
        if(den==0)  { cout<<"分母不能为零!"<<endl;    exit(1); }
    }
public:
    zrf_Ratio(int _num=1,int _den=1):num(_num),den(_den)
    { isLegal(); }
    friend ostream& operator<<(ostream& ostr, const zrf_Ratio& r)
    { return ostr << r.num << "/" << r.den; }
    friend zrf_Ratio operator-(const zrf_Ratio& z)  { 
        z.isLegal();
        return zrf_Ratio(-z.num,z.den);
    }
    friend zrf_Ratio operator+(const zrf_Ratio& l, const zrf_Ratio& r)  {
        l.isLegal(); r.isLegal();
        int d=min_divisor(l.den,r.den);
        int new_num=(l.num*r.den+r.num*l.den)/d;
        int new_den=l.den*r.den/d;
        return zrf_Ratio(new_num,new_den);
    }
    friend zrf_Ratio operator-(const zrf_Ratio& l, const zrf_Ratio& r)  {
        l.isLegal(); r.isLegal();
        int d=min_divisor(l.den,r.den);
        int new_num=(l.num*r.den-r.num*l.den)/d;
        int new_den=l.den*r.den/d;
        return zrf_Ratio(new_num,new_den);      
    }
    friend zrf_Ratio operator*(const zrf_Ratio& l, const zrf_Ratio& r)  {
        l.isLegal(); r.isLegal();
        int new_num=l.num*r.num, new_den=l.den*r.den;
        int d=min_divisor(new_num,new_den);
        while(d!=1)
        { new_num/=d; new_den/=d;d=min_divisor(new_num,new_den); }
        return zrf_Ratio(new_num,new_den);
    }
    friend zrf_Ratio operator/(const zrf_Ratio& l, const zrf_Ratio& r)  
    { return l*(zrf_Ratio(r.den,r.num));}
};
int main()
{
    zrf_Ratio a(1,18);
    zrf_Ratio b(11,24);
    p(-a);
    p(a+b);
    p(a-b);
    p(a*b);
    p(a/b);
    zrf_Ratio e(0,1);
    p(a/e);
}
datou431
datou431   Rxr 2015.06.18 15:27

先把自己的答案拿出来看看。

Csdn user default icon
上传中...
上传图片
插入图片