bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

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__