Jump to content
Yamix

Cronômetro

Recommended Posts

Yamix

Olá,

Estou começando em pascal, por conta própria, e estou desenvolvendo meu primeiro programa e cada vez mais tento deixar ele complexo, estava quebrando cabeça, tentando fazer com que o cronômetro possa contar minutos e segundos, já tentei muitas coisas, mas não funciona.

Peço a ajuda dos senhores, poderiam me ajudar? 

Program quero_aprender;

 uses crt;
 
 var tempo : integer; 
     tipo,comecar : string;
     
 Begin

	WriteLn('Bem-vindo ao Cronometro');
	Delay(1200);
	WriteLn();
	WriteLn('Para começar o cronometro, pressione S.');
	WriteLn('Caso deseje sair, pressione uma letra diferente');
	Readln(comecar); 
	
	If (comecar = 'S') or (comecar = 's' ) then begin
	   ClrScr;
	   WriteLn(' A contagem do tempo deverá ser feita em segundos ou minutos?');
	   WriteLn(' Escreva SEG para segundos ou MIN para minutos.');
	   ReadLn(tipo);
  End;
	   
	  // CONTAGEM FEITA EM SEGUNDOS 
	   If (tipo = 'SEG') or (tipo = 'seg') then begin
	     WriteLn(' Digite um tempo a ser cronometrado. ');
	     ReadLn(tempo);
	     WriteLn(' O tempo do cronometro foi definido para:',tempo,' segundo(s)');
	     Delay(2000);
	     ClrScr;
	     WriteLn(' Carregando... ');
	     Delay(2000);
	     ClrScr;
	          
	     Repeat
	       WriteLn(' O tempo real do cronometro esta em:',tempo,' segundo(s)');
	       Tempo := tempo - 1;
	       Delay(1000);
		   ClrScr;
	     Until (Tempo = 0);
	   
	     If (Tempo = 0) then begin
	       WriteLn(' O tempo foi cronometrado com sucesso.');
	       Readkey;
	     End;	
	   End; 
	 
	  // CONTAGEM FEITA EM MINUTOS
	     
	    If (tipo = 'MIN') or (tipo = 'min') then begin
	      WriteLn(' Digite um tempo a ser cronometrado. ');
	      ReadLn(tempo);
	      WriteLn(' O tempo do cronometro foi definido para:',tempo,' minuto(s)');
	      Delay(2000);
	      ClrScr;
	      WriteLn(' Carregando... ');
	      Delay(2000);
	      ClrScr;
	          
	      Repeat
	        WriteLn(' O tempo real do cronometro esta em:',tempo,' minuto(s)');
	        Tempo := tempo - 1;
	        Delay(60000);
		    ClrScr;
	      Until (Tempo = 0);
	   
	      If (Tempo = 0) then begin
	        WriteLn(' O tempo foi cronometrado com sucesso.');
	        Readkey;
	      End;
       End;			   
 End.

 

Edited by Gabriel Gomes
Alinhar.

Share this post


Link to post
Share on other sites
nunopicado

Parece estar a funcionar razoavelmente bem para o tipo de programa que é.
A parte de segundos funciona, a parte de minutos também.

O que ele não faz, e talvez seja isso que queres, é que quando mandas iniciar em minutos, ele fosse contando regressivamente os minutos e segundos até ao fim do prazo, é isso?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Yamix

Isso mesmo, já tentei várias coisas, mas eu não consigo.. Eu não inclui no code, essa parte do programa, que conta os minutos e segundos porque nada funcionou, por isso vim pedir ajuda.

Share this post


Link to post
Share on other sites
nunopicado

A questão que te impede de fazer isso é que estás a fazer dois temporizadores diferentes, um que conta segundos, outro minutos.

Para o que queres, a contagem tem de ser sempre em segundos. A apresentação do valor no ecrã é que pode ser desmultiplicado em minutos e segundos.

Assim, podes eliminar o ciclo que conta em minutos, e usa sempre o outro.
Quando o utilizador escolher minutos, multiplicas a escolha dele por 60 e mandas o valor para o ciclo.

Por fim, na parte em que apresentas o tempo que resta no ecrã, usas o "DIV 60" para saber quantos minutos faltam, e o "MOD 60" para verificar quantos segundos faltam, e depois apresentas os valores.

 


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Yamix

