[C con Clase] saludo

Salvador Pozo salvador en conclase.net
Mar Oct 13 10:29:02 CEST 2009


El pasado 2009-10-13 01:45:09, jose gabriel escribió:
 
jg> Buenas noches, caballeros y damas,

Hola:

jg> ...
jg> No me queda claro cuando hablan de bucles y mencionan el while y el do while.
jg> Me resulta difícil entender si es lo mismo que en mis clases en
jg> español me enseñan como un bucle tipo Repita-Hasta y cuál es la
jg> ventaja si se utiliza un bucle Mientras.

Básicamente existen tres estructuras de control de flujo: mientras (while), repetir-mientras (do..while) y para (for).

No sé en Costa Rica, o en otros países. En España tenemos cierta tendencia a conservar ciertas palabras (no sé si correcta o incorrectamente), en inglés. Probablemente para no confundir ni confundirnos, ya que estas palabras suelen ser palabras reservadas y su significado no coincide exactemente con su traducción literal. Para mi esto tiene la "ventaja" de que no limitamos el significado de conceptos a su definición de diccionario, ya que usando palabras no españolas, podemos definirlas de forma diferente, obviando su traducción o su significado original. Pero esto es una opinión personal...

De momento olvidemos el bucle for, que no es más que una forma elaborada de un bucle mientras o "while".

Esto nos deja dos bucles o estructuras de control: while y do..while.

Tu mencionas también la estructura repetir hasta (repeat..until).

Dependiendo del lenguaje, a veces se usa la estructura do..while y otras repeat..until. (Otras veces ninguna de las dos).

Por ejemplo, C y C++ usan do..while, y PASCAL repeat..until. El BASIC original no usaba ninguna de las dos, y sólo disponía de bucles for. El resto de las estructuras de control se implementaban usando sentencias se salto "goto".

La diferencia entre un bucle do..while y uno repeat..until es la condición de salida del bucle.

En el primero, el bucle se repite "mientras" la condición sea verdadera. En el segundo, "hasta" que la condición sea verdadera, es decir, "mientras" sea falsa.

Evidentemente, "mientras" y "hasta" implican condiciones contrarias. Estos dos bucles son equivalentes:

do {
   sentencia;
} while(condicion);

repeat {
   sentencia;
} until(!condicion);

(Esto suponiendo que C/C++ dispusieran de bucles repeat..until).

jg> Qué cambios habría que hacer mínimos para pasar de un while (en
jg> teoría) a un do while? sería lo mismo o similar para pasar de un
jg> repita-hasta y un mientras? Entiendo que en el repita-hasta se evalúa
jg> una vez, en el mientras se evalúa cero veces si es false.
jg> Estoy hecho un lío porque mi libro como les digo está en español. Y
jg> ustedes usan while en ingles.

Evidentemente, todas estas estructuras no son imprescindibles, aunque facilitan mucho la programación y la compresión del código, y por lo tanto su análisis, mantenimiento y corrección de errores.

Un bucle do..while se puede escribir usando una estructura while:

----
do {
  <sentencia>
} while(condicion);
----
Forma 1:
----
condicion=true;
while(condicion) {
  <sentencia>
}
----
Forma 2:
----
<sentencia>
while(condicion) {
  <sentencia>
}
----

La forma 1 nos sirve si condición es una variable que admita una asignación, pero esto no es siempre posible.

La forma 2 es más general, pero implica escribir dos veces el mismo conjunto de sentencias del bucle. Imagina que este conjunto (bloque) está compuesto por cien o doscientas líneas. En ese caso tendremos que escribir una función o, si hay que corregir un error o hacer una modificación, hacerlo en dos sitios diferentes.

Pasar un  while a un do..while no es tan evidente, y requiere más código:

----
while(condicion) {
  <sentencia>
}
----
Equivalencia:
----
do {
  if(condicion) <sentencia>;
} while(condicion);
----

Muy artificioso, ¿verdad?

Todo esto es hablando de forma abstracta. Imagina, por un momento, que la "condición" no es una expresión booleana simple, sino la llamada a una función, que puede modificar valores de variables, o una sentencia con operadores de incremento o decremento. En ese caso, las equivalencias no son tan claras, ya que cada vez que se evalúa una "condición" hay efectos secundarios. Hay que tener en cuenta todos estos matices cuando se buscan equivalencias.

Vuelvo a tu pregunta. Cuando los bucles son repetir..hasta, además de estas conversiones hay que invertir las condiciones en las comparaciones.

jg> No hablo de un lenguaje específico, solo de algoritmos generales que
jg> después serán llevados a algún lenguaje como C++.

Por supuesto, todo esto es general, y como he dicho, no todos los lenguajes disponen de todas las estructuras de control.

El artículo que mencionas contiene algunos consejos prácticos interesantes. Es importante elegir correctamente la estructura de control adecuada, ya que facilitará la tarea de implementar el programa, así como su mantenimiento, evitando errores y código innecesario.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase