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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


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

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Usar la hora en programa
« en: 16 Julio 2014, 11:27 am »

Buenas de nuevo.

Estoy intentando hacer una alarma con C, y no se como puedo hacer que el programa utilice la hora del ordenador para que sepa que hora es, y que cuando llegue a la hora indicada, muestre un mensaje.

Gracias.


En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Usar la hora en programa
« Respuesta #1 en: 16 Julio 2014, 12:08 pm »

Puedes usar la estructura tm definida en la cabecera <time.h> e irla actualizando con las funciones time y localtime para escribirla. Te dejo la referencia:

http://www.cplusplus.com/reference/ctime/tm/

Podrías hacer algo tal que así:
Código
  1. #include <time.h>
  2. #include <stdio.h>
  3.  
  4. int main(int argc, char * argv[])
  5. {
  6.    int segundos = 0;
  7.    int minutos  = 0;
  8.    int horas    = 0;
  9.    struct tm * infoTiempo;
  10.    time_t tiempo;
  11.  
  12.  
  13.    printf("Introduzca la hora a la que quiere que suene el despertador en formato (hh:mm:ss) :");
  14.  
  15.    scanf("%d:%d:%d",&horas, &minutos, &segundos);
  16.    printf("Despertador fijado en %d:%d:%d", horas, minutos, segundos);
  17.    for(;;)//Bucle infinito
  18.    {
  19.        time(&tiempo); //Obtenemos el tiempo
  20.        infoTiempo = localtime(&tiempo); //Escribimos la estructura tm
  21.        if((infoTiempo->tm_hour == horas)&&(infoTiempo->tm_min == minutos)&&(infoTiempo->tm_sec == segundos)) //Esperamos que de la alarma
  22.        {
  23.            printf("\n Suena la alarma.");
  24.            break; //Rompe el for.
  25.        }
  26.    }
  27.    return 0;
  28. }

Saludos.


« Última modificación: 16 Julio 2014, 12:14 pm por avesudra » En línea

Regístrate en
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Usar la hora en programa
« Respuesta #2 en: 16 Julio 2014, 12:39 pm »

Genial avesudra, gracias por la ayuda. Lo he hecho y me va genial, pero no entiendo para que se declara:  struct tm * infoTiempo; y time_t tiempo;

La estructura esa, se supone que es una estructura ya creada de la biblioteca time.h ¿no?

El bucle infinito se supone que es para que la hora se vaya actualizando hasta que llegue a la indicada, y cada cuanto se actualiza por defecto ¿a cada segundo?

Y lo de declarar time_t tiempo no lo entiendo :/

Gracias! :)
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Usar la hora en programa
« Respuesta #3 en: 16 Julio 2014, 13:11 pm »

La estructura tm contiene varios parámetros que se obtienen del tipo time_t tiempo. Primero de todo time_t tiempo se utiliza para obtener los datos del tiempo estándar, y luego la función localtime escribe dicha estructura (separando los datos para su manejo) para tu zona sacando los datos de la variable tiempo. La estructura viene ya definida en <time.h> como dices y está definida tal que así (la declaración se hace en el struct tm * infoTiempo;):
Código
  1. struct tm
  2. {
  3.  int   tm_sec;
  4.  int   tm_min;
  5.  int   tm_hour;
  6.  int   tm_mday;
  7.  int   tm_mon;
  8.  int   tm_year;
  9.  int   tm_wday;
  10.  int   tm_yday;
  11.  int   tm_isdst;
  12. };
El bucle infinito es como dices para que se vaya actualizando la hora con las funciones time y localtime. En cuanto a la pregunta de cada cuanto se actualiza, pues el tiempo que tarda es menos de un segundo, por lo que si imprimes por pantalla la hora cada vez que pasa por dicha instrucción te dará 5 o 6 horas idénticas.

Mira las referencias de las funciones y de los tipos.

