Bucle do - while

Es una variante especial del bucle while. Al contrario que el bucle while, que comprueba la condición antes de entrar en el bucle, el bucle do - while la evalúa al final del bucle. Esto implica que el bucle se ejecutará al menos una vez.

do
{
   bloque de sentencias;
}
while (condicion);
../../_images/do_while.jpg

Diagrama de flujo de la sentencia do - while

El uso de do - while es muy habitual en los menús de introducción de datos por parte de un usuario.

  1. Al menos una vez el usuario tendrá que introducir los datos

  2. Si se detecta un error, se vuelven a solicitar

El siguiente ejemplo, que vuelve a utilizar la introducción del ordinal de un mes, muestra cómo con do - while se obtiene una versión más compacta respecto a su alternativa vista anteriormente usando while.

Ejemplo 1

#include <iostream>
using namespace std;

int main()
{
   int mes;
   do
   {
      cout << "Dame el mes: (1, 2, ..., 12): ";
      cin >> mes;
      if (mes < 1 || mes > 12)
         cout << "El valor introducido no es válido.\n";
   }
   while (mes < 1 || mes > 12);

   if (mes == 1 || mes == 3 || mes == 5 || mes == 7 ||
       mes == 8 || mes == 10 || mes == 12)
      cout << "El mes tiene 31 dias.\n";
   else if (mes == 2)
      cout << "El mes tiene 28 o 29 dias.\n";
   else if (mes == 4 || mes == 6 || mes == 9 || mes == 11)
      cout << "El mes tiene 30 dias.\n";
   else
      cout << "¡Imposible!\n";
}

Edita, compila y ejecuta el código

El siguiente ejemplo utiliza el bucle do - while para un menú, uno de sus usos más habituales.

Ejemplo 2

#include <iostream>
using namespace std;
int main()
{
   int opcion;
   double celsius, kelvin;
   do
   {
      cout << "Este programa transforma temperaturas.\n";
      cout << "Elija una opcion:\n";
      cout << "1. De grados celsius a grados kelvin\n";
      cout << "2. De grados kelvin a grados celsius \n\n";
      cout << "Por favor, introduzca su opcion (1 o 2): ";
      cin >> opcion;
      if (opcion != 1 && opcion !=2)
         cout << "La opción elegida no es válida\n";
   }
   while (opcion != 1 && opcion !=2);

   switch(opcion)
   {
      double celsius, kelvin;
      case 1: // paso de Celsius a Kelvin
         cout << "Introduzca la temperatura en grados Celsius: ";
         cin >> celsius;
         if (celsius >= -273)
         {
         kelvin = celsius + 273;
         cout << celsius << " grados C son " << kelvin << " grados K.\n";
         }
         else
         cout<<"Temperatura por debajo del cero absoluto.\n";
      break;
      case 2: // paso de Kelvin a Celsius
         cout << "Introduzca la temperatura en grados kelvin: ";
         cin >> kelvin;
         if (kelvin >= 0)
         {
            celsius = kelvin - 273;
            cout << kelvin << " grados K son " << celsius << " grados C.\n";
         }
         else
            cout<<"Temperatura por debajo del cero absoluto.\n";
         break;
      default:  // Puede obviarse en este caso
         cout<<"La opcion escogida no es valida.\n";
   }
}

Edita, compila y ejecuta el código