Ir ao conteúdo
  • Cadastre-se

Como usar else depois do case


Posts recomendados

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.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...