Autor
|
Tema: Usar la hora en programa (Leído 3,591 veces)
|
Baal_30
Desconectado
Mensajes: 248
|
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
Mensajes: 724
Intentando ser mejor cada día :)
|
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.
|
|
« Última modificación: 16 Julio 2014, 12:14 pm por avesudra »
|
En línea
|
Regístrate en
|
|
|
Baal_30
Desconectado
Mensajes: 248
|
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
Mensajes: 724
Intentando ser mejor cada día :)
|
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.
|
|
« Última modificación: 16 Julio 2014, 13:19 pm por avesudra »
|
En línea
|
Regístrate en
|
|
|
Baal_30
Desconectado
Mensajes: 248
|
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(){ 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 ); } } } }
|
|
|
En línea
|
«La suerte es el cuidado de los detalles». -Winston Churchill
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
......................................... 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: ********************************** 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! ..... !!!!
|
|
|
En línea
|
|
|
|
Baal_30
Desconectado
Mensajes: 248
|
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"); switch(op){ case 1 : reloj(); break; case 2 : cuenta(); } } int reloj(){ int hh, mm; struct tm * infoTiempo; time_t tiempo; printf("Introduce una hora:\n"); printf("Introduce los minutos:\n"); printf("La alarma sonara a las %d:%d\n",hh ,mm ); for(;;){ 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(){ 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"); } } } } }
|
|
|
En línea
|
«La suerte es el cuidado de los detalles». -Winston Churchill
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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: 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! ..... !!!!
|
|
|
En línea
|
|
|
|
Baal_30
Desconectado
Mensajes: 248
|
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
Mensajes: 1.314
|
............................ 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: 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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Tengo problemas a la hora de usar el aircrack para conectarme a una red wifi.
Wireless en Windows
|
noize
|
0
|
2,452
|
27 Enero 2012, 20:59 pm
por noize
|
|
|
Programa en c++ que sume segundos en una hora determinada
Programación C/C++
|
dxdiag90
|
7
|
9,849
|
17 Octubre 2012, 00:39 am
por Puntoinfinito
|
|
|
[c]generador de numeros aleatoreos( se puede usar con la hora)
Programación C/C++
|
daryo
|
0
|
1,656
|
22 Septiembre 2013, 17:30 pm
por daryo
|
|
|
tengo un problema de rendimiento a la hora de usar juegos
GNU/Linux
|
KZN
|
4
|
3,179
|
2 Octubre 2014, 15:36 pm
por KZN
|
|
|
Problema a la hora de usar string.h
Programación C/C++
|
aprendiz de programador
|
4
|
2,599
|
30 Enero 2016, 22:12 pm
por MAFUS
|
|