Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Caster en 18 Junio 2013, 22:01 pm



Título: Problema con casting
Publicado por: Caster en 18 Junio 2013, 22:01 pm
Llevo un rato ya rompiéndome la cabeza con este programa y se que es una tontería, pero no veo el problema, es un simple programa para ver si un número es par o no y es el siguiente:
Código
  1. #include <stdio.h>
  2. int main() {
  3.     float num;
  4.     printf("Introduzca el numero:\n");
  5.     scanf("%lf", &num);
  6.     if ((num / 2) == ((int)(num/2)))
  7.        printf("Es par\n");
  8.     else if ((num / 2) != ((int)(num/2)))
  9.        printf ("Es impar\n");
  10.     getchar();
  11.  
  12.     return 0;
  13. }
  14.  

El primero fallo que tuve fue con el casting de int porque no le ponía paréntesis y me daba fallo al compilar pero ya lo solucioné, el problema que tengo es que me da que todos los números son pares, se que hay otras formas de hacerlos como con el operador % y alguna mas, pero lo que quiero es la solución a mi problema, porque no la encuentro.

Saludos.

EDITO: Cambie el tipo de variable float por double y funciona, pero no entiendo el por qué.

EDITO2: Si dejo el float y cambio el "%lf" en el scanf por "%f" funciona igual.


Título: Re: Problema con casting
Publicado por: amchacon en 18 Junio 2013, 22:37 pm
Como tú dices, con %2 se sabría al instante:

Código
  1. if (numero%2 == 0)
  2. printf("El numero es par");
  3. else
  4. printf("El numero es impar");

Pero quieres saber que es lo que pasa con tu código. Lo primero:
Código
  1.     if ((num / 2) == ((int)(num/2)))
  2.        printf("Es par\n");
  3.     else if ((num / 2) != ((int)(num/2)))
  4.        printf ("Es impar\n");

El segundo if sobra, si hemos llegado al else es porque esa condición ya es cierta:

Código
  1. if ((num / 2) == ((int)(num/2)))
  2.        printf("Es par\n");
  3. else
  4.        printf ("Es impar\n");

El segundo error esque la condición que has puesto no tiene sentido. "si numero dividido entre /2 es igual al mismo número dividido entre 2...". Esto siempre va a ser cierto porque es una ovbiedad:

Código:
1/2 = 1/2 CIERTO
2/2 = 2/2 CIERTO
3/2 = 3/2 CIERTO
4/2 = 4/2 CIERTO
5/2 = 5/2 CIERTO



Título: Re: Problema con casting
Publicado por: Caster en 18 Junio 2013, 22:43 pm
O soy yo muy tonto, o muy poca gente entiende el programa, no estoy comparando el mismo numero, porque en el segundo hace un casting, por ejemplo, 12 entre 2 es 6, y el int de 6 (por decirlo de alguna manera) es 6, pero sin embargo 13 entre 2 es 6.5 y el int de 6.5 es 6, por lo tanto no son iguales y es impar. Y respecto del programa, ya entendí el fallo, el especificador del scanf no coincidía con la variable, todo solucionado.

Saludos


Título: Re: Problema con casting
Publicado por: amchacon en 18 Junio 2013, 22:48 pm
Ah ostia  :silbar:


Título: Re: Problema con casting
Publicado por: leosansan en 19 Junio 2013, 00:09 am
Creo que el fallo inicial está en declarar num como float o double, ya que en ese caso el no ser par no implica que sea impar. Por ejemplo, 6.7 daría impar y sin embargo no es ni lo uno ni lo otro. Es más, el concepto de par e impar está reservado para números enteros, con lo que no cabe declarar num como float ni double.

Es decir que habría que tratar la variable num como int, y así ver si es par y sino, impepinablemente es impar.

Y ahí entra en juego el posible tema del casting donde compararías num/2., y fíjate bien en el punto del 2 que transforma el int en float, con (int)(num/2.), o más simple, compararlo con (num/2) es decir sin el punto decimal porque ya sería entero.

Conclusión:


Código
  1. #include <stdio.h>
  2. int main() {
  3.     int num;
  4.     printf("Introduzca el numero:\n");
  5.     scanf("%d", &num);
  6.     if ((num / 2.) == ((int)(num/2.)))
  7.     /*o bien: if ((num / 2.) == num/2)*/
  8.        printf("\nEs par\n");
  9.     else
  10.        printf ("\nEs impar\n");
  11.     getchar();
  12.     return 0;
  13. }
  14.  

 Saluditos!
    
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con casting
Publicado por: Caster en 19 Junio 2013, 00:12 am
El 2. soluciona todo, porque si como tu dices cambiamos el float por un int siempre saldrian par, lo declaro como float para que coja los decimales al dividirlo por 2.

Saludos


Título: Re: Problema con casting
Publicado por: leosansan en 19 Junio 2013, 16:53 pm
El 2. soluciona todo, porque si como tu dices cambiamos el float por un int siempre saldrian par, lo declaro como float para que coja los decimales al dividirlo por 2.

No hombre, no. Tienes que declararlo entero ,como ya te explique en el post anterior. Al dividirlo entre 2., y de nuevo  hago hincapié en el punto decimal, automáticamente el código pasa ese valor a float, por lo que si introduces 13, 13/2. pasaría a ser 6.500000 y al compararlo con 13 de dará impar.

Una salida al código que te paso, otra vez, a continuación:


Código
  1.  
  2. Introduzca el numero
  3. (negativo para salir) :6
  4.  
  5. num / 2.=3.000000---->num/2=3
  6. Es par
  7.  
  8. Introduzca el numero
  9. (negativo para salir) :13
  10.  
  11. num / 2.=6.500000---->num/2=6
  12. Es impar
  13.  
  14. Introduzca el numero
  15. (negativo para salir) :9
  16.  
  17. num / 2.=4.500000---->num/2=4
  18. Es impar
  19.  
  20. Introduzca el numero
  21. (negativo para salir) :15
  22.  
  23. num / 2.=7.500000---->num/2=7
  24. Es impar
  25.  
  26. Introduzca el numero
  27. (negativo para salir) :14
  28.  
  29. num / 2.=7.000000---->num/2=7
  30. Es par
  31.  
  32.  


Y dos cositas, observa que declaro num como int y la otra es que ejecutes el código que te pasamos para comprobar que funciona, no te conformes con mirarlo y sacar conclusiones que, como en este caso, te han llevado a error:


Código
  1. #include <stdio.h>
  2. int main() {
  3.     int num=0;
  4.     while (num>=0)
  5.     {
  6.         printf("\nIntroduzca el numero \n(negativo para salir) :");
  7.         scanf("%d", &num);
  8.         printf("\nnum / 2.=%f---->num/2=%d",num / 2.,num/2\n);
  9.         if (num / 2. == num/2)
  10.            printf("\nEs par\n");
  11.         else
  12.            printf ("\nEs impar\n");
  13.     }
  14.  
  15.     getchar();
  16.     return 0;
  17. }
  18.  

 Saluditos!
    
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con casting
Publicado por: Caster en 19 Junio 2013, 18:19 pm
Me expliqué yo mal, dije que yo lo declaraba como float para que tuviera decimales y que poniéndole el . al 2 se solucionaba eso al declararlo como int, lo entendí todo.

Saludos