Ir ao conteúdo
  • Cadastre-se
Thetheu Diias

Como usar else depois do case

Recommended Posts

Salve rapaziada! boa noite! Minha dúvida é o seguinte: Como utilizar o comando REPEAT depois do ELSE dentro CASE OF. Sou novato e estou estudando em Pascal. No entanto surgiu está dúvida pois o laço de repetição não está funcionando. Estou criando um programa para calcular o consumo e despesas efetuada por um viajante em um determinado carro abastecido por um total de litros de um combustivel X de valor Y. a estrutura seguinte do programa se encontra nesta posição:

PROGRAM Consumo;
uses crt;

VAR
        valor, km, opcao, consumo, despesa: real;
        litros: integer;
        comb: integer;

BEGIN

        WRITELN(' COMBUSTIVEL');
                WRITELN;
        WRITELN('> [1] - GASOLINA');
        WRITELN('> [2] - ALCOOL');
        WRITELN('> [3] - DIESEL');
              WRITELN;
            WRITE('SELECIONE O TIPO DE COMBUSTIVEL: ');
              READ(comb);
            WRITELN;
            
     CASE comb OF
         1: WRITELN('COMBUSTIVEL SELECIONADO: GASOLINA');
         2:WRITELN('COMBUSTIVEL SELECIONADO: ALCOOL');
         3: WRITELN('COMBUSTIVEL SELECIONADO: DIESEL');
   ELSE
      REPEAT
            WRITELN('COMBUSTIVEL SELECIONADO: INVÁLIDO');
               WRITELN('SELECIONE O TIPO DE COMBUSTIVEL: ');

                 READ(comb);

  UNTIL (comb < 1) and (comb >= 4);
         END;

   

WRITELN;
         WRITE('INFORME O VALOR DO COMBUSTIVEL: ');
             READ(valor);
        WRITELN;
        WRITE('INFORME A QUANTIDADE DE LITROS ABASTECIDA: ');
            READ(litros);
        WRITELN;
        WRITE('INFORME A QUILOMETRAGEM  PERCORRIDA: ');
            READ(km);
        WRITELN;
     

      consumo := (km / litros);
      despesa := (valor * litros);
        
        IF (comb = 1) THEN
      begin
          WRITELN('COMBUSTIVEL: GASOLINA');
          WRITELN('VALOR DO COMBUSTIVEL: R$', valor:2:2, ' REAIS');
          WRITELN('LITROS: ', litros:2:1);
          WRITELN('DISTANCIA: ',km:3:2, ' KM');
          WRITELN('CONSUMO: ', consumo:2:2,' KM POR LITROS DE COMBUSTIVEL');
          WRITELN('DESPESA: R$', despesa:2:2, ' REAIS');    
      end;
         IF (comb = 2) THEN
      begin
            WRITELN('COMBUSTIVEL: ALCOOL');
            WRITELN('VALOR DO COMBUSTIVEL: R$', valor:2:2, ' REAIS');
            WRITELN('LITROS: ', litros:2:1);
            WRITELN('DISTANCIA: ',km:3:2, ' KM');
            WRITELN('CONSUMO: ', consumo:2:2,' KM POR LITROS DE COMBUSTIVEL');
            WRITELN('DESPESA: R$', despesa:2:2, ' REAIS');         
      end;
        IF (comb = 3) THEN
      begin
            WRITELN('COMBUSTIVEL: DIESEL');
            WRITELN('VALOR DO COMBUSTIVEL: R$', valor:2:2, ' REAIS');
            WRITELN('LITROS: ', litros:2:1);
            WRITELN('DISTANCIA: ',km:3:2, ' KM');
            WRITELN('CONSUMO: ', consumo:2:2,' KM POR LITROS DE COMBUSTIVEL');
            WRITELN('DESPESA: R$', despesa:2:2, ' REAIS');        
      end;

READKEY;
    END.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Thetheu Diias.

 

1) Use readln(), em vez de read()

Resumidamente: troque todos os read por readln.

Um pouco sobre aqui:

 

2) Evite CAIXA ALTA

Ou seja, o uso de texto em MAIÚSCULO é de certo modo desagradável para leitura. Em certo contexto, parece que está gritando.

Abaixo seu código reindentado... veja a diferença.

 

program Consumo;
uses
  CRT;
var
  valor, km, opcao, consumo, despesa: real;
  litros: integer;
  comb: integer;
