6. Condicionales

Cuando se introduce una respuesta a una pregunta, o cuando se obtiene un valor como resultado de una operación, o en otras muchas situaciones, es necesario que el código "decida" si va a hacer una cosa u otra (o ninguna) con lo que se ha obtenido. Por ejemplo. Si a la pregunta de si el usuario es español éste respondió afirmativamente, habrá que preguntarle cual es su numero del DNI. En caso contrario habrá que preguntarle por su número de pasaporte. Hay varias posibilidades de establecer condicionales durante la ejecución de un programa. Veámoslas:

6.1 Sentencias IF... THEN... ELSE

La sentencia IF significa, en castellano si (condicional, no afirmativo) . La palabra THEN significa entonces o como consecuencia. La palabra ELSE se podría traducir por en caso contrario. Cuando queremos que el programa realice una o mas operaciones si se cumple una condición, podemos usar una estructura básica como la del siguiente ejemplo:

Condicionales

<HTML>
<HEAD>
<TITLE>Prueba básica de condicional</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    edad = INPUTBOX ("¿Es usted mayor de edad?",,"Si")
    IF (edad = "Si") THEN
        MSGBOX ("Usted ya puede votar")
    END IF
</SCRIPT>

</BODY>
</HTML>

Este código muestra la siguiente ventana en la pantalla:

Si el usuario responde Si (Aceptando la respuesta por defecto), el programa muestra el siguiente resultado:

Haz clic aquí para ver esta página: ejemplo de condicional

En caso de que el usuario responda otra cosa o pinche en cancelar el programa no muestra ningún resultado. Como hemos visto, la condición va entre paréntesis. Esto no es obligatorio en VBScript, pero facilita la legibilidad del código. Nosotros lo haremos siempre así, por sistema.

Vamos a sofisticar un poco mas nuestro programa:

Condicionales

<HTML>
<HEAD>
<TITLE>Prueba básica de condicional</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    edad = INPUTBOX ("¿Es usted mayor de edad?",,"Si")
    IF (edad = "Si") THEN
        MSGBOX ("Usted ya puede votar")
    ELSE
        MSGBOX ("Usted aún no puede votar")
7
    END IF
</SCRIPT>

</BODY>
</HTML>

En caso de una respuesta diferente a Si por parte del usuario, ahora veremos en pantalla lo siguiente:

Como vemos, un condicional va encerrado entre las instrucciones IF y END IF. A continuación de la palabra clave IF, en la misma línea de código aparece la condición que determina la ejecución de unas instrucciones o de otras. Después de la palabra clave THEN aparecen las instrucciones que han de ejecutarse si se cumple la condición. A continuación de la palabra clave ELSE aparecen las instrucciones que han de ejecutarse si la condición no se cumple. Todo el bloque del condicional termina con las palabras clave END IF. Por lo tanto, la estructura general de este tipo de condicionales es la siguiente:

IF (condición) THEN

    BLOQUE DE INSTRUCCIONES 1

ELSE

    BLOQUE DE INSTRUCCIONES 2

END IF

6.2. Condicionales Anidados

El ejemplo anterior evalúa una condición. Si se cumple la condición hace una cosa y si no se cumple hace otra. Ahora supongamos la siguiente estructura:

IF (condición_1) THEN

    BLOQUE DE INSTRUCCIONES 1

ELSE

    IF (condición_2) THEN

        BLOQUE DE INSTRUCCIONES 2

    ELSE

        BLOQUE DE INSTRUCCIONES 3

    END IF

END IF

Esta estructura es un poco mas compleja. Si se cumple la condición_1 ejecutará el BLOQUE DE INSTRUCCIONES 1. Si no se cumple evalúa la condición_2. En caso de cumplirse ésta, ejecuta el BLOQUE DE INSTRUCCIONES 2. Solo en caso de que las dos condiciones sean falsas se ejecutará el BLOQUE DE INSTRUCCIONES 3. Veamos un ejemplo:

Condicionales anidados

<HTML>
<HEAD>
<TITLE>Prueba básica de condicional</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    edad = INPUTBOX ("¿Cuál es su edad?",,"0")
    IF (edad < 18) THEN
        MSGBOX ("Eres un jovenzuelo")
    ELSE
        IF (edad > 65) THEN
            MSGBOX ("Usted ya está jubilado")
        ELSE
            MSGBOX ("Usted es adulto")
        END IF
    END IF
</SCRIPT>

</BODY>
</HTML>

