Mostrando entradas con la etiqueta Bifurcación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Bifurcación. Mostrar todas las entradas

miércoles, 25 de septiembre de 2024

OOo Basic. Estructuras.

Condicional con alternativa por defecto.

La forma más habitual de formular un condicional no es, no obstante, su forma más simple, ya que en ella la bifurcación  queda limitada a una única opción (que se cumpla la condición), cuando lo frecuente (y lógico, si se mira bien) es que, cuanto menos por defecto, se presente una opción o un conjunto de opciones para el caso en que dicha condición resulte F.


En estos caso, el flujograma representa como sigue el desarrollo del algoritmo...


... y la sintaxis OOo Basic que lo concreta se expresa como sigue:

If a = b Then
c = "Respuesta confirmada"
Else
c = "Respuesta no confirmada"
End If 

También es este caso cabe hacer mucho más complejo el enunciado del condicional, añadiendo proposiciones a ambas condiciones, pero lo importante, y lo que realmente supone un cambio respecto a la [formulación más simple] del condicional es el hecho de que ahora disponemos de una respuesta controlada para cuando la condición a = b sea falsa, sin entrar en la causa de la esa falsedad (bien a<b, bien a>b). Un ejemplo que desarrolla el presentado en la entrada anterior es el siguiente:

If sAlSexo = "M" Then
sTrtm1 = "el alumno"
sTrtm2 = "al citado alumno"
sTrtm3 = "escolarizado"
sTrtm4 = "del alumno"
Else 
sTrtm1 = "la alumna"
sTrtm2 = "a la citada alumna"
sTrtm3 = "escolarizada"
sTrtm4 = "de la alumna" 
End If

En la anterior formulación, y antes de formular el condicionaltendríamos que tener referenciados datos a las variables , los cuales funcionarían como datos por defecto. En la actual, el uso de Else nos permite ofrecer un contenido alternativo a esas variables cuando sAlSexo = "M" -> False, haciendo innecesaria esa asignación previa y por defecto, ya que es Else la que proporciona las respuestas "por defecto".

OOo Basic. Estructuras

Condicional simple

La forma más simple que adopta una estructura condicional es someter a una expresión al análisis en términos de cumplimiento de la condición que se expresa (a = b, a<> b o cualquier otra formulación) y en caso, y sólo en el caso, de que se cumpla dicha condición ejecutar una o varias instrucciones formuladas como proposiciones ( c = d, por ejemplo). Esta lógica es la que expresa la forma condicional simple mediante su sintaxis.


Esa formulación sintáctica se expresa en OOo Basic como...

If a >= 3 Then

c = "Respuesta confirmada"

End If 

... que  se representa mediante el diagrama de flujo siguiente:



Dado que el proceso a seguir si se cumple que condición -> V puede ser de diferente grado de complejidad, es posible que el proceso subsiguiente está expresado mediante una proposición o varias, pero es no altera la lógica de la estructura, aunque sí afecta a su sintaxis, ya que, en esos términos, no es lo mismo formular la estructura como hicimos antes, que hacerlo de este otro modo:

If sAlSexo = "M" Then
sTrtm1 = "el alumno"
sTrtm2 = "al citado alumno"
sTrtm3 = "escolarizado"
sTrtm4 = "del alumno"
End If

A pesar de la aparente mayor complejidad de esta segunda formulación, la lógica del proceso es la misma; lo que cambian son las implicaciones para el desarrollo del conjunto del algoritmo, pero esa es otra cuestión.

                            OOo Basic. Estructuras.

                            Condicional simple. Sintaxis mínima.

                            Hemos visto en la [entrada anterior] cómo se formula la forma condicional más simple de todas las posibles, pero aun cabe simplificar más aun su sintaxis.


                            Esta formulación elimina de la expresión (de la sintaxis) la instrucción de cierre del condicional, además de exigir el cumplimiento de dos condiciones:
                            •  Que la proposición resultante del cumplimiento del condicional se escriba a continuación de la expresión Then (no en la línea siguiente)
                            • Y que sólo se formule una proposición.
                            Veamos un ejemplo comparativo:

                            Sub CondicionalSimple1

                            Dim sEtapa As String
                            Dim iEdad As Integer

                            iEdad = CInt(InputBox ("Edad del alumno"))

                            If iEdad <= 12 Then
                            sEtapa = "E. Primaria"
                            End If

                            MsgBox sEtapa

                            End Sub


                            Sub CondicionalSimple2

                            Dim sEtapa As String
                            Dim iEdad As Integer

                            iEdad = CInt(InputBox ("Edad del alumno"))

                            If iEdad <= 12 Then sEtapa = "E. Primaria"
                             
                            MsgBox sEtapa

                            End Sub

                            Mientras que CondicionalSimple1 cumple con la sintaxis característica de OOo Basic y formula el condicional con una instrucción de inicio que contiene el propio condicional (If iEdad <= 12 Then), una proposición que se ubica en la línea siguiente (sEtapa = "E. Primaria") y una instrucción de cierre del condicional (End If), CondicionalSimple2 presenta una formulación (una sintaxis) simplificada a una única línea, la cual cumple con las restricciones indicadas antes: If iEdad <= 12 Then sEtapa = "E. Primaria".

                            Esta simplificación sintáctica pretende (supongo) facilitar la formulación de condicionales simples, pero sus usos son limitados atendiendo a las restricciones antes dichas, especialmente la segunda: sólo se puede formular una proposición. Además rompe con la lógica del lenguaje (Instrucción de inicio - Instrucción de finalización), por lo que no termina de convencerme. No obstante, ahí está para quienes prefieran ahorrarse dos líneas de código.

                            martes, 4 de julio de 2023

                            OOo Basic. Estructuras.

                             Bifurcación. Condicional complejo.

                            Además de las formas simples vista antes, OOo Basic también cuenta con una sintaxis condicional que permite representar la condicionalidad compleja, entendiendo por ésta la posibilidad de varias alternativas a la instrucción condicional.




                            Esto, dicho de otra manera, viene a significar que la condicional simple no agota todas las opcionalidades del algoritmo, bien por derivar de una de las dos opciones iniciales (V/F) (o de las dos) una segunda... tercera...n-opción, o bien porque la propia opcionalidad inicial es politómica, esto es: que tiene más de dos opciones de respuesta. En el primer caso estamos hablando de estructuras condicionales anidadas y en el segundo de condicionales sucesivos.

                            La primera situación se presenta sintácticamente como condicionales anidados...

                            If vA = x Then
                            If vB = y Then
                            Proposición 1
                            Else
                            Proposición 2
                            End If
                            Else
                            Proposición 3 (por defecto)
                            End If 

                             (en su expresión más sencilla)

                             ... y la segunda como condicionales sucesivos mediante el uso de la instrucción ElseIf...Then

                            If vA = x Then
                            Proposición 1
                            ElseIf vA = y Then
                            Proposición 2
                            ElseIf vA = z Then
                            Proposición 3
                            Else
                            Proposición 4 (por defecto)
                            End If

                            Así como, por claridad del código, no se aconseja el uso de condicionales anidados complejos, los condicionales sucesivos no presenta mayor dificultad, aunque en OOo Basic está disponible una instrucción que puede resultar más apropiada cuando las opciones son muchas: la instrucción Select...Case, de la que nos ocuparemos en la [entrada siguiente].

                            OOo Basic. Estructuras

                            Bifurcación múltiple: Select Case

                            Junto con If, pero pensado en condicionales sucesivos múltiples, la estructura Select Case completa el conjunto de instrucciones que nos permiten tomar decisiones en función de condiciones previas.




                            La instrucción Select Case está pensada para cuando se deben comprobar sucesiva y excluyentemente el cumplimiento (o no) de una serie de condiciones, dependiendo de ello lo que deberá suceder a continuación, que estará en función de cual de esas condiciones se cumpla.

                            Mauricio Baeza, nuestro autor de cabecera para OOo Basic, pone como ejemplo la asignación de un valor textual acorde con un valor numérico, en concreto, los días de la semana. Otro ejemplo similar podrían ser los meses del año, pero para no hacer más larga esta ejemplificación sigamos al maestro.

                            Sub DiaDeLaSemana
                            Dim Dia As Integer
                            Dia = InputBox( "¿Que día es hoy (1 a 7)?" )
                             
                            Select Case Dia
                            Case 1
                            MsgBox "Hoy es lunes"
                            Case 2
                            MsgBox "Hoy es martes"
                            Case 3
                            MsgBox "Hoy es miércoles"
                            Case 4
                            MsgBox "Hoy es jueves"
                            Case 5
                            MsgBox "Hoy es viernes"
                            Case 6
                            MsgBox "Hoy es sábado"
                            Case 7
                            MsgBox "Hoy es domingo" 
                             Case Else
                            MsgBox "Creo que debes repasar los días de la semana"
                            End Select 

                             End Sub

                            Select presenta también la posibilidad de tratar opciones como un único bloque, bien separando posibles condiciones mediante comas, bien agrupándolas mediante la palabra reservada To. Veamos sendos ejemplos basados en el anterior:

                            • Si queremos valorar dos opciones, por ejemplo, los días que corresponden con el fin de semana:

                            Select Case Dia
                            Case 6, 7
                            MsgBox "Por fin a descansar"
                            End select

                            • Si queremos valorar un intervalo de opciones, por ejemplo de 1 a 5, días laborables: 

                            Select Case Dia
                            Case 1 To 5
                            MsgBox "Que horror, hoy toca trabajar"
                            End Select

                            En ambos casos nos ahorraremos explicitar la respuesta compartida por varias condiciones, lo que hace que esta instrucción sea muy flexible y nos evita utilizar formulaciones complejas basadas en operadores lógicos, cosa que deberíamos hacer en caso de utilizar el condicional If.

                            lunes, 22 de agosto de 2022

                            OOo Basic. Estructuras.

                            Bifurcación condicional.

                            Vistos los principales tipos de datos (y variables) y de operadores, aunque cabe la opción de avanzar explicando las funciones con las que trabajar con los anteriores, dada la complejidad de ese contenido y su amplitud, he considerado más adecuado estudiar las estructuras fundamentales con las que nos podemos encontrar en un algoritmo.



                            Tres son las formas en que se desarrolla un algoritmo: sucesión lineal (que es la que deriva de lo que hasta ahora sabemos), bifurcación e iteración. Para el desarrollo de la primera es suficiente con el uso de variables y su tratamiento con operadores, pero para las otras dos se necesita contar con estructuras (instrucciones) específicas. Concretamente, para la bifurcación necesitamos estructuras condicionales, que son las que trataremos en este apartado de la sección en la que nos encontramos.

                            Una definición de bifurcación en programación es la ruptura condicionada del orden lineal del desarrollo del algoritmo; algo así, y en su forma más simple, como un punto en el que se presentan varias opciones de solución/desarrollo por las que hay que optar en función del cumplimiento o no de determinada condición. El cumplimiento o no de la condición (la cual puede ser simple o compleja) determina que se desarrollen unas opciones u otras. Una vez superado ese punto de decisión, el algoritmo puede seguir su curso lineal, hasta que se vuelva a presentar una nueva posibilidad de opción, o quedar todo el condicionado a la decisión previa, siendo esto secundario para lo que ahora nos ocupa.

                            La forma en la que en OOo Basic se trata la bifurcación es mediante diferentes estructuras condicionales, desde formulaciones (y representaciones) simple a otras más complejas, incluyendo dentro de las segundas el uso de condicionales dentro de condicionales (condicionales anidados). De todos ellos hablaremos en las entradas que se tratan dentro de esta sección. Ahora las presentaré en síntesis, para adelantar contenido y facilitar la comprensión del conjunto y de las partes.

                            La estructura condicional más simple (SI condicional) permite responder V/F a la validez del enunciado al que se refiere: Si vA = x es V (True), entonces conjunto de proposiones -> Fin del condicional; pero Si aV = x es F (False), entonces (directamente) Fin del condicional. Este razonamiento se expresa gráficamente mediante este flujograma:

                            Una segunda formulación del condicional incluye la alternativa para el caso en que la proposición valorada resulte ser falsa, la cual cumple la función de opción por defecto. 

                            Se desarrolla como sigue: SI vA = x es V Entonces Proposiciones A -> Fin del condicional; en caso contrario (ELSE) (vA = x es F), entonces Proposiciones alternativas por defecto B -> Fin del condicional. La representación mediante flujograma es la siguiente:

                            Aunque aparentemente hayamos considerado la existencia de una única proposición, lo que en el flujograma se denomina Bloque puede estar compuesto por un amplio conjunto de proposiciones, sin que esta complejidad afecte a la estructura condicional. Tampoco se ve afectada por el grado de complejidad que pueda presentar la condición, aunque aquí, por simplificar, la hayamos expresado de la forma más simple posible (aV = x).

                            Ahora bien, conforme vayamos analizando un número mayor de opciones condicionales, esa estructura se va haciendo más compleja, por lo que es necesario disponer de sintaxis condicionales adaptadas a esta complejidad. Esto es posible mediante el anidamiento de condicionales simples y/o mediante condicionales múltiples.

                            El anidamiento consiste en la inclusión de un condicional (o varios) dentro de otro condicional. Su forma más simple sería la que representamos en este flujograma que nos da idea, no obstante, de la complejidad que puede llegar a alcanzar una estructura de opcionalidad basada en condicionales anidados.


                            Los condicionales múltiples se basan en la posibilidad de que la condicional inicial pueda ser múltiple (no dicotómica), por lo que no es suficiente con las instrucciones If y Else. Para ello contamos con la instrucción ElseIf (Else If también es válido), que funciona como alternativa  a If inicial y también concreta (al igual que éste) una condición específica en oposición a Else, que funciona como opción por defecto; de hecho ElseIf requiere tanto la condición como la sintaxis condicional completa (ElseIf vA > x Then).

                            El siguiente flujograma representa una estructura condicional múltiple.


                            En algunos lenguajes (OOo Basic, por ejemplo), además de la opción If...ElseIf...Else, también existen otras estructuras específicas (Select Case/Switch case) que responden al flujograma anterior, pero otros lenguajes (Python, por ejemplo) no cuentan con estas instrucciones alternativas sin que se vea reducida la funcionalidad del algoritmo.