Curso/Tutorial de Pascal (Turbo Pascal)
C/C++/C# HTML Java JavaScript Linux PHP Python Swift
 Principal
 Inicio
 Libros
 Librerías
 Bibliotecas
 Mapa Web
 
 Recursos
 Artículos
 Cursos
 Ejercicios
 Guías de uso
 Mini Diccionario 
  
 Sintaxis
 ANSI C
 Ordinogramas
 Pascal
 Pseudocódigo 
  
 Contenidos > 2.3 Alternativa múltiple ( la instrucción case )
Una instrucción alternativa múltiple (o simplemente alternativa múltiple) permite seleccionar, por medio de una expresión, el siguiente bloque de instrucciones a ejecutar de entre varios posibles. En Pascal, para escribir una alternativa múltiple se utiliza la sintaxis:


 case <expresión> of
  <lista_de_constantes_1> : begin
                             <bloque_de_instrucciones_1>
                             end;
  <lista_de_constantes_2> : begin
                             <bloque_de_instrucciones_2>
                            end;
  ...
  <lista_de_constantes_n> : begin
                             <bloque_de_instrucciones_n>
                            end
  [ else
       begin
          <bloque_de_instrucciones_n+1>
       end ]
 end
 

El resultado de evaluar la <expresión> debe ser un valor perteneciente a un tipo de dato finito y ordenado, es decir, entero, lógico, carácter, enumerado o subrango.

Dependiendo del valor obtenido al evaluar la <expresión>, se ejecutará un bloque de
instrucciones u otro. En las listas de constantes se deben escribir los valores que determinan el bloque de instrucciones a ejecutar, puediendo ser constantes (por ejemplo: 5 ó '5') o subrangos (por ejemplo: 1..5 ó '1'..'5').

Opcionalmente, se puede escribir un <bloque_de_instrucciones_n+1> después de la palabra reservada else. Este bloque de instrucciones se ejecutará en el caso de que el valor obtenido al evaluar la <expresión>, no se encuentre en ninguna de las listas de constantes
.

Ejemplo 1: Se quiere escribir un programa que:

1º) Pida por teclado el número (dato entero) de un día de la semana.
2º) Muestre por pantalla el nombre (dato cadena) correspondiente a dicho día.

Nota: Si el número de día introducido es menor que 1 ó mayor que 7, se mostrará el mensaje: "ERROR: Día incorrecto.".

En pantalla:


   Introduzca dia de la semana: 2

   Martes

 


   Introduzca dia de la semana: 9

   ERROR: Dia incorrecto.

 

Cuando un bloque de instrucciones sólo contiene una instrucción, las palabras reservadas beginend, que enmarcan dicho bloque, son opcionales. Así pues, podemos escribir:

program EJE12041;

uses Crt;

var Dia : Integer;

begin
   ClrScr;
   GotoXY( 4, 2 );
   Write( 'Introduzca dia de la semana: ' );
   ReadLn( Dia );

   GotoXY( 4, 4 );
   case Dia of
      1 : Write( 'Lunes' );
      2 : Write( 'Martes' );
      3 : Write( 'Miercoles' );
      4 : Write( 'Jueves' );
      5 : Write( 'Viernes' );
      6 : Write( 'Sabado' );
      7 : Write( 'Domingo' )
      else
         Write( 'ERROR: Dia incorrecto.' )
   end
end.

Programa (.PAS): Día de la semana

Cuando en una lista de constantes de una alternativa múltiple aparece más de un valor, estos se escriben separados por el carácter coma (,). Estúdiese el siguiente ejemplo.

Ejemplo 2: En la siguiente tabla se muestran las categorías a las que pertenecen los signos del zodíaco:

Categorías de los signos del zodíaco

Se quiere escribir un programa que:

1º) Muestre el listado de los signos del zodíaco, con sus números asociados.
2º) Pida por teclado un número (dato entero) asociado a un signo del zodíaco.
3º) Muestre la categoría a la que pertenece el signo del zodíaco seleccionado.

Nota: Si el número introducido por el usuario, no está asociado a ningún signo del zodíaco, se mostrará el mensaje: "ERROR: <número> no está asociado a ningún signo.".

