Capítulo 6: Ciclos While


La técnica de definir nuevas funciones y definir for ciclo s, tan útiles como son, en realidad no permite a Karel resolver ningún problema nuevo. Cada vez que run un programa, siempre hace exactamente lo mismo. Los programas se vuelven mucho más útiles cuando pueden responder de manera diferente a diferentes entradas.

Como ejemplo, digamos que desea escribir un programa para tener Karel moverse en una pared. Pero no desea simplemente que este programa funcione en un mundo con un tamaño fijo. Le gustaría escribir un programa único que pudiera funcionar en cualquier mundo.

Intente cambiar el mundo haciendo clic en el menú desplegable "Cambiar mundo" sobre el mundo. Para cualquier tamaño de mundo, Karel será moverse hasta que golpee una pared. Tenga en cuenta que esta hazaña no se puede lograr utilizando un for ciclo . Eso requeriría que conozcamos el tamaño del mundo al momento de programar.

Basic While Loop

En Karel , un while ciclo se usa para repetir un cuerpo de códigoMientrasse cumple una condición dada. los while ciclo tiene la siguiente forma general:

while prueba :
declaraciones a repetir

El control de flujo de un while ciclo es el siguiente. Cuando el programa alcanza un while ciclo comienza a repetir un proceso donde primerochequesSi la prueba pasa, y si es así.run sel código en el cuerpo.

Cuando el programachequesSi la prueba pasa, decide si elpruebaes cierto para el estado actual del mundo. Si es así, ciclo será run el código en el cuerpo. Si la prueba falla, el ciclo ha terminado y el programa moverse está encendido.

Cuando el programarun sel cuerpo del ciclo , el programa ejecuta las líneas en el cuerpo de una en una. Cuando el programa llega al final del while ciclo , vuelve a la parte superior del ciclo . Luego, vuelve a verificar la prueba y continúa hasta ciclo si pasa. El programa no sale del ciclo hasta que llega a una verificación y la prueba falla.

Karel tiene muchospruebadeclaraciones, y vamos a repasar todos ellos en el siguiente capítulo. Por ahora vamos a utilizar una sola declaración de prueba: frente_despejado() lo cual es cierto si no hay una pared directamente enfrente de Karel .

Fencepost Bug

Modifiquemos nuestro programa anterior para hacerlo más interesante. En lugar de simplemente moverse hacia una pared, Karel que Karel coloque una línea de conos , una en cada cuadrado. Nuevamente queremos que este programa funcione para un mundo de cualquier tamaño:

Eso se ve genial. Excepto por un problema. En todos los mundos, Karel no coloca cono en el último cuadrado de la línea (mire de cerca). Cuando Karel está en el último cuadrado, el programa no ejecuta el cuerpo del ciclo porque la prueba ya no pasa: Karel está frente a una pared. Es posible que tenga la tentación de intentar cambiar el orden del cuerpo para que Karel moverse s antes de colocar un cono . El código es editable, así que pruébalo.

Existe un problema más profundo que ningún reordenamiento del cuerpo puede resolver. Para el mundo con 7 columnas, Karel necesita poner 7 conos , pero solo debería moverse() 6 veces. Desde el while ciclo ejecuta ambas líneas cuando pasa una prueba, ¿cómo puede hacer que el programa ejecute un comando una vez más que el otro?

El error en este programa es un ejemplo de un problema de programación llamado error del poste . El nombre proviene del hecho de que si desea construir una cerca hecha de paneles que tengan un poste de cerca en cualquier tamaño, el número de postes de cerca es siempre uno mayor que el número de paneles. ¿Cuántos postes de cerca, por ejemplo, necesita para construir una cerca con 10 paneles? La respuesta es 11, como se ilustra en el siguiente diagrama:

Una vez que lo descubra, corregir este error es bastante fácil. Antes de que Karel detenga en el fin del mundo, todo lo que tiene que hacer el programa es colocar un cono final:


Siguiente capítulo