Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

TJFBarreto

Ciclo Repeat voltar atrás (dúvida)

Mensagens Recomendadas

TJFBarreto

Boas,

Estou a laborar um trabalho e gostaria de saber uma dúvida, o programa corre bem, mas quando selecciono um item de escolha e faz o que é pedido, ele fecha o programa, como faço para que ele não feche e volte ao menu que estava no inicio, penso que seja com um ciclo Repeat..

Aqui fica o código, estou a usar o compilador Pascalzim!

Program Banco;
var escolha, mountante, levantar, pin, confirmacao : integer;
    saldo : real;

Procedure Menu;
  var OperacaoCorrecta: Boolean;
  Begin
  
  Saldo:=0;
  
OperacaoCorrecta:=False;
  	 repeat
  	     clrscr;
  	     gotoxy(35,15);writeln('::::: Caixa Geral de Depositos :::::');
  	     writeln('');
  	     textcolor(white);gotoxy(30,18);writeln('Escolha uma opção');
  	     textcolor(yellow);
  	     gotoxy(30,21);writeln('1 - Consulta de Saldo');
  	     gotoxy(30,22);writeln('2 - Depósitos');
  	     gotoxy(30,23);writeln('3 - Levantamentos');
  	     gotoxy(30,24);writeln('4 - Alterar Codigo Pin');
  	     textcolor(red);
  	     writeln('');
  	     gotoxy(30,26);writeln('5 - Sair');
  	     writeln('');
  	     gotoxy(30,28);textcolor(white); write('Insira a operação que pretende utilizar:'); 
	  readln(escolha);
  	    if (escolha=1) or (escolha=2) or (escolha=3) or (escolha=4) or (escolha=5) then
  	      OperacaoCorrecta:=true
  	     else
  	     begin
  	      clrscr;
  	      writeln('Digitou um opção inválida');
  	      readln;
  	     end
  	until OperacaoCorrecta=true;
End;

Procedure Sair;
  Begin
   clrscr;
   textcolor(white);
    writeln('Escolheu sair do banco...');
    writeln('');
   textcolor(green);
    writeln('Volte sempre!');
  End;

   Procedure Consulta;
   Begin
   
   clrscr;
   textcolor(yellow);
   writeln('Deseja mesmo visualizar o saldo da sua conta?');
   writeln(Saldo:0:2);
   end;
   
   Procedure Deposito;
   Begin
   clrscr;
   textcolor(yellow);
   writeln('Quando deseja depositar na sua conta?');
   readln(mountante);
   Saldo:=Saldo + Mountante;
   textcolor(yellow);
   writeln('Fui depositado ',mountante,' , ficou com ',saldo:0:2);
   end;
   
   Procedure Levantamentos;
   Begin
   clrscr;
   textcolor(yellow);
   writeln('Quando deseja levantar da sua conta?');
   readln(levantar);
   Saldo:=Saldo - levantar;
   textcolor(yellow);
   writeln('Fui levantado ',levantar,' .');
   end;
   
   Procedure Alterarpin;
   Begin
   clrscr;
   repeat
   
     textcolor(yellow);
   	writeln('Escreva o pin que deseja');
   	readln(pin);
   	clrscr;
   	textcolor(yellow);
   	writeln('Escreva o pin novamente');
   	readln(confirmacao);
   	clrscr;
   	writeln('Pin alterado com sucesso');
   until pin=confirmacao;
   End;
   
   
   Procedure Escolhas;
   Begin
   case escolha of
      1:Consulta;
      2:Deposito;
      3:Levantamentos;
      4:Alterarpin;
      5:Sair;
   end;
   end;
   
Begin
   Menu;
   Escolhas; 
End.

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bsccara

O mais simples é eliminar o procedimento 'Escolhas' e colocar o seu conteúdo dentro do código principal, com um 'repeat.. until False' a envolver, e com um Exit depois do procedimento 'Sair'. Tipo :

Begin
  repeat
    Menu;
    case escolha of
        1:Consulta;
        2:Deposito;
        3:Levantamentos;
        4:Alterarpin;
        5:begin
             Sair;
             Exit;
          end;
    end;
   until False;
End.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

É isso mesmo, um ciclo repeat.

Basicamente tens de colocar tudo o que queres repetir dentro do ciclo, e criar uma forma de terminar o ciclo.

Como queres repetir todo o ciclo, podes por exemplo colocar todo o programa principal.

Pessoalmente não me agrada muito que o menu use uma variavel global (aliás, gosto pouco de usar variaveis globais), mas sem entrar agora nessa questão, recomendaria o seguinte:

.
. // bla bla bla, os procedimentos todos, etc.
.

begin // programa principal
   repeat
        Menu;         // são estas duas linhas que devem ficar dentro do repeat
        Escolhas;   
   until escolha = 5;
end.

Com isto, todo o teu programa será repetido até que o utilizador escolha a opção 5.

Em termos genéricos:

REPETE

  Menu;

  Escolhas;

ATÉ QUE A ESCOLHA SEJA 5;


"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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TJFBarreto

Pois até aqui já cheguei e cheguei a fazer isto do repeat, mas quando selecciono uma procedimento ele não o acaba ou não abre, e volta logo para trás...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Não sei porquê mas cheira-me que tem a ver com a situação das variáveis globais...

Esperimenta assim:

No teu procedimento "Escolhas", no fim do procedimento, coloca o seguinte:

Escolha:=0;

Testa isso e depois diz qualquer coisa...


"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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Reparei agora numa coisa.

O teu Saldo:=0; tem de sair de dentro do procedimento Menu, senão vais "perder dinheiro" de cada vez que o menu é iniciado.

Passa essa linha para antes do repeat no menu principal.


"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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

E outra coisa:

Não tens nenhum "travão" nos teus procedimentos das operações. Assim, quando a operação é acabada, ele mostra logo o menu, e não chegas a ver o resultado, parecendo que o procedimentão não entra sequer, ou não chega ao fim (exactamente o que estás a notar).

Mete alguma coisa no fim de cada procedimento que te suspenda o programa antes de reentrar no menu.

por exemplo:

Write('Pressione a tecla <enter> para continuar. . .');
readln;

Põe isto no final de cada procedimento das operações 1 a 4.

PS: Aquele escolha:=0 podes ignorar, não vale a pena!


"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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Volte para trás?

com o until escolha = 5 ele vai sempre repetir até ser essa a escolha, e aí, como não tem nada depois do until, termina o programa.

O que te está a acontecer?

Edit: Atenção que no procedimento sair não podes por o readln; (ou melhor, podes, mas quando fazes Sair, ele ainda fica a pedir mais um enter)


"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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TJFBarreto

Pois, eu tenho isso, mas na opção 1 ele fica no menu inicial, na opção 2 ele abre mas não faz o processamento bem e volta para trás e assim para os outros 2, deve estar algum conflito em algum sitio mas não sei aonde...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Colocaste os readln; nos procedimentos?

Tenho isso testado a funcionar com o teu programa...


"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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

B) Sempre às ordens...


"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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.