Autor
|
Tema: Problema con casting (Leído 3,023 veces)
|
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"); if ((num / 2) == ((int)(num/2))) else if ((num / 2) != ((int)(num/2))) 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.
|
|
« Última modificación: 18 Junio 2013, 22:14 pm por Caster »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Como tú dices, con %2 se sabría al instante: if (numero%2 == 0) else
Pero quieres saber que es lo que pasa con tu código. Lo primero: if ((num / 2) == ((int)(num/2))) else if ((num / 2) != ((int)(num/2)))
El segundo if sobra, si hemos llegado al else es porque esa condición ya es cierta: if ((num / 2) == ((int)(num/2))) else
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
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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:#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!
|
|
« Última modificación: 19 Junio 2013, 16:58 pm por leosansan »
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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: 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:
#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!
|
|
« Última modificación: 19 Junio 2013, 17:02 pm por leosansan »
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Casting
Programación Visual Basic
|
TeKNo dUKe
|
0
|
1,223
|
26 Junio 2008, 14:34 pm
por TeKNo dUKe
|
|
|
¿Fallo de casting?
Java
|
SKalextric
|
5
|
3,588
|
16 Octubre 2008, 06:22 am
por sapito169
|
|
|
Casting.xxx, el primer dominio porno en Internet
Noticias
|
wolfbcn
|
0
|
4,175
|
5 Agosto 2011, 02:52 am
por wolfbcn
|
|
|
Recopilatorio de Filtros, Casting y Parsing para PHP
PHP
|
WHK
|
0
|
1,851
|
21 Diciembre 2011, 18:40 pm
por WHK
|
|
|
Detenidos los dos autores de un fraude telefónico relacionado con el casting ...
Noticias
|
wolfbcn
|
0
|
1,274
|
30 Julio 2014, 13:43 pm
por wolfbcn
|
|