Jump to content

Como fazer um loop com o Case?


Recommended Posts

Posted (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 by nunopicado
Syntax Highlight, Tag
Posted

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.

Posted

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  

Posted (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 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.

Posted

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 

Posted (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 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.

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.