// Moeda.cpp
// Definição das classes cEuro e cEscudo    ( Versão 2 )
// Aula de 8 de Novembro de 2001


#include "Moeda.h"
#include <stdlib.h>
#include <math.h>
//#include <iostream.h>
#include <string.h>

// Declaração de funções auxiliares à implementação
// Repare na utilização da palavra STATIC
static void ConverteParaStr( double Valor, char *Str, char SimbDecimal );
static double LerMoeda( istream &in, char SimbDecimal ); 








//   ----------------------   Classe cEuro   -------------------------

// Construtores 

cEuro::cEuro()
{
	Valor = 0;
}

cEuro::cEuro(cEscudo &Escudo )
{
	Valor = Escudo.GetValor() / 200.482;

	// Falta realizar o arredondamento

}


cEuro::cEuro( double db )
{
	Valor = db;
}

// Operadores


cEuro cEuro::operator-( cEuro Eur )
{
	cEuro Resultado;

	Resultado.Valor = Valor - Eur.Valor ;

	return Resultado;

}

// Acesso

double cEuro::GetValor()
{
	return Valor;
}



// Input e Output
// Overloadind dos operadores de input e de output
// Funções friend


//void cEuro::Ler()
istream& operator>>( istream &in, cEuro &Eur )
{
	//cout << "EUR : ";
	Eur.Valor = LerMoeda( in, ',');
	return in;

}


//void cEuro::Escrever()
ostream& operator<<( ostream &out, cEuro Eur )
{
	char s[10];

	ConverteParaStr( Eur.Valor, s, ',' ); 

	out << s << " EUR ";

	return out;
}



//   ----------------------   Classe cEscudo   -------------------------

// Construtores 

cEscudo::cEscudo()
{
	Valor = 0;
}

cEscudo::cEscudo(cEuro &Euro )
{
	// Multiplica pela Taxa de Conversão
	Valor = Euro.GetValor() * 200.482;   

	// Arredondamento 
	if (  (floor(Valor) + 0.5) < Valor ) 
		Valor = ceil(Valor);
	else
		Valor = floor(Valor);

}

cEscudo::cEscudo( double db )
{
	Valor = db;
}


// Acesso

double cEscudo::GetValor()
{
	return Valor;
}

// Operadores

/*
cEscudo cEscudo::operator-( cEscudo Esc )
{
	cEscudo Resultado;

	Resultado.Valor = Valor - Esc.Valor ;

	return Resultado;

}
*/

cEscudo operator-( cEscudo op1, cEscudo op2 )
{
	cEscudo Resultado;

	Resultado.Valor = op1.Valor - op2.Valor ;

	return Resultado;

}



//cEscudo::operator double()
//{
//	return Valor;
//}




// Input e Output
// Overloadind dos operadores de input e de output
// Funções friend

//void cEscudo::Ler()
istream& operator>>( istream &in, cEscudo &Esc )
{
	//cout << "ESC : ";
	Esc.Valor = LerMoeda( in, '$');
	return in;

}


//void cEscudo::Escrever()
ostream& operator<<( ostream &out, cEscudo Esc )
{
	char s[10];

	ConverteParaStr( Esc.Valor, s, '$' ); 

	out << s << " ESC ";

	return out;
}











// Funções Auxiliares 

void ConverteParaStr( double Valor, char *s, char SimbDecimal )
{
	int idxPontoDecimal, Sinal, i;
	char *pStr, *p;
	

	pStr = fcvt( Valor,2, &idxPontoDecimal, &Sinal );
	
	if ( Sinal != 0 )
	{
		*s = '-';
		s++;
	}
	
	
	for ( p=pStr , i=0; i < idxPontoDecimal ; i++, p++, s++ )
		*s = *p;

	*s = SimbDecimal;
	s++;
	*s = *p;
	p++; s++;
	*s = *p;
	s++;
	*s = '\0';

}


double LerMoeda( istream &in, char SimbDecimal )
{ 
	char s[10];
	char *pPontoDec;

	in >> s;

	pPontoDec = strchr( s, SimbDecimal );

	if ( pPontoDec )
		*pPontoDec = '.';

	return atof(s);
}
