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.

したがって、クラスに 2 つの代表的な整数pとが含まれている場合q、等値演算子を次のように実装できます。

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

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

    // ...
};

2 つのの理由付けの場合、 によって不等式が得られますp * rhs.q < rhs.p * q。他のすべての関係は、これらの 2 つの観点から実装できます。たとえば、x <= yis the same as!(y < x)などです。

すでに実装しているように、分子と分母の両方を GCD で除算することにより、有理数を最低項にキャンセルできます。

「混合」数、つまり整数プラス 1 より小さい有理数は、操作のために通常の分子分母の有理表現に自明に変換され、整数除算と剰余によって混合形式に戻されます。

于 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 に答える