6.3+Bucles+While

Una vez acabados los bucles for, nos centraremos en los bucles While. **6.3.1. Concepto del bucle While.**  El bucle **While** se utiliza cuando realmente no sabemos el número de iteraciones que se van a realizar en el bucle, sin embargo sí sabemos que mientras se cumpla una determinada condición debemos realizar el bucle. Cuando esa condición ya no se cumpla entonces el bucle finalizará. En este tipo de bucles no existe ninguna variable que indique el número de vueltas que ha realizado o falta por realizar. **El único control** que utiliza es una **condición que está al comienzo del bucle**, mientras esta condición sea cierta se realizan iteraciones y en el momento que sea falsa se finaliza el bucle. Al estar la condición a la entrada del bucle, lo primero que se hace es comprobar la condición y después la iteración; esto significa que antes de comenzar a realizarse el bucle debe comprobar que la condición es verdadera, si ésta no lo es entonces el bucle no se realizará. Por tanto después de cada iteración el bucle vuelve a la puerta para comprobar si la condición es falsa o verdadera. Este tipo de bucles es muy útil en programación puesto que simula procesos reales; por ejemplo en un surtidor se podría llenar los depósitos de combustible mientras haya gasolina; una máquina expendedora de billetes puede vender billetes mientras haya billetes. En general este bucle es muy efectivo en procesos que sigan el esquema **mientras..ocurra algo...hacer tal cosa**. El "ocurra algo" es la condición del bucle y "hacer tal cosa" es el cuerpo del bucle; es decir, las sentencias que se ejecutan durante la iteración. Un ejemplo sería.

Como ya sabes, las máquinas de tabaco suministran un paquete determinado introduciendo unas monedas. Esta máquina funciona con un bucle de tipo While ya que se podría expresar por: "**mientras haya paquetes de tabaco venderlos**". La condición **haya tabaco** se puede expresar como **tabaco>0** y el proceso **"venderlos"** por: **tomar dinero; dar cajetilla; devolver cambio**(si lo hay) **y hacer tabaco=tabaco-1** (quiere decir que queda una cajetilla menos). Así se podría expresar:

mientras (tabaco>0) tomar dinero. dar cajetilla. devolver cambio (si lo hay). tabaco=tabaco-1. (se ha vendido un paquete). fin del bucle. <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">1.- Al comienzo del programa los valores de la expresión que forma la condición están inicializados. Volviendo al ejemplo anterior, es lógico que si se quiere vender las cajetillas antes haya asique, si se han metido inicialmente 100 cajetillas en el programa se expresa **"tabaco=100"** y esto se realiza antes de comenzar el bucle. <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">2.- Dentro del bucle se altera la condición de entrada; es decir, si se está ejecutando el bucle esto quiere decir que la condición es verdadera. Si esta condición no cambiara nunca entonces el bucle sería infinito (la puerta estaría siempre abierta). Así pues, llegará un momento en el que la condición tendrá que ser falsa y por tanto finalice el bucle. En el ejemplo anterior existe la sentencia **"tabaco=tabaco-1"** que causará que la condición (tabaco>0) sea falsa. Realmente esto ocurrirá cuando se realicen 100 iteraciones dentro del bucle o lo que es lo mismo cuando se hayan vendido las 100 cajetillas de tabaco.

<span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;">**Recuerda que:** los bucles while antes de comenzar a realizar una iteración comprueban una condición, si ésta es verdadera entonces se realiza una iteración y si es falsa entonces finaliza la ejecución del bucle.

<span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">**Los bucles que no se ejecutan nunca** se suelen presentar cuando antes del bucle la condición es falsa, por tanto no se entra en el bucle y éste no se realiza. Si ocurre esto revisa los valores iniciales que conforman la expresión que hay dentro de la condición. <span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;">**Los bucles infinitos** se suelen presentar cuando dentro del bucle no se cambia la condición de entrada.

