// cFraccao.cpp
// Definição da classe cFraccao
// Solução do Exercício da aula do dia 16 de Novembro de 2001 


#include "cFraccao.h"
#include <iostream.h>
#include <string.h>
#include <stdlib.h>


static int MaxDivisorComum( int n1, int n2 );
static int MinMultiploComum( int n1, int n2 );


cFraccao::cFraccao()
{
	Num = 1;
	Den = 1;
}



bool cFraccao::Simplificar() 
{

	int mdc;

	mdc = MaxDivisorComum( Num, Den );

	if ( mdc != 1 ) 
	{
		Num = Num / mdc;
		Den = Den / mdc;
		return true;
	}
	else
		return false;

}


cFraccao cFraccao::operator-( cFraccao f2 )
{
	cFraccao res;

	int mmc = MinMultiploComum( Den, f2.Den );
	
	res.Den = mmc;

	res.Num = ( mmc/Den ) * Num - ( mmc /f2.Den ) * f2.Num ;

	return res;
}


cFraccao cFraccao::operator+( cFraccao f2 )
{
	cFraccao res;

	int mmc = MinMultiploComum( Den, f2.Den );
	
	res.Den = mmc;

	res.Num = ( mmc/Den ) * Num + ( mmc /f2.Den ) * f2.Num ;

	return res;
}
	

istream& operator>>( istream& in, cFraccao &f )
{
	char s[15];
	char *p;

	in >> s;

	p = strchr(s,'/');
	*p = '\0';

	f.Num = atoi(s);
	f.Den = atoi(p+1);

	return in;
}


ostream& operator<<( ostream& out, cFraccao f )
{
	out << f.Num << "/" << f.Den ;
	return out;
}


// Funções auxiliares

// Implementa o Algoritmo de Euclides para calcular o Máximo  Divisor Comum
int MaxDivisorComum( int n1, int n2 )
{
	int Dividendo, Divisor, Resto;

	if ( n1 > n2 )
	{
		Dividendo = n1;
		  Divisor = n2;
	}
	else
	{
		Dividendo = n2;
		  Divisor = n1;
	}

	do 
	{
		Resto = Dividendo % Divisor;
		if ( Resto != 0 ) 
		{
			Dividendo = Divisor;
			  Divisor = Resto;
		}

	} while ( Resto != 0 ); 

	return Divisor;

}


int MinMultiploComum( int n1, int n2 )
{
	return ( n1*n2 ) / MaxDivisorComum( n1, n2 );
}