En primer lugar una observación. En el capítulo anterior decíamos que INPUTBOX () recibía un valor alfanumérico, aunque aquí recibe un valor numérico (la edad) y lo procesa sin problemas como un número. Esto es posible gracias a la propia estructura de datos del lenguaje (ver el capítulo 3: Datos y variables en VBScript).

Bien. Veamos lo que ocurre al ejecutar el código anterior. En primer lugar se le pide al usuario que introduzca su edad. La respuesta por defecto es 0. Una vez que la ha introducido y ha pulsado en Aceptar, se comprueba si la edad es menor que 18. Para ello se usa el operador < (mira el Apéndice C: Operadores en VBScript). En caso de que sea así, se muestra el siguiente mensaje:

En caso de no cumplirse la condición, se comprueba si la edad es mayor que 65. Si se cumple esta condición se muestra el siguiente mensaje:

Solo en caso de no cumplirse ninguna de las dos condiciones anteriores se muestra el último mensaje:

Haz clic aquí para ver esta página: ejemplo de condicional anidada

Hay que resaltar que las condiciones son excluyentes entre sí. Es decir. En el momento que alguna de ellas resulte ser cierta, se ejecuta el bloque de instrucciones correspondiente y se abandona el condicional. Por ejemplo. Si la primera condición es cierta, ya no se evaluará la segunda, como es lógico.

6.3 Condiciones compuestas

Supongamos que sólo queremos evaluar si la edad del usuario está entre 18 y 65 años. Solo nos interesa saber si está o no en ese rango de edad. Veamos un ejemplo:

Condiciones compuestas

<HTML>
<HEAD>
<TITLE>Prueba básica de condicional</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    edad = INPUTBOX ("¿Cuál es su edad?",,"0")
    IF (edad > 18 AND edad < 65) THEN
        MSGBOX ("Usted es un adulto en edad laboral")
    ELSE
        MSGBOX ("Usted no está en edad laboral")
    END IF
</SCRIPT>

</BODY>
</HTML>

Aquí vemos que la condición son, en realidad dos condiciones unidas por el operador lógico AND (Mira el Apéndice C). Esta línea se podría leer como "Si la edad es menor que 18 y la edad es menor que 65 entonces...". De esta forma se evalúan condiciones múltiples.

6.4. Más sobre condiciones múltiples: Select ..Case

Cuando hay que evaluar muchas condiciones no se deben utilizar condicionales anidados: resulta muy laborioso y engorroso de depurar. Para ello se utilizan las sentencias SELECT CASE y END SELECT. Veamos un ejemplo:

Condiciones múltiples

<HTML>
<HEAD>
<TITLE>Prueba de Select</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
DIM cantidad
cantidad = 3
SELECT CASE cantidad
    CASE 1:
        MSGBOX ("La cantidad vale 1")
    CASE 2:
        MSGBOX ("La cantidad vale 2")
    CASE 3:
        MSGBOX ("La cantidad vale 3")
    CASE 4:
        MSGBOX ("La cantidad vale 4")
    CASE 5:
        MSGBOX ("La cantidad vale 5")
    CASE 6:
        MSGBOX ("La cantidad vale 6")
    CASE ELSE:
        MSGBOX ("La cantidad no está entre 1 y 6")
END SELECT
</SCRIPT>

</BODY>
</HTML>

El resultado será el siguiente:

Supongamos que la línea cantidad = 3 la sustituimos por cantidad = 7. El resultado sería el siguiente.

Haz clic aquí para ver esta página: ejemplo de condicional múltiple

7. Bucles

En cualquier lenguaje de programación se nos plantea, en muchas ocasiones, la necesidad de realizar una operación mas de una vez, en un proceso reiterativo. Esa operación puede realizarse un número determinado o indeterminado de veces. En VBScript tenemos varias estructuras que nos lo permiten. Vamos a conocerlas todas y así sabremos como elegir una u otra según las circunstancias.

7.1 Bucles FOR... NEXT

Esta estructura se emplea cuando es necesario repetir un bloque de operaciones un número determinado de veces. Un bucle FOR ... Next emplea para ello un variable de control que actúa como contador de las veces que se ha procesado el bucle. La variable que actúa como contador parte de un valor_inicial. Cada vez que se ejecuta el BLOQUE DE SENTENCIAS incluido en el bucle la variable de contador se incrementa en una unidad. Opcionalmente el incremento puede ser diferente de la unidad, incluyendo el parámetro STEP seguido del índice de incremento que deseemos. Cuando el contador alcanza el valor_final se deja de ejecutar el bucle y se sigue ejecutando el programa a partir de la instrucción que va detrás de NEXT. La estructura general es la siguiente:

