Jump to content
EMCM

Reiniciar programa

Recommended Posts

EMCM

Tenho um código com a seguinte seleção:

case tipo of
  	1:tipo2:=1;
  	2:tipo2:=2;
  	3:tipo2:=3;
  	4:tipo2:=4;
  	5:tipo2:=5;
  	6:tipo2:=6;
  	else 
  writeln('Inseriu um número inválido!');
         exit;

Mas, o problema é que quando eu pressiono, por exemplo, o 8 ele apararece a mensagem ('Inseriu um número inválido') e  o programa fecha, devido ao 'exit' que eu coloquei.

Então queria saber se existe alguma forma de o prgram reiniciar que do eu pressiono outro número para alem de 1 a 6!

Desde já obrigado!

Share this post


Link to post
Share on other sites
nunopicado

Pessoalmente tirava daí o exit.

Um ciclo é realmente o mais indicado, e usar um trigger, como uma tecla qualquer, para terminar o ciclo resolve o problema.

exemplo:

repeat
    case tipo of
          1:tipo2:=1;
          2:tipo2:=2;
          3:tipo2:=3;
          4:tipo2:=4;
          5:tipo2:=5;
          6:tipo2:=6;
    else writeln('Inseriu um número inválido!');
    end;
until (tipo>=1) and (tipo<=6);


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

Para o problema apresentado a solução aparente seria a do Nunopicado, no entanto essa solução tem um bug... é que entraria em LOOP pois não volta a receber outro valor para a variavel de teste, TIPO

A minha solução seria a seguinte:

repeat
    tipo:=readkey; {ou readln(tipo); conforme a necessidade}
    case tipo of
          1:tipo2:=1;
          2:tipo2:=2;
          3:tipo2:=3;
          4:tipo2:=4;
          5:tipo2:=5;
          6:tipo2:=6;
    else writeln('Inseriu um número inválido!');
    end;
until (tipo>=1) and (tipo<=6);

Share this post


Link to post
Share on other sites
pwseo

Apenas por uma questão de polémica :P

label retry;
// ...
retry:
tipo := readkey;
case tipo of
  1..6: tipo2 := tipo;
else begin
  writeln('Número inválido!');
  goto retry;
end;

Atenção! Os goto só se devem usar quando se sabe o que se está a fazer, etc etc bla bla bla :)

Share this post


Link to post
Share on other sites
nunopicado

:D

Bem... é no que dá escrever à pressa sem ler o resto do problema! hehehehe

O Passarito tem toda a razão, o input tem de ficar dentro do ciclo.

Pedro: Terreno perigoso esse onde estás a entrar... hehehehe

Mas gostei da ressalva, especialmente do blablabla... Very insightful ;)

PS: Este tópico é uma fonte de bugs...

Se a variável tipo é char (readkey), faltam as pelicas no case... e tipo2=tipo so faria sentido caso tipo2 também fosse: e aí acho que não seria necessária! Ou estou a ver mal outra vez? 8)


"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
passarito
PS: Este tópico é uma fonte de bugs...
:D

Isto é o que dá quando alguém mostra 3 pauzinhos e pergunta, onde é que eu tenho o problema? E Alguém mais entendido faz-lhe uma cabana :)

O teu PS, É TUDO NA MUCHE :)

@Pedro

Em anos de programação em Pascal, sempre descobri uma solução melhor que usar o Label-Goto. Acho que às vezes é falta de procurar uma alternativa mais consistente do que a aparente!

Ainda no exemplo do Pedro... concordo com a linha de pensamento, mas se é para simplificar então não usaria o case.

var tipo:integer;
.....
repeat
    readln(tipo); 
    if tipo in [1..6] then tipo2:=tipo else writeln('Inseriu um número inválido!');
until not tipo in [1..6];

Se é para simplificar, simplificaremos!!!! LOL

Share this post


Link to post
Share on other sites
nunopicado

heheheheh

É muito ano a virar frangos...


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

Como veio ao de cima o assunto do GOTO e a questão original ficou em segundo plano, dividi o tópico.

A discussão do GOTO continua aqui. :cheesygrin:


Knowledge is free!

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.