Heyyyyyyyyyyyyyyy

Aprende a programar microcontroladores en C... http://tecdigitaldelbajio.com/software-tarjeta.html

viernes, 7 de agosto de 2009

Instrucciones de Condición Anidadas



Ups, perdón por este pequeño receso, pero ya estoy listo para la siguiente lección vamos a hablar más de las instrucciones condicionales, específicamente de instrucciones de condición anidadas.

Una instrucción de condición anidada es cuando una instrucción condicional tiene en su rama del verdadero o falso otra instrucción condicional. No todo se puede arreglar con un solo if, existen una gran infinidad de programas que requieren de estructuras anidadas. Veamos algunos ejemplos de estos tipos de problemas, solo se muestra el código de la parte del if en la solución de los ejemplos.

Ejemplo 1

Realizar un programa que lea un número y que indique si es positivo y además mayor que 10.

Solución

Con una comparación con 0 descubrimos si es positivo o no, si lo es, basta con agregar otro if para compararlo con 10 e indicar si es positivo y mayor que 10 este es el código:
if ( Numero >= 0 ) {
if (Numero > 10) {
stringItem.setText("El Número es positivo y mayor a 10");
}
else {
stringItem.setText("El Número es positivo y menor a 10");
}
}
else
stringItem.setText("El Número es negativo");

En el ejemplo se puede observar claramente como en la rama del verdadero del primer if se agrega otro if, lo anterior es lo que conocemos como if anidados, un if dentro de otro if.

Algo importante es la sangría (el espacio que se deja al iniciar las sentencias), se utiliza para ir agrupando claramente los if, y no confundirse, es altamente recomendable agregar la sangría a los if.

Ejemplo #2

Realizar un programa para ingresar la longitud de tres lados de un triangulo (L1, L2 y L3) y que el programa indique si el triangulo leído es equilátero (los tres lados iguales), o si es isósceles (solo dos lados son iguales) y finalmente que indique si es escaleno (los tres lados diferentes).

Solución

Otra vez se requiere varias comparaciones, varios if anidados, por ejemplo para saber si el triangulo es equilátero, se comparan los lados para saber si son iguales, como se observa en el código siguiente:

if ( L1 == L2 ) {
if ( L2 == L3)
stringItem.setText("El triangulo es equilatero");
}
Para saber si es el triangulo es isósceles se requieren varias comparaciones para comprobar las tres opciones posibles, para saber si hay dos lados iguales de la siguiente forma:
if ( L1 == L2 ) { //Opción 1: cuando L1 es igual a L2 pero diferente a L3
if ( L3 != L1)
stringItem.setText("El triangulo es isósceles");
}
else {
if ( L1 == L3 ) { //Opción 2: cuando L1 es igual a L3 pero diferente a L2
if ( L2 != L1)
stringItem.setText("El triangulo es isósceles");
}
else {
if ( L3 == L2 ) {//Opción 3: cuando L3 es igual a L2 pero diferente a L1
if ( L1 != L2)
stringItem.setText("El triangulo es isósceles");
}
}
}
No lo había mencionado en el blog pero // en Java significa un comentario y se agrega para explicar el código, hay que tener cuidado con las { } por eso precisamente se recomienda ampliamente el uso de sangría para identificar claramente los grupos de instrucciones que van en el if o en el else y cerrar adecuadamente las llaves.

Finalmente para saber si el triangulo es escaleno pues se compararan los lados para saber si son diferentes algo como el caso del triangulo equilátero, este es el código.

if ( L1 != L2 ) {
if ( L2 != L3)
if ( L1 != L3)
stringItem.setText("El triangulo es escaleno");
}
La animación siguiente muestra el código completo para este ejemplo, además se observa la ejecución del programa como la hace el procesador línea por línea para que el lector vea los caminos que se siguen con las diferentes combinaciones que hay.
Basta con introducir los valores de los lados del triangulo en los campos de texto y dar clic en el botón de iniciar la animación, al hacerlo aparece una línea azul que indica las comparaciones que hace el procesador hasta encontrar la solución.

Operadores Lógicos

Afortunadamente en java existen los llamados operadores lógicos que me permiten cambiar los if’s anidados en un solo if. Los operadores lógicos que veremos son los siguientes:

Operador AND ( Y )

La sintaxis del operador es así: &&

Su tabla de verdad nos muestra cuando dos variables unidas por un AND son verdaderas o falsas:
Operador 1Operador 2Operador 1 AND Operador 2
FFF
FVF
VFF
VVV

