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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con ejercicio en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con ejercicio en C  (Leído 3,757 veces)
Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Ayuda con ejercicio en C
« en: 28 Octubre 2012, 15:43 pm »

Buenas!

Bueno pues de los ejercicios que me dejasteis en otro post eleji este para ir empezando:

Citar
Dado un numero entero positivo de segundos, se desea convertirlo a días.
En el archivo segundos.in se informa el número de segundos el cual
puede tener hasta 100 dígitos decimales, como una secuencia de dígitos.
La salida se grabará en el archivo segundos.out, cada respuesta en una
línea, y deberá contener:
1. Indicación de si el número de segundos dado equivale a un numero
entero de minutos o no (mediante una S para sí, y una N para no).
2. Indicación de si el número de segundos dado equivale a un numero
entero de horas, en el mismo formato que para la respuesta 1).
3. Indicación de si el número de segundos dado equivale a un numero
entero de días, en el mismo formato que para la respuesta 1).
4. Imprimir el numero de días, horas, minutos y segundos equivalente
al número de segundos dado.
Ejemplo:
Si segundos.in contiene:
5650560900
El archivo segundos.out debería contener:
S
N
S
65400 d, 0 h, 15 m, 0 s

Bueno yo cambie lo de archivos, porque aun no se manejarlos, y he llegado hasta los tres primeros puntos, pero el 4 no se como hacerlo, y queria que me dijerias a ver de que forma puedo hacerlo, no quiero codigo, solo como poder hacerlo, una idea para despues hacerlo yo, os dejo lo que llevo hecho:
Código
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <inttypes.h>
  4.  
  5.  
  6.  
  7. int main()
  8. {
  9. uint64_t segundos;
  10. double minutos;
  11. double horas;
  12. double dias;
  13.  
  14.  
  15. printf("Porfavor introduzca los segundos: \n");
  16. scanf("%llu", &segundos);
  17.  
  18. while(getchar() != '\n')
  19. ;
  20.  
  21. minutos = (double) segundos/60;
  22.  
  23.  
  24. if (((int) minutos) != minutos)
  25. printf("Numero entero de minutos: No\n");
  26. else if (((int) minutos) == minutos)
  27. printf("Numero entero de minutos: Si\n");
  28.  
  29. horas = (double) segundos/3600;
  30.  
  31. if (((int) horas) != horas)
  32. printf("Numero entero de horas: No\n");
  33. else if (((int) horas) == horas)
  34. printf("Numero entero de horas: Si\n");
  35.  
  36. dias = (double) (segundos/3600)/24;
  37.  
  38. if (((int) dias) != dias)
  39. printf("Numero entero de dias: No\n");
  40. else if (((int) dias) == dias)
  41. printf("Numero entero de dias: Si\n");
  42.  
  43.  
  44. return 0;
  45. }

Saludos


En línea

xiruko


Desconectado Desconectado

Mensajes: 437


Ver Perfil
Re: Ayuda con ejercicio en C
« Respuesta #1 en: 28 Octubre 2012, 17:16 pm »

para saber si algun numero es divisible por otro numero, se suele usar el operador de resto o mod '%'. por ejemplo, si quieres saber el resto de hacer una division entera de 7 entre 3, te quedaria:
Código:
7 / 3 = 2 (cociente)
7 % 3 = 1 (resto)

en el caso de tu ejercicio, es lo mismo pero sabiendo que 1 minuto tiene 60 segundos y que 1 hora tiene 60 minutos (o 3600 segundos). por ejemplo:
Código:
140 segundos
minutos = 140 / 60 = 2 minutos
segundos sobrantes = 140 % 60 = 20 segundos
resultado: 2 minutos y 20 segundos

espero habertelo aclarado. un saludo!


« Última modificación: 28 Octubre 2012, 17:18 pm por xiruko » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Ayuda con ejercicio en C
« Respuesta #2 en: 28 Octubre 2012, 17:21 pm »

pero el 4 no se como hacerlo, y queria que me dijerias a ver de que forma puedo hacerlo, no quiero codigo, solo como poder hacerlo, una idea para despues hacerlo yo

Tendras que obtener dias, horas minutos y segundos restantes a partir de los segundos de entrada. Por ejemplo:
Código
  1. dias = (int) segundos/(3600*24);
