Control de flujo

 

 

Introducción

En Qbasic las sentencias se ejecutan sucesivamente una tras otra (secuencialmente). Esto define un camino o dirección según la cual se va desarrollado el programa. Sin embargo, habrá  momentos en que el programa deba ejecutar determinadas partes dependiendo del estado en el que se halle el propio programa o las variables externas. Esto permitir modificar el orden de la ejecución para adaptarse al estado del programa y bifurcar hacia nuevas subrutinas cuando se cumplan ciertas condiciones, que el programador fija de antemano. Los mecanismos en QBasic que permiten llevar esto a cabo son:

Volver al principio de página

 

La instrucción IF

La primera sentencia de control es la sentencia if. Admite dos tipos de sintaxis:

IF expresión THEN sentencia_1 [ELSE sentencia_2]

o también:

IF expresión THEN
	[bloque_sentencias_1]
[ELSEIF expresion_2 THEN
	[bloque_sentencias_2]]...
ELSE
	[bloque_sentencias_n]
END IF

Esta sentencia es equivalente a la que poseen la mayoría de lenguajes de programación y sirve para bifurcar en un punto de programa. Permite al programa tomar decisiones. En su primera forma, la sentencia_1 sólo se ejecuta si el resultado de evaluar la expresión es verdadero (no cero); en caso contrario, se ejecuta sentencia_2. En la segunda forma, tenemos varias posibilidades: si al evaluar la expresión el resultado es verdadero se ejecutan las instrucciones bloque_sentencias_1, pero si el resultado es falso se evalúa la expresión_2 y si ésta es verdadera se ejecuta  bloque_sentencias_2, y así sucesivamente. En cualquier caso sólo una de los bloques de sentencias se ejecuta.

Veamos algunos ejemplos:

	IF num% = 1 THEN PRINT "la variable num vale 1"	ELSE PRINT "la variable num no vale 1"

Tras evaluarse la expresión IF y ejecutarse la sentencia adecuada, el programa continúa con la línea siguiente a la de la última sentencia del IF. Para la sentencia IF vale como expresión cualquiera válida en QBasic, incluso las llamadas a funciones:

	IF suma(num1, num2) >= 0 THEN
		PRINT "La suma de num1 y num2 es positiva"
	END IF


Como sentencias valen cualquier tipo de sentencia válida en QBasic, entre ellas la propia sentencia IF. En este caso hablaremos de sentencias IF anidadas. Por ejemplo:

	IF num > 0 THEN
		IF num = 1 THEN
			PRINT "num es igual a 1"
		ELSEIF num > 1 THEN
			PRINT "num es mayor que 1"
		ELSE
			PRINT "num es menor que 1"
		END IF
	END IF

En este caso, si la variable num es menor o igual que cero el programa no mostrará ningún mensaje, y en caso contrario se mostrará el mensaje correspondiente a la comparación del valor con la unidad.

Volver al principio de página

 

El bucle WHILE

Un bucle es un conjunto de sentencias que se ejecutan repetidamente hasta que se alcanza una condición de fin de bucle, o condición de salida. El bucle while es el tipo de bucle más sencillo. En su modo más simple se escribe:

WHILE expresión
	bloque_sentencias
WEND

El bucle while comienza por evaluar la expresión. Si es cierta, se ejecuta bloque_sentencias. Entonces se vuelve a evaluar la expresión. De nuevo, si es verdadera, se vuelve a ejecutar bloque_sentencias. Este proceso continúa hasta que el resultado de evaluar la expresión es falso. Por esto se le llama a esta expresión la condición de salida. Por ejemplo:

	variable% = 10

	WHILE variable% >= 1
		PRINT "la variable vale "; variable%

		variable% = variable% -1
	WEND

En este caso se imprime  el valor de la variable hasta que se llega a 1. Normalmente, en las sentencias del bucle WHILE se coloca alguna instrucción que modifique la expresión de control, como vemos en el ejemplo anterior.

Volver al principio de página

 

El bucle DO - WHILE

La sintaxis de este bucle es:

DO [{WHILE | UNTIL} expresión]
	bloque_sentencias
LOOP

o también:

DO
	bloque_sentencias
LOOP [{WHILE | UNTIL} expresión]

Su funcionamiento es análogo el del bucle WHILE, salvo que la expresión de control se puede evaluar al final del bucle (si se utiliza la segunda opción de sintaxis). Esto nos garantiza que el bucle DO_WHILE se ejecuta al menos una vez. Incluye también la posibilidad de ejecutar el bucle mientras (WHILE) expresión sea verdadera o hasta (UNTIL) que expresión sea verdadera.

Por ejemplo:

	n% = 9

	DO
		PRINT "número actual "; n%
		n% = n% -1
	LOOP WHILE n% >= 0

este programa muestra el valor de n hasta que vale 0. Y el siguiente produce el mismo resultado.

	n% = 9

	DO
		PRINT "número actual "; n%
		n% = n% -1
	LOOP UNTIL n% = -1

Volver al principio de página

 

El bucle FOR

La sintaxis del bucle FOR es:

FOR contador = inicio TO fin [STEP incremento]
	bloque_sentencias
