operator-
引き算をできるようにする。
Friction.hにある分数のテンプレートクラスに減算演算子を追加
// Friction.cpp #ifndef __FRICTION_H__ #define __FRICTION_H__ #include <iostream> #include "Function.h" // 分数 template <class T> class TFriction { private: T m_numerator; // 分子 T m_denominator; // 分母 bool m_sign; // 符号(true:+,false:-) public: TFriction( T nu=0, T de=1 ) : m_numerator( nu ), m_denominator( de ), m_sign( 1 ) { } ~TFriction() { } T GetNumerator() { return m_numerator; } T GetDenominator() { return m_denominator; } void SetNumerator( T n ) { m_numerator = n; } void SetDenominator( T d ) { m_denominator = d; } bool GetSign() { return m_sign; } void Disp(); void Sign(); void Exec(); TFriction<T> reduction(); // 演算子 TFriction<T>& operator=( TFriction<T> t ) { m_numerator = t.GetNumerator(); m_denominator = t.GetDenominator(); m_sign = t.GetSign(); return *this; } TFriction<T> operator+( TFriction<T> t ) { this->Exec(); t.Exec(); TFriction<T> temp( t.GetDenominator()*this->m_numerator + this->m_denominator*t.GetNumerator(), // 分子 this->m_denominator * t.GetDenominator() // 分母 ); temp = temp.reduction(); return temp; } TFriction<T> operator-( TFriction<T> t ) { this->Exec(); t.Exec(); TFriction<T> temp( t.GetDenominator()*this->m_numerator - this->m_denominator*t.GetNumerator(), // 分子 this->m_denominator * t.GetDenominator() // 分母 ); temp = temp.reduction(); return temp; } }; // 約分 template<class T> TFriction<T> TFriction<T>::reduction() { Exec(); // 負の符号の時は、分子から負を取り因数分解する if( false == m_sign ) m_numerator *= -1; std::vector<T> n_factor = Factorization<T>( m_numerator ); std::vector<T> d_factor = Factorization<T>( m_denominator ); for( int i = 0; i < (int)n_factor.size(); ++i ) { for( int j = 0; j < (int)d_factor.size(); ++j ) { std::cout << n_factor.at(i) << ":" << d_factor.at(j) << std::endl; if( n_factor.at(i) == d_factor.at(j) ) n_factor.at(i) = d_factor.at(j) = 1; } } T num = 1; T den = 1; for( int i = 0; i < (int)n_factor.size(); ++i ) num *= n_factor.at(i); for( int j = 0; j < (int)d_factor.size(); ++j ) den *= d_factor.at(j); if( false == m_sign ) num *= -1; return TFriction<T>( num, den ); } template<class T> void TFriction<T>::Sign() { int i = ( m_numerator < 0 ) ? 0 : 1; int j = ( m_denominator < 0 ) ? 0 : 1; m_sign = ( i ^ j ) ? 0 : 1; } template<class T> void TFriction<T>::Exec() { Sign(); // 符号を分子に if( m_denominator < 0 ) { m_numerator *= -1; m_denominator *= -1; } } template<class T> void TFriction<T>::Disp() { Exec(); std::cout << m_numerator << "/" << m_denominator << std::endl; } #endif // __FRICTION_H__