P.D: Revisa lo anterior, lo de numero entero de días en especial.

Y lo siguiente no lo mires hasta que no lo hallas resuelto tú:








Código
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <inttypes.h>
  4.  
  5.  
  6.  
  7. int main()
  8. {
  9. uint64_t segundos;
  10. double minutos;
  11. double horas;
  12. double dias;
  13.  
  14.  
  15. printf("Porfavor introduzca los segundos: \n");
  16. scanf("%llu", &segundos);
  17.  
  18. while(getchar() != '\n')
  19. ;
  20.  
  21. minutos = (double) segundos/60;
  22.  
  23.  
  24. if (((int) minutos) != minutos)
  25. printf("Numero entero de minutos: No\n");
  26. else if (((int) minutos) == minutos)
  27. printf("Numero entero de minutos: Si\n");
  28.  
  29. horas = (double) segundos/3600;
  30.  
  31. if (((int) horas) != horas)
  32. printf("Numero entero de horas: No\n");
  33. else if (((int) horas) == horas)
  34. printf("Numero entero de horas: Si\n");
  35.  
  36. dias = (double) (segundos/(3600*24));
  37.  
  38. if (((int) dias) != dias)
  39. printf("Numero entero de dias: No\n");
  40. else if (((int) dias) == dias )
  41.    printf("Numero entero de dias: Si\n");
  42.    dias = (int) segundos/(3600*24);
  43.    horas = (segundos - (int) dias *3600*24)/3600;
  44.    minutos = (segundos -(int) dias *3600*24 - (int) horas*3600)/60;
  45.    segundos = segundos -(int) dias *3600*24 - (int) horas*3600- (int) minutos*60;
  46.    printf("\nNumero de dias: %g  \n",dias);
  47.    printf("Numero de horas: %g  \n",horas);
  48.    printf("Numero de minutos: %g  \n",minutos);
  49.    printf("Numero de segundos: %llu  \n",segundos);
  50. getchar();
  51. return 0;
  52. }
  53.  
« Última modificación: 28 Octubre 2012, 17:24 pm por leosansan » En línea

xiruko


Desconectado Desconectado

Mensajes: 437


Ver Perfil
Re: Ayuda con ejercicio en C
« Respuesta #3 en: 29 Octubre 2012, 00:18 am »

he vuelto a mirar el post y me he fijado en esto:

Citar
Dado un numero entero positivo de segundos, se desea convertirlo a días.
En el archivo segundos.in se informa el número de segundos el cual
puede tener hasta 100 dígitos decimales, como una secuencia de dígitos.

hasta 100 digitos decimales significa que va desde 0 hasta 9.99e99 y con un unsigned de 64 bits "solo" llegas hasta 2^64=1.84e19, por lo que deberas buscar la manera de manejar numeros tan grandes (con eso no puedo ayudarte ya que no tengo ni idea, solo comentaba para que lo tuvieras en cuenta).

un saludo!
En línea

Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Re: Ayuda con ejercicio en C
« Respuesta #4 en: 30 Octubre 2012, 16:47 pm »

Ya me habia dado cuenta, pero ahora mismo no me preocupa eso, lo que mas me interesa a mi es saber resolver el problema en si.

Saludos
En línea

Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Re: Ayuda con ejercicio en C
« Respuesta #5 en: 30 Octubre 2012, 18:45 pm »

Menudo lio tengo, ya llevo varias horas rompiendome la cabeza y no llego a nada, al principio he intentado hacerlo yo solo y no se si me acerque si quiera, y como no conseguia nada probe la solucion de leosansan, la copie y compile, y no da el resultado esperado, asi que seguire intentandolo a ver sin consigo algo.

Saludos

Edito: Para conseguir los dias he escrito esto y funciona perfectamente:

Código
  1. dias = segundos / (3600*24);

EDITO 2: Pues parece que pensando al final llegue a la solucion, he programado esto:

Código
  1. dias = segundos / (3600*24);
  2. horas = (segundos % (3600*24)) / 3600;
  3. minutos = ((segundos % (3600*24)) % 3600) / 60;
  4. segundos = ((segundos % (3600*24)) % 3600) % 60;

Y funciona perfectamente. Al final el codigo completo queda asi:

Código
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <inttypes.h>
  4.  
  5.  
  6.  
  7. int main()
  8. {
  9. uint64_t segundos;
  10. double minutos;
  11. double horas;
  12. double dias;
  13.  
  14.  
  15. printf("Porfavor introduzca los segundos: \n");
  16. scanf("%llu", &segundos);
  17.  
  18. while(getchar() != '\n')
  19. ;
  20.  
  21. minutos = (double) segundos/60;
  22.  
  23.  
  24. if (((int) minutos) != minutos)
  25. printf("N\n");
  26. else if (((int) minutos) == minutos)
  27. printf("S\n");
  28.  
  29. horas = (double) segundos/3600;
  30.  
  31. if (((int) horas) != horas)
  32. printf("N\n");
  33. else if (((int) horas) == horas)
  34. printf("S\n");
  35.  
  36. dias = (double) (segundos/3600)/24;
  37.  
  38. if (((int) dias) != dias)
  39. printf("N\n");
  40. else if (((int) dias) == dias)
  41. printf("S\n");
  42.  
  43. dias = segundos / (3600*24);
  44. horas = (segundos % (3600*24)) / 3600;
  45. minutos = ((segundos % (3600*24)) % 3600) / 60;
  46. segundos = ((segundos % (3600*24)) % 3600) % 60;
  47.  
  48.  
  49. printf("%lf d, %lf h, %lf m, %llu s\n", dias, horas, minutos, segundos);
  50.  
  51.  
  52. return 0;
  53. }
  54.  

Saludos y muchas gracias a todos por la ayuda. He editado las salidas por pantalla para que se adapte mejor a los resultados que pide el ejercicio.
« Última modificación: 30 Octubre 2012, 19:01 pm por Caster » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Ayuda con ejercicio en C
« Respuesta #6 en: 30 Octubre 2012, 20:04 pm »

al principio he intentado hacerlo yo solo y no se si me acerque si quiera, y como no conseguia nada probe la solucion de leosansan, la copie y compile, y no da el resultado esperado
Citar
Dime en qué no funciona. Por ejemplo segundos=191115 da 2d  5h  5min  15s. Sin embargo, en el código te sigue fallando "numero de dias enteros" que da 2 cuando obviamente no es un número de dias enteros
Saludos!.
En línea

Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Re: Ayuda con ejercicio en C
« Respuesta #7 en: 30 Octubre 2012, 20:12 pm »

Tu codigo no es que no funcione, sino que introduzco el numero de segundos que se da como ejemplo en el ejercicio y el resultado no coincide, acabo de probar con el numero de segundos que das tu yla salida del programa que hice yo es esta:

Citar
Porfavor introduzca los segundos:
191115
N
N
N
2.000000 d, 5.000000 h, 5.000000 m, 15 s

Es corrrecta, no es un numero entero de minutos, ni de horas, ni de dias, asi que sale todo "N" y despues como bien dice el programa no es numero entero de nada, asi que sobran horas, minutos y segundos y por eso ninguno de ellos queda en 0.

Saludos

EDITO: He probado ha introducir 120 segundos y el programa me ha dado esto:

Citar
Porfavor introduzca los segundos:
120
S
N
S
0.000000 d, 0.000000 h, 2.000000 m, 0 s

Esta todo bien excepto que dice que es un numero entero de dias, ya he visto el fallo, y cambie esta linea:

Código
  1. dias = (double) (segundos/3600)/24;

Por esta:

Código
  1. dias = (double) segundos / (3600*24);

Y ahora la salida es esta:

Citar
Porfavor introduzca los segundos:
120
S
N
N
0.000000 d, 0.000000 h, 2.000000 m, 0 s

Saludos y muchas gracias.
« Última modificación: 30 Octubre 2012, 20:20 pm por Caster » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Ayuda con ejercicio en C
« Respuesta #8 en: 31 Octubre 2012, 12:06 pm »

