0

所以我正在为我的 OO 课程编写一个混合数字课程。我们需要重载每个比较和布尔操作数(除其他外),但我在如何考虑“<”和“>”操作数方面遇到了麻烦。这是我的 '==' 和 '!=' 操作数函数,用于某些上下文。

编辑:另外,如果有人对加法/减法方法有任何提示,我将不胜感激。

bool operator ==(Mixed& mn1, Mixed& mn2){

mn1.ToFraction();
mn2.ToFraction();

mn1.Simplify();
mn2.Simplify();

if(mn1.numerator == mn2.numerator && mn1.denominator == mn2.denominator)
    return true;
else
    return false;
}

bool operator !=( Mixed& mn1,  Mixed& mn2){
mn1.ToFraction();
mn2.ToFraction();

mn1.Simplify();
mn2.Simplify();

if(mn1.numerator == mn2.numerator && mn1.denominator == mn2.denominator)
    return false;
else
    return true;
}

如果有人可以提供一些指导,我将不胜感激。哦,我们不能将它们转换为小数进行比较。

编辑:这是我的标题。

#include <iostream>

using namespace std;

class Mixed
{
public:
Mixed(int integer, int numerator = 0, int denominator = 1);
Mixed(int integer = 0);
double Evaluate();
void ToFraction();
void Simplify();

friend istream& operator >>(istream& in, Mixed& mn);
friend ostream& operator <<(ostream& out, Mixed& mn);

friend bool operator ==( Mixed& mn1,  Mixed& mn2);
friend bool operator !=( Mixed& mn1,  Mixed& mn2);
friend bool operator >( Mixed& mn1,  Mixed& mn2);
friend bool operator <( Mixed& mn1,  Mixed& mn2);
friend bool operator <=( Mixed& mn1,  Mixed& mn2);
friend bool operator >=( Mixed& mn1,  Mixed& mn2);

friend const Mixed operator +( Mixed& mn1,  Mixed& mn2);
friend const Mixed operator -( Mixed& mn1,  Mixed& mn2);
friend const Mixed operator *( Mixed& mn1,  Mixed& mn2);
friend const Mixed operator /( Mixed& mn1,  Mixed& mn2);

private:
int GCD(int a, int b);
int integer, numerator, denominator;
};
4

2 回答 2

2

有理数非常简单:有理数是一对整数 (a, b),通常写为a / b,直到 (a, b) ≡ (a', b') 当且仅当 ab' = a'b。

因此,如果您的类包含两个有代表性的整数pq,您可以将相等运算符实现为:

struct Rational
{
    int p;            // numerator
    unsigned int q;   // denominator

    bool operator==(Rational const & rhs) const
    {
        return p * rhs.q == rhs.p * q;
    }

    // ...
};

对于两个积极的理性,你有不平等通过p * rhs.q < rhs.p * q。所有其他关系都可以根据这两者来实现,例如与等x <= y相同。!(y < x)

正如您似乎已经实现的那样,可以通过将分子和分母除以它们的 GCD 来取消有理数到最低项。

“混合”数字,即整数加上小于一的有理数,被简单地转换为通常的分子-分母有理数表示以进行操作,并通过整数除法和余数返回混合形式。

于 2012-06-08T23:34:29.237 回答
1

要比较有理数,您通常希望找到一个公分母,然后比较分子。对于这样的比较,您也不需要减少到最低的术语(尽管它足够快/容易,这样做通常是无害的)。

如果您决定保持相等比较的原样,您可以将它们简化为以下内容:

bool operator ==(Mixed mn1, Mixed mn2){    
    mn1.ToFraction();
    mn2.ToFraction();

    mn1.Simplify();
    mn2.Simplify();

    return mn1.numerator == mn2.numerator && mn1.denominator == mn2.denominator;
}
于 2012-06-08T23:45:24.040 回答