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

/******************************** 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') && (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) && (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) && (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) && ((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] = 1000;	break;
		}
	}
 
	/* 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 ("nnttt...Presione cualquier tecla para terminar.");
	getch();
 
	/* Retorno exitoso */
	return 0;
}

¿Has encontrado algún error? ¿Tienes la solución? Dejame tu correción ;-)

Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress las eliminó al verlas como etiquetas HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios. Y lo mas importante: Todos los ejemplos fueron realizados por personas con únicamente conocimiento básico del lenguaje, no de programación.

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

  • Si es lenguaje C [c]Código en C[/c]
  • Si es lenguaje Pascal [pascal]Aquí dentro el código de Pascal[/pascal].

De esta manera el código coloreas el código.

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 con lo siguiente:

Me reservo el derecho de alterar, publicar o no los comentarios as´ como cambiar mis condiciones en el momento que así lo requiera.

¿estas de acuerdo? entonces adelante que ya te he quitado bastante tiempo leyendo esta basura de advertencias :)

Comentarios

2007-12-04 14:07:19
Convertir Arábigos a Romanos con PHP
[...] http://ejemplos.mis-algoritmos.com/archives/160 [...]