|
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:
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.
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.
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 |
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.
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}.
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:
expresión[, expresión] ...
expresión TO expresión
IS operador_relacional expresión