FOR contador = valor_inicial TO valor_final STEP incremento

    BLOQUE DE SENTENCIAS

NEXT

Veamos unos ejemplos de uso.

Bucle For...Next

<HTML>
<HEAD>
<TITLE>Prueba de bucle FOR...NEXT</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    OPTION EXPLICIT
    DIM contador
    FOR contador = 0 TO 5
        DOCUMENT.WRITE (contador & "<BR>")
    NEXT
    DOCUMENT.WRITE ("Se acabó la cuenta")
</SCRIPT>

</BODY>
</HTML>

El resultado de la ejecución de éste código será el siguiente:

0
1
2
3
4
5
Se acabó la cuenta

Haz clic aquí para ver esta página: ejemplo de bucle FOR

Bien. Ahora supongamos el siguiente ejemplo de código:

Bucle For...Next

<HTML>
<HEAD>
<TITLE>Prueba de bucle FOR...NEXT</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    OPTION EXPLICIT
    DIM contador
    FOR contador = 0 TO 10 STEP 2
        DOCUMENT.WRITE (contador & "<BR>")
    NEXT
    DOCUMENT.WRITE ("Se acabó la cuenta")
</SCRIPT>

</BODY>
</HTML>

El resultado será:

0
2
4
6
810
Se acabó la cuenta

Como vemos en el último ejemplo, la cuenta se ha realizado de dos en dos por la palabra clave STEP 2 que hemos añadido a la instrucción FOR.

7.2 Bucles DO WHILE...LOOP

Este tipo de bucles se emplean para efectuar (DO) una operación un número indeterminado de veces mientras (WHILE) se cumpla una condición. Su estructura general es la siguiente:

DO WHILE (condición)

    BLOQUE DE INSTRUCCIONES

LOOP

El BLOQUE DE INSTRUCCIONES, contenido entre las líneas DO y LOOP se ejecutará mientras se cumpla la condición. Supongamos que ha llegado la hora de pedirle al usuario una palabra clave para continuar ejecutando un programa. Esta palabra será, por ejemplo, AUTORIZADO. Veamos como lo haríamos:

Bucle Do...While

<HTML>
<HEAD>
<TITLE>Prueba de DO WHILE ... LOOP</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    OPTION EXPLICIT
    DIM clave
    clave = ""
    DO WHILE (clave <> "AUTORIZADO")
        ' Ejecuta mientras la clave no es igual a <> AUTORIZADO
        clave = INPUTBOX ("Teclea la clave:")
    LOOP
    MSGBOX ("La clave ya es correcta")
</SCRIPT>

</BODY>
</HTML>

Este ejemplo mostrará el siguiente cuadro de diálogo y no seguirá adelante hasta que se introduzca la palabra AUTORIZADO. Si se introduce mal la clave, seguirá mostrando la pregunta indefinidamente.

Una vez introducida la clave correctamente el programa continuará su ejecución mostrando lo siguiente:

Haz clic aquí para ver esta página: ejemplo de bucle DO WHILE

Bien. Veamos más posibilidades.

7.3 Bucles DO UNTIL ... LOOP

Este bucle funciona de manera muy similar al anterior, con la salvedad de que el BLOQUE DE INSTRUCCIONES se ejecuta hasta que (UNTIL) se cumple la condición. Cuando se cumple la condición deja de ejecutarse el bucle. La estructura general es la siguiente:

DO UNTIL (condición)

    BLOQUE DE INSTRUCCIONES

LOOP

Como siempre, la mejor manera de entender el funcionamiento es con un ejemplo. Supongamos el mismo caso de antes. Se tiene que pedir la clave mientras no se introduzca correctamente. Veamos como hacerlo.

Bucle Do...Until

<HTML>
<HEAD>
<TITLE>Prueba de DO WHILE ... LOOP</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    OPTION EXPLICIT
    DIM clave
    clave = ""
    DO UNTIL (clave = "AUTORIZADO")
        ' Ejecuta hasta que la clave es igual a AUTORIZADO
        clave = INPUTBOX ("Teclea la clave:")
    LOOP
    MSGBOX ("La clave ya es correcta")
</SCRIPT>

</BODY>
</HTML>

El resultado es idéntico al del ejemplo anterior.

7.4 Bucles WHILE ... WEND

Estos bucles son un vestigio de los primeros tiempos de BASIC. Hoy día han sido sustituidos por los bucles DO WHILE ... LOOP, cuyo funcionamiento es idéntico. Sin embargo, los intérpretes actuales todavía los soportan como complemento, por aquellos programadores acostumbrados al modelo antiguo. Su estructura general es la siguiente:

WHILE (condición)

    BLOQUE DE SENTENCIAS

WEND

De todas formas, se aconseja no utilizar este formato de bucle, ya que es posible que futuras versiones del intérprete dejen de contemplarlo.

7.5 Rompiendo bucles

En ocasiones es necesario interrumpir de manera forzada la ejecución de un bucle, por ejemplo si se produce una situación que aconseje la continuación del programa ignorando el resto del proceso del bucle. Para ello se emplea la instrucción EXIT. Esta instrucción presenta tres formatos distintos, según el tipo de bucle en que se implemente. Si queremos causar la ruptura de un bucle FOR... NEXT, utilizaremos EXIT FOR. Para romper un bucle DO WHILE ... LOOP o un bucle DO UNTIL ... LOOP utilizaremos la instrucción EXIT DO. Si lo que queremos es romper un bucle WHILE ... WEND usaremos EXIT WHILE. Veamos un ejemplo práctico. Vamos a suponer que estamos contando números y queremos que la cuenta se interrumpa cuando el cuadrado del número por el que vamos sea mayor que 99. Veamos el siguiente código:

Salir de un bucle

<HTML>
<HEAD>
<TITLE>Prueba de EXIT</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    OPTION EXPLICIT
    DIM num
    DIM cuad
    num = 0
    cuad = 0
    DO WHILE (num < 1000)
        num = num + 1
        cuad = num * num
        IF (cuad > 99) THEN
            EXIT DO
        END IF
        DOCUMENT.WRITE("El cuadrado de " & num & " es " & cuad & "<BR>")
    LOOP
    DOCUMENT.WRITE ("Se acabó el bucle.")
</SCRIPT>

</BODY>
</HTML>

El resultado del código anterior es el siguiente:

El cuadrado de 1 es 1
El cuadrado de 2 es 4
El cuadrado de 3 es 9
El cuadrado de 4 es 16
El cuadrado de 5 es 25
El cuadrado de 6 es 36
El cuadrado de 7 es 49
El cuadrado de 8 es 64
El cuadrado de 9 es 81
Se acabó el bucle.

Haz clic aquí para ver esta página: ejemplo de bucle EXIT DO

Este ejemplo ilustra el funcionamiento de la instrucción EXIT DO. Los otros dos formatos actúan de manera similar. La instrucción EXIT no es de uso muy frecuente, ya que casi siempre se pueden encontrar soluciones mas elegantes, pero conviene conocerla.

8. Ejemplos

Vamos a ver algunos ejemplos.

Uso de la función CBOOL

<HTML>
<HEAD>
<TITLE>
Prueba de funciones de conversión.
</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    OPTION EXPLICIT
    DIM variable
    variable = 1
    MSGBOX (CBOOL (variable))
</SCRIPT>

</BODY>
</HTML>

El resultado de este código será el siguiente:

La función CBOOL en particular devuelve un valor falso si el argumento es 0 y un valor verdadero si el argumento es cualquier otro número.

Una observación acerca de las conversiones entre subtipos numéricos. Si un número que convertimos, p.e., a Byte es muy grande para caber en este subtipo, se truncará. Supongamos la siguiente sentencia: numero = CBYTE (567.384.896.456,29) . Esto es claramente una irregularidad, ya que el número es demasiado grande para ser di subtipo Byte.

Veamos mas ejemplos:

Uso de Funciones de cadena: Instr y Mid

<HTML>
<HEAD>
<TITLE>Prueba de funciones de cadena.</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    OPTION EXPLICIT
    DIM variable
    DIM parte_central
    variable = CHR (65)
    DOCUMENT.WRITE ("Valor de CHR (65): " & variable & "<BR>")
    variable = "Alfa"
    parte_central = INSTR (variable,"l")
    DOCUMENT.WRITE (parte_central & "<BR>")
    Variable = "Manzana"
    Parte_central = MID (variable, 3, 2)
    DOCUMENT.WRITE (parte_central)
</SCRIPT>

</BODY>
</HTML>

Haz clic aquí para ver esta página: ejemplo de funciones de cadena. Como resultado nos aparece en pantalla lo siguiente:

Valor de CHR (65): A
2
nz

Fíjate en la segunda línea. Es el resultado de la función INSTR. Si analizamos la correspondiente línea de código veremos que esta función recibe dos argumentos. El primero es la cadena (o variable que la contiene) donde hay que buscar algo. El segundo es la cadena (o variable que la contiene) que hay que buscar dentro. El número que devuelve como resultado (en este caso el 2) es la posición que ocupa la segunda cadena dentro de la primera.

Ahora observa la última línea, con el texto nz. Es el resultado de aplicar la función MID. Observa la correspondiente línea de código. Ves que esta función recibe tres argumentos. El primero es una cadena (o la variable que la contiene) de la que se extraerá una sub-cadena. El segundo es un número (o una variable que contiene un número), que indica que lugar de la cadena iniciará la sub-cadena. El tercero es un número (o una variable que contiene un número) que indica cuantos caracteres se cogerán para la sub-cadena. Hay que puntualizar que la cadena original no sufre amputación ni transformación de ningún tipo.

Otro ejemplo:

Funciones matemáticas

<HTML>
<HEAD>
<TITLE>Prueba de funciones matemáticas.</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    OPTION EXPLICIT
    RANDOMIZE

    DIM numero
    numero = 0
    DO UNTIL numero > 0
        numero = INPUTBOX ("Introduzca un número")
        IF (NOT ISNUMERIC (numero)) THEN
            numero = 0
        END IF
    LOOP

    DOCUMENT.WRITE ("El número es: " & numero & "<BR>")
    numero = INT (numero)
    DOCUMENT.WRITE ("La parte entera es: " & numero & "<BR>")
    DOCUMENT.WRITE ("El valor hexa es: " & HEX (numero) & "<BR>")
    DOCUMENT.WRITE ("Un número aleatorio es: " & RND() & "<BR>")
</SCRIPT>

</BODY>
</HTML>

Haz clic aquí para ver esta página: ejemplo de funciones matemáticas Este programa nos pide un número por teclado como ya conocemos. Supongamos que introducimos 45,7. Los resultados serán los siguientes:

El número es: 45,7
La parte entera es: 45
El valor hexa es: 2D
Un número aleatorio es: 0,1896936

La primera línea nos muestra el número que hemos introducido. La segunda nos muestra el resultado de obtener la parte entera con la función INT, la tercera línea nos muestra el valor hexa de 45. Finalmente la cuarta línea es un número aleatorio generado con RND(). Esta función siempre genera un número aleatorio que está entre 0 y 1. Observa que el código incluye la instrucción RANDOMIZE.

Observa también que se ha usado la función ISNUMERIC para anular la entrada por teclado si lo que se introdujo no es un número. En este caso se ha precedido la función del operador lógico NOT. Consulta el Apéndice C para obtener mas información respecto a los operadores.

Ejemplo con VbScript y condicionales

Otro ejemplo mas:

Funciones de fecha

<HTML>
<HEAD>
<TITLE>Prueba de una función de fecha</TITLE>
</HEAD>
<BODY>

<SCRIPT LANGUAGE = "VBScript">
    OPTION EXPLICIT
    DIM fecha
    fecha = DATE ()
    IF (WEEKDAY (fecha, VBMONDAY) = 7) THEN
        DOCUMENT.WRITE ("Hoy es domingo.")
    ELSE
        DOCUMENT.WRITE ("Hoy se trabaja.")
    END IF
</SCRIPT>

</BODY>
</HTML>

Este código recoge, en primer lugar, la fecha del sistema. Si la fecha corresponde a un domingo, muestra:

Hoy es domingo.

En caso contrario, muestra:

Hoy se trabaja.

Para hacer esto, utiliza la función WEEKDAY, indicando, como primer día de la semana, el Lunes.

GENERALIDADES FINALES

Recuerda, las tres diferencias básicas entre funciones de usuario y procedimientos son:

1. La función de usuario se define entre las instrucciones FUNCTION y END FUNCTION. El procedimiento se define entre SUB y END SUB.

2. Las funciones (de usuario y del lenguaje) devuelven un resultado. Los procedimientos, no.

3. La forma de invocar una función es con su nombre seguido de paréntesis. Si la función recibe argumentos, éstos van entre los paréntesis. Para invocar un procedimiento hay dos formas. La primera es el nombre del procedimiento seguido de los argumentos, si los hay, separados por comas. La segunda es la palabra clave CALL, seguida del nombre del procedimiento, seguido éste, a su vez de paréntesis. Si hay argumentos, éstos van entre los paréntesis, seguidos por comas.