Problema con casting

Iniciado por Caster, 18 Junio 2013, 22:01 PM

0 Miembros y 1 Visitante están viendo este tema.

Caster

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:
#include <stdio.h>
int main() {
    float num;
    printf("Introduzca el numero:\n");
    scanf("%lf", &num);
    if ((num / 2) == ((int)(num/2)))
       printf("Es par\n");
    else if ((num / 2) != ((int)(num/2)))
       printf ("Es impar\n");
    getchar();

    return 0;
}


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.

amchacon

Como tú dices, con %2 se sabría al instante:

if (numero%2 == 0)
printf("El numero es par");
else
printf("El numero es impar");


Pero quieres saber que es lo que pasa con tu código. Lo primero:

     if ((num / 2) == ((int)(num/2)))
        printf("Es par\n");
     else if ((num / 2) != ((int)(num/2)))
        printf ("Es impar\n");


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


if ((num / 2) == ((int)(num/2)))
        printf("Es par\n");
else
        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:

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


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

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Caster

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

amchacon

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

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#4
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 (cpp) [Seleccionar]

#include <stdio.h>
int main() {
    int num;
    printf("Introduzca el numero:\n");
    scanf("%d", &num);
    if ((num / 2.) == ((int)(num/2.)))
    /*o bien: if ((num / 2.) == num/2)*/
       printf("\nEs par\n");
    else
       printf ("\nEs impar\n");
    getchar();
    return 0;
}


Saluditos!
   

Caster

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

leosansan

#6
Cita de: 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.

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 (cpp) [Seleccionar]


Introduzca el numero
(negativo para salir) :6

num / 2.=3.000000---->num/2=3
Es par

Introduzca el numero
(negativo para salir) :13

num / 2.=6.500000---->num/2=6
Es impar

Introduzca el numero
(negativo para salir) :9

num / 2.=4.500000---->num/2=4
Es impar

Introduzca el numero
(negativo para salir) :15

num / 2.=7.500000---->num/2=7
Es impar

Introduzca el numero
(negativo para salir) :14

num / 2.=7.000000---->num/2=7
Es par



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 (cpp) [Seleccionar]
#include <stdio.h>
int main() {
    int num=0;
    while (num>=0)
    {
        printf("\nIntroduzca el numero \n(negativo para salir) :");
        scanf("%d", &num);
        printf("\nnum / 2.=%f---->num/2=%d",num / 2.,num/2\n);
        if (num / 2. == num/2)
           printf("\nEs par\n");
        else
           printf ("\nEs impar\n");
    }

    getchar();
    return 0;
}


Saluditos!
   

Caster

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