Donde <expr> es la expresión a evaluar y <val1>, <val2>, ... <val-n> son valores de entre los que puede tomar esa expresión, y para cada valor se ejecutará el bloque correspondiente. Como los valores pueden repetirse, se pueden ejecutar uno o más de los bloques, o bien ninguno.
Nótese que el Case termina siempre con un End;, a pesar de que no tiene Begin.
Nótese que la parte del Else es opcional, al igual que en el If, y su bloque asociado sólo se ejecuta si la expresión toma un valor para el cual no se ha especificado un bloque de código. Sin embargo, si se usara el Else, el último bloque sobre él debe llevar un punto y coma al final de su última línea, a diferencia de como es en el If.
Veamos el siguiente ejemplo:
Program Case;
Uses
CRT;
Var
opcion:char;
Begin
CLRSCR;
Writeln ('Opción: 1 ');
Writeln ('Opción: 2 ');
Writeln ('Opción: 3 ');
Write ('Escoge una opción: ');
Readln (opcion);
Case opcion Of
'1': Writeln ('Escogiste la opción: 1');
'2': Writeln ('Escogiste la opción: 2');
'3': Writeln ('Escogiste la opción: 3');
Else
Writeln ('Escogiste una opción no valida');
End;
Readln;
End.
El ejemplo anterior nos presenta un pequeño menú con 3 opciones a escoger, si escogemos la opción 1, y por tanto le damos a la variable opcion el valor de uno, entonces se ejecutaron las instrucciones que corresponden al caso de que la variable sea igual a 1, si escogemos la opción 2, entonces se ejecutarán las instrucciones que corresponden al caso de que la variable sea igual a 2, etc.
Dentro de cada caso que tenga la expresión podemos ejecutar una o más instrucciones, incluyendo bloques If y anidar bloques Case si nos fuera necesario.
Otro ejemplo:
Program Directorio;
Uses
Crt;
Var
Piso: Integer;
Negocio: String;
Begin
Write ('Número de piso: ');
Readln (Piso);
Case Piso Of
1: Negocio:= 'Microsoft';
2: Negocio:= 'Compaq';
End;
If Negocio <> '' Then
Writeln ('El negocio en el piso ', Piso, ' es: ', Negocio)
Else
Writeln ('Este edificio sólo tiene dos pisos');
End.
El programa trabaja como sigue: según sea el piso escogido, se guardan los nombres de los negocios en ese piso en una variable de tipo String. Luego, se consulta el valor de esa variable: si es nula (''), no se le asignó valor en el Case y entonces el número de piso no es válido y se imprime el mensaje del Else. En caso contrario, se muestran los negocios en ese piso.
Sin embargo, esta no es más que una pequeña muestra en el poder del Case. En efecto, una extensión a su sintaxis de valores le permite ejecutar un mismo bloque de código para un rango de valores de la expresión:
Case X Of
1..5 : Write ('Entre 1 y 5');
7 : Write ('Siete');
End;
La idea es colocar dos expresiones separadas por punto punto (..); si el valor de la expresión evaluada por el Case (en este caso el valor de la variable X) está comprendido en este rango, se ejecuta este bloque.
Una última consideración sobre el Case es que la expresión a ser evaluada debe producir siempre un resultado entero, o un carácter:
Case X Of
'A'..'Z', 'a'..'z': Write ('Letra');
'0'..'9' : Write ('Número');
Else
Write ('Carácter especial');
End;
Aquí a es una variable del tipo Char. Como se ve además en este ejemplo, se pueden colocar más de un rango en un solo bloque, como se ha hecho con las letras (ya que la computadora interpreta las mayúsculas y las minúsculas de formas distintas).
Otro ejemplo:
Program Case;
Uses
CRT;
Var
letra:char;
Begin
CLRSCR;
Write ('Escriba un símbolo: ');
Readln (letra);
Case letra Of
' ': Writeln ('Un espacio');
'A'..'Z', 'a'..'z': Writeln ('Una letra');
'0'..'9': Writeln ('Un dígito');
'+', '-', '*', '/': WriteLn('Un operador');
Else
Writeln ('No es espacio, ni letra, ni dígito, ni operador');
End;
Readln;
End.
Otro ejemplo:
Program Areas;
Uses
CRT;
Var
area,L,B,N:real;
opcion:integer;
Begin
CLRSCR;
Writeln ('1.- Area Triangulo');
Writeln ('2.- Area Rectángulo');
Writeln ('3.- Area Cuadrado');
Writeln ('4.- Salir');
Write ('Ingrese opción: ');
Readln (opcion);
Case opcion Of
1: Begin
Write ('Ingrese base: ');
Readln (B);
Write ('Ingrese altura: ');
Readln (N);
area:=(B*N)/2;
Writeln ('El Area es: ',area:8:4);
End;
2: Begin
Write ('Ingrese base: ');
Readln (B);
Write ('Ingrese altura: ');
Readln (N);
area:=B*N;
Writeln ('El Area es: ',area:8:4);
End;
3: Begin
Write ('Ingrese lado: ');
Readln (L);
area:=Sqr(L);
Writeln ('El Area es: ',area:8:4);
End;
4: Writeln ('Hasta luego');
Else
Writeln ('Opcion Invalida');
End;
Readln;
End.
|