La estructura if-then-else, nos da la capacidad de poder escoger entre dos alternativas, en función del valor de una condición. Pero la estructura Case-of nos permite elegir una alternativa de entre varias. Case of, se puede interpretar como : “En caso de que la alternativa tome un cierto valor, se ejecutará la instrucción o instrucciones correspondiente al valor tomado”. El programa de ejemplo que veremos a continuación, nos mostrara el uso de la estructura Case-of. El programa consistirá en pedirnos por teclado dos números, y después nos pedirá la operación a realizar de acuerdo a la siguiente tabla:

Operación Descuento
1 Suma los dos números ingresados
2 Resta los dos números ingresados
3 Multiplica los dos números ingresados
4 Divide los dos números ingresados

A continuación el ejemplo:

En este ejemplo la variable operación, recibe el nombre de selector. El selector debe ser un tipo de dato entero, carácter, string, booleano, enumerado o subrango, es decir no se puede usar un tipo de dato real. Los números que aparecen en las líneas debajo de la palabra Case, se denominan etiquetas. Cada etiqueta viene seguida de dos puntos, y a continuación de una instrucción o bloque de instrucciones se debe colocar un punto y coma (;), a excepción de la última etiqueta.

Cuando se ejecuta una estructura Case-of, se evalúa el selector y su valor se compara, con cada una de las distintas etiquetas. Si una de las etiquetas es igual al valor del selector, entonces se ejecuta la instrucción asociada a esa etiqueta. Una vez terminada la instrucción elegida, se considera finalizado el trabajo de la estructura Case-of, pasando a ejecutar la instrucción siguiente. En el programa si el selector recibe el valor 2, entonces ejecutará las instrucciones asociadas a la etiqueta 2.

Cuando ninguna de las etiquetas coincide con el valor del selector, se ejecutará las instrucciones correspondientes al else, que en este ejemplo, mostrará el mensaje :”No hay resultado, ingrese una operación”. No obstante el else; es opcional, y si no estuviera presente pasara a ejecutar la siguiente instrucción del programa. Una etiqueta puede ser una lista de valores separadas por comas, o un subrango de valores, o una mezcla de ambos. Por ejemplo podemos hacer un programa que nos permita imprimir la categoría a la que corresponde un estudiante de acuerdo a la siguiente tabla:

Calificación Categoria
81 .. 100 A
61 .. 80 B
41 .. 60 C
21 .. 40 D
00 .. 20 E

El programa se puede hacer usando la estructura Case-of, usando en las etiquetas los subrangos de las calificaciones del alumno, a continuación el ejemplo:

El programa anterior es más legible a diferencia de escribirlo encadenando las estructuras if-then-else. Otro ejemplo más del uso de la estructura Case of, lo muestro con el siguiente programa:

El programa permite saber si se ingreso desde el teclado una letra mayúscula o minúscula, para ello hacemos uso de los subrangos, pero en este caso de caracteres. El código 165 representa la letra Ñ mayúscula y el código 164 la letra ñ en minúscula, pero en la codificación de caracteres IBM 437; por lo tanto hay que modificar la codificación de caracteres del intérprete de comandos para que el programa funcione; usar chcp 437 en Windows y en Linux usar el menú del terminal de Gnome: Terminal->Establecer codificación de caracteres.

Existen situaciones en las que el análisis de un problema que se quiere resolver, nos conduce a usar un conjunto de condiciones muy amplio. Por ejemplo, se desea hacer un programa que realice descuentos al cliente, por la compra de uno de los tres productos que se venden en la tienda, de acuerdo a la siguiente tabla de decisiones:

  Productos Descuentos
A B C
D
E
C
I
S
I
O
N
E
S
N N N 0.00%
N N S 1.00%
N S N 2.00%
N S S 3.00%
S N N 4.00%
S N S 5.00%
S S N 6.00%
S S S 7.00%

N significa no compra y S si compra, en la tabla de decisiones se puede observar que cuando el cliente compra el producto A y el producto B, obtiene un descuento del 6%, y cuando compra todos los productos obtiene un descuento del 7%.

Una primera solución, es usar la estructura if-then del siguiente modo:

If ((A='N') and (B='N') and (C='S')) then desc:=0.01;
If ((A='N') and (B='S') and (C='N')) then desc:=0.02;
If ((A='N') and (B='S') and (C='S')) then desc:=0.03;
If ((A='S') and (B='N') and (C='N')) then desc:=0.04;
If ((A='S') and (B='N') and (C='S')) then desc:=0.05;
If ((A='S') and (B='S') and (C='N')) then desc:=0.06;
If ((A='S') and (B='S') and (C='S')) then desc:=0.07;

Pero, haciendo una observación más exhaustiva y cambiando los valores S y N, por 1 y 0 respectivamente. Obtendremos una combinación de dígitos binarios que van desde 0 a 7, esto nos permite convertir las combinaciones N y S, en valores numéricos que puede evaluar la estructura Case-of, del siguiente modo:

a:=0; b:=0; c:=0;
if PA='S' then a:=1;
if PB='S' then b:=1;
if PC='S' then c:=1;
n:=(a shl 2) + (b shl 1) + c;
Case n of
   0 : desc :=0.00;
   1 : desc :=0.01;
   2 : desc :=0.02;
   3 : desc :=0.03;
   4 : desc :=0.04;
   5 : desc :=0.05;
   6 : desc :=0.06;
   7 : desc :=0.07;
End;

Como podrán observar se usan las variables PA,PB,PC para determinar el producto elegido, y las variables a,b,c para realizar la conversión numérica. El compilador siempre generará código que permite ejecutar más rápido una estructura Case-of, a diferencia de usar las estructuras if-then-else. A continuación el programa completo de ejemplo:

El ejemplo descrito es muy útil cuando la tabla de decisiones, está limitada a usar sólo dos posibles valores. Pero el ejemplo anterior, también se puede hacer mucho mejor con el uso de banderas y el operador or, permitiendo acelerar en cuestión de nanosegundos los resultados, cambiando las instrucciones para la obtención del valor de n, a continuación el programa de ejemplo:

Del ejemplo anterior las variables a, b y c, serían las banderas para luego usando el operador or juntar o unir las banderas, y de esa manera obtener el valor de n. El siguiente programa es un ejemplo del uso de string con la estructura case.