BEGIN
writeln(' Combustivel');
writeln;
writeln('> [1] - Gasolina');
writeln('> [2] - Alcool  ');
writeln('> [3] - diesel  ');
writeln;
write('Selecione o tipo de combustivel: ');
read(comb);
writeln;
case comb of
  1:writeln('Combustivel selecionado: gasolina');
  2:writeln('Combustivel selecionado: alcool');
  3:writeln('Combustivel selecionado: diesel');
  else
    repeat
      writeln('Combustivel selecionado: inválido');
      writeln('selecione o tipo de combustivel: ');
      read(comb);
    until (comb < 1) and (comb >= 4);
  end; //fim case
writeln;
write('Informe o valor do combustivel: ');
read(valor);
writeln;
write('Informe a quantidade de litros abastecida: ');
read(litros);
writeln;
write('Informe a quilometragem  percorrida: ');
read(km);
writeln;
consumo:=(km / litros);  //obs.: esses "( )" são facultativos.
despesa:=(valor * litros);
if (comb = 1) then
  begin
  writeln('combustivel: gasolina');
  writeln('valor do combustivel: r$', valor:2:2, ' reais');
  writeln('litros: ', litros:2:1);
  writeln('distancia: ',km:3:2, ' km');
  writeln('consumo: ', consumo:2:2,' km por litros de combustivel');
  writeln('despesa: r$', despesa:2:2, ' reais');    
  end;
if (comb = 2) then
  begin
  writeln('combustivel: alcool');
  writeln('valor do combustivel: r$', valor:2:2, ' reais');
  writeln('litros: ', litros:2:1);
  writeln('distancia: ',km:3:2, ' km');
  writeln('consumo: ', consumo:2:2,' km por litros de combustivel');
  writeln('despesa: r$', despesa:2:2, ' reais');         
  end;
if (comb = 3) then
  begin
  writeln('combustivel: diesel');
  writeln('valor do combustivel: r$', valor:2:2, ' reais');
  writeln('litros: ', litros:2:1);
  writeln('distancia: ',km:3:2, ' km');
  writeln('consumo: ', consumo:2:2,' km por litros de combustivel');
  writeln('despesa: r$', despesa:2:2, ' reais');        
  end;
ReadKey;
END.

 

3) Else do case

 

Em 19/11/2016 às 23:18, Thetheu Diias disse:

Como utilizar o comando REPEAT depois do ELSE dentro CASE OF

O mais correto seria dizer "dentro do else". "Depois" dá a entender que é fora!, ou seja, teriam-se um else, com os seus códigos, e após ele teria um repeat, o que não é o caso.

 

Então, a estrutura me parece correta. O que pode está dando problema é o que eu citei no item 1). Substitua todos os read por readln e faça outros testes.

 

3.1) Estrutura do case

Tomemos o exemplo abaixo como base:
 

case comb of
  1:begin
    writeln('combustivel selecionado: gasolina');
    xxx
    xxx
    end;
  2:begin
    writeln('combustivel selecionado: alcool');
    xxx
    xxx
    xxx
    xxx   
    end;
  3:writeln('combustivel selecionado: diesel');
  else
    repeat
      writeln('combustivel selecionado: inválido');
      writeln('selecione o tipo de combustivel: ');
      read(comb);
    until (comb < 1) and (comb >= 4);
  end; //fim case

Perceba que caso queiramos colocar "mais de uma instrução" dentro de cada "caso", é necessário inserir um begin/end. Dá mesma forma que precisaríamos colocar se fosse para um if por exemplo, ou seja, "Para uma linha, bota direto. Mais de uma linha, insere o begin/end".

 

Por curiosidade, o else do case foge a "essa regra", ou seja, não sendo necessário um begin/end dentro dele. Se você colocar mais 10 linhas, por exemplo, depois do until, o else vai funcionar normalmente.

Obs.: só para ficar claro... esse repeat dentro do else conta como uma instrução só, não importando quantas linhas tem entre ele o until.

 

4) IF x IF/ELSE

Para os if dos "comb" ali embaxio, é necessário utilizar a estrutura de if/else neles (em vez de vários if simples), pois são "condições mutuamente exclusivas entre si", ou seja, se for uma opção, não vai ser a outra...Por exemplo,  se for a opção 2, não poderá mais ser a opção 3, logo não fazendo mais sentido verificar os posteriores. (não utilizar o else pode ser considerado erro de lógica).

 

***

 

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×