Convierte un numero romano en arabigo en el rango de I a MMMCMXCIX (Ingles)
/******************************** R2A_ENG.C *********************************/ /* Created by: Manuel F Mart¡nez. manpaz@email.com */ /* Lenguage: C/C++ */ /* Date: Guatemala May 19, 2002 */ /* ************************************************************************ */ /* Object: Convert an roman numeral to arabical, the input can be a number */ /* between 1 to 3999. */ /* Description: The program take each letter and store it in one letter */ /* array, after convert each letter and store it in the same */ /* position of one numbers array. */ /* */ /* In this array be analized if is a number of two letters or */ /* one letter; if is of two letters do a difference if the */ /* pair is correctly write, and this value is amounted to the */ /* integer variable that store the result, and if the number */ /* is of one letter only amount the value of this roman */ /* letter. */ /****************************************************************************/ /* NOTE: IF YOU USE VISUAL C++, FIRST CREATE A WORKSPACE, SECOND CLEAR THE */ /* LINE "clrscr();" THEN COMPILE THE PROGRAM. */ /****************************************************************************/ /* Header files */ #include <conio.h>; #include <ctype.h>; #include <stdio.h>; #include <dos.h>; int main (void) { int numR = 0; /* Decimal value of roman numeral */ int decR = 0; /* Decimal value of each roman numeral */ int cont = 0; /* String position */ int cont3R = 0; /* 3 incurs counter */ int numsR[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* Array that store the value of each roman letter */ char letterR = ' '; /* Contain the temporal roman letter */ char roman[15] = ""; /* Contain the input string */ /* Clear the screen and display the input message */ clrscr(); printf ("Enter a roman numeral between range I to MMMCMXCIX:n"); /* Read from keyboard until appear an <ENTER> */ while ((letterR != 'n') && (cont < 15)) { letterR = toupper(getchar()); switch (letterR) { /* V, L y D only can appear one time */ case 'V': case 'L': case 'D': /* If appear more of one time, then finish the program */ if ((cont > 0) && (roman[cont - 1] == letterR)) { printf ("nData incorrect"); delay (1000); exit (0); } /* If appear one time, be save the char in the string that store the characters of roman numeral */ else { roman[cont++] = letterR; } break; /* I, X, C y M can appear until 3 times */ case 'I': case 'X': case 'C': case 'M': /* If appear correctly, be save the char in the string that that store the characters of roman numeral */ if (cont3R <= 3) { roman[cont++] = letterR; } cont3R++; /* If appear more of 3 times, then finish the program */ if ((cont3R > 3) && (roman[cont - 2] == letterR)) { printf ("nData incorrect"); delay (1000); exit (0); } /* If the 3 incurs counter get to be 3 but the preceding char is different of current, then reset the 3 incurs counter */ if ((cont > 1) && ((cont3R > 3) || (roman[cont - 2] != letterR))) { cont3R = 1; } break; /* Invalidate the n char as default char */ case 'n': break; /* If the input is a char that not concern to roman numerals, then finish the program */ default: printf ("nData incorrect"); delay (1000); exit (0); } } /* Reutilization of cont3R var as index of iterations for no create a new var and then optimize the program */ /* Convert to decimal each letter of roman numeral that was input */ 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; } } /* Do a sum over stored numbers */ for (cont3R = 0; cont3R <= cont; cont3R++) { /* */ /* Add decimal value of each roman numeral */ if (numsR[cont3R] >= numsR[cont3R + 1]) { decR = numsR[cont3R]; } /* If precedent number is less than current value and this is 10% or 5% of current value, then do a difference between two roman numerals to obtain the final value i.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++; } /* If precedent numbre is less than current value and not is 10% or 5% of current value, then finish the program */ if (decR < numsR[cont3R + 1]) { printf ("nData incorrect"); delay (1000); exit (0); } numR += decR; } /* Diplay result in the screen */ printf ("The value is %d", numR); /* Press any key to finish the program */ printf ("nnttt...Press any key to exit."); getch(); /* Return succesfully */ return 0; }
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 :)