Puedes evitarte tanto casting sin más que introducir alguno de los números como decimales:
Código
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <inttypes.h>
  4.  
  5.  
  6.  
  7. int main()
  8. {
  9. uint64_t segundos;
  10. double minutos;
  11. double horas;
  12. double dias;
  13. printf("Porfavor introduzca los segundos: \n");
  14. scanf("%llu", &segundos);
  15. while(getchar() != '\n')
  16. ;
  17. minutos =  segundos/60.0;  /*<== fijate en el decimal*/
  18. if (((int) minutos) != minutos)
  19. printf("Numero entero de minutos: No\n");
  20. else if (((int) minutos) == minutos)
  21. printf("Numero entero de minutos: Si\n");
  22. horas =  segundos/3600.0; /*<== fijate en el decimal*/
  23.    if (((int) horas) != horas)
  24. printf("Numero entero de horas: No\n");
  25. else if (((int) horas) == horas)
  26. printf("Numero entero de horas: Si\n");
  27. dias = segundos/(3600.0*24);  /*<== fijate en el decimal*/
  28.    if (((int) dias) != dias)
  29. printf("Numero entero de dias: No\n");
  30. else if (((int) dias) == dias )
  31.    printf("Numero entero de dias: Si\n");
  32.    dias = (int) segundos/(3600*24);
  33.    horas = (segundos - (int) dias *3600*24)/3600;
  34.    minutos = (segundos -(int) dias *3600*24 - (int) horas*3600)/60;
  35.    segundos = segundos -(int) dias *3600*24 - (int) horas*3600- (int) minutos*60;
  36.    printf("\nNumero de dias: %g  \n",dias);
  37.    printf("Numero de horas: %g  \n",horas);
  38.    printf("Numero de minutos: %g  \n",minutos);
  39.    printf("Numero de segundos: %llu  \n",segundos);
  40. getchar();
  41. return 0;
  42. }
Saludos!.
En línea

xiruko


Desconectado Desconectado

Mensajes: 437


Ver Perfil
Re: Ayuda con ejercicio en C
« Respuesta #9 en: 31 Octubre 2012, 12:24 pm »

Citar
Ya me habia dado cuenta, pero ahora mismo no me preocupa eso, lo que mas me interesa a mi es saber resolver el problema en si.

tambien te lo conteste al principio del hilo y no me hiciste mucho caso. pero bueno, te dejo aqui el codigo a falta de implementar lo del numero de 100 cifras.

Código
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <inttypes.h>
  4.  
  5. int main() {
  6.  
  7. uint64_t segundos, minutos, horas, dias;
  8.  
  9. printf("Introduce los segundos: ");
  10. scanf("%llu", &segundos);
  11.  
  12. minutos=segundos/60;
  13. puts((segundos%=60) ? "N" : "S");
  14.  
  15. horas=minutos/60;
  16. puts((minutos%=60) ? "N" : "S");
  17.  
  18. dias=horas/24;
  19. puts((horas%=24) ? "N" : "S");
  20.  
  21. printf("%llu d, %llu h, %llu m, %llu s\n", dias, horas, minutos, segundos);
  22.  
  23. return 0;
  24. }

salida:

Código:
xiruko:~$ gcc segundos.c -o segundos
xiruko:~$ ./segundos
Introduce los segundos: 5650560900
S
N
S
65400 d, 0 h, 15 m, 0 s
xiruko:~$

un saludo!

edito: modifico los if/else para que queden mas bonitos por recomendacion de BatchianoISpyxolo xD
« Última modificación: 31 Octubre 2012, 13:00 pm por xiruko » En línea

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ayuda] Ejercicio C 100
Ejercicios
Dem0ny 2 4,737 Último mensaje 19 Diciembre 2007, 22:45 pm
por Dem0ny
Ayuda co un ejercicio de C#
.NET (C#, VB.NET, ASP)
hitori batusai 2 4,293 Último mensaje 22 Febrero 2008, 01:53 am
por hitori batusai
Ayuda con ejercicio de VB
Programación Visual Basic
guada_sp 5 2,418 Último mensaje 8 Marzo 2008, 02:54 am
por ‭‭‭‭jackl007
[Ejercicio] Aca tienen un ejercicio para practicar « 1 2 3 »
Programación Visual Basic
Dreamaker 20 12,811 Último mensaje 5 Septiembre 2010, 02:57 am
por TGa.
Ayuda ejercicio de Pascal, cuando uno no lo ve claro pide ayuda
Programación General
manu3742 1 2,098 Último mensaje 31 Marzo 2011, 15:43 pm
por d(-_-)b
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines