Buscador Elinv.

Búsqueda personalizada

miércoles, 6 de abril de 2011

Números romanos hasta 9.999.999 por Elinv.

:arrow: Hola estimados amigos, aquí les dejo un código original, diseñado y creado por nosotros, que en solo 141 lineas de códigos, las cuales incluyen muchísimos comentarios, permiten convertir de nuestra numeración a la numeración romana hasta el número 9.999.999.

:arrow: Si observan otro tópico a este respecto que se encuentra en este foro --> viewtopic.php?f=6&t=233, podrán ver que el algoritmo utilizado en ambas circunstancias es totalmente diferente.

:arrow: En este nuestro código que les acercamos, podrán ver como se aplican estructuras al procedimiento de conversión.

:arrow: Bueno aquí se los dejamos.




 
#include <iostream>
using namespace std;
//Estructura que necesitamos
    struct Convertir // "Convertir" es el nombre de la misma
    {
         char romanos[5];
    };
    struct Convertir num_rom[25];
//Prototipo de procedimientos
void inicializar(struct Convertir num_rom[]);
void imprimir(int entero, int mas);
void cuatromilenmas(int entero, int mas);
 
int main(){
    //Inicializamos la estructura
    inicializar(num_rom);
    //Aquí pasamos el número a convertir.
    int numero = 12100;
    int auxiliar_nro = numero;
    //auxiliar contendrá el número de cifras
    int auxiliar = 0;
    char cadena[25];
    int indice=0;
    //Cantidad de digitos.
    for(int x=0; x <10; x++){
        //Damos vuelta el número
        cadena[indice]=(char) (auxiliar_nro%10) + 48//0x30;  //+ 48 es lo mismo
        auxiliar_nro = auxiliar_nro /10;
        auxiliar++;
        indice++;
        if (auxiliar_nro == 0){
            cadena[indice]='\0';
            break;
        }
    }
    //Mostramos información
    cout << "El numero: " << numero << " convertido a romanos es: " << endl;
    //Estas lineas las usamos para rango de miles
    //Aquí hacer una función.
    //----------------------------
    //Aquí comenzamos el análisis
    int entero;
    //----------------------------
    if (numero>=4000){
        //Vemos si algun número romano igual o supera a 4000
        //------------------------------
        for(int x=auxiliar-1; x>=0; x-- ){
            //Convertimos a entero
            entero = cadena[x]-48;
            //Pasamos el entero y en equis pasamos la posición del dígito
            cuatromilenmas(entero, x);
        }
        //------------------------------
        cout << endl;
    }
    //------------------------------
    for(int x=auxiliar-1; x>=0; x-- ){
        //Convertimos a entero
        entero = cadena[x]-48;
        imprimir(entero, x);
    }
    //------------------------------
    cout << endl;
    return 0;
}
//Función para preparar el subyarado superior desde 4000
//a 1000000
void cuatromilenmas(int entero, int mas){
mas = mas *4;
if (mas >=11 && mas <=24){
    if (entero != 1 && entero != 4 && entero != 5 && entero != 9){
        if (entero<4){
            for(int y=1; y <= entero; y++){
                cout << "_";
            }
        }
        if (entero>5){
            cout << "_";
            for(int y=1; y <= entero-5; y++){
                cout << "_";
            }
        }
    }
    if (entero==1){cout << "_";}
    if (entero==4){cout << "_";}
    if (entero==5){cout << "_";}
    if (entero==9){cout << "_";}
}
}
 
//Función para imprimir los numeros romanos
void imprimir(int entero, int mas){
    mas = mas * 4;
 
    if (entero != 1 && entero != 4 && entero != 5 && entero != 9){
        if (entero<4){
            for(int y=1; y <= entero; y++){
                cout << num_rom[mas].romanos;
            }
        }
        if (entero>5){
            cout << num_rom[mas+2].romanos;
            for(int y=1; y <= entero-5; y++){
                cout << num_rom[mas].romanos;
            }
        }
    }
    if (entero==1){cout << num_rom[mas].romanos;}
    if (entero==4){cout << num_rom[mas+1].romanos;}
    if (entero==5){cout << num_rom[mas+2].romanos;}
    if (entero==9){cout << num_rom[mas+3].romanos;}
}
 
//Función para inicializar matriz
void inicializar(struct Convertir num_rom[]){
    strcpy(num_rom[0].romanos,          "I"     );
    strcpy(num_rom[1].romanos,          "IV"    );
    strcpy(num_rom[2].romanos,          "V"     );
    strcpy(num_rom[3].romanos,          "IX"    );
    strcpy(num_rom[4].romanos,          "X"     );
    strcpy(num_rom[5].romanos,          "XL"    );
    strcpy(num_rom[6].romanos,          "L"     );
    strcpy(num_rom[7].romanos,          "XC"    );
    strcpy(num_rom[8].romanos,          "C"     );
    strcpy(num_rom[9].romanos,          "CD"    );
    strcpy(num_rom[10].romanos,         "D"     );
    strcpy(num_rom[11].romanos,         "CM"    );
    strcpy(num_rom[12].romanos,         "M"     );
    strcpy(num_rom[13].romanos,         "MV"    );
    strcpy(num_rom[14].romanos,         "V"     );
    strcpy(num_rom[15].romanos,         "MX"    );
    strcpy(num_rom[16].romanos,         "X"     );
    strcpy(num_rom[17].romanos,         "XL"    );
    strcpy(num_rom[18].romanos,         "L"     );
    strcpy(num_rom[19].romanos,         "XC"    );
    strcpy(num_rom[20].romanos,         "C"     );
    strcpy(num_rom[21].romanos,         "CD"    );
    strcpy(num_rom[22].romanos,         "D"     );
    strcpy(num_rom[23].romanos,         "CM"    );
    strcpy(num_rom[24].romanos,         "M"     );
}