Autor
|
Tema: verificar numeros romanos (Leído 10,752 veces)
|
amchacon
Desconectado
Mensajes: 1.211
|
break/continue representan saltos, pero son saltos estructurados y relativamente claros. Su mala fama se debe a que pongas un break donde no debes y se salte el bucle creando errores extraños. Eso hace que su abuso sea un gran problema, como programador debes decidir si queda claro o confuso su uso en el contexto actual. Como regla general, suelo poner un solo break/continue por bucle y intento que sea al principio, porque se ven más explícitos. En el código que he propuesto, el uso de break me permite ahorrarme el uso de una variable bandera y se ve bastante claro. Por lo que lo considero adecuado. Los continue me parecen bastante importantes, imaginate que estas usando un for anidado: for (short i = 0; i < 100;i++) for (short j = 0; j < 100;j++) { // Codigo... }
Y quieres evitar que se haga una iteracion en la cual i = j. Podrías poner algo tal que asi: for (short i = 0; i < 100;i++) for (short j = 0; j < 100;j++) { if (i != j) { // Codigo... } }
Pero eso implica más llaves y más bloques de codigo. El uso de continue te permite saltarse la iteracion de una forma bastante explícita y clara: for (short i = 0; i < 100;i++) for (short j = 0; j < 100;j++) { if (i == j) continue; // Codigo... }
los profesores nos prohibían estas instrucciones debido a que utilizar un break/continue es equivalante a la instrucción goto: estás "saltando" desde un punto del bucle a otro modificando el curso de ejecución del programa. Ojo con ese argumento, las llamadas a función también son saltos de ejecución del programa.
|
|
|
En línea
|
|
|
|
Alien-Z
Desconectado
Mensajes: 177
C++ Programmer
|
Ojo con ese argumento, las llamadas a función también son saltos de ejecución del programa. Si, pero no son saltos desde el punto de vista del programador sino del programa, cuando hablamos de la prohibición de break/continue/goto no nos referimos a que sea ineficiente realizar estos saltos sino que no son claros a la hora de trabajar el código. Si en mi programa escribo la función "dividir(..)" tanto yo como cualquier otro informático comprenderá qué estamos diviendo X entre Y independientemente de las veces que llame a esta función; sin embargo si en un bucle pongo 3 o 4 break/continue, por lo general otra persona que intente leerlo le va a costar bastante comprenderlo. Por tanto considero que el argumento citado por los catedráticos es válido. ¿Deberíamos dejarlo en un punto intermedio y usar estas instrucciones con cabeza?, en teoría no habría problema pero igual que con el famoso goto veríamos mucho abuso, por eso gran parte de los informáticos no recomiendan incluirlas en el programa; pero por supuesto la instrucción está ahi y cada uno puede darle el uso que crea conveniente. Un saludo.
|
|
« Última modificación: 20 Agosto 2013, 13:00 pm por Alien-Z »
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
amchacon ya le puse lo que me dijiste en la condicion *ptr!= '\n' && *ptr!='\0' y no me funciona aun, sigo teniendo el mismo problema de que aunque le ponga un numero romano me imprime que no es #include <stdio.h> #include <stdlib.h> #define TAM 10 int main() { int i,j,bandera; char romano[TAM],letras[]={'I','V','X','L','C','D','M','\0'},*ptr,*p; printf("Dame el primer numero: "); ptr = romano; p = letras; for(i=*ptr;((*ptr!='\0')&&(*ptr!= '\n'));*ptr++) { bandera = 0; for(j=*p;(((*p!='\0')&&(*ptr!='\n'))&&(bandera==0));*p++) { if(*ptr == *p) bandera = 1; } if(!bandera) { printf("Error!No es numero romano\n"); } } return 0; }
|
|
|
En línea
|
|
|
|
Alien-Z
Desconectado
Mensajes: 177
C++ Programmer
|
Tiene un par de errores, te lo pongo corregido: #include <stdio.h> #include <stdlib.h> #define TAM 10 int main () { char alfRomano[] = {'I','V','X','L','C','D','M','\0'}, entrada[TAM], *pAlfRomano, *pEntrada; bool encontrado; printf("Introduce un numero: "); fgets(entrada, TAM, stdin); for(pEntrada = entrada; *pEntrada != '\n'; pEntrada++) { //Bucle exterior: recorre la entrada letra por letra encontrado = false; for(pAlfRomano = alfRomano; ((*pAlfRomano != '\0') && !encontrado); pAlfRomano++) { //Bucle interior: comprueba si el siguiente carácter es romano if(*pEntrada == *pAlfRomano) encontrado = true; } if(!encontrado) { printf("No es un numero romano.\n"); exit(1); } } printf("Es un numero romano.\n"); return 0; }
Casos especiales: -Si introduces la cadena vacía te la da por correcta y eso no es un número romano. -Si introduces un número romano correcto y al final un espacio te la da por incorrecta cuando si es válida. Esto es muy sencillo de manejar pero ya corre por tu cuenta. Además puedes mejorar el código y añadirle reglas de la sintáxis romana como por ejemplo que no se puedan escribir más de tres carácteres iguales consecutivos: VIIII -> mal Saludos.
|
|
« Última modificación: 21 Agosto 2013, 11:21 am por Alien-Z »
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
Saludos Alien-Z ya por fin pude encontrar el error, estaba en el puntero del segundo for, cada vez que entraba de nuevo al 2do ciclo el puntero no se reiniciaba a la primera posicion, pero ya lo pude corregir int main() { int i,j,bandera; char romano[TAM],letras[]={'I','V','X','L','C','D','M','\0'},*ptr,*p; printf("Dame el primer numero: "); ptr = romano; p = letras; for(i=*ptr;*ptr!='\0';*ptr++) { bandera = 0; for(j=0;((j<7)&&(bandera==0));j++) { if(*ptr == *(p+j)) bandera = 1; } if(!bandera) { printf("Error!No es numero romano\n"); } } return 0; }
muchas gracias
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
por fin pude encontrar el error, estaba en el puntero del segundo for, cada vez que entraba de nuevo al 2do ciclo el puntero no se reiniciaba a la primera posicion, pero ya lo pude corregir Algunos comentarios sobre ese programa: * Faltan los encabezados. * Si vas a imprimir una cadena en la salida estándar y esta no termina con el carácter '\n' debes vaciar su bufer de forma explicita mediante la llamada "fflush(stdout);". * No utilices gets, la razón de ello se explica en el tema |Lo que no hay que hacer en C/C++. Nivel basico|. * Para terminar la función principal no es necesario llamar a la función exit, puedes utilizar la sentencia "return N;" con el mismo efecto. Por ultimo como ya comento eferion se puede utilizar la función strchr (prototipo en <string.h>) para acortar el programa a un solo bucle. Mas o menos así: #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM_CHARS 7 int main(void) { char num[NUM_CHARS]; int i; printf("Dame el primer numero: "); if (fgets(num , NUM_CHARS , stdin ) == NULL ) return EXIT_FAILURE; for (i = 0; strchr("IVXLCDM", num [i ]) != NULL ; i ++) ; if (i > 0 && (num[i] == '\n' || num[i] == '\0')) else puts("Entrada no valida"); return EXIT_SUCCESS; }
Con la limitante de indicar una entrada no valida si la linea empieza con espacio blanco. Otra opción consiste en sustituir el bucle basado en strchr por una llamada a strspn. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Calculadora que suma numeros romanos
Programación C/C++
|
miiku
|
1
|
10,304
|
13 Agosto 2012, 03:50 am
por farresito
|
|
|
Numeros Romanos
« 1 2 3 »
Programación C/C++
|
05K4R1N
|
20
|
13,524
|
11 Junio 2013, 02:33 am
por edr89
|
|
|
Pasar numeros enteros arábigos a romanos, por donde empezar.
« 1 2 3 »
Programación C/C++
|
Caster
|
21
|
12,558
|
18 Mayo 2014, 18:38 pm
por Blaster
|
|
|
[Aporte]Convertidor de números decimales a romanos
Programación C/C++
|
0xFer
|
0
|
3,221
|
24 Mayo 2015, 19:00 pm
por 0xFer
|
|
|
Conversor de números arábigos a números romanos
Programación C/C++
|
perico1995
|
0
|
1,881
|
19 Diciembre 2017, 17:54 pm
por perico1995
|
|