<span style="color: #ff0000; display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">** 6.3.2. Representación algorítmica del bucle While. ** <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">La estructura general de la sentencia while es la siguiente: <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">(1)mientras (condición) <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">(2) bloque de sentencias; <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">(3)fin while. <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">Donde **bloque de sentencias** es cualquier conjunto de sentencias C. La estructura tiene tres partes: <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">(1) **mientras condición** se representa por el mismo símbolo que una sentencia **if** y dentro de él la condición. <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">(2) cada sentencia se representa por su símbolo. <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">(3) el **fin while** se representa mediante un punto. <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">La **figura nº 8** expre­sa un organigrama de la sen­tencia While y su explicación. <span style="display: block; font-family: 'Bookman','serif'; font-size: 16.6667px; text-align: justify;">

<span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;">Nótese que el inicio es una sentencia del tipo If, es decir que si la condición es verdadera se realizan el resto de sentencias y si no se va a la sentencia 3 finalizando el bucle.

<span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;">Para entenderlo mejor, concretizaremos con un ejemplo:

<span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">"Realizar un organigrama que represente el funcionamiento de una máquina de tabaco (por simplificar, suponer que sólo hay una marca de tabaco con un precio fijo). La máquina debe aceptar el dinero, dar el paquete y devolver el cambio".

<span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">Este problema se puede resolver con la estructura general: "mientras haya tabaco <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">venderlo", dónde venderlo es un conjunto de acciones. <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">La **figura nº 9** muestra la solución. <span style="display: block; font-family: 'Bookman','serif'; font-size: 16.6667px; text-align: justify;">

<span style="color: #ff0000; display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">**6.3.3. Bucles Do-While.** <span style="color: #ff0000; font-family: Verdana,Geneva,sans-serif; font-size: 110%;">**6.3.3.1. Concepto del bucle Do-While.**

<span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;"> Los bucles **for** y **while** tienen la caracte­rística común de que la condición se evaluaba antes de realizar el bucle, así cabía la posibilidad de que no se realizara ninguna iteración.

<span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;"> La principal diferencia del bucle **do-while**, respecto a los anteriores, es que éstos **evalúan la condi­ción al final del bucle**; así el bucle siempre realizará al menos una iteración. <span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;">Por tanto el número de iteraciones dependerá de la condición final del bucle (compuerta de salida del mismo), si es falsa (compuerta cerrada) acaba la ejecución del bucle, si no (compuerta abierta) hay otra iteración.

<span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;"> Al igual que los bucles **while** este tipo de bucles es muy utilizado puesto que muchas situaciones reales tienen una interpretación directa en el bucle **do-while**. Concretamente todas aquellas que se puedan expresar mediante: **"haz .....acciones.....mien­tras ocurra una condición"** la estructura del bucle sería:

<span style="color: #0000ff; display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">hacer <span style="color: #0000ff; display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">bloque de sentencias <span style="color: #0000ff; display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">mientras (condición)

<span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">Obsérvese que **mientras (condición)** está al final del bucle y esto hace que el bloque de sentencias se realice al menos una vez independiente­mente del valor que tenga la condición. Esta característica es la que determina la utilización del bucle; es decir, **si debemos realizar un bucle en el cual es necesario al menos hacer una iteración, entonces utilizaremos el bucle do-while.** <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">Situaciones en las cuales se requiere que el bucle se ejecute al menos una vez son por ejemplo, **todas aquellas que necesiten que una entrada de información cumpla una serie de condiciones y no se quiera continuar con el programa hasta que se cumplan**. Por ejemplo, en el organigrama de la máquina de tabaco se introducía una cantidad de dinero para adquirir un paquete, sería conveniente no dejar continuar la ejecución del programa hasta que la cantidad de dinero introducida no fuese igual o superior al precio del paquete de tabaco. Esto se realizaría así:

<span style="color: #0000ff; display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">haz <span style="color: #0000ff; display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">leer precio (cantidad introducida) <span style="color: #0000ff; display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">mientras (precio<200)

