// Moeda.cpp
// Parte 2
// Aula de 9 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(char SimbDecimal ); 


//   ----------------------   Classe cEuro   -------------------------

// Construtores 

cEuro::cEuro()
{
	Valor = 0;
}

cEuro::cEuro(cEscudo &Escudo )
{
	Valor = Escudo.GetValor() / 200.482;

	// Falta realizar o arredondamento

}



// Métodos de Input e Output

void cEuro::Ler()
{
	cout << "EUR : ";
	Valor = LerMoeda(',');

}


void cEuro::Escrever()
{
	char s[10];

	ConverteParaStr( Valor, s, ',' ); 

	cout << s << " EUR ";
}

// Acesso

double cEuro::GetValor()
{
	return Valor;
}


//   ----------------------   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);

}



// Métodos de Input e Output

void cEscudo::Ler()
{
	cout << "ESC : ";
	Valor = LerMoeda('$');

}


void cEscudo::Escrever()
{
	char s[10];

	ConverteParaStr( Valor, s, '$' ); 

	cout << s << " ESC ";
}

// Acesso

double cEscudo::GetValor()
{
	return Valor;
}

// operator+ implementado através de um método da classe
cEscudo cEscudo::operator+( cEscudo op2 )
{
	cEscudo Res;

	Res.Valor = Valor + op2.Valor ;

	return Res;
}

// operator- implementado através de uma função global, friend da classe
cEscudo operator-( cEscudo op1, cEscudo op2 )
{

	cEscudo Res;

	Res.Valor = op1.Valor - op2.Valor ;

	return Res;
}




// 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(char SimbDecimal )
{ 
	char s[10];
	char *pPontoDec;

	cin >> s;

	pPontoDec = strchr( s, SimbDecimal );

	if ( pPontoDec )
		*pPontoDec = '.';

	return atof(s);
}