Eu ainda não entendi como funciona esse MOD e DIV, entretanto eu entendi a lógica mais ou menos do meu problema, mas ainda sim não consigo escrever ela do jeito certo. Criei outro programa para mim aprender a fazer essa contagem de minutos e segundos, por enquanto tá assim:

Program Pzim ;

 var i,temposeg,tempomin:integer;
 
Begin
 
  writeln('escreva um tempo');
  readln(temposeg);

  // Converto o tempo em segundos para minutos
  temposeg := temposeg * 60;
  writeln(temposeg);
  
  // Aqui fazer a contagem do minutos em segundos
  for i:=60 downto 1 do begin
     delay(100); // está 100 para agilizar o teste
     temposeg:=temposeg -1;
     writeln(temposeg);

 // Quando passar 60 segundos, o tempomin diminuiria em -1
     if (temposeg mod 60 = 0) then begin
       writeln('um minuto se passou');
     end;
  end;
  readkey;
end.
  

Eu sei, que para cada vez que o temposeg fosse um divisor de 60, o meu tempomin deveria diminuir em 1, mas não estou conseguindo escrever isso.  Por favor, teria como desenvolver um code para mim?

Edited by Gabriel Gomes
Alinhar;

Share this post


Link to post
Share on other sites
BHAMF

Assim como o nunopicado disse, tens que fazer a contagem só para segundos. O que tens de fazer é verificar se o tempo é maior que 60, se for, você coloca como 1 minutos, se for maior que 60 duas vezes, 2 minutos, nesse sentido, mais ou menos assim:

[...]
 if tempo > 60 then begin
 tempoM := '1 minuto'; //tempoMinuto : string;
 tempoS := 60; //tempoS := integer;
 repeat
  write('Seu tempo é ', tempoM, 'minuto e ', tempoS, ' segundos.');  
  tempoS := tempoS - 1;
  delay(1000);
  clrscr;
 until (tempoS = 0);
[...]

Ainda poderias, para ajudar na formação do programa para torna-lo mais "complicado", adicionar o comando Window neste código na parte em que ele conta o tempo, deste jeito:

[...]
window(10,3, 60,15);
 repeat
  write('Seu tempo é ', tempoM, 'minuto e ', tempoS, ' segundos.');  
  tempoS := tempoS - 1;
  delay(1000);
  clrscr;
 until (tempoS = 0);
window(1,1, 80,25);
[...]

Diga-nos se tiveres algum progresso :))

15:45 05/01/2018 (Horário de Brasília)

  • Vote 1

Brenio Hallison A.M. Filho

 

Share this post


Link to post
Share on other sites
nunopicado
6 horas atrás, Gabriel Gomes disse:

Eu ainda não entendi como funciona esse MOD e DIV, entretanto eu entendi a lógica mais ou menos do meu problema, mas ainda sim não consigo escrever ela do jeito certo. Criei outro programa para mim aprender a fazer essa contagem de minutos e segundos, por enquanto tá assim:

Eu sei, que para cada vez que o temposeg fosse um divisor de 60, o meu tempomin deveria diminuir em 1, mas não estou conseguindo escrever isso.  Por favor, teria como desenvolver um code para mim?

O uso do mod e div servem apenas para apresentar o tempo no ecrã, e não para determinar quando o tempo reduz.
Exemplo: 

 

program Project1;

uses
  Crt;

var
  TempoMin: Integer = 2;
  TempoSeg: Integer;
  RestamMin: Integer;
  RestamSeg: Integer;

begin
  Write('Quantos minutos? ');
  ReadLn(TempoMin);

  // Converte minutos em segundos, pois a contagem tem de ser sempre em segundos
  TempoSeg := TempoMin * 60;

  // Ciclo
  while TempoSeg >= 0 do
    begin
      // Com o div, consegues apurar quantos minutos completos faltam para o fim do tempo
      RestamMin := TempoSeg div 60;

      // Com o mod, consegues apurar quantos segundos faltam além dos minutos completos
      RestamSeg := TempoSeg mod 60;

      WriteLn('Faltam ', RestamMin, ' minutos e ', RestamSeg, ' segundos');

      // Reduz o tempo
      Dec(TempoSeg);

      Delay(100);
    end;

  WriteLn('Fim');
  ReadLn;
end. 

 

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Yamix

Estou muito agradecido pela ajuda que me deram, agora meu primeiro programa está assim:

{ 20:35 05/01/18
  Meu primeiro programa em pascal, foi finalizado
	Agradeço por me ajudarem a concluir esse trabalho
	Nunopicado e BHAMF.}

Program Cronometro_Pzim;
  
 uses crt;
 
  var Tecla: Char;
      TempoMin: Integer;
      TempoSeg: Integer;
      RestamMin: Integer;
      RestamSeg: Integer;
   
  Begin

      TextColor(15);
      HighVideo;
      WriteLn(' +-------------------------------+');
      WriteLn(' BEM-VINDO AO CRONOMETRO TEST v0.1');
      WriteLn('    DESEJA COMEÇAR O CRONOMETRO?  ');
      WriteLn('          (S)IM OU (N)ÃO          ');
      WriteLn('                                  ');
      WriteLn(' +-------------------------------+');
      GoToXY(17,5);   
		
      ReadLn(tecla); 					      
      If (tecla= 'S') or (tecla ='s') then 
	  Begin 
		ClrScr;
    	WriteLn(' +-------------------------------------+');
		WriteLn('  DIGITE O TEMPO QUE SERA CRONOMETRADO: ');
		WriteLn('             (EM MINUTOS)               ');
        WriteLn('                                        ');
		WriteLn(' +-------------------------------------+');
	    GoToXY(19,4);
      End;

		ReadLn(TempoMin);
        ClrScr;
        TempoSeg := TempoMin * 60;
        While TempoSeg >= 0 do
        Begin
          RestamMin := TempoSeg div 60;
          RestamSeg := TempoSeg mod 60;
          WriteLn(' +-------------------------------------------------------------+');
		  WriteLn('               PARA QUE O CRONOMETRO SE ENCERRE,                ');
          WriteLn('              FALTAM ', RestamMin, ' MINUTO(S) E ', RestamSeg, ' SEGUNDO(S). ');
          WriteLn(' +-------------------------------------------------------------+');
          Dec(TempoSeg);
          Delay(1000);
          ClrScr;
       End;             
     
  End.	

Desejo adicionar mais funções nele, e quem sabe no futuro, poder fazer um cronometro digital em pascal, usando uses graph..

PS.: Agradeço de novo, por me ajudarem.

Edited by Gabriel Gomes
Alinhar;

Share this post


Link to post
Share on other sites
nunopicado

Onde tens TempoMin: Integer = 2;, podes remover o = 2. Foi apenas um teste, e depois esqueci-me de tirar! ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Yamix

Melhorei o meu programa, agora está assim:

{ 20:35 05/01/18
  Primeira versão do cronometro GTEST v0.1:

  Meu primeiro programa em pascal, foi finalizado
	Agradeço por me ajudarem a concluir esse trabalho
	Nunopicado e BHAMF.

}


{ 11:49 10/01/18
  Nova versão do cronometro GTEST v0.2:

  - Correção de alguns bugs, que estavam tornando o script inviável;
  - Agora são os procedimentos, que fazem todo o script;
  - Novo função de poder re-utilizar o cronometro sem precisar recomeçar o script;
  - Agora quando o tempo do cronometro, um som é emitido.

}


