1. ホーム
  2. c++

[解決済み] C++分数クラス

2022-02-20 11:11:32

質問内容

というクラスを作成する必要があります。 分数 2つのプライベートフィールド 分子, 分母 . そして、Numerator と Denominator をデフォルトで 1 に設定する public コンストラクタです。私は、4つのメンバ関数を私の 分数 クラスがあります。和、差、積、除算です。

そうすると、次に何をすればいいのかわからなくなります。なぜ本は分数の等価性を示すのでしょうか?それをどうすればいいのでしょうか?非常に重要な問題は、私のメンバー関数が取るべきパラメータは何かということでしょう。

また、分母が0であることを禁止する良い方法は何でしょうか?例外を投げるか、強制的に1にしてしまうか?

以下は、何日も悩んだ末の、問題番号5と6(表示されていません)の完全なソースコードです。 第6問は、最大公約数関数を実装して、分数を簡略化して返せというものです。ということで、ここに...

もし、このコードを最適化する方法があるとお考えでしたら、ぜひご回答をお願いします。

#include <iostream>
using namespace std;

class Fraction
{
private:
    int numerator, denominator; 
public:
    Fraction()
    {
        numerator = 1;
        denominator = 1;
    }
    Fraction(int n, int d)
    {
        numerator = n;
        if (d==0) 
        {
            cout << "ERROR: ATTEMPTING TO DIVIDE BY ZERO" << endl;
            exit(0); // will terminate the program if division by 0 is attempted
        }
        else
            denominator = d;
    }
    /*In the following functions I am dividing both numerator and denominator by the gcd function.
    GCD function accepts both numerator and denominator values. If we had 2 fractions, 1/2 and 1/4
    and we passed it into the Sum, the result would be n=6 and d=8. These are the values that GCD
    function will accept, find greatest common divisor and return the integer value of 2. In my case 
    am diving both numerator and denominator on the same line by the greatest common divisor. Although 
    it probably would be more efficient to create a local int variable and store GCD value in it, but
    for such small program it shouldn't make any difference.*/
    Fraction Sum(Fraction otherFraction)
    {
        int n = numerator*otherFraction.denominator+otherFraction.numerator*denominator;
        int d = denominator*otherFraction.denominator;
        return Fraction(n/gcd(n,d),d/gcd(n,d));
    }
    Fraction Difference(Fraction otherFraction)
    {
        int n = numerator*otherFraction.denominator-otherFraction.numerator*denominator;
        int d = denominator*otherFraction.denominator;
        return Fraction(n/gcd(n,d),d/gcd(n,d));
    }
    Fraction Product(Fraction otherFraction)
    {
        int n = numerator*otherFraction.numerator;
        int d = denominator*otherFraction.denominator;
        return Fraction(n/gcd(n,d),d/gcd(n,d));
    }
    Fraction Division(Fraction otherFraction)
    {
        int n = numerator*otherFraction.denominator;
        int d = denominator*otherFraction.numerator;
        return Fraction(n/gcd(n,d),d/gcd(n,d));
    }
    // I got the GCD algorithm from the following source:
    // Source C#: http://www.ww.functionx.com/csharp2/examples/gcd.htm
    int gcd(int n, int d)
    {
        int remainder;
        while (d != 0)
        {
            remainder = n % d;
            n = d;
            d = remainder;
        }
        return n;
    }
    void show() // Display method
    {
        if (denominator == 1) // e.g. fraction 2/1 will display simply as 2
            cout << numerator << endl;
        else
            cout << numerator << "/" << denominator << endl;
    }
};

int main()
{
    Fraction a(1,2);
    Fraction b(1,4);
    Fraction c;

    c = a.Sum(b); // Result: 3/4
    c.show();

    c = a.Difference(b); // Result: 1/4
    c.show();

    c = a.Product(b); // Result: 1/8
    c.show();

    c = a.Division(b); // Result: 2
    c.show();

    return 0;
}

解決方法は?

2つのコンストラクタを持つクラスを作成し、1つは2つの数値を指定した場合、もう1つはデフォルトで 1 .

そして、4つの関数を書きます。課題は、方程式を与えてくれるほど親切です。

もし分母が0になることがあれば、私は例外を投げるでしょう。 例えば、(1/2)/(0/4)を割ると分母が0になるなど、何が原因で0になったのかを示せば、エラー状態になるはずです。

(1/2)と(2/3)があって、ある操作をすると、新しい数字が返され、渡した2つの数字のどちらかを変更することはできません。 その場合、コンストラクタで常にゼロをチェックすることになりますが、どの操作でこのエラーが発生したかを説明する必要があります。