Lo ultimo lo he podido solucionar y he reducido algo mas el codigo pero me gustaria hacerlo lo mas cortito posible y que funcione bien:
Código PHP:
#include <iostream.h>
#include <iomanip.h>
#include <limits>
#define LIMITE_SUP 999999.99
#define LIMITE_INF 0
#define N_DIGITOS_ENTERO 6
#define UNIDADES 5
#define DECENAS 4
#define CENTENAS 3
#define MILLARES 2
#define DECENAS_MILLAR 1
#define CENTENAS_MILLAR 0
using namespace std;
void pausar()
{
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cin.get();
}
double SolicitarNumero(void)
{
double num;
//Pido un valor dentro del rango valido
do{
cout << "Introduce un numero (" << LIMITE_INF << " a " << setprecision(2) << fixed << LIMITE_SUP << "): ";
cin >> num;
if(num < LIMITE_INF || num > LIMITE_SUP)
cout << "El numero introducido excede del rango valido. Vuelva a intentarlo." << endl;
}while(num < LIMITE_INF || num > LIMITE_SUP);
return num;
}
string ObtenerStringInt(double num, int digitos[N_DIGITOS_ENTERO])
{
//Cadenas constantes
char cadenas[4][11][15]={{"","mil ","dosmil ","tresmil ","cuatromil ","cincomil ","seismil ","sietemil ","ochomil ","nuevemil "},
{"","cien ","doscientos ","trescientos ","cuatrocientos ","quinientos ","seiscientos ","setecientos ","ochocientos ","novecientos "},
{"","diez ","veinte ","treinta ","cuarenta ","cincuenta ","sesenta ","setenta ","ochenta ","noventa "},
{"cero","uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve"}};
char cadenaDecenas[9][15]={"once","doce","trece","catorce","quince","dieciseis","diecisiete","dieciocho","diecinueve"};
string salida;
for(int i=0; i<N_DIGITOS_ENTERO; i++){
bool compuesta=false;
switch(digitos[i]){
case 0: //Si es un cero no hacemos nada excepto que sea la unidad y el resto de posiciones tambien sea cero
if(i==N_DIGITOS_ENTERO-1){
for(int j=0;j<N_DIGITOS_ENTERO;j++){ //Busco para saber si hay algun digito diferente de 0
if(digitos[j] != 0){
compuesta=true;
break;
}
}
if(!compuesta) //Si no hay ningun digito diferente de 0 coloco 'cero' en la cadena de salida
salida += cadenas[3][0];
}
break;
default: //Si no es cero el digito
for(int j=i+1;j<N_DIGITOS_ENTERO;j++){ //Busco si despues de dicho digito hay algun digito diferente de 0
if(digitos[j] != 0){
compuesta=true;
break;
}
}
if(compuesta){ //Si existe algun digito diferente de 0 detras de en el que estoy ahora...
switch(i){
case UNIDADES: case MILLARES:
salida += cadenas[3][digitos[i]]; //Inserto la cadena correspondiente
if(i==MILLARES){
salida += " ";
salida += cadenas[0][1];
}
break;
case DECENAS: case DECENAS_MILLAR: //Si la decena es 2 uso la cadena "veinti" para crear una cadena compuesta
switch(digitos[i]){
case 1: //Si es 1 uso las cadenas oportunas para las decenas compuestas
if(digitos[i+1] != 0)
salida += cadenaDecenas[digitos[i+1]-1];
else
salida += cadenas[2][digitos[i]];
if(i==DECENAS){
i++;
continue;
}
salida += cadenas[0][1];
i++;
break;
case 2: //Si es 2 uso la cadena oportuna para las veintenas compuestas
if(digitos[i+1] != 0)
salida += "veinti";
else{
salida += cadenas[2][digitos[i]];
if(i==DECENAS_MILLAR){
salida += cadenas[0][1];
i++;
}
}
break;
default:
salida += cadenas[2][digitos[i]]; //Inserto la cadena correspondiente
if(digitos[i+1] != 0)
salida += "y ";
else if(i==DECENAS_MILLAR)
salida += cadenas[0][1];
}
break;
case CENTENAS: case CENTENAS_MILLAR: //Si es 1 y no son las unidades cojo del segundo array de cadenas para crear una cadena compuesta
if(digitos[i]==1)
salida += "ciento ";
else
salida += cadenas[1][digitos[i]]; //Inserto la cadena correspondiente
break;
default: //Para cualquier otro valor
salida += cadenas[i][digitos[i]]; //Inserto la cadena correspondiente
}
}else{ //Si no existe ningun digito diferente de 0 detras del actual
switch(i){
case UNIDADES: case MILLARES:
salida += cadenas[3][digitos[i]]; //Inserto la cadena correspondiente
if(i==MILLARES){
salida += " ";
salida += cadenas[0][1]; //Inserto la cadena que le corresponda
}
break;
case DECENAS: case DECENAS_MILLAR:
salida += cadenas[2][digitos[i]]; //Inserto la cadena correspondiente
if(i==DECENAS_MILLAR)
salida += cadenas[0][1];
break;
case CENTENAS: case CENTENAS_MILLAR:
salida += cadenas[1][digitos[i]]; //Inserto la cadena correspondiente
if(i==CENTENAS_MILLAR)
salida += cadenas[0][1];
break;
}
}
}
}
return salida;
}
void SepararDigitos(int num, int digitos[N_DIGITOS_ENTERO])
{
for(int i=N_DIGITOS_ENTERO-1; i>=0; i--,num /=10)
digitos[i]=num%10;
}
int main(int argc, char* argv[])
{
int parteEntera,parteDecimal;
double num;
string salida;
int digitos[N_DIGITOS_ENTERO];
num=SolicitarNumero();
//Separo la parte entera y la parte decimal truncando la decimal y quedandome solo con dos decimales
parteEntera = num;
parteDecimal = (num-parteEntera)*100;
//Separo los digitos enteros
SepararDigitos(parteEntera,digitos);
//Concateno la cadena a partir de sus digitos
salida=ObtenerStringInt(parteEntera,digitos);
//En caso de añadir una parte a la cadena la cual tiene un espacio detras y luego no añadir nada despues
//nos dejaria con una cadena terminada con un espacio asi que solo añado un espacio cuando esta no acabe
//ya en espacio
if(salida[salida.length()-1]!= ' ')
salida += " ";
//Añado la cadena de la parte decimal
cout << salida << "y " << parteDecimal << "/100"<< endl;
cout << "Pulsa intro para salir...";
pausar();
return 0;
}
//---------------------------------------------------------------------------