Saludos.
« Última modificación: 16 Julio 2014, 13:19 pm por avesudra » En línea

Regístrate en
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Usar la hora en programa
« Respuesta #4 en: 16 Julio 2014, 13:56 pm »

Muchas gracias, muy bien explicado todo!

Ahora me surje otro problemilla, y es que también quiero poner la opción de cuenta atrás, lo estoy haciendo como un bucle "for" anidado en otro, y estos anidados en otro. Aquí dejo el código, que no me funciona, me el primer printf, pongo el tiempo, me sale el segundo printf correcto, pero el printf del bucle me sale sólo una vez y con la misma hora que el 2º printf :/

Código
  1. int cuenta(){
  2. system("cls");
  3. int hh,mm,ss;
  4. int i,j,k;
  5. int x = 1;
  6.  
  7. printf("Introduzca el tiempo para realizar la cuenta atras(HH:MM:SS) :\n");
  8. scanf("%d:%d:%d",&hh,&mm,&ss);
  9.  
  10. printf("La alarma sonara en %d:%d:%d\n",hh,mm,ss);
  11.  
  12. for(i=hh;i>0;i--){
  13. for(j=mm;j>0;j--){
  14. for(k=ss;k>0;k--){
  15. Sleep(x);
  16. printf("Quedan: %d:%d:%d",i,j,k);
  17. }
  18. }
  19.  
  20. }
  21.  
  22. }
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Usar la hora en programa
« Respuesta #5 en: 16 Julio 2014, 15:41 pm »

.........................................
 no me funciona, me el primer printf, pongo el tiempo, me sale el segundo printf correcto, pero el printf del bucle me sale sólo una vez y con la misma hora que el 2º printf
..................................................

Si no me equivoco es debido al valor de X=1. Tendrías que poner x=1000.

Pero hay un error lógico y es que si introduces como tiempo 0:2:15 el cronómetro se inicia bien en justamente 0:2:15, pero al llegar a 0:2:0 pasaría a continuación a 0:1:15 en lugar de 0:1:59. Y análogamente con la hora .

Creo que lo puedes remediar con:

Código
  1. **********************************
  2.  int hh,mm,ss;
  3.  int i,j,ii,ij,ik;
  4.  int x = 1000;
  5.  printf("Introduzca el tiempo para realizar la cuenta atras(HH:MM:SS) :\n");
  6.  scanf("%d:%d:%d",&hh,&mm,&ss);
  7.  printf("La alarma sonara en %d:%d:%d\n",hh,mm,ss);
  8.  for(ii=hh,i=0;ii>=0;ii--,i++){
  9.    if (i>0) mm=59,ss=59;
  10.    for(ij=mm,j=0;ij>=0;ij--,j++){
  11.      if (j>0) ss=59;
  12.      for(ik=ss;ik>=0;ik--){
  13.        Sleep(x);
  14. printf("Quedan: %02d:%02d:%02d\r",ii,ij,ik);
  15.      }
  16.    }
  17.  }
  18. *****************************

¡¡¡¡ Saluditos! ..... !!!!


En línea

Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Usar la hora en programa
« Respuesta #6 en: 16 Julio 2014, 16:11 pm »

Gracias leosansan, me hubiera costado muchísimo encontrar la solución que me has dado¡!

Ya lo tengo terminado y gracias a vuestra ayuda :) Seguro que tiene más de un error, y se podrá mejorar. Aquí os dejo el código completo a ver que os parece :

