La técnica de definir nuevos métodos y definir ciclos for , por muy útiles que sean, no permite en realidad que Karel resuelva ningún problema nuevo. Cada vez que haces 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 solo desea que este programa funcione en un mundo con un tamaño fijo. Te gustaría escribir un solo programa que podría funcionar en cualquier mundo.
Intenta cambiar el mundo haciendo clic en el menú desplegable "Cambiar mundo" que se encuentra sobre el mundo. Para un mundo de cualquier tamaño, Karel será moverse hasta que toque una pared. Tenga en cuenta que esta hazaña no se puede lograr utilizando un for ciclo . Eso nos obligaría a saber el tamaño del mundo en el momento de la programación.
En Karel , un while ciclo se usa para repetir un cuerpo de códigoMientrasuna condición dada se mantiene. El ciclo while tiene la siguiente forma general:
while( prueba ){
declaraciones a repetir
}
El flujo de control de un ciclo while es el siguiente. Cuando el programa llega a ciclo while comienza a repetir un proceso en el que 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í, el ciclo tendrá el código run en el cuerpo. Si la prueba falla, el ciclo ha terminado y el programa moverse s está moverse .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 de la ciclo while , salta de nuevo a la parte superior de la ciclo . A continuación, vuelve a comprobar la prueba, continuando a 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: frenteDespejado() lo cual es cierto si no hay una pared directamente Karel de Karel .
Modifiquemos nuestro programa de arriba para hacerlo más interesante. En lugar de simplemente Karel a una pared, Karel que Karel coloque una línea de conos , una en cada casilla. Una vez más 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 un cono en el último cuadrado de la línea (observe detenidamente). Cuando Karel está en el último cuadrado, el programa no ejecuta el cuerpo del ciclo porque la prueba ya no pasa, Karel se enfrenta a una pared. Puede tener la tentación de intentar cambiar el orden del cuerpo de modo que Karel moverse s antes de colocar un cono. El código es editable así que ¡pruébalo!
Hay un problema más profundo que ninguna reorganización del cuerpo puede resolver. Para el mundo con 7 columnas, Karel necesita colocar 7 conos , pero solo debería moverse 6 veces. Dado que el ciclo while 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 cualquiera de los tamaños, el número de mensajes de cerca siempre es uno mayor que el número de paneles. ¿Cuántos postes de la cerca, por ejemplo, necesitas construir una cerca con 10 paneles? La respuesta es 11, como se ilustra en el siguiente diagrama:
Una vez que lo descubres, arreglar este error es bastante fácil. Antes de que Karel detenga en el fin del mundo, todo lo que el programa tiene que hacer es colocar un final cono :