jueves, 25 de mayo de 2017

LA TOMA DE DESICIONES

Las sentencias de decisión o también llamadas de CONTROL DE FLUJO son estructuras de control que realizan una pregunta la cual retorna verdadero o falso (evalúa una condicion) y selecciona la siguiente instrucción a ejecutar dependiendo la respuesta o resultado.
No todos los problemas se resuelven linealmente, a veces es necesario tener que tomar una decisión o ejecutar determinadas acciones cuando una condición se cumple, y otras cuando no lo hace. Supongamos que nuestro problema consiste en mantener la temperatura de un balde con agua tibia. Para hacerlo nosotros podemos agregar agua caliente o agua fría. En este problema necesitaríamos tomar una decisión sobre qué tipo de agua agregar.

necesitamos conocer una condición o tomar una decisión. En C# es sencillo poder lograr esto, ya que el lenguaje nos provee diferentes herramientas para poder lograrlo. Tendremos que utilizar expresiones y éstas se evaluarán. En este caso usaremos expresiones relacionales y expresiones lógicas, que se evaluarán, y dependiendo del resultado de esa evaluación, se llevarán a cabo ciertos pasos del algoritmo u otros. Empecemos por conocer las expresiones que necesitamos.
La ejecución de las instrucciones incluyendo una estructura de control como el condicional funcionan de esta manera:
  • Las instrucciones comienzan a ejecutarse de forma secuencial (en orden) y cuando se llega a una estructura condicional, la cual esta asociada a una condicion, se decide que camino tomar dependiendo siempre del resultado de la condicion siendo esta falsa o verdadera.
Crystal_Clear_app_kedit.png
Expresiones relacionales
Las expresiones relacionales se usan para expresar la relación que existe entre dos valores. Los valores pueden estar contenidos adentro de variables o ser colocados explícitamente. Estas expresiones, al igual que las expresiones aritméticas, tienen sus propios operadores. La expresión será evaluada, pero el resultado de la evaluación tendrá únicamente dos valores posibles: true false.
Ambos valores son de tipo bool true es usado para indicar que la expresión evaluada es verdadera. El valor de false por su parte se utiliza para indicar que la expresión evaluada es falsa.

C# proporciona muchos operadores, que son símbolos que especifican las operaciones (matemáticas, indización, llamada de función, etc.) que se realizan en una expresión. Puede sobrecargar muchos operadores para cambiar su significado al aplicarlos a un tipo definido por el usuario.
Las operaciones de tipos enteros (como ==!=<>& y |) suelen estar permitidas en los tipos de enumeración .
En las secciones se enumeran los operadores de C# desde la precedencia más alta a la más baja. Los operadores de cada sección comparten el mismo nivel de precedencia.

El uso de if
Ya aprendimos a usar las expresiones relacionales y el tipo de valor devuelto. Es el momento de hacer algo práctico con ellas. Este tipo de expresiones se usa en diferentes casos, pero generalmente en las estructuras selectivas o repetitivas.
Las estructuras selectivas serán estudiadas en este capítulo, las repetitivas en un capítulo posterior. Las estructuras selectivas son aquellas que nos permiten hacer una selección entre dos o varias rutas de ejecución posibles. La selección se llevará a cabo según el valor de una expresión. Esta expresión puede ser una expresión relacional.
Nuestra primera estructura selectiva se conoce como if, que es un si condicional. Si tal cosa sucede, entonces haz tal cosa. El uso del if es sencillo:
if(expresión)
Sentencia a ejecutar

El uso de if requiere que coloquemos una expresión a evaluar entre paréntesis. Si el resultado de esta expresión es true, entonces la sentencia a ejecutar se lleva a cabo.
Si el resultado de la evaluación es false, entonces la sentencia a ejecutar nunca se lleva a cabo, o dicho de otra forma, es ignorada.
En el diagrama de flujo if se representa por medio de un rombo. En el interior del rombo colocamos la expresión a evaluar, de las esquinas sacamos una ruta de ejecución en el caso de que sí se cumpla la condición o en el caso de que no se cumpla.

bool condition = true; if (condition) { Console.WriteLine("The variable is set to true."); } else { Console.WriteLine("The variable is set to false.");
}
El uso de else
Con los programas anteriores con los que estuvimos trabajando, donde utilizamos la sentencia if, hemos visto que podemos indicar que determinada sentencia se ejecute cuando deseamos que una condición se cumpla. Sin embargo, puede ocurrir que a veces necesitamos que una sentencia se ejecute cuando se cumple la condición y que otra sentencia se ejecute cuando esa condición no se cumpla. Si nos encontramos en este caso, una forma de resolverlo sería colocar un if con una condición y luego otro if con una condición que sea complemento de la primera. Esto ya lo hemos hecho anteriormente en el programa de los números positivos y negativos. Sin embargo, existe otra forma más sencilla que la utilizada en este programa para hacerlo. Esta forma puede sernos de mucha utilidad para simplificar la lógica y que no nos veamos obligados de tener que colocar tantos if dentro de una sentencia. Para lograr esto haremos uso de else.
Siempre utilizaremos else a continuación de una sentencia if, ya que else no se puede usar sólo. Tenemos que colocar nuestro código de la siguiente forma:
if(condición)
                Sentencia1; 
else
Sentencia2;

la lógica y que no nos veamos obligados de tener que colocar tantos if dentro de una sentencia. Para lograr esto haremos uso de else.
Siempre utilizaremos else a continuación de una sentencia if, ya que else no se puede usar sólo. Tenemos que colocar nuestro código de la siguiente forma:
Si la condición es evaluada como verdadera, entonces  se ejecuta la sentencia 1, en cambio, cuando la condición se evalúa como falsa, se ejecuta la sentencia 2. A continuación analizaremos cómo hacer uso de este caso para simplificar nuestro código. Para esto elegimos para representar este ejemplo el programa de los números positivos y negativos. 



Escalera de if-else
Otra estructura que se puede utilizar es la escalera de if-else. Una de sus funciones principales es optimizar la ejecución del código. Algunas veces son necesarias porque así lo requiere la lógica del programa. Al igual que con los if anidados, no hay que utilizarlos sin planeación, ya que al no programarlos correctamente, nos puede llevar a errores de lógica que pueden resultar difíciles de solucionar.
Ahora aprendamos cómo los podemos usar para que nuestro código se vuelva más eficiente. Si observamos el programa de las operaciones matemáticas, tenemos un if para cada operación. Esto significa que cuando nuestro programa se ejecuta, sin importar si se ha seleccionado la suma o la multiplicación, siempre se tienen que ejecutar al menos cuatro if. Los if pueden ser operaciones costosas ya que se tienen que evaluar expresiones.
La forma de optimizar esto es con una cadena de if-else. El concepto es sencillo y consiste en colocar un if en la sentencia del else. 
if(expresión 1)
Sentencia1;
else
Sentencia2;


Expresiones lógicas
Al igual que las expresiones aritméticas y relacionales, las expresiones lógicas tienen sus propios operadores. Éstos son: y, o y no. En inglés los conocemos como: andor not.


El uso de la conjunción
Empecemos a conocerlos. El primer operador es y, conocido como conjunción. Para usar este operador es necesario tener dos expresiones. Una expresión a la izquierda y la otra a la derecha. Las expresiones se evalúan devolviendo valores true false. Con la conjunción, la expresión se evalúa como verdadera únicamente cuando ambas expresiones son verdaderas. La siguiente es la tabla de verdad para este operador.
El uso de switch
switch(VariableNumerica) /*dentro de los parentesis va la variable numerica que determina la opcion de menu*/
{


case 1: //si la "VariableNumerica" vale "1" se ejecutara esta opcion

{

/*...tus instrucciones aqui....*/

}
case 2: //si la "VariableNumerica" vale "2" se ejecutara esta opcion
{/*..mas instrucciones...*/
break;

}

default:  /*el default es opcional y se ejecuta cuando el valor que recibe el switch no esta incluido dentro de las opciones programadas con "case"*/
{

break;

}

}
En uno de los ejemplos anteriores, en los que realizamos las operaciones matemáticas, hemos observado que para cada operación debemos utilizar un if. Esto es correcto, y en varias ocasiones veremos que es necesario tomar diferentes opciones dependiendo del valor de una variable.
Como esto puede ocurrir frecuentemente, tenemos una estructura selectiva que nos ayuda y nos permite colocar el código para estos casos con facilidad. Esta estructura se conoce como switch. Para ésta necesitamos una variable y varios casos. Por ejemplo, en el programa de las operaciones, cada una de ellas es un caso. El valor de la variable se compara con un valor para cada caso. Si el valor coincide, entonces se empieza a ejecutar el código a partir de esa línea.
Cuando usamos switch es necesario colocar entre paréntesis la variable que utilizaremos para llevar a cabo las comparaciones. Luego tenemos que crear un bloque de código y colocar adentro de él los casos y el código a ejecutar para cada caso. Para indicar un caso, usamos case seguido del valor de comparación y dos puntos.
Existe un caso llamado defaultque podemos utilizar si lo deseamos. Este caso siempre debe ser el último caso definido. Cuando la variable de comparación no ha encontrado su valor en ninguno de los casos, entonces se ejecuta el código del caso defaultEn los casos podemos colocar cualquier código C# que sea válido.
Para indicar dónde termina el código de un caso debemos hacer uso de break, que nos permitirá salir de la ejecución de una estructura selectiva o repetitiva. Esto lo veremos con más detalle en otro capítulo. Si no hacemos uso de break y el caso está vacío, entonces el programa continuará ejecutando el código del próximo caso y así sucesivamente hasta el final del bloque del código que pertenece al switch.
Switch puede ser representado en el diagrama de flujo por medio del rombo. En su interior colocamos la variable de comparación y de las esquinas o los lados podemos sacar las diferentes rutas de ejecución que puede tener. Como ejemplo modificaremos el programa de las operaciones aritméticas para que haga uso del switch





No hay comentarios:

Publicar un comentario