Ver Mensaje Individual
  #2  
Antiguo 30-04-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 11
aguml Va por buen camino
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 numint 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=0i<N_DIGITOS_ENTEROi++){
        
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 numint digitos[N_DIGITOS_ENTERO])
{
    for(
int i=N_DIGITOS_ENTERO-1i>=0i--,num /=10)
        
digitos[i]=num%10;
}

int main(int argccharargv[])
{
    
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;
}
//--------------------------------------------------------------------------- 
Responder Con Cita