Estructura de control condicional anidada (if-else anidado)

La estructura condicional se utiliza para tomar decisiones, es una estructura secuencial donde se toma una decisión de ir para ejecutar entre dos alternativas de código que siempre se encuentran hacia adelante.

Como puede observarse en el diagrama, la parte de la sentencia «else» es opcional y por lo tanto puede omitirse. Esta estructura es conocida como «condicional simple».

Ejemplo

Se desea obtener la interpretación del índice de masa corporal (IMC) de una Persona de acuerdo a las tablas de establecidas por la Organización Mundial de la Salud para adultos. Para ello contamos con la siguiente tabla:

anidado
Intervalos de referencia Interpretación del IMC para adultos
imc < 18.5 Bajo peso
18.5 ≤ imc < 25 Normal
25 ≤ imc < 30 Sobrepeso
30 ≤ imc < 35 Obesidad leve
35 ≤ imc < 40 Obesidad media
40 ≤ imc Obesidad mórbida

En los casos de la tabla donde se tienen dos límites de referencia, es decir, que el valor del imc puede encontrarse entre dos valores, deben establecerse dos valores booleanos.

Ejercicio de escritura

Revisa el ejemplo y completa con los símbolos o las expresiones faltantes para cada intervalo:

if-else anidado versión 2
Intervalos de referencia Interpretación del IMC para adultos
imc < 18.5 ( imc < 18.5 )
18.5 ≤ imc < 25 ( imc >= 18.5 && imc < 25 )
25 > imc < 30 ( imc >= 25 && imc < 30 )
30 > imc < 35 ( imc >= 30 && imc < 35 )
35 > imc < 40 ( imc >= 35 && imc < 40 )
40 > imc(imc >= 40)

La implementación de este método puede ser por tres mecanismos:

  • Una condicional simple por cada intervalo de referencia (solución con if).
  • Condicionales dobles anidados y acomodados en “escalera” (if-else anidado version 1).
  • Condicionales dobles anidados alineados a la izquierda (if-else anidado versión 2).

Revísalos a continuación:

Solución con if

Solución con if

Se puede realizar la codificación utilizando el siguiente método. Observa como se implementaron cada una de las expresiones booleanas anteriores.

public String getInterpretacionIMC() {

if ( imc<18.5 ) // verificar el primer rango de valores imc < 18.5

return "Bajo peso";

if( imc<=18.5 && imc<25 ) // verificar el primer rango de valores 18.5 ≤ imc < 25

return "Normal";

if( imc>=25 && imc<30 ) // verificar el primer rango de valores 25 ≤ imc < 30

return "Sobreso";

if( imc>30 && imc<35 ) // verificar el primer rango de valores 30 ≤ imc < 35

return "Obesidad leve";

if( imc<=40 ) // verificar el primer rango de valores 35 ≤ imc < 40

return "Obesidad media";

if( imc>40 ) // verificar el primer rango de valores 40 ≤ imc

return "Obesidad mórbida";

}

Diagrama de flujo de multiples if sin anidar

if-else anidado version 1

Sin embargo, puede observarse que el segundo if es consecuencia del anterior; ya que si el imc no es menor que 18.5 (imc<18.5) el caso contrario sería que imc≥18.5, por lo que puede utilizarse else para determinar que se examinará el caso contrario y sólo se verificaría la siguiente condición (imc<25) porque ya se sabe que se cumple que imc≥18.5, y así sucesivamente:

public String getInterpretacionIMC() {

if ( imc<18.5 )

return "Bajo peso";

else {

if( imc<25 ) // en caso contrario, también imc≥18.5

return "Normal";

else {

if( imc<30 ) // en caso contrario, también imc≥25

return "Sobreso";

else {

if( imc<35 ) // en caso contrario, también imc≥30

return "Obesidad leve";

else {

if( imc<40 ) // en caso contrario, también imc≥40

return "Obesidad media";

else

return "Obesidad mórbida";

} // else imc ≥ 35

} // else imc ≥ 30

} // else imc ≥ 25

} // else imc ≥ 18.5

}

