MC102
Algoritmos e Programação de Computadores
Parte XIX
Norton Trevisan Roman
|
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;
- Expressão pode ser qualquer expressão, variável, ou chamada de função.
- Comando é um único comando, ou chamada a um procedimento.
- Se quisermos por mais de um comando no CASE devemos fazer:
CASE expressão OF
valor1 : BEGIN
comando1;
comando2;
...
comandon
END;
valor2, valor3 : BEGIN
comandoj;
...
comandol;
END;
...
valorn : comandom
END;
|
mas isso não é considerado boa programação, pois não gera um código limpo. O ideal é que criemos procedimentos:
PROCEDURE P1
BEGIN
comando1;
comando2;
...
comandon
END;
PROCEDURE P2;
BEGIN
comandoj;
...
comandol
END;
BEGIN
CASE expressão OF
valor1 : P1;
valor2, valor3 : P2;
...
valorn : comandom
END
END.
|
- CASE não aceita coisas do tipo (c é inteiro):
CASE c OF
30..40 : P1
END;
|
mas aceita
CASE c OF
30+40 : P1 {verifica se é igual a 70}
END;
|
‹— Parte XVIII — Página da disciplina — Parte XX —›