EMCM 0 Posted October 19, 2011 Report Share Posted October 19, 2011 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! Link to post Share on other sites
Diogo24 0 Posted October 19, 2011 Report Share Posted October 19, 2011 Usa um ciclo while e mete uma opção de exit, com este ciclo o programa só termina/fecha quando tu indicares a opção de exit. tens exemplo nesse site. http://www.learn-programming.za.net/programming_pascal_learn06.html espero ter ajudado Link to post Share on other sites
nunopicado 1,247 Posted October 19, 2011 Report Share Posted October 19, 2011 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. Link to post Share on other sites
passarito 58 Posted October 19, 2011 Report Share Posted October 19, 2011 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); Link to post Share on other sites
pwseo 234 Posted October 19, 2011 Report Share Posted October 19, 2011 Apenas por uma questão de polémica 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 Link to post Share on other sites
nunopicado 1,247 Posted October 20, 2011 Report Share Posted October 20, 2011 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. Link to post Share on other sites
passarito 58 Posted October 20, 2011 Report Share Posted October 20, 2011 PS: Este tópico é uma fonte de bugs... 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 Link to post Share on other sites
nunopicado 1,247 Posted October 20, 2011 Report Share Posted October 20, 2011 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. Link to post Share on other sites
thoga31 567 Posted October 20, 2011 Report Share Posted October 20, 2011 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. Knowledge is free! Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now