Aunque aparentemente aparecen muchas instrucciones en la parte de los bloques marcados con amarillo de las sentencias else, en realidad hay que recordar que if-else y las dos sentencias internas son una sentencia única; por lo que pueden omitirse como en el caso más interior (imc<40).

Esta estructura se conoce como if-else anidado o if-elseif-else y se observa como una “escalera”.

Diagrama de flujo de if-else anidados

if-else anidado versión 2

A la escalera del código anterior, puede dársele un ordenamiento colocando el if anidado inmediatamente después de la palabra else y respetar la sangría o identación previa para evitar la forma de “escalera” que en ocasiones hace más confusa la lectura del código:

public String getInterpretacionIMC() {

if ( imc<18.5 )

return "Bajo peso";

else if( imc<25 ) // en caso contrario, imc≥18.5

return "Normal";

else if( imc<30 ) // en caso contrario, imc≥25

return "Sobreso";

else if( imc<35 ) // en caso contrario, imc≥30

return "Obesidad leve";

else if( imc<40 ) // en caso contrario, imc≥40

return "Obesidad media";

else

return "Obesidad mórbida";

}

Diagrama de flujo de if-else anidados acomodados al mismo nivel, en general puede observarse más ordenado.

Ejercicios de codificaciones

Completa los ejercicios en el orden que se indica en la secuencia.

Un estudiante acaba de reprobar una Matemáticas I en el primer semestre y tiene las siguientes opciones de recuperación acomodadas por la mayor posibilidad de obtener una calificación más alta y aprender mejor, sin embargo, hay requisitos que debe cumplir.

Un estudiante acaba de reprobar una Matemáticas I en el primer semestre y tiene las siguientes opciones de recuperación acomodadas por la mayor posibilidad de obtener una calificación más alta y aprender mejor, sin embargo, hay requisitos que debe cumplir.

Opción Requisitos
Recursamiento inmediato Sólo deber una asignatura.
Curso en línea para presentar examen antes de iniciar el siguiente semestre Sólo deber una o dos asignaturas.
Recursamiento Cursarla sólo durante el tercer o quinto semestre.
Examen extraordinario Esperar al examen extraordinario a mediados del siguiente semestre, sólo se permiten dos inscripciones por periodo.

Cuales son las sentencias booleanas adecuadas para cada opción:

    Opciónes:

  1. Cursarla sólo durante el tercer o quinto semestre.
  2. Sólo deber una o dos asignaturas.
  3. Sólo deber una asignatura.
  4. Si no se pudo ninguna opción anterior.
Opción Requisitos
Recursamiento inmediato 3. Sólo deber una asignatura.
Curso en línea para presentar examen antes de iniciar el siguiente semestre 2. Sólo deber una o dos asignaturas.
Recursamiento 1. Cursarla sólo durante el tercer o quinto semestre.
Examen extraordinario 4. Si no se pudo ninguna opción anterior.

Implementa un algoritmo en diagrama de flujo que le permita implementar las decisiones más adecuadas para la inscripción. Escribe las opciones adecuadas en cada espacio.

Completa los espacios en blanco para que el siguiente diagrama de flujo corresponda con la codificación en Java.

Opción Requisitos
Recursamiento inmediato (alumno.getAdeudadas()==1)
Curso en línea para presentar examen antes de iniciar el siguiente semestre (alumno.getAdeudadas()==1 or alumno.getAdeudadas()==2)
Recursamiento (alumno.getSemestreActual()==3 or (alumno.getSemestreActual()==5)
Examen extraordinario // opción por default
esquema
esquema
esquema
esquema
esquema

Escribe el código en Java que corresponde al siguiente diagrama de flujo:

if( alumno.getAdeudadas()==1 )

inscribirEnRecursamientoInmediato();

else if( alumno.getAdeudadas()==2 ) // en este momento se sabe que debe al menos una

inscribirACursoEnLinea();

else if ( alumno.getSemestreActual()==3 or alumno.getSemestreActual()==5 ) // verifica semestre

inscribirEnRecursamiento();

else // no cumplió los otros requisitos

inscribirEnExtraordinario();