MC102
Algoritmos e Programação de Computadores
Parte XIX



Norton Trevisan Roman




O COMANDO CASE

Suponha que, em um determinado programa, temos a seguinte interface

  Escolha um planeta:
    (M)ercúrio
    (V)ênus
    (T)erra
    M(a)rte
    (J)úpiter
    (S)aturno
    (U)rano
    (N)etuno
    (P)lutão
  Sua escolha:
	

e queremos processar aentrada, ou seja, ler o caracter do usuário (que pode ser maiúsculo ou minúsculo) e abastecer uma variável com a gravidade do planeta escolhido. Como fazemos isso? Até agora teríamos que fazer:

  PROGRAM Planetas;
  VAR g : real;  {a gravidade}
      p : char;  {o planeta escolhido}

  {mostra a interface e devolve a letra digitada}
  FUNCTION interface : char;
  BEGIN
    writeln('Escolha um planeta:');
    writeln('  (M)ercúrio');
    writeln('  (V)ênus');
    writeln('  (T)erra');
    writeln('  M(a)rte');
    writeln('  (J)úpiter');
    writeln('  (S)aturno');
    writeln('  (U)rano');
    writeln('  (N)etuno');
    writeln('  (P)lutão');
    write('Sua escolha: ');
    readln(interface)
  END;

  BEGIN
    p := interface;

    IF (p='m') OR (p='M') THEN g := 1 {valor fictício}
    ELSE
      IF (p='v') OR (p='V') THEN g := 2
      ELSE
        IF (p='t') OR (p='T') THEN g := 3
	ELSE
	  IF (p='a') OR (p='A') THEN g := 4
	  ELSE
	    IF (p='j') OR (p='J') THEN g := 5
	    ELSE
	      IF (p='s') OR (p='S') THEN g := 6
	      ELSE
	        IF (p='u') OR (p='U') THEN g := 7
		ELSE
		  IF (p='n') OR (p='N') THEN g := 8
		  ELSE
		    IF (p='p') OR (p='P') THEN g := 9
		    ELSE writeln('planeta não existente')
  END.
	

Deve haver um modo melhor de fazer isso não? E tem:

  PROGRAM Planetas;
  VAR g : real;  {a gravidade}
      p : char;  {o planeta escolhido}

  {mostra a interface e devolve a letra digitada}
  FUNCTION interface : char;
  BEGIN
    writeln('Escolha um planeta:');
    writeln('  (M)ercúrio');
    writeln('  (V)ênus');
    writeln('  (T)erra');
    writeln('  M(a)rte');
    writeln('  (J)úpiter');
    writeln('  (S)aturno');
    writeln('  (U)rano');
    writeln('  (N)etuno');
    writeln('  (P)lutão');
    write('Sua escolha: ');
    readln(interface)
  END;

  BEGIN
    p := interface;

    CASE p OF
      'm' : g := 1;
      'v' : g := 2;
      't' : g := 3;
      'a' : g := 4;
      'j' : g := 5;
      's' : g := 6;
      'u' : g := 7;
      'n' : g := 8;
      'p' : g := 9
      else writeln('Planeta inexistente')
    END
  END.
	

Simples não? Assim o case permite testar se uma expressão é um de vários valores. Se nenhum dos valores for igual ao da expressão, o ELSE é ativado. Vale lembrar que, como no IF, esse ELSE é totalmente opcional, se o omitirmos e o usuário digitar uma letra não prevista, o programa simplesmente sai do CASE, passando à próxima linha de programa.

Mas note que nosso programa acima aceita somente letras minúsculas. E se o usuário digitar M? O programa dará a mensagem de "Planeta inexistente".Como fazemos para resolver isso? Uma solução é transformar tudo em minúscula antes de testar, outra é usar o CASE para testar as maiúsculas também:

  PROGRAM Planetas;
  VAR g : real;  {a gravidade}
      p : char;  {o planeta escolhido}

  {mostra a interface e devolve a letra digitada}
  FUNCTION interface : char;
  BEGIN
    writeln('Escolha um planeta:');
    writeln('  (M)ercúrio');
    writeln('  (V)ênus');
    writeln('  (T)erra');
    writeln('  M(a)rte');
    writeln('  (J)úpiter');
    writeln('  (S)aturno');
    writeln('  (U)rano');
    writeln('  (N)etuno');
    writeln('  (P)lutão');
    write('Sua escolha: ');
    readln(interface)
  END;

  BEGIN
    p := interface;

    CASE p OF
      'm','M' : g := 1;
      'v','V' : g := 2;
      't','T' : g := 3;
      'a','A' : g := 4;
      'j','J' : g := 5;
      's','S' : g := 6;
      'u','U' : g := 7;
      'n','N' : g := 8;
      'p','P' : g := 9
      else writeln('Planeta inexistente')
    END
  END.
	

Viu como fazemos um OU dentro do CASE? Com "," separando as opções.

Assim, a forma geral do CASE é:

    CASE expressão OF
      valor1         : comando1;
      valor2, valor3 : comando2;
      ...
      valorn         : comandon
      else comandom
    END;
	

Agora, algumas observações sobre o CASE;





‹— Parte XVIIIPágina da disciplinaParte XX —›