BotonMenu
BotonIndice

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


4. ESTRUCTURAS DE CONTROL.
4.3. ESTRUCTURA DE CONTROL CASE-OF.
4. ESTRUCTURAS DE CONTROL.
4.3. ESTRUCTURA DE CONTROL CASE-OF.
4. ESTRUCTURAS DE CONTROL.
4.3. ESTRUCTURA DE CONTROL CASE-OF.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Estructura de control Case-of.

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:


Descargar
{$codepage UTF8}

VAR num01,num02 : Double;
    resultado : Double;
    operacion : byte;

BEGIN
 Write('num01 : ');
 Readln(num01);
 Write('num02 : ');
 Readln(num02);
 Write('operacion : ');
 Readln(operacion);
 Case operacion of
    1 : Begin
          resultado:=num01+num02;
          Writeln('resultado = ',resultado:10:3)
        End;
    2 : Begin
          resultado:=num01-num02; 
          Writeln('resultado = ',resultado:10:3)
        End;
    3 : Begin
          resultado:=num01*num02;
          Writeln('resultado = ',resultado:10:3)
        End;
    4 : Begin
          resultado:=num01/num02;
          Writeln('resultado = ',resultado:10:3)
        End
    else  Writeln('No hay resultado, ingrese una operacion')
 End; //Fin de la estructura case.
 Readln
END.
Código fuente 6: Ejemplo del uso de Case of.
Descargar

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:


Descargar
{$codepage UTF8}

VAR Calificacion : Integer;

BEGIN
 Write('Ingrese la Calificacion del alumno :');
 Readln(Calificacion);
 Case Calificacion of
   90..100 : Writeln('A');
   80..89  : Writeln('B');
   70..79  : Writeln('C');
   60..69  : Writeln('D');
    0..59  : Writeln('E')
 End;
END.
Código fuente 7: Ejemplo de Case of con subrangos.
Descargar

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:


Descargar
{$codepage UTF8}

VAR letra : Char;

BEGIN
 Write('Ingrese una letra :');
 Readln(letra);
 Case letra of
   'A'..'Z',#165 : Writeln('Ingresaste una mayuscula');
   'a'..'z',#164 : Writeln('Ingresaste una minuscula') 
 End;
END.
Código fuente 8: Ejemplo de Case of con subrangos de caracteres.
Descargar

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:


Descargar
{$codepage UTF8}

VAR PA,PB,PC : Char;
    PrecioA,PrecioB,PrecioC,Desc,Total:Single;
    a,b,c,n : byte;

BEGIN
 Write('Producto A :');Readln(PA);
 Write('Producto B :');Readln(PB);
 Write('Producto C :');Readln(PC);
 a:=0;b:=0;c:=0;Desc:=0;
 PrecioA:=0;PrecioB:=0;PrecioC:=0;
 if PA='S' then Begin a:=1;PrecioA:=200 End;
 if PB='S' then Begin b:=1;PrecioB:=300 End;
 if PC='S' then Begin c:=1;PrecioC:=400 End;
 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;
 Total:=PrecioA+PrecioB+PrecioC;
 Writeln('SubTotal ',Total:10:3);
 Writeln('Descuento ',Total*Desc:10:3);
 Total:=Total-(Total*Desc);
 Writeln('Total ',Total:10:3)
END.
Código fuente 9: Ejemplo Tabla de decisiones usando Case of.
Descargar

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:


Descargar
{$codepage UTF8}

VAR PA,PB,PC : Char;
    PrecioA,PrecioB,PrecioC,Desc,Total:Single;
    a,b,c,n : byte;

BEGIN
 Write('Producto A :');Readln(PA);
 Write('Producto B :');Readln(PB);
 Write('Producto C :');Readln(PC);
 a:=0;b:=0;c:=0;Desc:=0;
 PrecioA:=0;PrecioB:=0;PrecioC:=0;
 if PA='S' then Begin a:=%100;PrecioA:=200 End;
 if PB='S' then Begin b:=%010;PrecioB:=300 End;
 if PC='S' then Begin c:=%001;PrecioC:=400 End;
 n:=a or b or 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;
 Total:=PrecioA+PrecioB+PrecioC;
 Writeln('SubTotal ',Total:10:3);
 Writeln('Descuento ',Total*Desc:10:3);
 Total:=Total-(Total*Desc);
 Writeln('Total ',Total:10:3)
END.
Código fuente 10: Ejemplo Tabla de decisiones usando Case of, banderas y el operador or.
Descargar

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.


Descargar
{$codepage UTF8}
VAR cad:String;
BEGIN
  Write('Escriba Hola o Adios para obtener una respuesta:');
  readln(cad);
  CASE cad OF
    'Hola': Writeln('Hola, Bienvenido a la conversacion');
    'Adios':Writeln('Hasta luego, espero verte pronto')
  ELSE Writeln('No entiendo lo que me dices')
  END
END.
Código fuente 11: Ejemplo usando Case of, con string.
Descargar




SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo (a través de Paypal me), que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado.








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.