Usar la hora en programa

Iniciado por Baal_30, 16 Julio 2014, 11:27 AM

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

Baal_30

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.
«La suerte es el cuidado de los detalles». -Winston Churchill

avesudra

#1
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í:
#include <time.h>
#include <stdio.h>

int main(int argc, char * argv[])
{
   int segundos = 0;
   int minutos  = 0;
   int horas    = 0;
   struct tm * infoTiempo;
   time_t tiempo;


   printf("Introduzca la hora a la que quiere que suene el despertador en formato (hh:mm:ss) :");

   scanf("%d:%d:%d",&horas, &minutos, &segundos);
   printf("Despertador fijado en %d:%d:%d", horas, minutos, segundos);
   for(;;)//Bucle infinito
   {
       time(&tiempo); //Obtenemos el tiempo
       infoTiempo = localtime(&tiempo); //Escribimos la estructura tm
       if((infoTiempo->tm_hour == horas)&&(infoTiempo->tm_min == minutos)&&(infoTiempo->tm_sec == segundos)) //Esperamos que de la alarma
       {
           printf("\n Suena la alarma.");
           break; //Rompe el for.
       }
   }
   return 0;
}


Saludos.
Regístrate en

Baal_30

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! :)
«La suerte es el cuidado de los detalles». -Winston Churchill

avesudra

#3
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;):
struct tm
{
 int   tm_sec;
 int   tm_min;
 int   tm_hour;
 int   tm_mday;
 int   tm_mon;
 int   tm_year;
 int   tm_wday;
 int   tm_yday;
 int   tm_isdst;
};

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.
Regístrate en

Baal_30

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 :/

int cuenta(){
system("cls");
int hh,mm,ss;
int i,j,k;
int x = 1;

printf("Introduzca el tiempo para realizar la cuenta atras(HH:MM:SS) :\n");
scanf("%d:%d:%d",&hh,&mm,&ss);

printf("La alarma sonara en %d:%d:%d\n",hh,mm,ss);

for(i=hh;i>0;i--){
for(j=mm;j>0;j--){
for(k=ss;k>0;k--){
Sleep(x);
printf("Quedan: %d:%d:%d",i,j,k);
}
}

}

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

leosansan

Cita de: Baal_30 en 16 Julio 2014, 13:56 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 (cpp) [Seleccionar]

**********************************
  int hh,mm,ss;
  int i,j,ii,ij,ik;
  int x = 1000;
  printf("Introduzca el tiempo para realizar la cuenta atras(HH:MM:SS) :\n");
  scanf("%d:%d:%d",&hh,&mm,&ss);
  printf("La alarma sonara en %d:%d:%d\n",hh,mm,ss);
  for(ii=hh,i=0;ii>=0;ii--,i++){
    if (i>0) mm=59,ss=59;
    for(ij=mm,j=0;ij>=0;ij--,j++){
      if (j>0) ss=59;
      for(ik=ss;ik>=0;ik--){
        Sleep(x);
printf("Quedan: %02d:%02d:%02d\r",ii,ij,ik);
      }
    }
  }
*****************************


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



Baal_30

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 :

//Alarma cuenta atrás y reloj
#include <stdio.h>
#include <time.h>
#include <windows.h>

int reloj();
int main(){
int op;

printf("elige sobre que deseas usar la alarma:\n");
printf("(1) Programar una hora\n");
printf("(2) Cuenta atras\n");
scanf("%d",&op);

switch(op){
case 1 : reloj();
break;
case 2 : cuenta();
}
}

int reloj(){
system("cls");

int hh, mm;
struct tm * infoTiempo;
time_t tiempo;

printf("Introduce una hora:\n");
scanf("%d",&hh);
printf("Introduce los minutos:\n");
scanf("%d",&mm);

printf("La alarma sonara a las %d:%d\n",hh,mm);

for(;;){
time(&tiempo);
infoTiempo = localtime(&tiempo);
if((infoTiempo->tm_hour == hh)&&(infoTiempo->tm_min==mm)){
printf("\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a");
break;
}
}

return 0;
}

int cuenta(){
system("cls");
int hh,mm,ss;
int i,j,ii,ij,ik;
int x = 1000;

printf("Introduzca el tiempo para realizar la cuenta atras(HH:MM:SS) :\n");
scanf("%d:%d:%d",&hh,&mm,&ss);

for(ii=hh,i=0;ii>=0;ii--,i++){
if(i>0) mm=59,ss=59;
for(ij=mm,j=0;ij>=0;ij--,j++){
if(j>0) ss=59;
for(ik=ss;ik>=0;ik--){
Sleep(x);
printf("La alarma sonara en: %d:%d:%d\r",ii,ij,ik);
if(ii==0&&ij==0&&ik==0){
printf("\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a");
}
}
}

}

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

leosansan

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 (cpp) [Seleccionar]
  for(ii=hh,i=0;ii>=0;ii--,i++){
    if(i>0) {mm=59,ss=59;}
    for(ij=mm,j=0;ij>=0;ij--,j++){
      if(j>0) ss=59;
      for(ik=ss;ik>=0;ik--){
        Sleep(x);
        printf("La alarma sonara en: %d:%d:%d\r",ii,ij,ik);
      }
    }
  }
  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! ..... !!!!




Baal_30

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 :/
«La suerte es el cuidado de los detalles». -Winston Churchill

leosansan

Cita de: Baal_30 en 17 Julio 2014, 11:50 AM
............................
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 (cpp) [Seleccionar]
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!.