Código
  1. //Alarma cuenta atrás y reloj
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include <windows.h>
  5.  
  6. int reloj();
  7. int main(){
  8. int op;
  9.  
  10. printf("elige sobre que deseas usar la alarma:\n");
  11. printf("(1) Programar una hora\n");
  12. printf("(2) Cuenta atras\n");
  13. scanf("%d",&op);
  14.  
  15. switch(op){
  16. case 1 : reloj();
  17. break;
  18. case 2 : cuenta();
  19. }
  20. }
  21.  
  22. int reloj(){
  23. system("cls");
  24.  
  25. int hh, mm;
  26. struct tm * infoTiempo;
  27. time_t tiempo;
  28.  
  29. printf("Introduce una hora:\n");
  30. scanf("%d",&hh);
  31. printf("Introduce los minutos:\n");
  32. scanf("%d",&mm);
  33.  
  34. printf("La alarma sonara a las %d:%d\n",hh,mm);
  35.  
  36. for(;;){
  37. time(&tiempo);
  38. infoTiempo = localtime(&tiempo);
  39. if((infoTiempo->tm_hour == hh)&&(infoTiempo->tm_min==mm)){
  40. printf("\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a");
  41. break;
  42. }
  43. }
  44.  
  45. return 0;
  46. }
  47.  
  48. int cuenta(){
  49. system("cls");
  50. int hh,mm,ss;
  51. int i,j,ii,ij,ik;
  52. int x = 1000;
  53.  
  54. printf("Introduzca el tiempo para realizar la cuenta atras(HH:MM:SS) :\n");
  55. scanf("%d:%d:%d",&hh,&mm,&ss);
  56.  
  57. for(ii=hh,i=0;ii>=0;ii--,i++){
  58. if(i>0) mm=59,ss=59;
  59. for(ij=mm,j=0;ij>=0;ij--,j++){
  60. if(j>0) ss=59;
  61. for(ik=ss;ik>=0;ik--){
  62. Sleep(x);
  63. printf("La alarma sonara en: %d:%d:%d\r",ii,ij,ik);
  64. if(ii==0&&ij==0&&ik==0){
  65. printf("\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a");
  66. }
  67. }
  68. }
  69.  
  70. }
  71.  
  72. }
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Usar la hora en programa
« Respuesta #7 en: 16 Julio 2014, 22:23 pm »

Te ha quedado "guay".  ;)

Sólo unos detallitos: te falta el prototipo de la función "cuenta", el return de la función main y te podrías ahorrar el último if de la función cuenta:

Código
  1.  for(ii=hh,i=0;ii>=0;ii--,i++){
  2.    if(i>0) {mm=59,ss=59;}
  3.    for(ij=mm,j=0;ij>=0;ij--,j++){
  4.      if(j>0) ss=59;
  5.      for(ik=ss;ik>=0;ik--){
  6.        Sleep(x);
  7.        printf("La alarma sonara en: %d:%d:%d\r",ii,ij,ik);
  8.      }
  9.    }
  10.  }
  11.  printf("\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a");

Sólo he probado la función cuenta y te reitero que está guay. ¡¡¡Enhorabuena¡¡¡¡

¡¡¡¡ Saluditos! ..... !!!!



En línea

Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Usar la hora en programa
« Respuesta #8 en: 17 Julio 2014, 11:50 am »

Muchas gracias leosansan ^^ Ya he corregido los detalles esos, pero el if no lo puedo quitar, si lo hago me suenan los pitidos desde el principio, hasta el final de la cuenta :/
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Usar la hora en programa
« Respuesta #9 en: 17 Julio 2014, 12:26 pm »

............................
Ya he corregido los detalles esos, pero el if no lo puedo quitar, si lo hago me suenan los pitidos desde el principio, hasta el final de la cuenta :/
.................................

Fíjate en el código que te puse que sin el if el printf va después del cierre de las llaves de los for, así sonará sólo al acabar los mismos es decir cuando ss=, mm=0 y hh=0 lo que equivale al if, por eso está de más.

Y por cierto, ahora que me fijo mejor es:

Código
  1. printf("La alarma sonara en: %02d:%02d:%02d\r",ii,ij,ik);

Así cuando queden, por ejemplo, nueve o menos segundo aparecerá 00:00:09 en lugar de 00:00:90 como lo tienes ahora.  ;)

Un fuerte saludo Baal_30!.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines