Bucles anidados

Con cierta frecuencia la solución de un problema exige el uso de bucles que están contenidos dentro de otros. Los bucles anidados pueden tener tantos niveles como se quiera.

La idea clave es: en cada iteración de un bucle externo, ocurren todas las iteraciones posibles de los bucles internos.

El siguiente ejemplo de creación de una tabla de multiplicar es ilustrativo de este proceso. En este caso, se tienen dos bucles anidados implementados mediante for.

// Tabla de multiplicar
#include <iostream>
#include <iomanip>  // para setw()

using namespace std;

int main()
{
   cout << "Introduce valor: ";
   int valor;
   cin >> valor;

   // Primera fila
   cout << "    "; // Hueco de 4 espacios
   for (int i = 1; i <= valor; ++i)
   {
      cout << setw(4) << i;
   } // Fin primera fila
   cout << endl << endl;

   for (int i = 1; i <= valor; ++i)
   {
      cout << setw(4) << i; // Primera columna
      for (int j = 1; j <= valor; ++j)
      {
         cout << setw(4) << i*j;
      }
      cout << endl;
   }
}

Edita, compila y ejecuta el código

El bucle externo recorre todos los enteros en el intervalo [1, valor] usando el contador i y el interno recorre el mismo rango, pero utilizando un segundo contador j. Así, en la primera iteración del bucle externo, cuando i tiene el valor 1, el bucle interno agota todas las posibles iteraciones, con j barriendo todos los valores del rango [1, valor]. Y así sucesivamente.

Para visualizar por pantalla la tabla con cierta estética, se utiliza un formato para alinear correctamente las columnas. Es el objetivo de la función setw(n), que reserva al menos n espacios para el flujo de caracteres al que afecta. Necesita que se incluya el archivo de cabecera iomanip, que forma parte de la biblioteca estándar iostream.