Ir ao conteúdo
  • Cadastre-se

Cronômetro 3 - em horas (crescente)


Posts recomendados

  • Membro VIP

Olá,

Por favor, caso deseje avaliações, poste o código fonte (em vez do ".exe"). :)

No aguardo...

 

Terceira versão simples do programinha de cronômetro crescente no formato hh:mm:ss que fiz em pascal. Vai de 00h:00m:00s a 24h:00m:00s Se houver erros, reportar por favor. Fiz todos os testes, mas nunca se sabe  :)

ANEXO REMOVIDO PELA MODERAÇÃO

Link para o comentário
Compartilhar em outros sites

Acredito que talvez há outras formas de desenvolver, mas por enquanto fico com essa. Processa até 24h. Qualquer bugs/sugestão reportar por favor  ;)


Program Cronometro_Crescente;

 var

 h,m,s: integer; 


 procedure sessentaSegundos;
 begin


  if (h = 0) and (m = 0) and (s < 10) then
  begin
     clrscr;
     gotoxy(35,12);
     textcolor(red);
     write('0',h,'h:0',m,'m:0',s,'s');
     delay(1000);
     s := s + 1;
  end
     else
     begin
         if (h = 0) and (m = 0) and (s >= 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write('0',h,'h:0',m,'m:',s,'s');
          delay(1000);
          s := s + 1;
         end;
     end;


 end;


 procedure sessentaMinutos;
 begin


 if (h = 0) and ((m >= 1) and (m < 10)) and (s < 10) then
 begin
      clrscr;
      gotoxy(35,12);
      textcolor(red);
      write('0',h,'h:0',m,'m:0',s,'s');
      delay(1000);
      s := s + 1;
 end;




     if (h = 0) and ((m >= 1) and (m < 10)) and (s >= 10) then
     begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write('0',h,'h:0',m,'m:',s,'s');
          delay(1000);
          s := s + 1;
     end;
               


         if (h = 0) and ((m >= 10) and (m <= 59)) and (s < 10) then
         begin
             clrscr;
             gotoxy(35,12);
             textcolor(red);
             write('0',h,'h:',m,'m:0',s,'s');
             delay(1000);
             s := s + 1;
         end;




         if (h = 0) and ((m >= 10) and (m <= 59)) and (s >= 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write('0',h,'h:',m,'m:',s,'s');
          delay(1000);
          s := s + 1;
         end;


 end;


 procedure apartirDeUmaHora;
 begin
  if ((h >= 1) and (h < 10)) and (m = 0) and (s < 10) then
  begin
      clrscr;
      gotoxy(35,12);
      textcolor(red);
      write('0',h,'h:0',m,'m:0',s,'s');
      delay(1000);
      s := s + 1;
  end;
         
      if ((h >= 1) and (h < 10)) and (m = 0) and (s >= 10) then
      begin
        clrscr;
        gotoxy(35,12);
        textcolor(red);
        write('0',h,'h:0',m,'m:',s,'s');
        delay(1000);
        s := s + 1;
      end;
         
        if ((h >= 1) and (h < 10)) and ((m >= 1) and (m < 10)) and (s < 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write('0',h,'h:0',m,'m:0',s,'s');
          delay(1000);
          s := s + 1;
         end;
       
         if ((h >= 1) and (h < 10)) and ((m >= 1) and (m < 10)) and (s >= 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write('0',h,'h:0',m,'m:',s,'s');    
          delay(1000);
          s := s + 1;
         end;


       
         if ((h >= 1) and (h < 10)) and ((m >= 10) and (m <= 59)) and (s < 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write('0',h,'h:',m,'m:0',s,'s'); {alterado}
          delay(1000);
          s := s + 1;
         end;
       
       
         if ((h >= 1) and (h < 10)) and ((m >= 10) and (m <= 59)) and (s >= 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write('0',h,'h:',m,'m:',s,'s');
          delay(1000);
          s := s + 1;
         end;


 end;


 procedure apartirDeDezHoras;
 begin
  if ((h >= 10) and (h <= 23)) and (m = 0) and (s < 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write(h,'h:0',m,'m:0',s,'s');
          delay(1000);
          s := s + 1;
         end;
         
         
         {***}
         
         if ((h >= 10) and (h <= 23)) and (m = 0) and (s >= 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write(h,'h:0',m,'m:',s,'s'); {FIM}
          delay(1000);
          s := s + 1;
         end;
         
         if ((h >= 10) and (h <= 23)) and ((m >= 1) and (m < 10)) and (s < 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write(h,'h:0',m,'m:0',s,'s');
          delay(1000);
          s := s + 1;
         end;


       
         if ((h >= 10) and (h <= 23)) and ((m >= 1) and (m < 10)) and (s >= 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write(h,'h:0',m,'m:',s,'s');
          delay(1000);
          s := s + 1;
         end;
       
         if ((h >= 10) and (h <= 23)) and ((m >= 10) and (m <= 59)) and (s < 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write(h,'h:',m,'m:0',s,'s');
          delay(1000);
          s := s + 1;
         end;
       
       
         if ((h >= 10) and (h <= 23)) and ((m >= 10)) and (m <= 59) and (s >= 10) then
         begin
          clrscr;
          gotoxy(35,12);
          textcolor(red);
          write(h,'h:',m,'m:',s,'s');
          delay(1000);
          s := s + 1;
         end;


 end;


 procedure printaAteUmaHoraCravada;
 begin


 if (h = 0) and (m = 0) and (s = 60) then
    begin
        s := 0;
  m := m + 1;
        clrscr;
        gotoxy(35,12);
        textcolor(red);
        write('0',h,'h:0',m,'m:0',s,'s');
        delay(1000);
        s := s + 1;
    end                 
    else
    begin
      if (h = 0) and ((m >= 1) and (m <= 8)) and (s = 60) then
      begin
       s := 0;
 m := m + 1;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write('0',h,'h:0',m,'m:0',s,'s');
       delay(1000);
       s := s + 1;
      end;
    end;
    
      if (h = 0) and ((m >= 9) and (m <= 58)) and (s = 60) then
      begin
       s := 0;
       m := m + 1;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write('0',h,'h:',m,'m:0',s,'s');
       delay(1000);
       s := s + 1;
      end;


    
      if (h = 0) and (m = 59) and (s = 60) then
      begin
       h := 1;
 m := 0;
 s := 0;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write('0',h,'h:0',m,'m:0',s,'s');
       delay(1000);
       s := s + 1;
       m := 0;
      end; {ateUmaHoraCravada}


 end;


 procedure printaAteNoveHorasCravada;
 begin


 if ((h >= 1) and (h < 10)) and (m = 0) and (s = 60) then
      begin
       s := 0;
 m := m + 1;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write('0',h,'h:0',m,'m:0',s,'s');
       delay(1000);
       s := s + 1;
      end;
      
      
      if ((h >= 1) and (h < 10)) and ((m >= 1) and (m <= 8)) and (s = 60) then
      begin
       s := 0;
 m := m + 1;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write('0',h,'h:0',m,'m:0',s,'s');
       delay(1000);
       s := s + 1;
      end;
      
      if ((h >= 1) and (h < 10)) and ((m >= 9) and (m <= 58)) and (s = 60) then
      begin
       s := 0;
 m := m + 1;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write('0',h,'h:',m,'m:0',s,'s');  {u.aqui}
       delay(1000);
       s := s + 1;
      end;
      


      if ((h >= 1) and (h <= 8)) and (m = 59) and (s = 60) then
      begin
       h := h + 1;
       s := 0;
 m := 0;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write('0',h,'h:0',m,'m:0',s,'s');   {u.aqui 2}
       delay(1000);
       s := s + 1;
      end;


 end;


 procedure printaAcimaDeDezHorasCravada;
 begin


 if ((h >= 9) and (h <= 23)) and (m = 0) and (s = 60) then
      begin
       s := 0;
 m := m + 1;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write(h,'h:0',m,'m:0',s,'s');
       delay(1000);
       s := s + 1;
      end;
            
      
      if ((h >= 9) and (h <= 23)) and ((m >= 1) and (m < 10)) and (s = 60) then
      begin
       s := 0;
 m := m + 1;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write(h,'h:0',m,'m:0',s,'s');
       delay(1000);
       s := s + 1;
      end;
      
      if ((h >= 9) and (h <= 23)) and ((m >= 10) and (m <= 58)) and (s = 60) then
      begin
       s := 0;
 m := 0;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write(h,'h:0',m,'m:',s,'s');
       delay(1000);
       s := s + 1;
       m := m + 1;
      end;


    
    if ((h >= 9) and (h <= 23)) and (m = 59) and (s = 60) then
      begin
       h := h + 1;
       s := 0;
 m := 0;
       clrscr;
       gotoxy(35,12);
       textcolor(red);
       write(h,'h:0',m,'m:0',s,'s');
       delay(1000);
       s := s + 1;
      end;


 end;
  
 Begin
    h := 0;
    m := 0;
    s := 0;
  
    clrscr;
    gotoxy(35,12);
    textcolor(red);
    write('0',h,'h:0',m,'m:0',s,'s');
    delay(1000);
    s := s + 1;     


    
  repeat
     
         while (s < 60) do
    begin 
     
         sessentaSegundos; 
        
         sessentaMinutos;
         
         apartirDeUmaHora;
         
         apartirDeDezHoras;                                                                                                                   
                                               
    end;
      
         printaAteUmaHoraCravada;
          
         printaAteNoveHorasCravada;
         
         printaAcimaDeDezHorasCravada;
               
  until(h = 24);
  
  clrscr;
  gotoxy(30,12);
  textcolor(red);
  write('*** 24h DECORRIDAS ***');
     
 End.
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Um dos pontos é que está utilizando o Delay, e isso envolve pelo menos dois pontos:

1) o Delay pode variar de computador para computador (nem sem 1000 = 1 segundo real);

2) apesar de relativamente ser muito pouco, existe uma perda de tempo durante os processos... como os controles dos laçõs, das verificações do ifs etc... ou seja, cada segundo no programa está sendo contato da seguinte forma:
- tempo decorrido para execução de cada comando + 1000 milisegundos.

Obs.: Creio que a perda com a sincronição com "o mundo real" não seja muito grande... mas não deixa de ser um erro de lógica.

 

Mais, por enquanto vamos ignorar "essa possível diferença"... ok?

 

 

Outro ponto é que está sendo executando comandos sem necessidade...

Ex.:

  while (s < 60) do    begin    sessentaSegundos;    sessentaMinutos;    apartirDeUmaHora;    apartirDeDezHoras;                                                                                                                        end;

Se começa com "0", e tem um controle de "60" ciclos, para que executar os 3 últimos comandos dentro desse laço?

 

 

Agora, em relação a lógica para calcular o tempo, eu sugiro de uma forma diferente...

Você meio que está verificado a cada loop em qual se situação se encontra as casas... eu acho que poderia ser apenas contabilizando e adicionando ao segundo. Daí, ao completar 60, soma mais um no minuto... este tem uma verificação interna que se completar 60, soma um na hora... este ao completar 24 soma um ao dia... etc. Entendeu? O "evento de receber um é que exige o controle na casa"...  o programa em execução precisa apenas se preocupa em "contabilizar um segundo (tempo), e somar um ao segundo (variável)"....

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

Bom Simon, vamos lá:

 

* Quanto ao delay, estou ciente do atraso. O problema se resolve com o cálculo básico que o programa leva pra executar diferentes procedures e desse valor tirar e diferença pra que no mínimo fique mais próximo do "mundo real". Apenas uma análise minuciosa.

 

 

 

* A execução dos comandos sem necessidade acontece mesmo, mas não apenas nos três últimos comandos. Na lógica feita, sempre pelos menos 3 comandos dentro do while executarão sem necessidade. Nos primeiros 60min. Um tratamento baseado na situação atual do cronometro em questão durante o processo do programa resolve (embora duplique e tenha mais linhas de códigos, pois já está feito nos procedures).

 

 

while (s < 60) do
    begin
    sessentaSegundos;
    sessentaMinutos;
    apartirDeUmaHora;
    apartirDeDezHoras;                                                                                                                    
   
end;

 

 

* Nesse while há o seguinte controle: a cada 59s, o programa sai do while e printa o minuto/hora cravado/cavada em questão. Quando completar 1min cravado (s=60), sai do laço while e printa 00h:01m:00s no procedure printaAteUmaHoraCravada. Quando completar 1h cravada (s=60), sai do laço while e printa 01h:00m:00s no procedure printaAteUmaHoraCravada e assim por diante conforme a hora seja adicionada. De maneira que a cada 59s, o programa sai do laço while e printa o minuto ou hora cravada em questão em uns dos procedures fora while durante a execução do programa.      

 

 

* "Agora, em relação a lógica para calcular o tempo, eu sugiro de uma forma diferente...

Você meio que está verificado a cada loop em qual se situação se encontra as casas... eu acho que poderia ser apenas contabilizando e adicionando ao segundo. Daí, ao completar 60, soma mais um no minuto... este tem uma verificação interna que se completar 60, soma um na hora... este ao completar 24 soma um ao dia... etc. Entendeu? O "evento de receber um é que exige o controle na casa"...  o programa em execução precisa apenas se preocupa em "contabilizar um segundo (tempo), e somar um ao segundo (variável)"...."

 

* Não consegui pegar a ideia acima. Pode explicar de outra forma!? O controle de segundos, minutos e horas estão sendo tratados normal a cada 60s.

 

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

* Quanto ao delay, estou ciente do atraso. O problema se resolve com o cálculo básico que o programa leva pra executar diferentes procedures e desse valor tirar e diferença pra que no mínimo fique mais próximo do "mundo real". Apenas uma análise minuciosa.

 

Acho que não precisa se preocupar com isso agora... Creio que a diferença entre o tempo do programa e do "mundo real" seja muito pequena (irrisória), não vejo necessidade de cálculos (só apenas em nível didático - acho superválido por sinal)... e tem outra, o próprio ato de calcular já altera a medição, já que demanda também de recursos... ai já viu :)

Uma alternativa que iria propor é usar o relógio do Windows... o Pascal pode ter acessar a ele... provavelmente também vai haver imprecisões, mas não serão acumulativas, como no caso do Delay+processos (essa soma tende a sempre "atrasar mais um pouco" ou "adiantar mais um pouco" a cada loop). Sugiro que use o Delay mesmo, sem calcular nada por enquanto..

 

 

 

 

* A execução dos comandos sem necessidade acontece mesmo, mas não apenas nos três últimos comandos. Na lógica feita, sempre pelos menos 3 comandos dentro do while executarão sem necessidade. Nos primeiros 60min. Um tratamento baseado na situação atual do cronometro em questão durante o processo do programa resolve (embora duplique e tenha mais linhas de códigos, pois já está feito nos procedures).

 

Tem toda razão, resumidamente QUASE SEMPRE HAVERÁ 3 COMANDOS SENDO EXECUTADO SEM NECESSIDADE...

 

 

 

* Nesse while há o seguinte controle: a cada 59s, o programa sai do while e printa o minuto/hora cravado/cavada em questão. Quando completar 1min cravado (s=60), sai do laço while e printa 00h:01m:00s no procedure printaAteUmaHoraCravada. Quando completar 1h cravada (s=60), sai do laço while e printa 01h:00m:00s no procedure printaAteUmaHoraCravada e assim por diante conforme a hora seja adicionada. De maneira que a cada 59s, o programa sai do laço while e printa o minuto ou hora cravada em questão em uns dos procedures fora while durante a execução do programa.   

 

Vamos, lá... então, é que idealizo que você não deveria ter esse controle por "60 segundos", mas sim apenas se preocupando em adicionar "1" a cada 1 segundo (tempo) ao segundo (variável).

Não deve existir loop com controle algum... apenas algo que controle o tempo... cada "casa" deve se autocontrolar...

 

Imagine esse algoritmo (execute de verdade)

- abra a calculadora do Windows;;

- digite "0";

- digite "+";

- digite "1";

- pressione ENTER a cada 1 segundo*. (pode digitar mais rápido, rs)

 

No caso, você está sempre adicionando "1" na casa decimal, correto? o que vai acontecer ao chegar no 9 e adicionar mais 1? O decimal vai para zero, e é enviado um 1 para a próxima casa.... ficando 10 (um e zero... que chamamos de dez)..... e quando chegar a 99 mais 1????? O decimal vai para 0 e envia um para a próxima. A próxima como está com 9, vai para 0 e enviar 1 para a próxima... ficam 100.. por ai vai.

 

Ou seja, é uma EFEITO EM CASCATA e não uma "VERIFICAÇÃO A CADA X SEGUNDO EM CADA CASA".... sacou?

 

 

 

Obs.: O princípio do relógio é exatamente o mesmo, só muda o valor de cada "casa decimal" (como se chama a casa do relógio? rs). A primeira vai até 59 (segundo), a segunda até 59 (minutos), a terceira até 23 (horas), a quarta até 354 (dias) etc.

 

Obs2.: Por enquanto não vai fazer diferença se usar Delay ou qualquer outra forma para contar o tempo, o que está em jogo é a "a alimentação de cada casa e a sua retroverificação".

 

Obs.:2 Para testar, user um Delay menor (ex.: 200 ou 100..) :D.

 

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...