<span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;">Si se quisiera realizar el proceso a través de un bucle **while** sería más costoso, ya que necesitaríamos más sentencias de lectura: <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">precio=0 ó leer precio <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">mientras (precio<200)mientras(precio<200) <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">leer precioleer precio <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;"> fin del bucle.fin del bucle.

<span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;">Aquí se resalta la necesidad de los bucles **while** a iniciar las variables de la condición, pero en los bucles **do-while** no lo es.

<span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;">Vayamos con otro ejemplo distinto de la utilización del bucle **do-while:**

<span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">"Realizar un organigrama a través del cual se pueda jugar al número escondido. En este juego alguien escribe un número y otra persona trata de adivinarlo, esta persona dirá un número y si es mayor que el que está escrito se deberá decir "alto" mientras que si es menor se deberá decir "bajo". El juego finaliza cuando se acierta el número escrito y gana aquel que lo haya acertado en menos intentos". <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;"> Este juego se puede expresar de la forma: "di un número mientras no aciertes el número secreto" ó "juega mientras no aciertes el número secreto". Esto se puede expresar mediante un bucle **do-while** de la siguiente forma: <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">x=0 <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">haz <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">lee número (el jugador dice un número) <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">si es mayor que el secreto escribe ("alto") <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">si es menor que el secreto escribe ("bajo") <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">x=x+1 <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">mientras (número distinto al secreto) <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">escribe ("has acertado en ", x, "intentos")

<span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">La variable x mide el número de intentos que ha realizado el jugador hasta acertar.

<span style="color: #ff0000; display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">**6.3.3.2. Representación algorítmica del bucle Do-While.** <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;"> La estructura del bucle **do-while** tiene tres partes diferenciadas: inicio, bloque de sentencias y final. <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">do(comienzo del bucle). <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">bloque de sentencias;(bloque de sentencias). <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;">mientras (condición)(fin del bucle). <span style="display: block; font-family: Verdana,Geneva,sans-serif; font-size: 110%; text-align: justify;"> En este caso la condición final del bucle también actúa como "compuerta" de salida o indicador de iteraciones. El organigrama del bucle **do-while** se representa en la **figura nº 10.**

<span style="font-family: 'Bookman','serif'; font-size: 16.6667px;"> <span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%;"> Obsérvese que el final del bucle (mientras (condi­ción)) se representa por el mismo símbolo que una senten­cia **<span style="font-family: Bookman,serif; font-size: 16.6667px; line-height: 15.6pt;">if **. Dentro de las sentencias que componen el cuerpo del bucle debe haber alguna que posibi­lite cambiar el valor de la condición, ya que si el valor de ésta inicialmente es verdadero, entonces realizaríamos un bucle infinito. <span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%; line-height: 15.6pt; text-align: justify;">El algoritmo a través del cual representábamos el juego del número secreto se representa mediante un organigrama como se muestra en la **<span style="font-family: Verdana,Geneva,sans-serif; font-size: 110%; line-height: 15.6pt; text-align: justify;">figura nº 11. **



<span style="display: block; height: 1px; left: -40px; line-height: 15.6pt; overflow: hidden; position: absolute; text-align: justify; top: 5437.5px; width: 1px;"> Obsérvese que el final del bucle (mientras (condi­ción)) se representa por el mismo símbolo que una senten­cia **if**. Dentro de las sentencias que componen el cuerpo del bucle debe haber alguna que posibi­lite cambiar el valor de la condición, ya que si el valor de ésta inicialmente es verdadero, entonces realizaríamos un bucle infinito. <span style="display: block; height: 1px; left: -40px; line-height: 15.6pt; overflow: hidden; position: absolute; text-align: justify; top: 5437.5px; width: 1px;"> El algoritmo a través del cual representábamos el juego del número secreto se representa mediante un organigrama como se muestra en la **figura nº 11.**