1.8 If anidados

Dijimos antes que dentro de un bloque if puede ir cualquier instrucción, incluso otra instrucción if.
Cuando se coloca una instrucción if dentro de otra se denominan if anidados, y tiene la siguiente estructura:

void main()
{
       ***
       ***
       ***
       if (condicion1)
       {
             ***
             ***
                      if (condicion2)
             {
                    ***
                    ***     
             }
             else
             {
                    ***
                    ***
             }
       }
       else
       {
                      if (condicion3)
             {
                    ***
                    ***     
             }
             else
             {
                    ***
                    ***
             }  

           
       };
       ***
       ***
}
En este programa, se evalúa la condición 1. Si su resultado es verdadero, se ejecuta lo que está en el bloque if (Las instrucciones resaltadas en naranja, entre ellas el segundo if.) 
Si el resultado de condición 1 es falso, se ejecuta lo que está en el bloque else, que es el tercer if (resaltado en amarillo).
Cualquiera de los dos if que se ejecute, analizará a su vez la condición correspondiente y elegira el bloque a ejecutar.
Si en alguno de los bloques sólo hay una instrucción no es necesario poner las llaves { } de apertura y cierre de bloque. En este ejemplo, el bloque else del if principal sólo tiene una instrucción (el if de condición 3) por lo que sus llaves no son estrictamente necesarias: 

void main()
{
       ***
       ***
       ***
       if (condicion1)
       {
             ***
             ***
                      if (condicion2)
             {
                    ***
                    ***     
             }
             else
             {
                    ***
                    ***
             }
       }
       else
                        if (condicion3)
             {
                    ***
                    ***     
             }
             else
             {
                    ***
                    ***
             }

           
       ***
       ***
}
Sin embargo, no están de más y muchas veces es bueno ponerlas siempre, para facilitar la lectura del programa y evitar errores.
Si alguno de los if no tiene bloque else, pueden ocurrir situaciones como la siguiente.

void main()
{
       ***
       ***
       ***
       if (condicion1)
         if (condicion2)
             {
                    ***
                    ***     
             }
       else
             {
                    ***
                    ***
             }

           
       ***
       ***
}



¿A cuál de los dos if corresponde el bloque else? El C++ interpretará que corresponde al último if sin else que se encuentre en el programa, esto es el if de condicion2. Si el else corresponde al primer if y el segundo no tiene bloque else, se deben agregar las llaves de bloque para indicarlo:
void main()
{
       ***
       ***
       ***
       if (condicion1)
         {
          if (condicion2)
             {
                    ***
                    ***     
             }
         }
       else
             {
                    ***
                    ***
             }

           
       ***
       ***
}

Ahora sí, por estar dentro de diferentes niveles de jerarquía, el else no puede pertenecer al segundo if, por lo que el c++ interpretará que éste último no tiene bloque else y el else corresponde al primer if.

Se pueden anidar cualquier cantidad de niveles, pero no es recomendable anidar más de dos o tres niveles de if, ya que de lo contrario sería muy confuso de leer. Para evitar más niveles, se puede recurrir a operadores relacionales y combinar varias condiciones simples en una compuesta.

1.9 Decisión múltiple: switch

La instrucción if se llama de decisión simple, porque sólo puede elegir entre dos caminos: si el resultado de la condición es verdadero, elige un camino; si es falso, elige el otro camino.

Cuando se desea poder elegir entre múltiples caminos, se debe recurrir a múltiples instrucciones if, o se puede utlizar la instrucción switch, denominada de decisión múltiple.

La instrucción switch analiza una variable y según el resultado de esa variable, selecciona el camino a seguir. Como la cantidad de caminos posibles a seguir debe ser finitas, la variable a analizar debe ser de un tipo discreto (int o char).

Veamos el siguiente ejemplo:



// ejemplo6.cpp: Instrucción switch
//

#include "stdafx.h"
#include <iostream>
using namespace std;

void main()
{
int n1,n2,r;
char op;
cout<<"Ingrese dos números:";
cin>>n1>>n2;
cout<<"Ingrese la operación a realizar:";
cin>>op;
switch(op)
{
case '+': r = n1 + n2;
               break;
case '-': r = n1 - n2;
               break;
case '*': r = n1 * n2;
               break;
case '/': if (n2 != 0)
                      {
                             r = n1 / n2;
                      }
               else
                   {
                          r = 0;
                          cout<<"No se puede dividir por cero.";
                   }
               break;
default:  cout<<"Operación inválida.";
}
cout<< "El Resultado es "<<r;


cin>>r;

}


La instrucción switch analiza el valor de la variable op, y elegirá el camino según dicho valor. Si el contenido de la variable es el caracter '+', continúa ejecutando el programa en el primer case. Si el contenido es '-' continúa ejecutando el segundo, y así con las cuatro operaciones matemáticas. La instrucción break al final de cada case hace que se finalice la ejecución del switch y pase a la instrucción siguiente, que muestra el resultado final. Si no se coloca el break al final de un case, se continúan ejecutando las instrucciones del case siguiente. (A veces, eso es lo deseado).
Si el valor ingresado en la variable no coincide con ninguno de los valores especificados en los case, se ejecutan las instrucciones que estén tras la etiqueta default. Esta etiqueta no es obligatoria, pero es muy recomendable colocarla siempre.
El último case de la instrucción (generalmente el default), no necesita de un break, ya que cuando termine no hay nada más dentro del switch, por lo que seguirá con la instrucción siguiente, que es lo mismo que haría si hubiera un break.

El siguiente ejemplo mustra diferentes alternativas de cases con y sin break.



// ejemplo7.cpp: Variantes de la instrucción switch
//

#include "stdafx.h"
#include <iostream>
using namespace std;

void main()
{
int r;
cout<<"Ingrese un número:";
cin>>r;
switch(r)
{
case 1: cout<<"Esta instrucción se ejecuta en el caso 1"<<endl;
               break;
case 2: cout<<"Esta instrucción se ejecuta en el caso 2"<<endl;

case 3: cout<<"Esta instrucción se ejecuta en los casos 2 y 3"<<endl;
               break;             
case 4:
case 5: cout<<"Esta instrucción se ejecuta en los casos 4 y 5"<<endl;
               break;
default:  cout<<"Esta instrucción se ejecuta para cualquier caso mayor a 5.";
}


cin>>r;

}



Uno de los usos más comunes de la instrucción switch es para presentar al usuario menúes de opciones, correspondiendo un case a cada opción de menú.