HelpPls Posted February 26, 2018 at 04:43 PM Report #609512 Posted February 26, 2018 at 04:43 PM (edited) Olá Amigos Sou um novato na programação (uso Pascal) e gostaria de saber como se repete o case ate uma certa opção seja escolhida. Tipo: case Bilhete of 1: Begin Crianca := Crianca+1 End; 2: Begin Estudante := Estudante+1 End; 3: begin Adulto := Adulto+1 ; End; 4..98: begin writeln('Opção invalida'); End; //Se fossem escolhidas uma das opções anteriores, voltaria a pedir o case 99: begin //Se fosse escolhida esta opção o código continuaria normalmente End; End; Edited February 26, 2018 at 08:02 PM by nunopicado Syntax Highlight, Tag
nunopicado Posted February 26, 2018 at 07:47 PM Report #609514 Posted February 26, 2018 at 07:47 PM O Case é uma estrutura de controlo, não de repetição. Isto significa que só por si não é possível fazer a repetição a partir do case. O que precisas é usar um ciclo, por exemplo o repeat...until, para validar a inserção de valores, usando depois o case sabendo que os valores estarão sempre dentro dos parâmetros aceitáveis. Exemplo: repeat Write('Tipo de Bilhete: '); ReadLn(Bilhete); if not (Bilhete in [1..3]) // Se a opção não estiver no intervalo correcto, then WriteLn('Opção invalida'); // avisa o utilizador until Bilhete in [1..3]; // Repete até que a opção esteja no intervalo correcto; case Bilhete of // Executa o case sabendo que a opção é válida 1: Inc(Crianca); 2: Inc(Estudante); 3: Inc(Adulto); end; Ou melhor ainda, para evitar valores absolutos repetidos no código: var TiposBilhete: set of Byte; // Variável que guardará as opções permitidas begin TiposBilhete := [1..3]; // Lista de opções permitidas repeat Write('Tipo de Bilhete: '); ReadLn(Bilhete); if not (Bilhete in TiposBilhete) // Se a opção não estiver no intervalo correcto, then WriteLn('Opção invalida'); // avisa o utilizador until Bilhete in TiposBilhete; // Repete até que a opção esteja no intervalo correcto; case Bilhete of // Executa o case sabendo que a opção é válida 1: Inc(Crianca); 2: Inc(Estudante); 3: Inc(Adulto); end; Esta pequena alteração é importante para que, se tiveres de refactorar para ter mais opções, só tenhas de alterar o conjunto uma vez (no primeiro exemplo terias de alterar na condição do if e na do repeat...until. "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.
HelpPls Posted February 26, 2018 at 10:31 PM Author Report #609516 Posted February 26, 2018 at 10:31 PM Obrigado pela resposta. Mas queria que o programa se repeti-se se escolhe-se a opção 1 a 3, apresenta-se uma mensagem de 4 a 98 e executa-se uma linha de codigo se 99. Tentei trocar o 1..3 por 4..98 no teu codigo e repetia-se mas, aparentemente não adicionava mais 1 valor a varíavel
nunopicado Posted February 26, 2018 at 10:40 PM Report #609517 Posted February 26, 2018 at 10:40 PM (edited) Isto? var TiposBilhete: set of Byte; // Variável que guardará as opções permitidas begin TiposBilhete := [1..3, 99]; // Lista de opções permitidas repeat Write('Tipo de Bilhete: '); ReadLn(Bilhete); if not (Bilhete in TiposBilhete) // Se a opção não estiver no intervalo correcto, then WriteLn('Opção invalida'); // avisa o utilizador until Bilhete in TiposBilhete; // Repete até que a opção esteja no intervalo correcto; case Bilhete of // Executa o case sabendo que a opção é válida 1: Inc(Crianca); 2: Inc(Estudante); 3: Inc(Adulto); 99: FazQualquerCoisa; end; Ou o que tu queres é repetir todo o processo enquanto a opção não for 99? var TiposBilhete: set of Byte; // Variável que guardará as opções permitidas begin TiposBilhete := [1..3, 99]; // Lista de opções permitidas repeat repeat Write('Tipo de Bilhete: '); ReadLn(Bilhete); if not (Bilhete in TiposBilhete) // Se a opção não estiver no intervalo correcto, then WriteLn('Opção invalida'); // avisa o utilizador until Bilhete in TiposBilhete; // Repete até que a opção esteja no intervalo correcto; case Bilhete of // Executa o case sabendo que a opção é válida 1: Inc(Crianca); 2: Inc(Estudante); 3: Inc(Adulto); end; until Bilhete = 99; FazQualquerCoisa; Edited February 26, 2018 at 10:42 PM by nunopicado "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.
HelpPls Posted February 26, 2018 at 10:45 PM Author Report #609518 Posted February 26, 2018 at 10:45 PM Gostaria que as variaveis 'criança','estudante' e 'adulto' ganhassem +1 valor a cada vez que o ciclo repete-se essencialmente.Assim no fim consiga dizer quantas crianças,estudantes e adultos compraram bilhetes
HelpPls Posted February 26, 2018 at 11:14 PM Author Report #609519 Posted February 26, 2018 at 11:14 PM Ápos uns teste vi que o ultimo era mesmo o que eu precisava, obrigado!
nunopicado Posted February 26, 2018 at 11:51 PM Report #609520 Posted February 26, 2018 at 11:51 PM (edited) No último, caso tenha ficado dúvida, tens dois ciclos repeat...until. O interno, que já existia nos outros exemplos, serve para validar os dados inseridos. O externo encarrega-se de repetir todo o processo até que a opção escolhida seja a 99, e daí segue o programa. 😉 Edited February 26, 2018 at 11:51 PM by nunopicado "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.
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