Modulo 7. Expresiones y sentencias de control de Flujo En este punto de estudio se considera que tenemos claro los conceptos relacionados con variables y operadores, ahora estudiaremos como con las variables y los operadores construyen expresiones, estas expresiones son el componente principal de las declaraciones (statemenst) y como estas declaraciones (statements) se agrupan en bloques que en ocasiones pueden no tener una ejecución secuencial, esto se logra gracias a las sentencias o de control de flujo proporcionadas por el lenguaje. Que es una Expresión? Es una construcción que evalúa un solo valor y esta compuesto por variables, operadores, llamadas a métodos; se debe tener muy presente que esta construcción debe cumplir con la sintaxis del lenguaje. En módulos anteriores se estudio que se pueden crear un variable de diferentes tipos de datos, entre los que tenemos el int. Un ejemplo de una expresión es la creación y asignación de un valor a un dato primitivo. int variableEjemploEntero = 100; Observemos que cumple con la sintaxis del lenguaje, esta expresión en particular utiliza una variable y el operador de asignación. ¿Se puede componer una expresión con otra expresión? La respuesta es sí, una expresión se puede componer de expresiones más pequeñas, siempre y cuando el tipo de datos evaluado en la porción de la expresión sea compatible con el tipo de datos de la expresión más grande. El lenguaje java puede evaluar expresiones y declararlas como ambiguas al utilizar expresiones dentro de expresiones, supongamos la expresión 3+5*6/7 Es ambigua, ya que la división y la multiplicación tienen el mismo grado de precedencia, ¿qué parte de la expresión se realiza primero? Esta ambigüedad se soluciona especificando exactamente como se debe evaluar la expresión mediante el uso de los paréntesis, así: ( 3 +5 ) *( 6/7) ( 3 +( 5 *6 )) /7 Declaraciones o sentencias de control de flujo. Las declaraciones o sentencias de control de flujo no son más que instrucciones que permiten que el código se ejecute de diferentes formas, es decir, permite que la ejecución no se realice en una forma vertical, declaración por declaración; si no que por el contrario logran ejecutar ramificaciones del código, bloques repetitivos de código, agregar condiciones para saber que bloques se deben ejecutar. A continuación estudiaremos las sentencias de control de flujo soportadas por el lenguaje Java. Los conceptos acá expuestos y su uso, deben estar ya comprendidos y estudiados. Sentencia if – then Esta sentencia permite ejecutar un bloque del código solo si una condición a evaluar es verdadera. La sintaxis de escritura es la siguiente: if ( condición boolena) código A. código B Si la condición es verdadera el código A se ejecutaría, seguido del código B; ahora bien, si la condición es falsa se ejecuta el código B. Cuando código A es más de una declaración se debe colocar entre corchetes y formar un bloque de código. if ( condición boolena) { Bloque de código } código B El colocar corchetes cuando solo se ejecute una instrucción es opcional, pero es una buena práctica que evita errores en el código y hace más fácil su lectura. if ( condición ) { código A, solo una declaración } código B La condición boolena puede ser una expresión que de cómo resultado true o false, o una variable boolena Ejemplo int numeroUno = 19; int numeroDos = 27; if( numeroDos > numeroUno) { System.out.println("El número mayor es el numeroDos = " + numeroDos ); } System.out.println("Al finalizar esta sentencia se ejecutaria" ); Sentencia if – then - else Brinda un complemento a la sentencia if – then, ya que permite escribir las instrucciones o declaraciones de código a ejecutar cuando una condición es falsa luego de ser evaluada. Utiliza la misma sintaxis solo que agrega la palabra reservada else, el uso de los corchetes tiene el mismo comportamiento. if ( condición ) código A. else código B código C ó if ( condición ) { Bloque de código A } else { Bloque de código B } código C ó if ( condición 1 ) { Bloque de código A } else if ( condición 2 ) { código B, solo una declaración } código C En el último caso se anido la sentencia if de la condición 2. int numeroDos = 27; if( numeroDos > 25) { System.out.println("numero dos es mayor que 25 y es igual a "+ “numeroDos “); } else { System.out.println("numero dos NO es mayor que 25 y es “ + “igual a = " + numeroDos ); } System.out.println("Al finalizar esta sentencia se ejecutaria" ); Otro Ejemplo: int grados = 68; if( grados > 90 ){ System.out.println("Muy bien, super grande!"); } else if( grados > 60 ){ System.out.println("Muy bien, no tan grande!"); } else{ System.out.println("Hmm no alcanza lo esperado"); } Errores comunes 1. Evaluar un número en la expresión //Mal int numero = 0; if(numero){ //Declaraciones } 2. Usar = (asignación) en lugar del operador == (igualdad) // Mal int numero = 0; if(numero = 0 ){ //Declaraciones } 3. Escribir elseif (junto) el lenguaje reconoce a else y a if La sentencia switch A diferencia de las sentencias if – then o if – then – else, que solo permiten a lo máximo dos posibles caminos a seguir, switch permite cualquier cantidad de posibles caminos a seguir. Las declaraciones o sentencias que se encuentran dentro de la sentencia switch conoce como el cuerpo del switch y contiene los posibles caminos a seguir o un camino por defecto. La sintaxis es: switch ( variableEvaluar ) { case 1: camino A, solo se ejecuta cuando variableEvaluar sea igual a 1 case 2: camino B, solo se ejecuta cuando variableEvaluar sea igual a 2 case 3: camino C, solo se ejecuta cuando variableEvaluar sea igual a 3 case 4: camino D, solo se ejecuta cuando variableEvaluar sea igual a 4 default: camino E, solo se ejecuta cuando variableEvaluar no cumplió ninguna condición o por defecto. } Observe las llaves { luego de la sentencia switch y la llave } al finalizar, lo que se encuentra dentro del switch es su cuerpo. Para este caso en particular, el switch evalúa la variableEvaluar y determina cual camino seguir dentro de las posibilidades del switch. Para tener en cuenta en su uso: 1. Al encontrar el camino el switch continúa ejecutando los demás caminos que se encuentren. Para nuestro caso particular si variableEvaluar es 1, se ejecutaran los caminos A, B, C, D y E. Si variableEvaluar es 4, se ejecutaran los caminos D y E. Esta particularidad se soluciona con la sentencia break, la cual obliga al switch a continuar la ejecución con la siguiente instrucción luego del cuerpo del switch. switch ( variableEvaluar ) { case 1: camino A, solo se ejecuta cuando variableEvaluar sea igual a 1 break; case 2: camino B, solo se ejecuta cuando variableEvaluar sea igual a 2 break; case 3: camino C, solo se ejecuta cuando variableEvaluar sea igual a 3 break; case 4: camino D, solo se ejecuta cuando variableEvaluar sea igual a 4 break; default: camino E, solo se ejecuta cuando variableEvaluar no cumplió ninguna condición o por defecto. } 2. switch solo permite que variableEjecutar sea de los siguientes tipos: Un tipo de datos primitivo entre byte, short, char y int; Con tipos de datos enum1. Algunas clases que envuelven (“wrap”) algunos tipos de datos primitivos (Clase Integuer, Clase Character, Clase Byte, Clase Short). 3. La decisión de utilizar switch o if anidados parte del análisis de la necesidad, if anidados es más utilizado cuando se debe evaluar rangos de valores o diferentes condiciones. public class EjemploSwith { public static void main( String[] args ) { int edad = 92; switch(edad){ case 100: System.out.println( "Tienes un siglo!!!!" ); break; case 90: System.out.println("Ya tienes 90,” + “hmm felicitaciones!!!!" ); break; case 80: System.out.println("Aún te falta un poco “ + “para los 90 !" ); break; default: System.out.println("Que lastima no aplicas “ + “para nuestra selección"); } } } 1 Si se desea conocer este tipo de datos puede http://java.sun.com/docs/books/tutorial/java/javaOO/enum.html Sentencias while La sentencia while permite ejecutar un bloque de código mientras una condición sea verdadera. Es conocida como un ciclo. while (expresión) { bloque de código } Ó while (expresión) código A En este caso código A solo es una instrucción La expresión es evaluada y si su resultado es un boolean true, se ejecuta el bloque de código entre los corchetes o el código A. int i = 4; while ( i > 0 ){ System.out.print(i); i--; } Sentencias do – while La sentencia do – while, ejecuta primero una porción del código y luego evalúa una expresión, si esta expresión es verdadera la porción de código se continua ejecutando. do { Bloque de código } while ( expresión ) Dentro del bloque de código a ejecutar se debe contemplar las instrucciones tales que la expresión a evaluar en un momento deseado sea falso, si no, se incurre en el error de generar ciclos infinitos. En ocasiones se desea realizar ciclos infinitos, un fragmento de código para tal fin es: while (true){ // Bloque de código a repetirse en el ciclo infinito } Ejemplo 1: int x = 0; do { System.out.println(x); x++; }while(x<10); Ejemplo 2: do System.out.println(“hello”); while(false); Sentencias for Permite realizar un ciclo en un rango de valores controlados, el rango de ejecuciones se define mientras una condición es cumplida. La sintaxis de esta sentencia es: for (iniciación ; condición de terminación; incremento) { Bloque de código } ¿Que es iniciación? Es la expresión que se ejecuta al iniciar el ciclo, normalmente se inicia una variable que permite el control del ciclo. ¿Qué es condición de terminación? Es la expresión que se evalúa y termina el ciclo cuando su valor es false. ¿Qué es incremento? Es la expresión que se ejecuta después de la ejecución de una iteración del ciclo, esta expresión puede ser de incremento o de decremento. En el siguiente ejemplo se muestra como imprimir los números del 1 al 10.2 class ForDemo { public static void main(String[] args){ for(int i=1; i<11; i++){ System.out.println("Count is: " + i); } } } La sentencia for también permite la iteración entre arreglos y Colecciones de datos, la sintaxis para lograr esto es: 2 Ejemplo publicado en el tutorial de sun: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/for.html for ( tipoDato item : grupo o arreglo ) { Bloque de código } Donde el grupo o arreglo a iterar debe existir y estar declarado previamente. Recordar preguntar por esta instrucción especial cuando se vea el tema de arreglos.