En pantalla:


   Listado de signos del zodiaco:

   1. Aries
   2. Tauro
   3. Geminis
   4. Cancer
   5. Leo
   6. Virgo
   7. Libra
   8. Escorpio
   9. Sagitario
   10. Capricornio
   12. Acuario
   13. Piscis

   Introduzca numero de signo: 7

   Es un signo de Aire.

 


   Listado de signos del zodiaco:

   1. Aries
   2. Tauro
   3. Geminis
   4. Cancer
   5. Leo
   6. Virgo
   7. Libra
   8. Escorpio
   9. Sagitario
   10. Capricornio
   12. Acuario
   13. Piscis

   Introduzca numero de signo: 15

   ERROR: 15 no esta asociado a ningun signo.

 

Una posible solución es:

program EJE12051;

uses Crt;

var Numero : Integer;

begin
   ClrScr;
   GotoXY( 4, 2 );
   Write( 'Listado de signos del zodiaco:' );
   GotoXY( 4, 4 );
   Write( '1. Aries' );
   GotoXY( 4, 5 );
   Write( '2. Tauro' );
   GotoXY( 4, 6 );
   Write( '3. Geminis' );
   GotoXY( 4, 7 );
   Write( '4. Cancer' );
   GotoXY( 4, 8 );
   Write( '5. Leo' );
   GotoXY( 4, 9 );
   Write( '6. Virgo' );
   GotoXY( 4, 10 );
   Write( '7. Libra' );
   GotoXY( 4, 11 );
   Write( '8. Escorpio' );
   GotoXY( 4, 12 );
   Write( '9. Sagitario' );
   GotoXY( 4, 13 );
   Write( '10. Capricornio' );
   GotoXY( 4, 14 );
   Write( '11. Acuario' );
   GotoXY( 4, 15 );
   Write( '12. Piscis' );
   GotoXY( 4, 17);
   Write( 'Introduzca numero de signo: ' );

   Read( Numero );

   GotoXY( 4, 19 );
   case Numero of
     1, 5, 9  : Write( 'Es un signo de Fuego.' );
     2, 6, 10 : Write( 'Es un signo de Tierra.' );
     3, 7, 11 : Write( 'Es un signo de Aire.' );
     4, 8, 12 : Write( 'Es un signo de Agua.' )
     else
      Write( 'ERROR: ', Numero,
             ' no esta asociado a ningun signo.' )
   end
end.


Otra solución es:

program EJE12052;

uses Crt;

var
      Numero : Integer;
   Categoria : String [6];

begin
   ClrScr;
   GotoXY( 4, 2 );
   Write( 'Listado de signos del zodiaco:' );
   GotoXY( 4, 4 );
   Write( '1. Aries' );
   GotoXY( 4, 5 );
   Write( '2. Tauro' );
   GotoXY( 4, 6 );
   Write( '3. Geminis' );
   GotoXY( 4, 7 );
   Write( '4. Cancer' );
   GotoXY( 4, 8 );
   Write( '5. Leo' );
   GotoXY( 4, 9 );
   Write( '6. Virgo' );
   GotoXY( 4, 10 );
   Write( '7. Libra' );
   GotoXY( 4, 11 );
   Write( '8. Escorpio' );
   GotoXY( 4, 12 );
   Write( '9. Sagitario' );
   GotoXY( 4, 13 );
   Write( '10. Capricornio' );
   GotoXY( 4, 14 );
   Write( '11. Acuario' );
   GotoXY( 4, 15 );
   Write( '12. Piscis' );
   GotoXY( 4, 17);
   Write( 'Introduzca numero de signo: ' );


   Read( Numero );

   case Numero mod 4 of
      1 : Categoria := 'Fuego';
      2 : Categoria := 'Tierra';
      3 : Categoria := 'Aire';
      0 : Categoria := 'Agua'
   end;

   GotoXY( 4, 19 );
   if ( Numero >= 1 ) and ( Numero <= 12 ) then
      Write( 'Es un signo de ', Categoria, '.' )
   else
      Write( 'ERROR: ', Numero,
             ' no esta asociado a ningun signo.' )
end.


En esta segunda solución existen las siguientes diferencias importantes con respecto a la solución anterior:
  • En el código se utiliza una alternativa doble (if), además de una alternativa múltiple (case).
  • En la alternativa múltiple no se escribe el <bloque_de_instrucciones_n+1>.
  • La <expresión> de la alternativa múltiple es diferente.
  • La expresión 'Es un signo de ' sólo se escribe una vez.
  • Se ha utilizado una variable más: Categoria

Ejercicios Recomendados:
 Más información
Texto extraído del libro EMPEZAR DE CERO A PROGRAMAR EN PASCAL.
 Contenidos > Apartado siguiente
2.4 Anidamiento