Que son las estructuras condicionales?

Con las estructuras condicionales, o condiciones, podemos hacer que un programa “decida” si ejecutar un bloque de código o no. Si se cumple una condición entonces haz esto, si no se cumple entonces haz aquello. Esa es la sencilla lógica que comprende a las condiciones. Ya no estamos hablando de programación lineal, pues las estructuras condicionales pueden modificar el hilo de control del programa.  En pseudocódigo, se escribiría así.

Ejemplo 1

Si (condicion1) entonces {
   bloque de codigo1
} sino {
   bloque de codigo2
 }

En el ejemplo 1, ponemos entre paréntesis la condición que se debería cumplir para que el control del programa, pase a ejecuta el “bloque de codigo1”. Esta condición no es más que una expresión lógica. En caso de que esta “condicion1” no se cumpla el control del programa pasará a ejecutar el “bloque de codigo2”.

Expresiones Lógicas en estructuras condicionales

Las expresiones lógicas se construyen generalmente usando operadores. Siempre “devuelven” un valor verdadero o falso. Se usan generalmente en las estructuras condicionales y en los ciclos. Pongamos el ejemplo de una expresión lógica. Supongamos que “a”  tiene en memoria guardado el valor de 3, y  ”b”, el valor de 5.

La expresión lógica a == b, devolvería un false (falso), pues “3 es igual a 5”, no es verdad, en cambio, la expresión a ¡= b, devolvería un true(verdadero), pues “a no es igual a b”, si que es verdad. La lectura en lenguaje común de cada uno de los operadores de comparación, sería así:

Expresiones logicas mas usadas en estructuras condicionales

OperadorLectura
a == ba es igual a b?
a ¡= ba es desigual a b?
a > ba es mayor que b?
a < ba es menor que b?
a >= ba es mayor o igual que b?
a <= ba es menor o igual que b?

Si ejemplificamos con los valores que mencionamos anteriormente para a y b respectivamente, tendríamos como resultado la Fig. 2. Esto es lo que se denomina una tabla de verdad

ExpresiónResultado
a == bfalse
a ¡= btrue
a > bfalse
a < btrue
a >= bfalse
a <= btrue

Si dominamos el uso del as expresiones lógicas, podremos construir aplicaciones más sólidas y eficientes. Mas adelante aprenderemos como construir expresiones lógicas compuestas.

Ahora ejemplificaremos el uso de esta nueva herramienta en el programa de división, para impedir que el usuario teclee un cero en n2 enviando un mensaje de error.

Ejemplo 2

Imprimir (“Teclee el segundo numero:”);
Leer n2;

Si (n2 ¡= 0) {
   R = n1 / n2;
} sino {
  Imprimir “No se admiten ceros en la división”;
  Salir;
}

Imprimir (“El resultado de la división es ” . R);

En este ejemplo, la operación de cálculo se realiza, si y solo si, el segundo numero, n2, es desigual de 0; La nueva instruccion «Salir» no hace otra cosa que cerrar el programa. El ejemplo quedaria asi:

Programa # 5

Int n1,n2;
Float R;

Imprimir (“Teclee el primer numero:”);
Leer n1;

Imprimir (“Teclee el segundo numero:”);
Leer n2;

Si (n2 ¡= 0) {
    R = n1 / n2;
    Imprimir (“El resultado de la división es ” . R);
} sino {
    Imprimir (“No se admiten ceros en la división”);
    Salir
}

En el caso de que se entre un cero como n2, el programa dará el mensaje ”No se admiten ceros en la división”, y terminará. La instrucción condicional “Si” controla el flujo del programa, o sea, el bloque de codigo que calcula la división e imprime el resultado nunca se ejecutará si se entra un cero para n2, pues el “Si” ignora este paso en caso de que no se cumpla la condición “n2 ¡= 0”;

Ahora veremos otro ejemplo de la estructura condicional Si. Vamos a crear un programa que dado un numero, nos imprima en pantalla si es positivo o negativo. Claro esta que con solo mirarlo lo sabríamos, pues si lleva un “-” delante, ya está. Pero mas adelante no será tan sencillo, por ejemplo, pudiéramos entrar un número y que el programa nos diga si el número pertenece a la serie de Fibonacci o no. Pero vamos a nuestro problema. Aquí necesitamos solo una variable, para guardar el número que entrará el usuario por el teclado, lo demás sería compararlo con cero. O sea, si es mayor que cero, el numero es positivo, si es menor es negativo, si es el mismísimo cero, entonces es neutro, pues el cero no tiene signo.

Programa #6  (versión 1)

Int n;
Imprimir (“Teclee un numero”);
Leer n;

Si (n == 0) entonces { 
      Imprimir (“El cero es neutro”);
} sino {
    Si (n > 0) entonces { 
           Imprimir (n . “ es positivo.”);
        } sino  Imprimir (n . “es negativo”);
}

Aquí vemos estructuras condicionales anidadas unas dentro de otras. Si no lo hubiéramos hecho así, el programa sería un poco más grande, aunque mas sencillo a la hora de analizar. A veces la sencillez no es lo mas eficiente y veamos la otra versión, sin utilizar condicionales anidadas.

Programa #6  (versión 2)

Int n;
Imprimir (“Teclee un numero”);
Leer n;

Si (n == 0) entonces { 
    Imprimir (“El cero es neutro”);
}

Si (n > 0) entonces { 
    Imprimir (n . “ es positivo.”);
}   

Si (n < 0) entonces { 
    Imprimir (n . “ es negativo.”);
}
estructuras condicionales

Conclusiones

Como podemos observar en esta segunda version, el codigo es un poco mas largo, y la variacion de eficiencia comparada con la version una es despreciable debido a que es un algoritmo muy sencillo. En programas mas complejos tendras que desidir si irte por la complejidad eficiente, o la simplicidad ineficiente.