2016-03-27 6 views
1

インタビューでは、2つのクラスを作成するように求められました。最初の抽象クラスはNumberと呼ばれ、1つの操作 "+"をサポートします。 "抽象クラス"を実装するもう1つの部分。演算子のオーバーロードを使用して分数を追加

さらに:一度追加した分数は、元の形式で表示する必要があります。つまり、2/4は「1/2」や「0.5」ではなく「2/4」と表示されなければなりません。

いいえ他の詳細は私に提供されました。

以下は私が試したものです(不完全)。

私のmain.cppに

#include <iostream> 
#include "Fraction.h" 
using namespace std; 
int main() 
{ 
    Fraction sumFraction; 
    Fraction n11(1,2); 
    Fraction n21(1,2); 
    cout << n11.getValuenum() << "/"; 
    cout << n11.getValueden() << endl; 
    cout << n21.getValuenum() << "/"; 
    cout << n21.getValueden() << endl; 
    sumFraction = n11 + n21; 
    cout << sumFraction.getValuenum() << endl; 
    cout << sumFraction.getValueden() << endl; 
    return 0; 
} 

マイNumbers.h //抽象クラス

#pragma once 
    template<class T> 
    class Number 
    { 
     virtual T& operator= (const T &) = 0; // first parameter is implicitly passed 
     virtual const T operator+ (const T &) = 0; 
     virtual void display() = 0; 
    }; 

マイFraction.cpp

#include "Fraction.h" 

int Fraction::getValuenum() 
{ 
    return this->a1; 
} 

int Fraction::getValueden() 
{ 
    return this->a2; 
} 

Fraction::Fraction() 
{ 
    a1 = 0; 
    a2 = 0; 
} 
Fraction::Fraction(int num, int den) 
{ 
    a1 = num; 
    a2 = den; 
} 

void Fraction::display() 
{ 
    // will display the number in its original form 
} 

Fraction& Fraction::operator=(const Fraction &num) 
{ 
    a1 = num.a1; 
    a2 = num.a2; 
    return *this; 
} 

const Fraction Fraction::operator+(const Fraction &numberTwo) 
{ 
    Fraction n1; 
    n1.a1 = this->a1*numberTwo.a2 + this->a2*numberTwo.a1; 
n1.a2 = this->a2*numberTwo.a2; 
    return n1; 
} 

マイFraction.h

#pragma once 
#include "Number.h" 
class Fraction : public Number<Fraction> 
{ 
private: 
    int a1; 
    int a2; 
public: 
    void display(); 
    Fraction(); 
    Fraction(int num, int den); 
    int getValuenum(); 
    int getValueden(); 
    Fraction& operator= (const Fraction &); // first parameter is implicitly passed 
    const Fraction operator+ (const Fraction &); // first parameter is implicitly passed 

}; 
以下

は私の質問です:

  1. は、私は本当に各分画のための私の主な機能とは別に分子と分母を渡す必要があります。現在、分数の点で結果を加算して返す際に役立つかもしれない分子と分母を追跡するために、別にそれを渡しています。

  2. 私の演算子+ロジックでは、1/4 + 1/4を追加すると8/16が得られます。通常追加すると2/4になると思います。だから、分子と分母を使って追加する方法とそのような方法で分数を保持するので、出力が2/4、2/4であり、1/2または0.5でない場合

私を助けてください。

+0

[Khan Academy](https://www.khanacademy.org/math/pre-algebra/fractions-pre-alg/fractions-unlike-denom-pre-alg/v/adding-fractions -with-like-denominators)は、追加ロジックを助けることができます。 – Kupiakos

+0

抽象テンプレートクラス 'Number'は全く役に立たないと私は考えています。デザインを考え直す。 –

+0

分母に加えられる分数が同じ分母であれば分母に何もしないで、分子を追加するだけでいいと思います。そうすれば_1/4 + 1/4_は_2/4_になります。 – Logicrat

答えて

2

いくつかの発言:

  • あなたは分母が0であることを許してはならない、それはinexistent数(無限大またはundeterminated)
  • を与えるので、あなたは間違いなく同じ理由で0に分母を初期化しない必要があります
  • フラクションの正しい(数学的)付加である(1、より妥当な値と思われる)(*):

    a/b + c/d = (ad +bc)/bd 
    

表示方法の代わりに(または表示方法に加えて)ostream& operator << (ostream&, const Fraction&)オーバーロードを書くことをお勧めします。それはあなたがちょうどあなたの主、私は本当にあなたを理解していない

std::cout << n11 << " + " << n21 << " = " << sumFraction << std::endl; 

最初の質問で書くことができるようになるが、私はint型からの変換を追加します。

Fraction(int n): a1(n), a2(1) {}; 

が直接Fraction(1, 2) + 1を書き込むことができるようにしますか、 Fraction(1) + Fraction(1/2)(加算の最初の要素は分数でなければなりません)

(*)これは単純で一般的な方法です。また、クリーンな結果を得るために、最小公倍数を使用することができます。

den = lcm(b,d) 
a/b + c/d = (a * den/b) + c * den/d)/den 

あなたの代わりに12/16

しかしcomputing the LCMの1/4 + 2/4 = 3/4になるだろうその方法は、はるかに超えていますこの回答...

+0

計算LCMはトリックをしました。ありがとうございました。 – Unbreakable

関連する問題