Véase la tabla de verdad, solo hay una opción para que el operador AND sea verdadero: cuando sus dos operadores sean verdaderos.

Con este operador se puede saber si el triangulo es equilátero con un solo if así:
if (( L1 == L2 ) && ( L2 == L3)) {
stringItem.setText("El triangulo es equilátero");
}
Haciendo una analogía con la tabla de verdad, el operador 1 es (L1 == L2), el operador AND es && y el operador 2 es (L2 == L3) así que, podríamos decir con el if que “Si L1 es igual que L2 y L2 igual que L3 entonces el triangulo es equilátero”.

Recuerde la sintaxis el operador AND es && y siempre debe haber ( ) que encierran toda la expresión y de preferencia cada operador por ejemplo (L1 == L2) también hay que encerrarlo entre ( ).

Para saber si el triangulo es escaleno también se pude usar este operador de la siguiente forma:

if (( L1 != L2 ) && ( L2 != L3) && ( L1 != L3 )) {
stringItem.setText("El triangulo es escaleno");
}
¡¡Que tal, tres if’s los cambiamos por uno solo!!

El operador AND funciona con los operadores que sean, siempre recordando que para que la expresión sea verdadera a fuerzas cada operando tiene que ser verdadero.

Operador OR ( O )

La sintaxis del operador es así: ||

Su tabla de verdad nos muestra cuando dos variables unidas por un OR son verdaderas o falsas:

Operador 1Operador 2Operador 1 OR Operador 2
FFF
FVV
VFV
VVV

Con este operador basta con que un operador sea verdadero para que la expresión total sea verdadera.

Por ejemplo para saber si el triangulo es isósceles, se tienen tres opciones que podemos agrupar con el operador AND.

Opción 1: cuando L1 y L2 son iguales pero L3 es diferente

if (( L1 == L2 ) && ( L3 != L1)) {
}

Opción 2: cuando L1 y L3 son iguales pero L2 es diferente

if (( L1 == L3 ) && ( L2 != L1)) {

}

Opción 3: cuando L2 y L3 son iguales pero L1 es diferente

if (( L2 == L3 ) && ( L1 != L2)) {

}
Ahora bien las tres opciones se pueden agrupar con un OR, porque basta con que una de las opciones sea verdadera para que el triangulo sea isósceles, el código final para saber si el triangulo es isósceles queda con un solo if así:
if ((( L1 == L2 ) && ( L3 != L1)) || (( L1 == L3 ) && ( L2 != L1)) || (( L2 == L3 ) && ( L1 != L2))) { 

stringItem.setText("El triangulo es isósceles"); 
} 
En conclusión, los operadores lógicos pueden facilitarnos el trabajo cuando se trata de muchas instrucciones condicionales y más si son anidadas, como se vio en este ejemplo del triangulo, que se realizaba con más de 10 if’s y con los operadores lógicos se redujo a solamente 3. Hasta aquí vamos a dejar este post, recuerda practicar es la clave del éxito.


4 comentarios:

  1. mi nombre es cristian romero ( cristian_romero_r@hotmail.com) y soy profesor de fisica aca en Chile, decearia poder saber como realizar un test con varios form ( pantallas), y en cada uno de ellos realizar una pregunta, de tal manera que el estudiante la responda en un choicegroup( que marque la alternativa ) y que finalmente en un form se pueda mostar el resultado que obtuvo.

    Atte

    Cristian Romero R

    ResponderEliminar
  2. Hola cristian Romero, no me lo vas a creer pero la lección siguiente justo es mostrar como se selecciona una opción de un ChoiceGroup, voy a colocar un ejemplo y el video como acostumbro, ten paciencia, prometo orientar el ejemplo como tu lo necesitas, en esta semana sale el post, ya estoy trabajando en él.

    Saludos desde México
    Doñate

    ResponderEliminar
  3. Espero que esta semana puedas publicar como realizar un test con varias form y en cada uno un choicegroup para que el alumno seleccione su pregunta, y que al final salga su resultado, ya que aca con mis alumnos, que estan estusiasmados con realizar un test de esta forma, queresmos realiozarlo durante esta semana.

    Atte Cristian Romero R

    ResponderEliminar
  4. Hola, mil disculpas por la tardanza, el inicio de clases ha retrazado mis planes, dividi el ejemplo en dos post, ahorita mismo sale la primera parte y mañana mismo si todo sale bien sale la segunda parte con un video de ejemplo, donde espero se aclaren tus dudas.

    saludos

    ResponderEliminar