Relógio Digital em C? [RESOLVIDO]

1. Relógio Digital em C? [RESOLVIDO]

Luan
luaanx05

(usa Ubuntu)

Enviado em 18/08/2015 - 14:14h

Galera, é o seguint .. tenho esse código de um projeto de relógio digital em C. Bom, no windows ele roda perfeitamente como programado. Porém, gostaria de fazê-lo rodar no linux tbm, mas daí esse código apresenta erro.
O que eu devo mudar exatamente no código, além da biblioteca "windows.h", para que ele rode no linux?

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main (void)
{
int segundos = 0, minutos = 0, horas = 0;

while (1 == 1) {
Sleep (1000);
segundos++;
system("cls");

if (segundos > 59) {
minutos++;
segundos = 0;
}
if (minutos > 59) {
horas++;
minutos = 0;
}
if (horas > 23) {
horas = 0;
}
printf("%d: %d: %d", horas, minutos, segundos);
}

return 0;
}



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/08/2015 - 13:23h

luaanx05 escreveu:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main (void)
{
int segundos = 0, minutos = 0, horas = 0;

while (1 == 1) {
Sleep (1000);
segundos++;
system("cls");

if (segundos > 59) { minutos++; segundos = 0; }
if (minutos > 59) { horas++; minutos = 0; }
if (horas > 23) { horas = 0; }
printf("%d: %d: %d", horas, minutos, segundos);
}

return 0;
}


Esse jeito de fazer (e as adaptações indicadas para Linux, indicadas acima pelos colegas) tem um problema de precisão. Existe um erro cumulativo devido tanto ao fato de que nem sleep() (ou Sleep()) fazerem uma pausa de duração exatamente igual à determinada (podendo tal erro ser para mais ou para menos) quanto pelo fato de que as demais partes do programa também requerem um tempo maior do zero (e variável) para executar, especialmente por conta da execução de comando externo para limpar a tela. Fora dos custos internos, ainda existe a componente externa: uma coisa é executar um programa desse tipo enquanto o computador está ocioso, e outra é fazê-lo quando há outros processos demandando CPU, I/O ou fazendo muito swap de memória.

Provavelmente o programa cronômetro acima foi só um exercício básico de aritmética e uso de blocos condicionais. Contudo, se houver alguma pretensão de usá-lo para medir tempo com maior precisão, ele teria de ter outra forma.

Como já se usa o relógio do sistema operacional para fazer a pausa, acho que não seria problema usá-lo também para pegar uma hora de referência, e depois comparar novos valores de hora com a hora de referência. A forma final ficaria parecida com o seguinte.

#include <time.h>

int main(void){
time_t start, delta;
int h, m, s;

start=time(NULL);
while(true){
delta=time(NULL)-start;
h=(delta/3600)%24;
m=(delta/60)%60;
s=delta%60;
/* Imprime, pausa, etc... */
}
}


Se esse cronômetro tiver erro de precisão, será por culpa do sistema operacional ou do hardware, não pela construção do programa.

3. Re: Relógio Digital em C? [RESOLVIDO]

-
preroeb

(usa Outra)

Enviado em 18/08/2015 - 16:54h

Eu concordo com o colega acima, a alternativa é a função sleep da biblioteca unistd.h. Outra observação é trocar o system("cls") pelo printf("\033c") que também funciona pra limpar a tela. Não é recomendável usar a função system em geral pelas várias razões:
https://stackoverflow.com/a/4622772

Resolvido isso, gostaria de sugerir algumas coisas pra melhorar o programa: na parte do while(1 == 1) você pode deixar como while(1) para simplificar. E você pode mover a linha do sleep e do segundos++ para o final do while, para mostrar o contador a partir do 0: 0: 0.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts