Cursosindustriales.net Página 1 CURSO DE VB.NET. CONDICIONALES Y BUCLES. En esta parte del curso de Visual Basic.NET vamos a empezar a trabajar con condicionales y a aprovecharnos de los recursos que nos facilitan los bucles. En todo lenguaje de programación, se utiliza el uso de condicionales y de bucles para que la aplicación tenga un mayor rendimiento reduciendo las instrucciones de trabajo y realizando acciones de acuerdo a las opciones indicadas en cada caso. Este tema profundizará en el tema de los condicionales, que hemos visto en capítulos anteriores, y abordaremos los bucles que usaremos en nuestro próximo tema que será la primera práctica del curso: continuaremos con el proyecto Videoclub. Cursosindustriales.net Página 2 ¿QUÉ ES UNA CONDICIÓN? No podemos empezar el tema, aunque ya hayamos vistos los condicionales rápidamente, debemos de establecer como primer paso, qué es un condicional o una condición. En programación llamamos condición a la acción que se ejecuta si hemos podido elegir entre varias opciones. Por ejemplo: Si en el mercadillo, en una frutería, tienes en una cesta manzanas Golden, y en otra cesta tienes manzanas Reineta. Si coges manzanas Golden el frutero te cobrará un precio distinto al que te pondría si cogieses manzanas Reineta. Esto puede parecer un poco complicado, pero cuando aprendas a usar condicionales te va a resultar bastante sencillo realizar tus propias condiciones. En Visual Basic.NET existen muchos tipos de condicionales más los que puedes crear programando instrucciones, pero en este curso solo vamos a ver los dos condicionales más usados por los programadores, el condicional IF THEN y el SELECT CASE. Cada uno de ellos es bueno en ciertas circunstancias del proyecto y malo para otras. Empezaremos con el estudio de IF - THEN, y terminaremos estudiando los SELECT CASE para que así puedas ver que condicional usarás en tus futuras aplicaciones. Cursosindustriales.net Página 3 If - Then. Esta estructura condicional es un código que permite al usuario realizar varias acciones según asigne unos valores dentro de la instrucción del comando. Es decir, que el programa realizará una acción u otra dependiendo del valor que se asigne al condicional. La estructura del condicional compuesto es la siguiente: Este condicional pertenece a los condicionales simples de Visual basic.NET y conlleva un evento de validación de tipo Bolean, es decir, solo puede ser TRUE o FALSE. Esto indica que cada condición que se haga será exclusiva de la condición Si o No: Como se puede apreciar, en este proyecto de Windows Form, cuando ejecutes el formulario, se mostrará una ventana en la cual te pedirá que insertes una edad. Dependiendo del número se mostrará un mensaje u otro. Pero veamos en detalle este ejemplo: Cursosindustriales.net Página 4 Todo el programa se ejecuta dentro del proceso principal del formulario, lo que cuando el formulario se cargue interpretará el contenido de su subproceso. En la primera línea Dim numero As Integer = InputBox("¿Cuántos años tienes?", "Edad", numero), estamos habilitando un control que mostrará una ventana en la cual le pide al usuario la inserción de texto y que pertenece al espacio de nombres Microsoft.VisualBasic, y asignándola a una variable del tipo Integer para después usar el valor obtenido. En la segunda línea tenemos la estructura básica del condicional. If numero <=18 then, establece que si el valor de la variable número que asigne el usuario es menor o igual a 18, saltará a la siguiente línea y se ejecutará la instrucción siguiente, MsgBox ("Tienes menos de 18 años", VbInformation, "Aún eres un niño). Si por el contrario, el usuario selecciona un número superior a 18, el CLR comprueba que la sentencia If inicial devuelve un FALSE (ya que el número elegido por el contrario es diferente al esperado por TRUE, por lo que, en la cuarta línea, Else, hace que se cargue la reacción del condicional. Este condicional, podrás apreciar que es demasiado soso. Solo permite dos únicas respuestas, por lo que si necesitamos agregar mas respuestas y mas soluciones, no es capaz de solvertarnos este problema. Los desarrolladores de .NET comprendieron el problema al usar este condicional y pusieron pronto la solución al mismo, si bien, no es una alternativa a otros tipos de condicionales para ciertas funciones, solventa mucho el problema anterior. Introdujeron las anidaciones del condicional: Mediante el uso de la instrucción ELSEIF, se podía seguir la lógica del condicional sin que se pasara a ELSE, lo que permite cargar mas situaciones. En la cuarta línea se ha introducido una instrucción ELSEIF con una nueva acción. Cursosindustriales.net Página 5 Ahora ya he ampliado el rango de acción del usuario; si introduce otro valor distinto al de la primera condición, saltará a la siguiente línea y ejecutará el ELSEIF siempre que el valor introducido devuelva en el control del condicional un TRUE. En caso de que devuelva un FALSE, ejecutará la instrucción desde el ELSE. Pero creo que aún podemos hacerlo algo mejor esta estructura si terminamos correctamente el ejercicio, ya que la instrucción ELSE devolverá un TRUE para valores del usuario superiores a 65, lo que nos dice que podría marcar hasta el máximo del valor del Integer en cifras, cosa que no quedaría bien decir que "Eres un viejete" con mas de casi cinco mil millones de años. En este ejemplo, si introduces un número superior a 121, se te mostrará el mensaje "¿Te crees inmortal?". Como puedes ver hemos utilizado dos ELSEIF para establecer dos estados y hemos anidado un condicional IF THEN para establecer el último paso. Aunque perfectamente se podría poner otra condición ELSEIF, he decidido anidar un condicional para que veas el uso de este control y como proceder a anidarlo. A veces ocurre que deseas interrumpir el condicional para que no se ejecute la línea siguiente. Para ello recurrimos a la instrucción RETURN. Esta instrucción hace que el CLR de Visual Basic.NET retorne a un estado anterior y se salga del bucle o del condicional. Para ver su funcionamiento, usaremos dicha instrucción en un bucle: Cursosindustriales.net Página 6 En este bucle sencillo, cuando ejecutemos la aplicación mostrará una serie de ventanas con un número diferente del 1 al 10, es decir, nos mostrarán diez ventanas de aviso, una detrás de otra según pulsemos el botón de Aceptar. Imagina que quieres hacer que cuando llegue el programa al número 5, termine la cuenta. Para esto, debemos de utilizar un condicional junto a la instrucción RETURN de la manera que se muestra a continuación: Como puedes ver, el condicional está dentro del bucle, ya que lo que queremos es que se detenga el bucle cuando llegue al número 5. Si lo ejecutas verás que cuando llega al cinco, se termina el bucle y te muestra el formulario. En siguientes puntos veremos los bucles en detalle. Cursosindustriales.net Página 7 Select Case Este condicional es uno de mis favoritos, porque te ofrece muchas más posibilidades que el anterior IF THEN. La sintaxis de éste condicional es la siguiente: Como puedes ver, este condicional te permite establecer tantas condiciones como quieras, y solo debes de escribir la acción dentro de cada instrucción CASE. Eso sí, ahora debes de matizar más en el valor de la instrucción y llamar correctamente a la instrucción al declarar el SELECT CASE, ya que los demás CASE deberán de estar relacionados entre sí, ya que debes de programar el cada CASE en relación al tipo de variable inicial en el SELECT CASE. Veamos un ejemplo: Cursosindustriales.net Página 8 Según Introduzcas un valor u otro se ejecutará el CASE específico. Como ves, yo solo he introducido tres casos específicos para el valor de 1, 2 o 3. Pero podrás incluir todos los CASE que tú quisieras en tu programa. Además, cuando se ejecuta la instrucción del CASE, se termina el bucle y no ejecuta el siguiente. Pero, ¿qué pasaría si escogemos un número mayor de 3? Para eso existe otra instrucción que utilizamos como general cuando no se da la condición establecida en cualquiera de los CASE. Es el CASE ELSE: Ahora si ejecutamos el programa y ponemos un número diferente al que nos pide, se ejecutará la instrucción CASE ELSE ya que ninguna de las anteriores entradas son correctas. Ahora, ¿me sabrías decir que va a pasar si en vez de un número, escribo un carácter en la ventana? La respuesta es sencilla, como no se ejecuta ninguna opción establecida por el condicional (ni siquiera el CASE ELSE), se muestra directamente el formulario ya que has declarado la variable Integer y estás usando un valor String. En este caso CLR debería de mostrar un error, pero como el fallo no afecta al condicional SELECT CASE, no ejecuta el error, y por tanto omite el condicional. Cursosindustriales.net Página 9 Has visto como mediante este condicional se pueden obtener múltiples acciones según las múltiples respuestas. El uso de los condicionales es de libre elección a gusto del desarrollador, pero depende de ti con cual que vas a familiarizarte, aunque por norma general ambos condicionales serán usados en muchas aplicaciones, e incluso anidarás un tipo de condicional con otro. También es posible que este condicional trate rangos numéricos: Este ejercicio es similar al anterior, pero con la diferencia de que lo hemos realizado con el condicional SELECT. La primera línea es igual que el ejercicio anterior con IF THEN. En la segunda línea declaramos el SELECT CASE y la variable que queremos utilizar en nuestras condiciones CASE. Puedes ver ahora que hemos establecido unos rangos de acción para que si el usuario escribe un número comprendido entre esos rangos, se muestre un mensaje diferente. En el último condicional común CASE ELSE, puedes ver como he establecido que si me tomas el pelo te muestre un mensaje de aviso diferente. Observa como he introducido el valor de la variable numero en el interior del cuadro de aviso mediante el condicional & y después he seguido ajustando la instrucción MSGBOX. El condicional ampersand &, te ayudará enormemente en este tipo de situaciones para concatenar cadenas y variables en varios controles. Cursosindustriales.net Página 10 BUCLES Los bucles son acciones repetitivas que se programan para que el programador no tenga que escribir un número X de veces cierto patrón repetitivo. Además los bucles permiten interactuar con la aplicación y asignar valores diferentes sin que lo tenga que programar el programador. Existen varios tipos de bucles, como los que repiten una instrucción hasta que se dé una condición preestablecida (bucles condicionales) y los bucles que repiten una instrucción un número de veces definidas. Para empezar, comenzaremos con el estudio de los bucles de repetición definida, siendo el bucle más común el formado por la estructura FOR y NEXT en la cual mediante el atributo FOR se agrega la instrucción necesaria para que se realice el bucle. El atributo NEXT indica al compilador CLR que se termina el bucle FOR y que debe de cerrarlo. Sin esta instrucción, el bucle seguiría abierto y reproduciéndose, produciendo un error de lectura del código y de los datos. La estructura básica de un bucle es: En donde la secuencia del bucle será el elemento que se repetirá y la instrucción a ejecutar será una instrucción adicional que condicione el bucle. Uso de un bucle For. Imagina que queremos que se muestre en pantalla una serie de números del 1 al 10 en orden y progresivamente. En un nuevo proyecto de Aplicación de consola haríamos lo siguiente: Cursosindustriales.net Página 11 Con la instrucción Console.WriteLine hacemos que se muestre en pantalla la acción del bucle. Como puedes ver el bucle está formado por la secuencia del bucle a = 1 to 10, y la instrucción a ejecutar (Console.WriteLine(a)). El bucle se cierra mediante su cierre NEXT. Con la instrucción Console.ReadLine, hacemos que no se cierre la pantalla automáticamente y por lo tanto, el programa requiere de una acción del usuario para cerrar la ventana (o pulsar Intro, o cerrar la ventana directamente). Puedes ver que la instrucción Console.ReadLine, se encuentra fuera del bucle, por lo que esperará el programa a que se pulse Intro, después de haber ejecutado el bucle entero, ¿qué pasaría si agregáramos esta instrucción dentro del bucle? Antes de responder, vamos a explicar el bucle en profundidad: Dentro del proceso principal Sub Main, en la primera línea hemos declarado una variable del tipo Integer y no la hemos dado ningún valor. Por defecto CLR reserva el máximo espacio de memoria para este tipo de valor. En la tercera línea abrimos el bucle y en él asignamos la variable (a) un rango que va desde 1 a 10; literalmente significa Para a =1 hasta 10. Dentro del bucle establecemos que queremos que se muestre en pantalla mediante el uso del comando Console.WriteLine, la variable a para cada uno de los valores del bucle anterior. Por lo que se muestra la serie de números establecidos en el bucle FOR. Si hubiésemos puesto la instrucción Console.ReadLine dentro del bucle, el programa nos obligaría a pulsar Intro cada vez que quisiesemos ver un número y sería así hasta que se completase el bucle (llegase al número 10). El bucle FOR también nos permite interactuar con la aplicación. Por ejemplo, si en el ejemplo anterior, preguntamos que nos ponga un número del 1 al 10, podemos programar el bucle para que nos muestre los números hasta el número que hemos elegido: Cursosindustriales.net Página 12 En el siguiente ejercicio, puedes observar cuando lo ejecutes que la ventana te pide que escojas un número del 1 al 10. Cuando pulses el Intro, se te mostrará un bucle con el número de veces escogido. En la tercera línea, Console.Write, indica al CLR que se desea que el usuario introduzca un valor. A continuación, en la línea siguiente, realizamos una función de conversión con la función CINT, para que en la consola solo trate números enteros. Si intentas poner un número en FLOAT o decimal, esta función no tendrá en cuenta el decimal y lo elimina. Por ende, si por ejemplo, ponemos el número 4.5 (el punto es la coma del decimal), la función interpretará 4.5 como 45 y realizará el bucle en consecuencia. En la línea siguiente, el bucle propiamente establecido. Hemos indicado que el rango de acción del mismo va desde el 1 hasta el valor de la variable (a) que previamente, el usuario ha definido. Mostramos el resultado del bucle en la línea siguiente: Console.WriteLine ("Este es el número: " & b), la cual muestra todos los números desde el 1 hasta el elegido. En este ejemplo has podido ver como interactuamos más con el usuario, y ahora podemos definir el número de veces que queremos que se muestre el mensaje. NOTA: Es aconsejable nos familiaricemos con las funciones de conversión y siempre incluirlas en este tipo de ejercicios, para así evitar un fallo de errores por el usuario. Ordenación. Podemos establecer un orden a la hora de programar un bucle, es decir, podemos hacer que los datos a mostrar, se representen de manera ordenada, tal cual lo hacen por defecto al principio, o que se muestren de final a inicio, utilizando funciones adicionales y que se pueden agregar al bucle. Una de las funciones que más se usan es STEP. Esta función, establece que el bucle realizará los saltos establecidos en la función. STEP significa literalmente en castellano "paso", por lo que el bucle Cursosindustriales.net Página 13 establecerá un orden de paso a paso de acuerdo al STEP que se le informe. Por ejemplo, en el anterior ejercicio, si establecemos un STEP 2, mostrará el bucle de dos en dos: También podemos hacerlo que se muestre en orden decreciente: Observa que para el orden creciente, no hace falta poner la función STEP para cada paso numeral. Pero cuando es inverso el sentido si es obligatorio, pues de no ponerlo, CLR no es capaz de ejecutar el bucle correctamente. Cursosindustriales.net Página 14 Bucle DO LOOP. Este tipo de bucle repetirá una acción mientras no se introduzca una acción adecuada y predefinida con anterioridad. Imagina que en ejemplo anterior queremos que el usuario adivine un número que hemos definido previamente y que hasta que no lo escriba salga un mensaje de error. Con este bucle se puede realizar este ejercicio: Como puedes ver he realizado el programa de manera que hasta que no aciertes el número 9, se repita el mensaje. La estructura del bucle DO, siempre va acompañado del condicional WHILE que significa "mientras" y termina el bucle con la instrucción LOOP, que ejecutará la contraprogramación. Explicando el funcionamiento, en la primera línea declaro una variable Integer y no la asigno ningún valor. En el bucle condicional, asigno la variable a un número (9 en este caso) y le indico al programa que mientras el número sea distinto de 9, se muestre el mensaje que contiene el bucle, Console.Write(Adivina mi número (1-10): "). En la línea inmediata, tengo que asigna el valor de la variable a la función Console.ReadLine para que se repita el proceso de no devolver un TRUE el bucle. En el momento en que aciertes el número 9, el bucle saltará al LOOP y ejecutará la línea siguiente, en la cual te felicitará por haber adivinado el número. Otra forma de utilizar este bucle es con el condicional UNTIL y podemos obtener el mismo efecto: Cursosindustriales.net Página 15 Como puedes observar en relación al anterior, ejercicio, la única diferencia es el uso de los atributos de DO, y que en este caso hemos indicado que hasta el valor de la variable (a) no sea de 9, no se salga del bucle. Bucle WHILE. El otro de los bucles más usados en Visual Basic.NET es el bucle WHILE el cual es muy similar al anterior, pero con la diferencia de que es más simple que el anterior. Viendo el mismo ejemplo, se realizaría con un bucle WHILE de la siguiente manera: La diferencia entre un bucle u otro es el juego que se puede dar usando uno u otro. Hay que decir que el sentido de la programación, es mejor el bucle DO (WHILE / UNTIL) - LOOP, que el bucle WHILE, pero depende del programador y el uso que le va a dar para sus aplicaciones. Cursosindustriales.net Página 16 CONCATENANDO CONDICIONALES Y BUCLES Al igual que podemos concatenar condicionales y bucles, podemos mezclar ambas en un mismo programa. De hecho, pronto aprenderás que una aplicación sin condicionales ni bucles no es una aplicación que se precie. Para mezclar unos con otros debes de saber qué es lo que quieres conseguir, el tipo de programa que buscas, y la función principal que vas a realizar. Siguiendo con el programa anterior de que adivinemos el número, vamos a mezclar los términos aprendidos hasta el momento en una aplicación de Windows: Programa Adivina: El siguiente programa de Windows, te pide que introduzcas un número en el TextBox para ver si el número que ha pensado el programa automáticamente. El programa consta de únicamente dos controles, un Button y un TextBox. El código que hace posible el programa se muestra a continuación: Cursosindustriales.net Página 17 Explico el programa: Cuando se inicia, te pide que introduzcas un nombre. El programa te tratará de tú y te pedirá que escribas un número de entre el 1 y el 10 a ver si adivinas el número que ha pensado la máquina. Dependiendo de tus respuestas, te mostrará un mensaje u otro. Como puedes ver en la clase principal, declaro las variables que utilizaré para que estén disponibles para cualquier control, es decir, las declaro de ámbito público. Son dos variables, una Integer para los números y el String para tú nombre. Dentro del proceso del formulario, incluyo la lógica para cuando se ejecute la aplicación se muestre la ventana para que insertes tu nombre. Como puedes ver he utilizado el bucle DO UNTIL para decir al programa que hasta que el usuario no inserte un nombre, no pueda continuar el proceso, ya que dentro del bucle he introducido una instrucción GOTO que retorna al punto definido previamente GOTO A, por lo tanto hasta que el valor de la variable no esté definido, no se ejecutará el LOOP. En la siguiente línea, la instrucción Randomize(), es necesaria para redimensionar y tratar un valor entero. La línea siguiente, a=CInt(int((10 * rnd()) +1)), establece el número aleatorio que deberás introducir en el TextBox1 para que ganes. Observarás en la última línea del código del formulario, que he agregado un Label que muestre el valor del número aleatorio. Tú, puedes eliminar esta Label y así hacerle al usuario más difícil la adivinación. En el código del Button1, he establecido un bucle DO WHILE que indica que mientras el valor del número aleatorio no sea el correcto, el usuario siga intentándolo hasta que dé con él. La instrucción de la siguiente línea Return, hace que no se muestre constantemente el cuadro de aviso de fallo indicado en el bucle, es decir, que corta el bucle para que no se haga infinito. Has podido ver cómo hemos utilizado lo aprendido hasta ahora para hacer un sencillo programa que calcula un número aleatorio y nos pide que lo adivinemos. Está claro que solo es una aplicación básica, pero tú ya tienes los conocimientos necesarios para matizar más opciones y mejorarlo. Cursosindustriales.net Página 18 Hasta aquí ha llegado este tema. Puedes guardar el proyecto realizado, o eliminarlo, pero te recomiendo que lo guardes para que puedas disfrutar de él y realizar el estudio del mismo con más detalle. Cursosindustriales.net Página 19