TEMA 1.8
ESTRUCTURA DE SELECCIÓN SELECT

En el ejemplo de instrucciones IF anidadas nos salía un pedazo de listado para decir el nombre del mes. Después lo arreglamos un poco con las instrucciones ELSEIF. Ahora vamos a hacerlo todavía un poco mejor.

CLS
INPUT "Escribe el número del mes: ", mes
SELECT CASE mes
	CASE 1
		PRINT "Enero"
	CASE 2
		PRINT "Febrero"
	CASE 3
		PRINT "Marzo"
	CASE 4
		PRINT "Abril"
	CASE 5
		PRINT "Mayo"
	CASE 6
		PRINT "Junio"
	CASE 7
		PRINT "Julio"
	CASE 8
		PRINT "Agosto"
	CASE 9
		PRINT "Septiembre"
	CASE 10
		PRINT "Octubre"
	CASE 11
		PRINT "Noviembre"
	CASE 12
		PRINT "Diciembre"
	CASE ELSE
		PRINT "Mes no válido"
END SELECT
PRINT "S'ACABÓ"

Hemos usado una estructura nueva: La instrucción SELECT.

Esta estructura es equivalente a las anteriores de IF anidados, pero es más fácil de manejar y el programa queda más estructurado.

Si has entendido la estructura IF no te será muy difícil entender esta.

Lo primero es escribir las Palabras Clave SELECT CASE seguidas de una expresión. Esta expresión es normalmente simplemente una variable que puede ser de cadena o numérica. En este caso no tiene que devolver VERDADERO o FALSO como en los IF ya que no se usan operadores relacionales ni lógicos, solo los aritméticos cuando hace falta.

A continuación para cada resultado posible se pone la Palabra Clave CASE y la expresión a comparar con la del principio. Si la comparación es verdadera se ejecuta el bloque de instrucciones entre este CASE y el siguiente y se sale de la estructura. Si la condición es falsa se ejecuta el bloque del CASE ELSE si existe y si no nada.

Las expresiones de los cases se pueden poner de una de las siguientes formas:

CASE 1

Una expresión (En este caso un número), igual que en el ejemplo.

CASE 1, 2, 3

Varias expresiones separadas por comas.

CASE 1 TO 3

Un intervalo de valores, ambos inclusive, separados por la palabra clave TO. En este caso si la expresión inicial era de tipo entero serán válidos los resultados 1, 2 y 3, pero si era de tipo real serán válidos todos los números posibles entre el 1 y el 3 como por ejemplo el 1.517512 y el 2.17521.

CASE IS > 2
CASE IS = 5
CASE IS <> 8
CASE IS <= 6

Usando operadores relacionales. En el primer ejemplo serán válidos todos los valores mayores que 2, en el segundo sólo el 5, en el tercero cualquiera menos el 8 y en el último los que sean menor o igual que 6.

Si se nos olvida la palabra clave IS, QBasic la escribirá por nosotros.

Normalmente escribiremos las expresiones de los CASE de la forma más sencilla posible evitando intervalos muy extraños y teniendo cuidado con los operadores relacionales para no dejarnos "fuera" ningún valor posible, pero podemos llegar a escribir una estructura SELECT tan mal hecha como esta sin que el programa de ningún error de ejecución.

SELECT CASE n
	CASE 1
	CASE 1
	CASE 3
	CASE 2 TO 4
	CASE IS < 5
	CASE IS <= 5
	CASE <> 100
	CASE 16 TO 34
END SELECT

Hay expresiones repetidas, valores que entran en varias expresiones como el 3, un desastre. ¿Que ocurriría aquí?

Lo primero es que nunca ocurriría nada porque no hemos puesto bloques de instrucciones en los CASE, pero si las hubiéramos puesto pasaría lo siguiente. QBasic empieza a comprobar por los CASE hasta que encuentre uno que le venga bien. Cuando lo encuentra ejecuta su bloque de instrucciones y sale del SELECT CASE aunque otros bloques posteriores también hubieran servido. En este caso si el valor de n es 1 se ejecuta el primer CASE 1, el segundo no se llega a ejecutar nunca. Si el valor de n es 3 se ejecuta el CASE 3 y se sale, aunque los cuatro siguientes también hubieran servido. Si el valor de n es 100 no se ejecuta nada porque ningún CASE sirve y tampoco hay un CASE ELSE.

Las expresiones de los cases normalmente serán simplemente números (o cadenas) y algún intervalo alguna vez para poder estar seguro de que se va a ejecutar siempre el bloque correcto y nuestro programa va a funcionar bien.

Entre el SELECT CASE y el primer CASE no puede haber nada.

Si los bloques de instrucciones van a llevar sólo una instrucción sencilla podemos ponerla a continuación de la expresión del CASE separándola con dos puntos, por ejemplo nuestro ejemplo de los meses quedaría así:

SELECT CASE mes
	CASE 1: PRINT "Enero"
	CASE 2: PRINT "Febrero"
	CASE 3: PRINT "Marzo"
	CASE 4: PRINT "Abril"
	CASE 5: PRINT "Mayo"
	CASE 6: PRINT "Junio"
	CASE 7: PRINT "Julio"
	CASE 8: PRINT "Agosto"
	CASE 9: PRINT "Septiembre"
	CASE 10: PRINT "Octubre"
	CASE 11: PRINT "Noviembre"
	CASE 12: PRINT "Diciembre"
	CASE ELSE: PRINT "Mes no válido"
END SELECT

con lo que conseguimos un listado casi la mitad más corto.

Por supuesto las expresiones también pueden ser de cadenas:

INPUT "Escribe el nombre de un periférico del ordenador: ", perif$
SELECT CASE perif$
	CASE "Teclado", "Ratón"
		PRINT "Es un periférico de entrada"
	CASE "Monitor", "Impresora"
		PRINT "Es un periférico de salida"
	CASE "Módem"
		PRINT "Es un periférico de entrada/salida"
	CASE ELSE
		PRINT "Este periférico no lo conozco"
END SELECT

Y por supuesto los bloques de instrucciones de los CASE pueden contener cualquier tipo tipo de instrucciones anidadas en su interior como bloques IF, otro SELECT, etc.

Si estos bloques se hacen muy largos no te asustes, solucionaremos el problema cuando lleguemos a Programación Modular donde el SELECT servirá como menú para dar entrada a distintos procedimientos o subprogramas.

Casi todos los lenguajes tienen una estructura equivalente a SELECT, pero en el caso del lenguaje C es bastante mala. Hay que tener en cuenta de que en los lenguajes de los sistemas de bases de datos (SQL) existe una instrucción SELECT que no tiene nada que ver con esto, sirve para sacar información de las bases de datos.













CuRSo De iNTRoDuCCióN a La PRoGRaMaCióN CoN QBaSiC
© 2004 Juan M. González