Convierte un numero romano en arabigo en el rango de I a MMMCMXCIX (Latino)

c:
/******************************** R2A_ESP.C *********************************/
/* Creado por: Manuel F Mart¡nez.                          manpaz@email.com */
/* Lenguaje:   C/C++                                                        */
/* Fecha:      Guatemala Mayo 19, 2002                                      */
/* ************************************************************************ */
/* Objetivo: Convierte un n£mero romano a ar bigo, la entrada puede ser un  */
/*           n£mero romano no sensitivo en el rango de 1 a 3999.            */
/* Descripci¢n:  El  programa toma  cada letra y  la va almacenando  en un  */
/*               arreglo de letras, luego convierte cada letra y la guarda  */
/*               en la misma posici¢n en un arreglo de n£meros.             */
/*                                                                                                                                                       */
/*                                En este arreglo se compara si es un n£mero compuesto de 2  */
/*               letras o  de una letra;  si es de dos letras  se hace una  */
/*                                resta si el par esta  escrito correctamente, y este valor  */
/*               se suma a la variable entera que almacena el resultado, y  */
/*                                si el n£mero es de una letra solo se suma el valor de esa  */
/*                                letra romana.                                                            */
/****************************************************************************/
/* NOTA: SI UTILIZA VISUAL C++ PRIMERO CREE UN ESPACIO DE TRABAJO,  SEGUNDO */
/*       ELIMINE LA LINEA "clrscr();" ENTONCES COMPILE EL PROGRAMA.         */
/****************************************************************************/

/* Archivos de cabecera */
#include <conio.h>;
#include <ctype.h>;
#include <stdio.h>;
#include <dos.h>;

int main (void) {
        int numR = 0;         /* Valor decimal de n£mero romano          */
        int decR = 0;        /* Valor decimal de cada n£mero romano */
        int cont = 0;                  /* Posici¢n de la cadena                */
        int cont3R = 0;  /* Contador de 3 incurrencias          */
        int numsR[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
                                                                /* Arreglo que almacena el valor de
                                                                        cade letra romana                                     */

        char letraR = ' ';      /* Contiene la letra romana temporal  */
        char roman[15] = "";    /* Contiene la cadena ingresada               */

        /* Borrar la pantalla e imprimir mensaje de ingreso */
        clrscr();
        printf ("Ingrese un n£mero romano en el rango de I a MMMCMXCIX:\n");

        /* Leer desde el teclado hasta que aparezca un <ENTER> */
        while ((letraR != '\n') &#038;&#038; (cont < 15)) {
                letraR = toupper(getchar());

                switch (letraR) {
                        /* V, L y D solo pueden aparecer una vez */
                        case 'V': case 'L': case 'D':
                                /* Si aparecen mas de una vez, entonces termina el programa */
                                if ((cont > 0) &#038;&#038; (roman[cont - 1] == letraR)) {
                                                printf ("\nArgumento no v lido");
                                                delay (1000);
                                                exit (0);
                                }

                                /* Si aparece una vez, se guarda el caracter en la cadena
                                        que almacena los caracteres del n£mero romano         */

                                else { roman[cont++] = letraR; }
                                break;

                        /* I, X, C y M pueden aparecer hasta tres veces */
                        case 'I': case 'X': case 'C': case 'M':
                                /* Si aparece correctamente, se guarda el caracter en la cadena
                                        que almacena los caracteres del n£mero romano               */

                                if (cont3R <= 3) {
                                        roman[cont++] = letraR;
                                }
                                cont3R++;
                                /* Si aparecen mas de tres veces, entonces termina el programa */
                                if ((cont3R > 3) &#038;&#038; (roman[cont - 2] == letraR)) {
                                        printf ("\nArgumento no v lido");
                                        delay (1000);
                                        exit (0);
                                }
                                /* Si el contador de incurrencias llega a 3 pero el caracter
                                        anterior es distinto del actual, entonces se reinicia el
                                        contador de incurrencias                                */

                                if ((cont > 1) &#038;&#038; ((cont3R > 3) || (roman[cont - 2] != letraR))) {
                                        cont3R = 1;
                                }
                                break;

                        /* Invalidar el caracter \n como caracter por defecto */
                        case '\n':      break;

                        /* Si se ingresa un caracter que no pertenece a los n£meros
                                romanos, entonces termina el programa */

                        default:        printf("\nArgumento no v lido");
                                                        delay (1000);
                                                        exit (0);
          }
        }

        /* Reutilizar la variable cont3R como indice de iteraciones para no
                volver a crear una nueva y as¡ optimizar el programa      */


        /* Convertir en decimal cada letra perteneciente al n£mero romano
                que fu‚ ingresado */

        for (cont3R = 0; cont3R <= cont; cont3R++) {
                switch (roman[cont3R]) {
                case 'I':       numsR[cont3R] = 1;        break;
                case 'V':       numsR[cont3R] = 5;        break;
                case 'X':       numsR[cont3R] = 10;      break;
                case 'L':       numsR[cont3R] = 50;      break;
                case 'C':       numsR[cont3R] = 100;    break;
                case 'D':       numsR[cont3R] = 500;    break;
                case 'M':       numsR[cont3R] = 1000break;
                }
        }

        /* Hacer la sumatoria de los n£meros almacenados */
        for (cont3R = 0; cont3R <= cont; cont3R++) {
                /* Sumar el valor decimal */
                if (numsR[cont3R] >= numsR[cont3R + 1]) {
                        decR = numsR[cont3R];
                }
                /* Si el n£mero precedente es menor y es el 10% o el 5% del actual,
                        entonces hace la resta correspondiente para obtener el valor
                        final p.e. IX = 10 - 1 = 9                                                              */

                if ((numsR[cont3R] == (numsR[cont3R + 1] / 10))
                         || (numsR[cont3R] == (numsR[cont3R + 1] / 5))) {
                        decR = numsR[cont3R + 1] - numsR[cont3R];
                        cont3R++;
                }
                /* Si el n£mero precedente es menor y no es el 10% o el 5% del actual,
                        entonces termina el programa                                                  */

                if (decR < numsR[cont3R + 1]) {
                         printf ("\nArgumento no v lido");
                         delay (1000);
                         exit (0);
                }
                numR += decR;
        }

        /* Imprimir en pantalla el resultado */
        printf ("El valor es %d", numR);

        /* Presionar una tecla para terminar*/
        printf ("\n\n\t\t\t...Presione cualquier tecla para terminar.");
        getch();

        /* Retorno exitoso */
        return 0;
}

One Response to “Convierte un numero romano en arabigo en el rango de I a MMMCMXCIX (Latino)”

  1. Convertir Arábigos a Romanos con PHP Says:

    [...] http://ejemplos.mis-algoritmos.com/archives/160 [...]

¿Ya le viste algún error? Dejanos tu correción ;-)

Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress elimina los tags HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios.

Otro punto antes de comentar, Si vas a sugerir un segmento de código en algún lenguaje debes hacerlo así:

De esta manera el código sale coloreado.

Otro punto importante para muchos que sienten que se les ignora: Todos los comentarios los reviso y en su debido momento los apruebo, pero ojo con el último párrafo.

Para poner los símbolos de las librerías sin que desaparezcan, debes escribir los símbolos de mayor > y menor qué < con su entidad HTML correspondiente, así como el símbolo de &

Mis Algoritmos se reserva el derecho de alterar, publicar o no los comentarios así como cambiar estas reglas de uso.

Si estas de acuerdo, adelante puedes comentar :)

P.D. No le hago tareas a nadie, mejor hagan la mía :P