17 de junio de 2016

La estructura de control do-while.

   La estructura de control o ciclo do-while tiene la siguiente estructura general:

                         do {
                             sentencia(s);
                         } while (expresión);

   El ciclo do-while procesa o ejecuta el grupo de sentencia(s) delimitadas por su bloque de manera repetida, mientras la expresión al ser evaluada sea distinta de cero, es decir: expresión != 0.

   La llave izquierda “{” delimita el inicio de su bloque, mientras que la llave derecha “}” delimita su final.

   El conjunto de sentencia(s) delimitadas por el bloque del ciclo do-while se procesan al menos una vez, y cuando la secuencia de ejecución alcanza el indicador de fin del bloque y la palabra reservada while, se evalúa la expresión. Si expresión != 0, la estructura do-while modifica el flujo de ejecución secuencial para que brinque automáticamente a la palabra reservada do, y se repita el procesamiento de las sentencia(s) delimitadas por su bloque. En caso contrario, se procesa la siguiente sentencia que se encuentre después de la palabra reservada while.

   Observe que la descripción y el funcionamiento de la estructura do-while es similar al de la estructura while, con la diferencia de que la expresión en el ciclo while es evaluada al principio, mientras que en el ciclo do-while es evaluada al final. En base a esto, se tiene que:
  • Las sentencias de la estructura de repetición while se repiten de 0 a n-veces.
  • Las sentencias de la estructura de repetición do-while se repiten de 1 a n-veces.
   En esencia, esta es la única diferencia que existe entre las estructuras de repetición while y do-while. No olvide tenerlo en mente.

   Un ejemplo de uso de la estructura de repetición do-while se muestra en el Ejemplo 3.11. Observe la semejanza con el Ejemplo 3.9, y note que la principal diferencia radica, aparte del uso del ciclo do-while, en la expresión condicional de la línea 15, ya que se hace uso del operador de pos incremento para la variable de control en la expresión condicional, sin embargo, compruebe que la salida es exactamente la misma para ambos ejemplos.

   La estructura de repetición do-while ha sido relegada y poco apreciada por muchos programadores, pero tiene nichos de aplicación muy específicos y concretos en los que resulta más que conveniente.

   El Ejemplo 3.12 retoma el problema de indeterminación para la división discutido en la entrada correspondiente a la estructura de control if pero solucionado desde otro enfoque: repetir la solicitud del denominador y su respectiva lectura, mientras el denominador sea igual a cero, que es precisamente lo contrario a lo que se requiere.

   Aunque al principio lo anterior podría parecer contradictorio, si se analiza y reflexiona con detenimiento la aparente contradicción desaparece: el ciclo do-while de las líneas 12-15 repiten el prompt cuando no se obtiene lo deseado (que el denominador sea distinto de cero), es una lógica inversa, pero el truco está en entender que no se desea que se repita el prompt, pero si el denominador no es como se espera (distinto de cero), entonces se tiene que repetir el prompt. Por lo tanto, la expresión condicional se expresa en términos de dicha situación: la negación de distinto de cero es igual a cero.

   Observe que la línea 17 puede ejecutarse ya sin ningún tipo de verificación, ya que cuando la estructura de control secuencial la procese, es porque la validación hecha en el ciclo do-while se aseguró de que el denominador es distinto de cero, ya que en caso contrario, el flujo de control seguiría dentro del ciclo.

   Por último, es importante mencionar que es posible reescribir todo lo que se escriba con un ciclo while con un ciclo do-while y viceversa, pero existen nichos específicos en los que uno conviene más que el otro, y la lectura de datos acompañada de su respectiva validación se expresan de manera más natural con una estructura de repetición do-while.