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.