Convierte un numero arabigo en romano en el rango de 1 a 3000 (Latino)

c:
/********************************** A2R.C ***********************************/
/* Creado por: Manuel F Mart¡nez.                          manpaz@email.com */
/* Lenguaje:   C/C++                                                        */
/* Fecha:      Guatemala Abril 15, 2001                                     */
/* ************************************************************************ */
/* Objetivo: Convierte un n£mero ar bigo a romano, la entrada puede ser un  */
/*           n£mero entero en el rango de 1 a 3000.                         */
/* Descripci¢n:  El programa  toma el valor de  entrada y el  valor de esa  */
/*               posici¢n.                                                  */
/*                   p.e.:  int numeroArabigo = 3 7 5 9                     */
/* El n£mero 3 est   en la primera  posici¢n,  el n£mero 7  en la  segunda, */
/*            El n£mero 5 ...   ;  para obtener el 3 hacemos:               */
/*                      result = numeroArabigo / 1000                       */
/*            Entonces "result" almacena el valor en "miles".               */
/* Despu‚s, la funci¢n a2roman (int, int, char, char),  recive un par metro */
/* entero y tres caracteres, los par metros "char" indican los tres valores */
/* romanos  posibles para este n£mero y,  el entero indica el valor de esta */
/* posici¢n, la funci¢n a2roman analiza el n£mero y retorna un "string" con */
/* el equivalente en n£mero romano.  Despu‚s,  hace la misma operaci¢n para */
/* "centenas",  solo que el resultado es igual a "numeroArabigo/100" y etc. */
/****************************************************************************/
/* NOTA: SI UTILIZA VISUAL C++ PRIMERO CREE UN ESPACIO DE TRABAJO,  SEGUNDO */
/*       ELIMINE LA LINEA "clrscr();" ENTONCES COMPILE EL PROGRAMA.         */
/****************************************************************************/

/* Archivos de cabecera */
#include <stdio.h>
#include <conio.h>
#include <string.h>

/* Los caracteres "c1" y "c2" son inicializados en orden que no afecten a
        los "miles". */

char *a2roman (int valor, char *c1, char *c2, char *c3);

int main (void)
{
        int numeroArabigo = 1;   /* Inicializaci¢n para leer al menos una vez  */
        int result;              /* "result" almacena el valor de la posici¢n  */
        char roman[15] = "";     /* "roman" contiene la cadena "ar bigo-romano */

        /* Este ciclo perminte continuar si "numeroArabigo" ar bigo se encuentra
                en el rango */

        do
        {
                /* Limpiar la pantalla */
                clrscr();

                /* Imprimir un mensaje al usuario */
                printf ("Ingrese un entero en el rango de 1 a 3000: \n\t");

                /* Leer el valor */
                scanf ("%d", &#038;numeroArabigo);
        }
        while ((numeroArabigo < 1) || (numeroArabigo > 3000));

        /* Obtener el valor de los "miles" */
        if ((numeroArabigo <= 3000) &#038;&#038; (numeroArabigo >= 1000))
        {
                result = numeroArabigo / 1000;
                strcat (roman, a2roman(result, "M", " ", " "));
                numeroArabigo -= (result * 1000);
        }

        /* Obtener el valor de las "centenas" */
        if ((numeroArabigo < 1000) &#038;&#038; (numeroArabigo >= 100))
        {
                result = numeroArabigo / 100;
                strcat (roman, a2roman(result, "C", "D", "M"));
                numeroArabigo -= (result * 100);
        }

        /* Obtener el valor de las "centenas" */
        if ((numeroArabigo < 100) &#038;&#038; (numeroArabigo >= 10))
        {
                result = numeroArabigo / 10;
                strcat (roman, a2roman(result, "X", "L", "C"));
                numeroArabigo -= (result * 10);
        }

        /* Obtener el valor de las "unidades" */
        if ((numeroArabigo < 10) &#038;&#038; (numeroArabigo >= 1))
        {
                strcat (roman, a2roman(numeroArabigo, "I", "V", "X"));
        }

        /* Despliegar el n£mero romano */
        printf ("El n£mero romano es: \n\t%s\n\n", roman);
        printf ("\t\t...Presione cualquier tecla para terminar.");
        getch();

        /* Retorno exitoso */
        return 0;
}

char *a2roman (int valor, char *c1, char *c2, char *c3)
{
        int i;  /* "i" es el ¡ndice de iteraciones */
        char rRoman[15] = "";

        /* Si "valor" = 1, 2, 3 */
        if ((valor >= 1) &#038;&#038; (valor <= 3))
        {
                for (i = 0; i < valor; i++)
                        strcat (rRoman, c1);
        }

        /* Si "valor" = 5, 6, 7, 8 */
        if ((valor >= 5) &#038;&#038; (valor <= 8))
        {
                strcat (rRoman, c2);

                for (i = 0; i < (valor - 5); i++)
                        strcat (rRoman, c1);
        }

        /* Si "valor" = 4 */
        if (valor == 4)
        {
                strcat (rRoman, c1);
                strcat (rRoman, c2);
        }

        /* Si "valor" = 9 */
        if (valor == 9)
        {
                strcat (rRoman, c1);
                strcat (rRoman, c3);
        }

        return (rRoman);
}
 

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

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

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

¿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