NEXT [contador]

Este bucle se utiliza para realizar un conjunto de acciones un número determinado de veces.Su versión más sencilla es:

	FOR i% = 0 TO 10
		PRINT "i vale "; i%
	NEXT i%

Esta versión del bucle imprime el valor de i desde 0 con un incremento de una unidad mientras que esta variable no alcance el valor 10.

	FOR i% = 1 TO 10 STEP 2
		PRINT "i vale "; i%
	NEXT

Y en este ejemplo se muestran los valores 1, 3, 5, 7 y 9 (desde 1 con un incremento de 2).

El bucle FOR es equivalente a un bucle WHILE escrito del siguiente modo:

contador = inicio
WHILE contador <= fin
	bloque_sentencias
	contador = contador + incremento
WEND

Este bucle WHILE puede servirnos para salir fácilmente de dudas al escribir un bucle FOR, ya que se ve claramente el orden de ejecución de las expresiones y sentencias dentro del bucle FOR. Como se ve, en cada pasada del bucle FOR se sigue el orden: evaluación del valor del contador, ejecución de bloque_sentencias y e incremento del contador.

Volver al principio de página

 

Las sentencia EXIT

Hay veces en que interesa romper un bucle en una determinada posición, para finalizar su ejecución. Esto suele ser habitual cuando el bucle tiene una gran complicación o cuando necesitamos salir "por las malas" de él. Esto último suele ser frecuente cuando en el bucle se producen "condiciones de error". Para este tipo de salto disponemos de la sentencia EXIT.

Su sintaxis es:

	EXIT {DO | FOR}

La sentencia EXIT rompe la ejecución de un bucle o bloque de instrucciones y continúa en la instrucción que sigue al bucle o bloque. Por ejemplo:

	a% = 10

	DO WHILE 1
		PRINT a%
		IF a% <= 1 THEN EXIT DO
		a% = a% -1
	LOOP

Aunque en apariencia este es un bucle sin fin, ya que la condición WHILE 1 es siempre cierta, este bucle se acaba cuando la variable a valga 1. El bucle simplemente imprime su valor y decrementa la variable.

Otro ejemplo:

	FOR i% = 1 TO 10
		PRINT i%
		INPUT a$
		IF a$ = "S" THEN EXIT FOR
	NEXT

el cual imprime enteros entre 1 y 10 hasta que se introduce por teclado la la pulsación S.

EXIT también se utiliza con procedimientos SUB o FUNCTION, para abandonar el procedimiento antes de ejecutar todas las sentencias que preceden al correspondiente END {SUB | FUNCTION}.

Volver al principio de página

 

La sentencia de selección múltiple SELECT CASE

Esta sentencia sirve para agrupar varias sentencias IF en una sola, en el caso particular en el que una variable es comparada a diferentes valores, todos ellos constantes, y que realiza acciones si coincide con ellos. Su sintaxis es:

SELECT CASE expresión_control
	CASE lista_expresiones_1
		bloque_sentencias_1
	[CASE lista_expresiones_2]
		[bloque_sentencias_2]]...
	[CASE ELSE
		[bloque_sentencias_n]]
END SELECT

Su sintaxis es más complicada que la de anteriores bucles, ya que agrupa un mayor número de acciones y posibilidades en una sola sentencia. El modo de funcionamiento es el siguiente:

Vamos a ver un ejemplo de múltiples casos con IF y luego con SELECT CASE:

' Ejemplo de selcción con IF
	DIM num AS INTEGER

	INPUT "Introduce un número ", num

	IF num = 1 THEN
		PRINT "Es un 1"
	ELSEIF num = 2 THEN
		PRINT "Es un 2"
	ELSEIF num = 3 THEN
		PRINT "Es un 3"
	ELSE
		PRINT "No es ni 1, ni 2, ni 3"
	END IF
END

Ahora con SELECT CASE:

' Ejemplo de selección con SELCT CASE
	DIM num AS INTEGER

	INPUT "Introduce un número ", num

	SELECT CASE num
		CASE 1
			PRINT "Es un 1"
		CASE 2
			PRINT "Es un 2"
		CASE 3
			PRINT "Es un 3"
		CASE ELSE
			PRINT "No es ni 1, ni 2, ni 3"
	END SELECT
END

Como vemos, el código con SELECT CASE es más cómodo de leer.

Esta sentencia tiene además otras posibilidades. Veamos el siguiente ejemplo:

' Otro ejemplo
	INPUT "Escriba nivel de riesgo aceptable (1-10): ", Total

	SELECT CASE Total
		CASE IS >= 8
			PRINT "Riesgo y ganancia máximos."
			PRINT "Seleccione plan de inversiones en bolsa de valores."
		CASE 3 TO 7
			PRINT "Riesgo y ganancia de moderados a altos."
			PRINT "Seleccione fondo mutuo o bonos de corporaciones."
		CASE 1, 2
			PRINT "Sin riesgo, pocas ganancias."
			PRINT "Seleccione plan de pensión individual."
	END SELECT
END

En él observamos que en lista_expresiones se pueden utilizar las siguientes formas:

Volver al principio de página

volver a Inicio