Program Cronometro_GTEST;

 Uses crt;

  Var Tecla : String;
      Tecla2: String;
      TempoMin: Integer;
      TempoSeg: Integer;
      RestamMin: Integer;
      RestamSeg: Integer;

   Procedure DesenharMenu;
   Begin
     TextColor(15);
     HighVideo;
     ClrScr;
     GoToXY(1,10);
     WriteLn(' +----------------------------------------------------------------------------+');
     WriteLn('                        BEM-VINDO AO CRONOMETRO GTEST v0.2                     ');
     WriteLn('                           DESEJA COMECAR O CRONOMETRO?                        ');
     WriteLn('                                 (S)IM OU (N)AO                                ');
     WriteLn('                                                                               ');
     WriteLn(' +----------------------------------------------------------------------------+');
     GoToXY(41,14);
   End;

   Procedure VerificaTecla;
   Begin
	 ReadLn(Tecla);
	 Tecla := UpCase(Tecla);
   End;

   Procedure PegaTempo;
   Begin
	 If (Tecla = UpCase('S')) then
	 Begin
	   ClrScr;
	   GoToXY(1,10);
       WriteLn(' +----------------------------------------------------------------------------+');
       WriteLn('                        DIGITE O TEMPO QUE SERA CRONOMETRADO:                  ');
       WriteLn('                                   (EM MINUTOS)                                ');
	   WriteLn('                                                                               ');
	   WriteLn(' +----------------------------------------------------------------------------+');
	   GoToXY(41,13);
	 End;
   End;

   Procedure Cronometro;
   Begin
	 ReadLn(TempoMin);
	 While (TempoMin <= 0) do
	 Begin
	   ClrScr;
	   GoToXY(1,10);
	   WriteLn(' +----------------------------------------------------------------------------+');
       WriteLn('                  DIGITE UM TEMPO MAIOR QUE 0 PARA SER CRONOMETRADO:           ');
       WriteLn('                                   (EM MINUTOS)                                ');
	   WriteLn('                                                                               ');
	   WriteLn(' +----------------------------------------------------------------------------+');
       GoToXY(41,13);
       ReadLn(TempoMin);
	 End;
	 If (TempoMin > 0) then
	 Begin
       TempoSeg := TempoMin * 60;
       While (TempoSeg >= 60) do
       Begin
         ClrScr;
         RestamMin := TempoSeg div 60;
         RestamSeg := TempoSeg mod 60;
         GoToXY(1,11);
         WriteLn(' +----------------------------------------------------------------------------+');
	     WriteLn('                       PARA QUE O CRONOMETRO SE ENCERRE,                       ');
         WriteLn('                      FALTAM ', RestamMin, ' MINUTO(S) E ', RestamSeg, ' SEGUNDO(S). ');
         WriteLn(' +----------------------------------------------------------------------------+');
         Dec(TempoSeg);
         Delay(1000);
         ClrScr;
       End;
       While (TempoSeg < 60) and (TempoSeg > 10) do
       Begin
         ClrScr;
         RestamSeg := TempoSeg mod 60;
         GoToXY(1,11);
         WriteLn(' +----------------------------------------------------------------------------+');
		 WriteLn('                        PARA QUE O CRONOMETRO SE ENCERRE,                      ');
         WriteLn('                               FALTAM ', RestamSeg, ' SEGUNDO(S).        ');
         WriteLn(' +----------------------------------------------------------------------------+');
         Dec(TempoSeg);
         Delay(1000);
         ClrScr;
       End;
       While (TempoSeg <= 10) and (TempoSeg > 0) do
       Begin
         ClrScr;
         RestamSeg := TempoSeg mod 60;
         TextColor(12);
         GoToXY(1,11);
         WriteLn(' +----------------------------------------------------------------------------+');
		 WriteLn('                        PARA QUE O CRONOMETRO SE ENCERRE,                      ');
         WriteLn('                               FALTAM ', RestamSeg, ' SEGUNDO(S).        ');
         WriteLn(' +----------------------------------------------------------------------------+');
         Dec(TempoSeg);
         Delay(1000);
         ClrScr;
       End;
     End;
   End;

   Procedure DesenhaFim;
   Begin
	 If (TempoSeg = 0) then
     Begin
       TextColor(15);
       Sound(300);
       delay(150);
       Sound(0);
       GoToXY(1,10);
       WriteLn(' +----------------------------------------------------------------------------+');
       WriteLn('                       O TEMPO DO CRONOMETROU SE ENCERROU                      ');
       WriteLn('                   DESEJA COMECAR UM NOVO TEMPO NO CRONOMETRO?                ');
       WriteLn('                                (S)IM OU (N)AO                                 ');
       WriteLn('                                                                               ');
       WriteLn(' +----------------------------------------------------------------------------+');
       GoToXY(40,14);
	   ReadLn(tecla2);
       Tecla2 := UpCase(tecla2);
	 End;
  End;

   Procedure RestartCronometro;
   Begin
	 While (tecla2 = upcase('s')) do
	 Begin
	   Pegatempo;
	   Cronometro;
	   DesenhaFim;
	 End;
   End;

 Begin

   DesenharMenu;
   VerificaTecla;
   While (Tecla <> upcase('S')) do exit;
   Pegatempo;
   Cronometro;
   DesenhaFim;
   RestartCronometro;

 End.

É interessante mostrar, como eu evoluí o programa, com base no que vou aprendendo com o tempo. Isso pode ser útil para algum iniciante, caso queira aprender como usar os procedimentos, ou funções que a própria biblioteca "CRT" oferece.

Edited by Gabriel Gomes
Alinhar;

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.