elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  verificar numeros romanos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: verificar numeros romanos  (Leído 10,816 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
verificar numeros romanos
« en: 19 Agosto 2013, 19:52 pm »

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

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAM 7
  4.  
  5. int main()
  6. {
  7.    char romano[TAM];
  8.    printf("Dame el primer numero: ");
  9.    fgets(romano,TAM,stdin);
  10.    while(*romano++ != '\0')
  11.    {
  12.        if(*romano!='I','V','X','L','C','M')
  13.            printf("Error!! no es numero romano\n");
  14.    }
  15.    return 0;
  16. }

el error esta en el if

de antemano gracias


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: verificar numeros romanos
« Respuesta #1 en: 19 Agosto 2013, 20:12 pm »

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

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
fabianjsm

Desconectado Desconectado

Mensajes: 26


Ver Perfil WWW
Re: verificar numeros romanos
« Respuesta #2 en: 19 Agosto 2013, 20:22 pm »

Humilde consejo: K&R
En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: verificar numeros romanos
« Respuesta #3 en: 19 Agosto 2013, 21:19 pm »

gracias amchacon seria algo como esto???:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAM 7
  4.  
  5. int main()
  6. {
  7.    char romano[TAM],letras[]={'I','V','X','L','C','M'},*ptr,*p;
  8.    printf("Dame el primer numero: ");
  9.    fgets(romano,TAM,stdin);
  10.    ptr = romano;
  11.    p = letras;
  12.    while(*ptr++ != '\0')
  13.    {
  14.        if(*ptr++ != *p++)
  15.            printf("Error!! no es numero romano\n");
  16.    }
  17.    return 0;
  18. }

y que significa k&r?
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: verificar numeros romanos
« Respuesta #4 en: 19 Agosto 2013, 21:45 pm »

Código
  1. while(*ptr++ != '\0')
  2.    {
  3.        if(*ptr++ != *p++)
  4.            printf("Error!! no es numero romano\n");
  5.    }

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:

Código
  1. if ( strchr( letras, *ptr ) == NULL ) printf("Error!! no es numero romano\n");
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: verificar numeros romanos
« Respuesta #5 en: 19 Agosto 2013, 21:49 pm »

No, seria un bucle anidado.

Te lo hago con fors que me gustan más:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define TAM 7
  5.  
  6. int main()
  7. {
  8.    int i,j;
  9.    char romano[TAM],letras[]={"IVXLCM"};
  10.    printf("Dame el primer numero: ");
  11.    fgets(romano,TAM,stdin);
  12.  
  13.    for (i = 0; romano[i] != '\n';i++)
  14.    {
  15.        for (j = 0;letras[j];j++)
  16.        {
  17.            if (romano[i] == letras[j]) break;
  18.        }
  19.  
  20.        if (!letras[j]) { printf("Error! No es un numero romano: %c \n",romano[i],i);}
  21.    }
  22.  
  23.    return 0;
  24. }
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: verificar numeros romanos
« Respuesta #6 en: 19 Agosto 2013, 21:58 pm »

Cuando se inicializan las posiciones de un array de carácteres de este modo hay que añadir manualmente el fin de cadena:

Código
  1. char romano[TAM],letras[]={'I','V','X','L','C','M'},*ptr,*p; //Este es tu código
  2. 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:

Código
  1. while(*ptr++ != '\0')

Debes de hacerlo antes de terminar el bucle:

Código
  1. while(*ptr != '\0') {
  2.   ...
  3.   ptr++;
  4. }

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:

Código
  1. if(*ptr++ != *p++)
  2.               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.

Código
  1. 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 Desconectado

Mensajes: 389


Ver Perfil
Re: verificar numeros romanos
« Respuesta #7 en: 20 Agosto 2013, 06:00 am »

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

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAM 7
  4.  
  5. int main()
  6. {
  7.    int i,j,bandera;
  8.    char romano[TAM],letras[]={'I','V','X','L','C','M','\0'},*ptr,*p;
  9.    printf("Dame el primer numero: ");
  10.    fgets(romano,TAM,stdin);
  11.    ptr = romano;
  12.    p = letras;
  13.    for(i=*ptr;*ptr!='\0';*ptr++)
  14.    {
  15.        bandera = 0;
  16.        for(j=*p;((*p!='\0')&&(bandera==0));*p++)
  17.        {
  18.            if(*ptr == *p)
  19.               bandera = 1;
  20.        }
  21.        if(bandera!=1)
  22.        {
  23.            printf("Error!No es numero romano\n");
  24.            exit(1);
  25.        }
  26.    }
  27.    return 0;
  28. }
« Última modificación: 20 Agosto 2013, 06:31 am por m@o_614 » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: verificar numeros romanos
« Respuesta #8 en: 20 Agosto 2013, 08:10 am »

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:

Código
  1. *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

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: verificar numeros romanos
« Respuesta #9 en: 20 Agosto 2013, 10:30 am »

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

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Calculadora que suma numeros romanos
Programación C/C++
miiku 1 10,333 Último mensaje 13 Agosto 2012, 03:50 am
por farresito
Numeros Romanos « 1 2 3 »
Programación C/C++
05K4R1N 20 13,627 Último mensaje 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,645 Último mensaje 18 Mayo 2014, 18:38 pm
por Blaster
[Aporte]Convertidor de números decimales a romanos
Programación C/C++
0xFer 0 3,249 Último mensaje 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,900 Último mensaje 19 Diciembre 2017, 17:54 pm
por perico1995
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines