Autor
|
Tema: verificar numeros romanos (Leído 10,741 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
Saludos tengo el siguiente programa que me pide que le ingrese un numero romano cualquiera, pero tengo que verificar que si sea romano y que no contenga letras que no sean I, V, X, L, M y es ahi donde tengo el problema #include <stdio.h> #include <stdlib.h> #define TAM 7 int main() { char romano[TAM]; printf("Dame el primer numero: "); while(*romano++ != '\0') { if(*romano!='I','V','X','L','C','M') printf("Error!! no es numero romano\n"); } return 0; }
el error esta en el if de antemano gracias
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Ese if no es correcto, no puedes intercalar condiciones con una ,.
Puedes crearte un array con todas las letras del alfabeto romano y recorrerlo.
|
|
|
En línea
|
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
gracias amchacon seria algo como esto???: #include <stdio.h> #include <stdlib.h> #define TAM 7 int main() { char romano[TAM],letras[]={'I','V','X','L','C','M'},*ptr,*p; printf("Dame el primer numero: "); ptr = romano; p = letras; while(*ptr++ != '\0') { if(*ptr++ != *p++) printf("Error!! no es numero romano\n"); } return 0; }
y que significa k&r?
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
while(*ptr++ != '\0') { if(*ptr++ != *p++) printf("Error!! no es numero romano\n"); }
Esto está mal... solo te va a funcionar si el caracter introducido es I ( el primero ). Si metes una X, en cuanto llegue a esta línea la primera vez comparará I con X y al no ser igual te va a lanzar un mensaje de error. Tienes que comprobar TODOS los caracteres de 'letras' y si no coincide con ninguno entonces mostrar el mensaje de error. Otra opción más sencilla podría ser: if ( strchr( letras , *ptr ) == NULL ) printf("Error!! no es numero romano\n");
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
No, seria un bucle anidado. Te lo hago con fors que me gustan más: #include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 7 int main() { int i,j; char romano[TAM],letras[]={"IVXLCM"}; printf("Dame el primer numero: "); for (i = 0; romano[i] != '\n';i++) { for (j = 0;letras[j];j++) { if (romano[i] == letras[j]) break; } if (!letras [j ]) { printf("Error! No es un numero romano: %c \n",romano [i ],i );} } return 0; }
|
|
|
En línea
|
|
|
|
Alien-Z
Desconectado
Mensajes: 177
C++ Programmer
|
Cuando se inicializan las posiciones de un array de carácteres de este modo hay que añadir manualmente el fin de cadena: char romano[TAM],letras[]={'I','V','X','L','C','M'},*ptr,*p; //Este es tu código char romano[TAM],letras[]={'I','V','X','L','C','M', '\0'},*ptr,*p; //Sería así
Si actualizas la variable de control en la condición del bucle (*ptr++) te estás saltando el primer elemento del array: while(*ptr++ != '\0')
Debes de hacerlo antes de terminar el bucle: while(*ptr != '\0') { ... ptr++; }
Con ese condicional lo único que estás haciendo es comprobando si la entrada es igual a lo que hay en el array "letras[]", no si se trata de un número romano: if(*ptr++ != *p++) printf("Error!! no es numero romano\n");
Si yo meto "IVXLM" sería correcto pero si introduzco "VII" me la daría por mala cuando si es un número romano. El ejemplo de amchacon es genial para guiarte en tu código pero me parece que se la ha pasado indicar que solo es para que lo uses como esquema porque no se deben utilizar las instrucciones break/continue para modificar el curso de una iteración en los bucles. if (romano[i] == letras[j]) break;
Un saludo.
|
|
« Última modificación: 19 Agosto 2013, 22:20 pm por Alien-Z »
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
aqui tengo algunas mejoras que le hice al codigo, aunque cuando le ingreso un numero romano cualquiera como: XVI, me imprime error!no es numero romano y no tengo idea de por que, ya van varias veces que lo checo #include <stdio.h> #include <stdlib.h> #define TAM 7 int main() { int i,j,bandera; char romano[TAM],letras[]={'I','V','X','L','C','M','\0'},*ptr,*p; printf("Dame el primer numero: "); ptr = romano; p = letras; for(i=*ptr;*ptr!='\0';*ptr++) { bandera = 0; for(j=*p;((*p!='\0')&&(bandera==0));*p++) { if(*ptr == *p) bandera = 1; } if(bandera!=1) { printf("Error!No es numero romano\n"); } } return 0; }
|
|
« Última modificación: 20 Agosto 2013, 06:31 am por m@o_614 »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
aqui tengo algunas mejoras que le hice al codigo, aunque cuando le ingreso un numero romano cualquiera como: XVI, me imprime error!no es numero romano y no tengo idea de por que, ya van varias veces que lo checo fgets coge también el retorno de carro en la cadena. Por eso puse != '\n en mi código. Quizás lo más correcto sería: *ptr != '\n' && *ptr!='\0'
Porque también puede pasar que no coja la cadena entera al ser muy larga, si no coje la cadena entera tampoco cogerá el retorno de carro. El ejemplo de amchacon es genial para guiarte en tu código pero me parece que se la ha pasado indicar que solo es para que lo uses como esquema porque no se deben utilizar las instrucciones break/continue para modificar el curso de una iteración en los bucles. Eso ya depende del profesor, pero break/continue son sentencias totalmente válidas en la vida real. Generalmente suelen dejar códigos más claros que hacerlas con ellas.
|
|
|
En línea
|
|
|
|
Alien-Z
Desconectado
Mensajes: 177
C++ Programmer
|
Eso ya depende del profesor, pero break/continue son sentencias totalmente válidas en la vida real.
Generalmente suelen dejar códigos más claros que hacerlas con ellas.
Ya veo, no sabía que hubieran otras opiniones respecto a su uso. En mi facultad 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. Teniendo en cuenta que los paradigmas heredan unos de otros: El paradigma orientado a objetos hereda del estructurado que a su vez hereda del secuencial, C++ es OO y Secuencial a la vez, se deben ejecutar las instrucciones sin saltos de línea. Tú código queda claro porque hay un único break, pero si estuvieramos hablando de una aplicación un poco más compleja en la que, al permitirse el uso de break/continue, cada bucle tuviera 3 o 4, haría casi imposible su comprensión. Cualquier opinión o debate es bienvenido. Un saludo.
|
|
« Última modificación: 20 Agosto 2013, 10:38 am por Alien-Z »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Calculadora que suma numeros romanos
Programación C/C++
|
miiku
|
1
|
10,299
|
13 Agosto 2012, 03:50 am
por farresito
|
|
|
Numeros Romanos
« 1 2 3 »
Programación C/C++
|
05K4R1N
|
20
|
13,516
|
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,552
|
18 Mayo 2014, 18:38 pm
por Blaster
|
|
|
[Aporte]Convertidor de números decimales a romanos
Programación C/C++
|
0xFer
|
0
|
3,217
|
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,878
|
19 Diciembre 2017, 17:54 pm
por perico1995
|
|