Detectar si un numero es entero o no

Iniciado por Caster, 25 Octubre 2012, 20:15 PM

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

Caster

Bueno pues sigo con el mismo ejercicio que estoy haciendo en el ultimo post que hice hace poco tiempo, pero esta vez es otro problema, aqui os dejo el codigo que llevo:

#include <stdio.h>

int main()
{
long int segundos;
double minutos;


printf("Porfavor introduzca los segundos: \n");
scanf("%ld", &segundos);

while(getchar() != '\n')
;

minutos = segundos/60;

if (((int) minutos) == minutos)
printf("Numero entero de minutos: Si");
else
printf("Numero entero de minutos: No");


getchar();
return 0;
}


Lo primero que me pide el ejercicio es que segun el numero de segundos introducidos, analice si es un numero entero de minutos o no, y creo que este codigo esta bien, pero ponga el numero que ponga siempre me da que si, y ya lo he repasado mil veces y he probado a ponerlo de otras maneras pero siempre pasaba lo mismo, creo que estoy fallando en una tonteria pero no me doy cuenta.

Saludos

EDITO:He probado a cambiar la variable segundos de tipo int a tipo double y asi funciona perfectamente, y se que el error estaba el linea de asignacion a minutos despues del bucle while, pero sigo sin enetender el error

Saludos

leosansan

#1
Cita de: Caster en 25 Octubre 2012, 20:15 PM
pero sigo sin entender el error
Tal como lo tenías
Código (cpp) [Seleccionar]
" minutos = segundos/60; " era una operación entre enteros y devolvía un entero, por eso siempre te daba SI.
Puedes seguir declarando a segundos como entero pero usar:
Código (cpp) [Seleccionar]
minutos = segundos/60.0;
O bien, siguiendo con segundos como entero,  hacer un casting:
Código (cpp) [Seleccionar]
minutos = (double) segundos/60;

Caster

Algo habia pensado yo que era por culpa en esa sentencia y los tipos de variables, pero no me daba cuenta. Muchas gracias

Saludos

leosansan

CitarFijate que he reeditado el post anterior.
Saludos

Caster

Muchisimas grcias por la respuesta, voy a hacer un cast a segundos, porque asi me sirve para el resto del programa, me acabas de resolver justo un problema que acaba de tener ahora mismo.

Saludos

ecfisa

Hola Caster.

Otra opción es:


#include <stdio.h>

int main(int argc, char* argv[]) {
 int segundos;

 printf("Ingrese cantidad de segundos: ");
 scanf("%d",&segundos);
 while(getchar()!='\n');

 if (segundos % 60)
   printf("Son %d minutos y %d segundos.", segundos / 60, segundos % 60);
 else
   printf("Son exactamente %d minutos.", segundos / 60);

 getchar();
 return 0;
}


Saludos.

Caster

Muchas gracias, pero es parte de un ejercicio que he puesto en otro hilo y lo que pide el ejercicio es unicamente detectar si es un numero entero o no, no pide el resto.

Saludos

ecfisa

#7
Hola Caster.

Haa entiendo, no sabía lo del otro hilo...

En realidad, lo que quería destacar es que:  Para saber si la cantidad de segundos ingresada es un número exácto de minutos, basta con verificar que el resto de la división de la cantidad ingresada de segundos por 60, sea igual o distinta de 0. (1 minuto = 60 segundos)

El operador '%' devuelve el módulo (resto) de la división, entonces tu código podría haber quedado:

#include <stdio.h>

int main(int argc, char* argv[]) {
 int segundos;

 printf("Ingrese cantidad de segundos: ");
 scanf("%d",&segundos);
 while(getchar()!='\n');

 if (segundos % 60)   /* igual que: (segundos % 60 != 0) */
   printf("Numero entero de minutos: No");
 else
   printf("Numero entero de minutos: Si");

 getchar();
 return 0;
}


Saludos.  :)

Caster

En el otro hilo me dijeron lo mismo, y al final quedo asi el codigo:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main() {

uint64_t segundos, minutos, horas, dias;

printf("Introduce los segundos: ");
scanf("%llu", &segundos);

minutos=segundos/60;
puts((segundos%=60) ? "N" : "S");

horas=minutos/60;
puts((minutos%=60) ? "N" : "S");

dias=horas/24;
puts((horas%=24) ? "N" : "S");

printf("%llu d, %llu h, %llu m, %llu s\n", dias, horas, minutos, segundos);

return 0;
}


Es el codigo del ejercicio completo, por eso hay alguna parte que no tiene nada que ver son este hilo.

Saludos

BatchianoISpyxolo

#9
El título del tema es "Detectar si un numero es entero o no"

¿Por qué segundos, minutos, horas? What? xD

#include <stdio.h>
#include <math.h>

int main (void) {

   double x = 2.16;
   double y = 5.;

   puts ( ((x-floor(fabs(x))) == 0.) ? "Entero" : "Decimal" );

   puts ( ((y-floor(fabs(y))) == 0.) ? "Entero" : "Decimal" );

   return 0;
}


Edito: Ah, número entero de segundos, minutos etc con aritmética modular. Perdón.

¡Saludos!

Edito2: Por cierto, ¿has probado el operador % con números suficientemente grandes? No estoy seguro pero pordría no funcionarte. Y posiblemente en las librerías que has incluido haya una función que calcule el módulo de un número entre otro.
Puede que desees aprender a programar desde 0: www.espascal.es