Programación de Karel 1° Edición
Programación de Karel 1° Edición
Programación de Karel 1° Edición
ra-
Izqui
erda;
Pr
ogr
ama
enKci
ón
ar
el
Guz
mán
-Pa
di
ll
a-G
óme
z
‐ 7 ‐
1
Introducción a Karel
Introducción
Karel es un software de programación, el cual posee su propio lenguaje y
está orientado al aprendizaje de algoritmos, es decir, el propósito
principal de Karel es entrenar al usuario en el uso de la lógica para la
resolución de problemas.
Karel, tiene como característica principal el simular un robot el cual
gráficamente es representado por una flecha azul, la cual viaja en torno a
su mundo (una cuadricula de 100x100) como si fuera una ciudad, donde
existen calles (eje Y) y avenidas (eje X). Dentro de su mismo mundo
pueden existir paredes (líneas negras) las cuales tienen como fin el
impedir o limitar el paso del robot por determinado sitio. Además, Karel
lleva consigo una mochila, en la cual puede guardar zumbadores que
recoge en su camino o bien de donde puede tomar zumbadores para
colocarlos en alguna coordenada del mundo.
1.1 Ambiente de Karel
El ambiente básico de Karel está conformado por 4 secciones:
a) Mundo: Es la ciudad donde Karel estará trabajando de acuerdo a las
condiciones del programa codificado.
b) Programa: Sección donde se escribe (codifica) el programa, y se puede
elegir entre 2 lenguajes diferentes que son Pascal y Java.
OMIJal Gira‐Izquierda;
‐ 8 ‐
c) Ejecutar: En ésta sección se corre el programa (lo empieza a ejecutar),
el cual tiene que estar previamente codificado y compilado. Aquí es
donde vemos gráficamente como actúa Karel en base al programa que se
elaboró y dentro del Mundo que se creó.
d) Ayuda: Contiene un sencillo tutorial acerca del uso de Karel. También
viene la sintaxis de las instrucciones.
Sección Mundo:
Esta pestaña cuenta básicamente con 5 botones:
‐ Nuevo. Crea un nuevo archivo de mundo.
‐ Abrir. Abre un archivo de mundo previamente guardado.
‐ Guardar como. Guarda el mundo que está actualmente abierto,
y se puede elegir la ubicación donde se guardará y el nombre del
archivo.
Zumbadores en la mochila, es la cantidad de zumbadores que
inicialmente Karel carga en la mochila.
Sección Programa:
OMIJal Gira‐Izquierda;
‐ 9 ‐
Esta pestaña cuanta básicamente con 5 botones:
‐ Nuevo. Crea un nuevo archivo de texto para escribir el código
fuente de un programa.
‐ Abrir. Abre un archivo de texto con un programa previamente
codificado y guardado.
‐ Guardar. Guarda el programa que esté actualmente abierto.
‐ Compilar. Compila el archivo abierto, con el objetivo de localizar
posibles errores físicos en la escritura del programa, todo
programa que se desee ejecutar deberá antes ser compilado y
haber obtenido en este proceso el mensaje de “Compilación
Correcta”. Cada vez que se realicen modificaciones la programa,
se deberá compilar, de lo contrario no se tomarán en cuenta los
cambios realizados al programa.
Sección Ejecutar:
Esta pestaña cuenta con 4 botones y 2 cuadro de texto.
‐ Adelante. Ejecuta la siguiente línea de código.
‐ Correr. Empieza a ejecutar el programa desde la última línea en
la que se quedó.
OMIJal Gira‐Izquierda;
‐ 10 ‐
‐ Detener. Pausa la ejecución del programa
‐ Inicializar. Regresa a Karel a su posición inicial, sitúa la ejecución
del programa al inicio del mismo e inicializa el mundo de trabajo.
Retardo de ejecución, es el tiempo en milisegundos que tardará
el programa, en ejecutar una línea de código.
Para poner una pared dentro del mundo, se tiene que dar un click entre 2
manzanas (cuadros grises), y para quitarla, simplemente se da click a la
pared existente que se desee eliminar.
Con pared: Sin pared:
OMIJal Gira‐Izquierda;
‐ 11 ‐
Karel puede girar en su mundo solamente hacia la izquierda, y siempre
en etapas de 90 grados; de esta manera, solo puede estar orientado
hacia 4 puntos, que son Norte, Sur, Este y Oeste.
Se puede establecer el lugar y la orientación de Karel en el mundo, de la
siguiente manera: se da click derecho en cualquier esquina, y se abrirá un
menú emergente, elegiremos “Situar a Karel”, y posteriormente la
orientación que se desea.
En el mundo también se puede definir el número inicial de zumbadores
que Karel traerá en su mochila, los cuales pueden ir de 0 hasta INFINITO.
Es posible poner zumbadores en el mundo, por donde Karel transitará,
para poner una cantidad de zumbadores iniciales en el mundo,
simplemente se da “click derecho” sobre la posición deseada y en menú
emergente que aparece se elige la cantidad deseada, que puede ser de 0
a 9, una cantidad definida o infinitos zumbadores.
OMIJal Gira‐Izquierda;
‐ 12 ‐
OMIJal Gira‐Izquierda;
‐ 13 ‐
2
Estructura de un Programa
Introducción
En este capítulo comenzaremos a analizar las instrucciones básicas con
las que cuenta Karel, describiremos para que pueden ser utilizadas y la
manera correcta en que deben ser escritas (sintaxis) dentro del código.
Karel es la simulación de un robot el cual tiene las siguientes limitantes:
• No puede dar vueltas hacia la derecha
• No tiene reversa
• No salta paredes
• Solo detecta a los zumbadores que están en su misma
coordenada
• No sabe cuántos zumbadores hay en su mochila
• Una vez que se apaga no se puede volver a prender salvo
que vuelva a comenzar el programa
• No tiene variables explicitas a diferencia de otros
lenguajes
A pesar de estas limitantes, siempre en base a un algoritmo podrás
encontrar la solución y lograr tu objetivo. Por ejemplo; si quieres dar
“vuelta a la derecha”, tu sabes que no existe esta instrucción, pero si das
3 “vueltas a la izquierda” obtendrás el resultado buscado… una “vuelta a
la derecha”, o bien puedes crear una función gira‐derecha que realice
esta acción.
Básico en un programador que está iniciando, es que se acostumbre a
poner comentarios en sus programas, estos comentarios son textos que
forman parte del Código, pero Karel no los toma en cuenta para su
funcionamiento. Los comentarios son útiles, cuando se desea tener un
OMIJal Gira‐Izquierda;
‐ 14 ‐
Para poner un texto como un comentario, se pone un paréntesis que
abre, seguido de un asterisco (* y al final del texto se pone un asterisco y
un paréntesis que cierra *).
Recuerda
Sintaxis:
(* Esto es un comentario *)
Cuando escribas algún comentario dentro del código este quedará
sombreado para diferenciarlo del código y podrá tener incluso varias
líneas como se muestra a continuación.
iniciar‐programa
inicia‐ejecucion
(* este programa hace avanzar a
Karel una posición *)
avanza;
apagate;
termina‐ejecucion;
finalizar‐programa
Correcto
Cuando desarrolles un programa, se recomienda que uses tabulaciones para
identificar el cierre y apertura de instrucciones de manera fácil.
Avanzar
Esta instrucción permite que Karel camine una calle o avenida hacia
adelante, según sea la orientación que tenga.
Antes: Después:
Recuerda
Sintaxis:
avanza;
Girar hacia la izquierda
Indica a Karel que deberá dar un giro de 90 grados hacia la izquierda.
Antes Después
Recuerda
Sintaxis:
gira-izquierda;
Coger un zumbador
Esta instrucción logra que Karel recoja un zumbador que este en la
misma posición donde él se localiza, si Karel quiere recoger un zumbador
donde no existe, el programa se terminará abruptamente desplegando
un mensaje de error.
OMIJal Gira‐Izquierda;
‐ 16 ‐
Antes Después
Recuerda
Sintaxis:
coge-zumbador;
Dejar un zumbador
Esta instrucción logra que Karel saque de su mochila un zumbador y lo
deje en la esquina donde se localiza, para esto Karel deberá tener en su
mochila al menos un zumbador, de lo contrario el programa terminará
abruptamente y enviara un mensaje de error.
Antes Después
Recuerda
Sintaxis:
deja-zumbador;
Apagarse
Esta instrucción permite que Karel sea apagado y con esto finalizar la
ejecución del programa, una vez apagado solo si el programa se ejecuta
nuevamente Karel volverá a “prenderse”, puedes escribir a lo largo de tu
código más de una vez este comando, solo debes cuidar que no se
apague antes de que haber resuelto correctamente el problema.
OMIJal Gira‐Izquierda;
‐ 17 ‐
Recuerda
Sintaxis:
apagate;
A partir de las instrucciones que hemos aprendido en este capítulo
podemos comenzar a desarrollar nuestro primer programa en Karel.
2.2 Desarrollo y Ejecución de Programas
La estructura de un programa en Karel
Cuenta con 2 simples secciones:
1) iniciar‐programa … finalizar‐programa: Indica donde irá todo
el código fuente del programa; donde inicia y donde finaliza.
Para terminar la ejecución del programa, debe estar la instrucción
apágate. Esta indica el momento en que Karel debe de apagarse.
OMIJal Gira‐Izquierda;
‐ 18 ‐
Pasos para hacer un programa:
1. Ir a la Sección Mundo y diseñar un mundo que cumpla con las
condiciones iniciales del problema, tales como (número de
zumbadores en la mochila, orientación y ubicación de Karel,
colocación de zumbadores, etc.). Recuerda que en los concursos
de programación tu programa es evaluado en por lo menos 5
mundos, donde todos estos cumplen con las condiciones iniciales
del problema y donde tu código siempre tendrá que lograr la
solución.
2. Una vez que termines de diseñar el mundo guárdalo utilizando el
botón de Guardar o Guardar como.
3. Ir a la Sección Programa y revisar que
esté seleccionada la opción Pascal y
enseguida presionar el botón de Nuevo.
4. Escribir el código con la solución al problema planteado, grabar y
compilar el programa.
5. Si marca errores, deberás leer cuidadosamente
el tipo de error que tuviste y la línea donde esta
(este número de línea es aproximado), una vez
corregido deberás volver a Compilar tu
programa hasta que te aparezca una ventana
como la siguiente.
6. Ir a la Sección de Ejecutar
7. Presionar el botón Inicializar y luego el botón Correr.
Correcto
Cuando vamos a desarrollar un programa en Karel, se nos dará un
problema, el cual debemos de leer muy bien y analizar cada una de las
consideraciones, además recuerda que los mundos que se muestran son
solo un ejemplo, es importante probar tu programa en varios mundos que
cumplan con las consideraciones del problema.
OMIJal Gira‐Izquierda;
‐ 19 ‐
Errores comunes de programación.
Cuando diseñamos un programa, es frecuente incluir inconscientemente
algunas acciones que Karel no puede realizar y por tanto generar una
terminación anormal del programa, cuando esto ocurre nos muestra una
ventana como la siguiente:
Algunas de estas acciones son:
• Intentar recoger zumbadores cuando no existen.
• Dejar un zumbador cuando no tiene en su mochila.
• Querer atravesar una pared
Ejemplo
En el siguiente programa pondremos en práctica cada una de las sentencias
básicas de Karel que aprendimos, y observaremos como es afectado el mundo
de Karel con estas instrucciones.
Programa de Arranque
Karel se encuentra en su casa (posición 1,1) orientado al norte,
deberá recoger el zumbador que tiene en su casa y llevarlo a la casilla
superior siguiente (2,1) y terminar la misión orientándose al oeste.
El mundo inicial de Karel
OMIJal Gira‐Izquierda;
‐ 20 ‐
Karel recogerá el zumbador que tiene
en su casa (“coge‐zumbador;”), y el
mundo quedará como se muestra.
La siguiente instrucción será avanzar
(“avanza;”), un paso al frente.
Ahora Karel dejara el zumbador en la
nueva locación (“deja‐zumbador”;).
El problema solicita que Karel termine su trabajo
orientado al oeste, para lo cual deberá girar en 1
ocasión a la izquierda (“gira‐izquierda”;)
Para terminar se da la instrucción apágate, y
el programa habrá terminado.
OMIJal Gira‐Izquierda;
‐ 21 ‐
Código:
iniciar‐programa
inicia‐ejecucion
coge‐zumbador;
avanza;
deja‐zumbador;
apagate;
termina‐ejecucion
finalizar‐programa
¡A programar!
Es tiempo de poner a prueba tus capacidades, visita el Problemando Básico 1
(apéndice E) y realiza el programa #1 ‐ “La cartera”.
Recuerda que en el apéndice F puedes encontrar los códigos ideales para
resolver los problemas del Problemando Básico 1, pero antes de visitarlo intenta
resolverlos por ti mismo.
OMIJal Gira‐Izquierda;
‐ 22 ‐
3
Toma de Decisiones
Introducción
Para realizar un programa que funcione en diversos tipos de mundos,
será necesario que tu programa tome decisiones tales como decidir qué
camino tomar, que hacer en caso de encontrar una pared, o cual es la
esquina con el mayor número de zumbadores.
Cuando se toma una decisión, se puede decir que básicamente existen
dos posibilidades de acción, de las cuales sólo se va a ejecutar una;
dependiendo de las circunstancias del programa en ese momento.
En Karel la palabra reservada que le corresponde a la toma de decisiones
es “SI”. Palabra reservada es aquella que es parte del Lenguaje de
Programación y el usuario no podrá usarla para fines distintos a lo que ya
tenga establecido.
3.1 Condiciones
Condiciones es como llamaremos a las “expresiones” a evaluar, puesto
que en Karel, no podemos utilizar expresiones matemáticas como en
otros lenguajes de programación.
Estas condiciones, son bastante explícitas y vienen listadas en la tabla a
continuación:
frente‐libre frente‐bloqueado
junto‐a‐zumbador no‐junto‐a‐zumbador
izquierda‐libre izquierda‐bloqueada
algun‐zumbador‐en‐la‐mochila ningun‐zumbador‐en‐la‐mochila
OMIJal Gira‐Izquierda;
‐ 23 ‐
derecha‐libre derecha‐bloqueada
orientado‐al‐norte orientado‐al‐sur
orientado‐al‐este orientado‐al‐oeste
no‐orientado‐al‐norte no‐orientado‐al‐sur
no‐orientado‐al‐este no‐orientado‐al‐oeste
Por ejemplo, si se utiliza la condición “frente‐libre” en un código para
efectuar una decisión, Karel efectuará las acciones correspondientes a un
“SI”, en caso de que no exista una pared frente a él en ese preciso
instante y las acciones de un “NO” en caso de tener frente a el una
pared.
Ejemplo
si frente‐libre entonces avanza;
Karel avanzará una ocasión si no se encuentra ante una pared.
Existen dos clasificaciones para las decisiones en Karel, “las decisiones
simples y dobles”, y “las decisiones con múltiple condición”.
3.2 Decisiones Simples
Son cuestionamientos que se realizan solo en 1 ocasión y de ser
afirmativa la respuesta se ejecutan las instrucciones dentro del bloque
(inicio – fin)
Recuerda
Sintaxis:
si <condición> entonces
inicio
instruccion1;
instruccion2;
.
instruccionN;
fin;
OMIJal Gira‐Izquierda;
‐ 24 ‐
En donde las palabras “si”, “entonces”, “inicio” y “fin”, son palabras
reservadas del lenguaje y se debe respetar tanto su escritura como su
lugar correspondiente en el bloque de código. La “condición” puede ser
cualquiera de las vistas en el subtema 3.1. y también debe respetarse al
pie de la letra su escritura para no tener errores de compilación.
Por último las “instrucciones i”, donde ‘i’ es el número de instrucción que
va desde al menos 1 hasta N, son las instrucciones que ejecutará Karel en
caso de que la condición sea cierta, en caso contrario, Karel ignorará
todas estas instrucciones y continuará ejecutándose a partir de la
primera línea posterior al “fin”.
Ejemplo
En el siguiente programa pondremos en práctica la forma de utilizar la toma
de decisiones del “si”
Problema: Karel está en su casa orientado hacia el norte y deberá
caminar en ese sentido, sus presentimientos le dicen existe una
pared a 2 calles al norte pero el deberá de constatarlo, al llegar a esa
posición y si en verdad existe la pared deberá girar a la derecha,
avanzar una calle y apagarse.
Código:
iniciar-programa
inicia-ejecucion
avanza;
avanza;
si frente-bloqueado entonces inicio
gira-izquierda;
gira-izquierda;
gira-izquierda;
avanza;
fin;
apagate;
termina-ejecucion
finalizar-programa
OMIJal Gira‐Izquierda;
‐ 25 ‐
El mundo estaría de la siguiente forma:
Debido a que la evaluación de la condición fue
positiva, se ejecuta el código dentro del “SI”
que es girar 3 veces a la izquierda y avanzar.
Nota:
Si el bloque consta de una sola instrucción no es necesario colocar las
etiquetas de “inicio” y “fin”. Ejemplo: si frente‐libre entonces avanza
3.3 Decisiones Dobles
Pero, ¿qué es lo que pasaría si fuese necesario ejecutar unas
determinadas instrucciones si, y solo si la condición es incierta?
Para esto son necesarias las decisiones dobles cuya sintaxis no es muy
distinta de las decisiones simples, sólo se le agrega un bloque de código
más al final de la decisión simple:
Recuerda
Sintaxis:
si <condición> entonces
inicio
instruccion1;
instruccion2;
.
.
OMIJal Gira‐Izquierda;
‐ 26 ‐
instruccionN;
fin
sino inicio
instruccion1;
instruccion2;
.
.
instruccionN;
fin;
Donde las palabras “si”, “entonces”, “inicio”, “fin” y “sino” son palabras
reservadas del lenguaje.
En este caso, si la condición se cumple, se ejecutará una decisión simple
como en el subtema anterior, pero en el caso que la condición no se
cumpla, se ejecutarán las instrucciones de la cláusula “SINO”.
La palabra reservada “sino” representa el inicio del bloque adicional de
código dentro del cual (representadas por las instrucciones ‘i’) está el
código a ejecutar en caso de que la condición haya resultado en un “NO”.
Hay que notar que asimismo son necesarios las etiquetas “inicio” y “fin”.
Ejemplo
En el siguiente programa pondremos en práctica la forma de utilizar la toma
de decisiones del “si” y “sino”
Código:
iniciar-programa
inicia-ejecucion
si frente-libre entonces inicio
avanza;
fin
sino inicio
gira-izquierda;
avanza;
fin;
OMIJal Gira‐Izquierda;
‐ 27 ‐
El mundo estaría de la siguiente forma:
Hasta este punto ya pasó el primer “SI”
puesto que el frente si se encontrába libre,
pero ahora se encuentra con la segunda
condición de frente libre, la cual es negativa.
Como se aprecia en el código de ejemplo, las
instrucciones en caso de que el frente no
estuviera libre son girar a la izquierda y
avanzar una vez.
En la sintaxis de las decisiones dobles, recordar que la etiqueta “fin”
correspondiente al “SI” no lleva carácter ‘;’ (punto y coma) al final;
mientras que la etiqueta correspondiente al “SINO”, si lleva ‘;’.
OMIJal Gira‐Izquierda;
‐ 28 ‐
Esto se logra utilizando las palabras reservadas de múltiple condición “Y”
y “O” entre cada par de condiciones a evaluar; es decir, si son 3
condiciones, en total se utilizarán dos palabras reservadas de múltiple
condición.
• Operador ‘y’
Para que una evaluación en una toma de decisiones utilizando 2
condiciones unidas por un operador ‘Y’ resulte en un “SI”, es necesario
que ambas condiciones sean ciertas. Basta con que una de las
condiciones sea falsa para que la evaluación resulte en un “NO” y no se
ejecute la decisión, o en su defecto se ejecute la cláusula “SINO” para
una toma de decisión doble.
Recuerda
Sintaxis:
Condición#1 Y Condicion#2
A continuación una tabla lógica del funcionamiento del operador ‘y’.
Valores con operador ‘Y’
Condición 1 Condición 2 Evaluación
NO NO NO
NO SI NO
SI NO NO
SI SI SI
Por ejemplo, si se escribe en código lo siguiente:
frente-libre y junto-a-zumbador
En ese caso, se espera que se ejecuten las instrucciones del “SI” solo si
para ese momento Karel tiene el frente libre y además se encuentra
sobre algún zumbador, de lo contrario, con que una de las dos
condiciones sea incierta no se ejecutarán las instrucciones del “SI”.
OMIJal Gira‐Izquierda;
‐ 29 ‐
Esto tiene también sentido si lo vemos desde un punto de vista
gramatical. En el vocabulario español, la conjunción “y” es utilizada
cuando es necesario mencionar elementos, condiciones, objetos,
instrucciones, etc. de las cuales es necesario que todos cumplan el
sentido de la oración. Por ejemplo: “Ana quiere una casa y un carro”;
esto nos dice que para satisfacer los gustos de Ana es necesario tanto
una casa como un carro, ambos.
Ejemplo
En el siguiente programa pondremos en práctica la forma de utilizar la
unión de condiciones por medio de “Y”.
Situación: Karel está situado en su casa (posición 1,1) y
orientado al norte, con el siguiente código, donde terminará
ubicado Karel?
Codigo:
si frente-libre y junto-a-zumbador entonces
inicio
coge-zumbador;
avanza;
fin
sino
inicio
avanza;
fin;
si frente-libre y junto-a-zumbador entonces
inicio
coge-zumbador;
avanza;
fin
sino
inicio
avanza;
fin;
si frente-libre y junto-a-zumbador entonces
inicio
coge-zumbador;
avanza;
OMIJal Gira‐Izquierda;
‐ 30 ‐
fin;
apagate;
El mundo queda de la siguiente manera:
Para el primer “SI”, la evaluación resulta falsa
puesto que si tiene el frente libre pero no se
encuentra junto a algún zumbador, por lo tanto
se ejecuta el “SINO” y simplemente avanza.
Para el segundo “SI”, la evaluación es cierta puesto
que la frente se encuentra libre y del mismo modo
esta junto a un zumbador, por lo tanto se ejecuta
el “SI” que consiste de coger el zumbador y
avanzar un paso.
Para el último “SI” la evaluación es falsa ya que Karel
si se localiza junto a un zumbador pero su frente no
se encuentra libre, y esta es la vista de cómo queda
el mundo tras terminar la ejecución del programa.
Operador ‘o’
Para que una evaluación en una toma de decisiones utilizando 2
condiciones unidas por un operador ‘O’ resulte en un “SI”, es necesario
que al menos una condición sea cierta. Esto es, es necesario que el par de
condiciones sea falso para que la evaluación resulte en un “NO” y no se
OMIJal Gira‐Izquierda;
‐ 31 ‐
ejecute la decisión, o en su defecto se ejecute la cláusula “SINO” para
una toma de decisión doble.
Recuerda
Sintaxis:
Condición#1 O Condicion#2
A continuación una tabla lógica del funcionamiento del operador ‘o’.
Valores con operador ‘O’
Condicion 1 Condicion 2 Evaluación
NO NO NO
NO SI SI
SI NO SI
SI SI SI
Por ejemplo, si se escribe en código lo siguiente:
frente-libre o junto-a-zumbador
En ese caso, se espera que se ejecuten las instrucciones del “SI” solo si
para ese momento Karel tiene:
• Ya sea el frente libre.
• Ya sea un zumbador junto a él.
• Tanto el frente libre como un zumbador junto a él.
Si no cumple con alguna de las anteriores, es decir que tanto no tenga el
frente libre como tampoco se encuentre sobre algún zumbador en el
mundo, la evaluación resultará falsa.
Esto tiene sentido si también lo vemos desde un punto de vista
gramatical. En el vocabulario español, la conjunción “o” es utilizada
cuando es necesario mencionar elementos, condiciones, objetos,
instrucciones, etc., de las cuales es necesario que al menos uno satisfaga
el sentido de la oración. Por ejemplo: “Ana quiere una casa o un carro”;
OMIJal Gira‐Izquierda;
‐ 32 ‐
esto nos dice que para satisfacer los gustos de Ana es necesario ya sea
una casa o un carro o ambos.
Ejemplo
Después de analizar el funcionamiento de la instrucción “o” veremos un
ejemplo práctico de cómo funciona.
Situación: Karel está situado en su casa (posición 1,1) y
orientado al norte, además tiene 1 zumbador en su mochila.
Con el siguiente código, donde terminará ubicado Karel?
Codigo:
si algun-zumbador-en-la-mochila o junto-a-zumbador entonces
inicio
avanza;
fin;
deja-zumbador;
El mundo (iniciando con 1 zumbador en la mochila) queda de la siguiente
manera:
Para la primera toma de decisión, Karel cuenta con un
zumbador en su mochila por tanto una de las
condiciones se cumple que es la de “algún‐zumbador‐
en‐la‐mochila”, y ejecuta las instrucciones del “SI”
que consisten en avanzar una vez.
OMIJal Gira‐Izquierda;
‐ 33 ‐
Antes del segundo “SI”, Karel dejó su único
zumbador en su posición, por tanto la evaluación
también es cierta ya que la condición “junto‐a‐
zumbador” es cierta, a pesar de ya no tener
zumbadores en la mochila, por lo tanto avanza.
Para el tercer “SI” ninguna de las dos condiciones
requeridas es cierta, por ello no se ejecutan las
instrucciones del “SI” y Karel se apaga.
• Operador “no”
El operador “no”, es bastante sencillo de entender y no se considera
dentro de las decisiones de múltiple condición puesto que sólo puede
operar con una condición.
La función del operador “no” es intercambiar el valor de la evaluación de
SI a NO y viceversa.
Recuerda
Sintaxis:
NO Condición#1
A continuación una tabla lógica del funcionamiento del operador ‘no’.
Valores operador "NO"
Condición 1 Evaluación
SI NO
NO SI
OMIJal Gira‐Izquierda;
‐ 34 ‐
Utilizar la condición:
frente-libre
Seria lo mismo que utilizar la condición:
no frente-bloqueado
Es una gran ventaja que el hecho de que sean funciones booleanas, les
permita hacer varias combinaciones de condiciones con los operadores
atrás estudiados; es por esto que se pueden utilizar mediante el uso de
paréntesis mas de un operador de múltiple condición, para generar
decisiones todavía mas específicas.
Por ejemplo:
(no (frente-bloqueado o junto-a-zumbador) y orientado-
al-este)
Tenemos que estar muy atentos a la hora de hacer este tipo de
expresiones booleanas compuestas, puesto que un solo paréntesis en
una posición inadecuada podría alterar todo el sentido de la expresión.
Las decisiones anidadas no son más que tomas de decisiones dentro de
otra toma de decisiones. Es decir, tienen la siguiente sintaxis:
Recuerda
Sintaxis:
si <condición> entonces
inicio
si <condición> entonces
inicio
instruccion1;
instruccion2;
.
.
instruccionN;
OMIJal Gira‐Izquierda;
‐ 35 ‐
fin;
instruccion1;
instruccion2;
.
.
instruccionN;
fin;
No existe restricción que limite cuantas tomas decisiones se pueden
colocar dentro de otra, en la sintaxis anterior podemos observar que solo
dentro de una está la otra toma de decisiones, pero si tu lo necesitas
puedes colocar mas.
Este tipo de codificación puede llegar a sustituir a una toma de decisión
con condición múltiple, debido a que sólo entrará al segundo “SI” si se
cumple el primero, esto es, que las instrucciones ‘i’ del segundo SI se
ejecutarán solo si ambas condiciones son correctas. Como con el
operador ‘Y’.
Ejemplo
Para observar mejor la aplicación de este tipo de instrucciones veremos a
continuación un ejemplo básico de cómo se puede aplicar las decisiones
anidadas.
si junto-a-zumbador entonces
inicio
coge-zumbador;
si junto-a-zumbador entonces
inicio
deja-zumbador;
apagate;
fin
sino
inicio
deja-zumbador;
fin;
avanza;
fin;
OMIJal Gira‐Izquierda;
‐ 36 ‐
si junto-a-zumbador entonces
inicio
coge-zumbador;
si junto-a-zumbador entonces
inicio
deja-zumbador;
apagate;
fin
sino
inicio
deja-zumbador;
fin;
avanza;
fin;
apagate;
El mundo queda de la siguiente manera:
Para el primer “SI”, Karel ejecuta las
instrucciones puesto que si se encuentra
junto a un zumbador, mientras que para el
anidado, ya no hay zumbador por lo que
ejecuta las instrucciones del “SINO”.
Dentro del “SINO” las instrucciones
consistían en dejar el zumbador recogido y
avanzar. Para el siguiente “SI”, Karel vuelve a
ejecutar las primeras instrucciones puesto
que se localiza sobre un zumbador.
OMIJal Gira‐Izquierda;
‐ 37 ‐
Para el “SI” anidado, Karel puede ejecutar
ciertamente las instrucciones ya que una vez
recogido el zumbador, vuelve a encontrarse sobre
otro (eran 2) debido a que inicialmente había dos.
Finalmente deja el zumbador y se apaga.
Aquí pudimos apreciar una de las aplicaciones más importantes de la
toma de decisiones anidada.
Pero, qué sucederá cuando no sabemos cuantos pasos deberá dar Karel
antes de encontrarse con un muro, un zumbador, o algún elemento que
le indique parar o cambiar de dirección. Resulta inútil lógicamente
repetir tantas cláusulas “SI” o “SI – SINO”, en un programa cuando
pueden ser ejecutadas cíclicamente hasta que la condición sea falsa.
Estos ciclos se conocen como “repeticiones” y los veremos en el próximo
capítulo.
OMIJal Gira‐Izquierda;
‐ 38 ‐
4
Repeticiones
Introducción
Cuando realizas un programa en Karel, habrá muchas ocasiones en las
que necesitarás que cierto bloque de instrucciones, se repita
determinado número de veces ò se ejecuten mientras no ocurra
determinado evento o condición. En este capítulo aprenderás como
realizar ciclos y con ello resolver problemas más complejos a los que
hemos elaborado.
Básicamente abordaremos tres aspectos fundamentales:
¾ Repeticiones fijas: Ejecutarán el código UN determinado número
de veces (el número de veces no puede variar mientras se ejecuta el
programa).
¾ Repeticiones condicionales: Ejecutan el código indeterminado
número de veces (depende de que tantas veces se cumpla la condición)
¾ Ciclo anidado: Ocurre cuando un bloque de instrucciones que se
repetirá se encuentra dentro de otro ciclo con más instrucciones
por repetir.
Correcto
Cuando tu ciclo solo incluya una sola sentencia (instrucción), entonces
puedes quitar el inicio y fin del ciclo.
OMIJal Gira‐Izquierda;
‐ 39 ‐
Repetir
Instrucción que repite determinado numero de veces, las instrucciones
dentro de un bloque.
No olvides
Sintaxis:
repetir xxx veces
inicio
instruccion1;
.
.
instrucción n;
fin;
Donde:
xxx = número entero que indica las veces que se repetirá.
Un ejemplo muy común en el que se utiliza este tipo de repeticiones es
cuando necesitas simular una vuelta a la derecha, para lo cual necesitas
siempre realizar tres giros a la izquierda (no existe “gira‐derecha”) y con
ello Karel quedará en la misma posición como si existiera la vuelta a la
derecha. Para lograr este objetivo basta con escribir esta instrucción:
repetir 3 veces gira‐izquierda;
Error
Un error común de programación es olvidar poner el inicio y fin en ciclos que
contienen más de una sentencia.
Ejemplo
Karel tendrá que dar 3 pasos al frente y a cada paso estará dejando un
zumbador.
OMIJal Gira‐Izquierda;
‐ 40 ‐
iniciar-programa
inicia-ejecucion
repetir 3 veces
inicio
avanza;
deja-zumbador;
fin;
apagate;
termina-ejecucion
finalizar-programa
El mundo inicial de Karel
La primera instrucción que se encuentra es la de repetir, la
cual indica que el código entre el inicio ‐ fin se ejecute el
número de veces que diga. Karel dará un paso al frente y
dejará un zumbador de los que trae en su mochila.
Cuando se ejecute por segunda vez el repetir tendrá que
realizar el mismo proceso anterior (avanzar y dejar un
zumbador).
Se ejecutará por última vez el código repetir donde
avanzará, dejará un zumbador y se saldrá del ciclo donde
encontrará la instrucción apagate.
OMIJal Gira‐Izquierda;
‐ 41 ‐
La instrucción que se utiliza para generar este tipo de repeticiones es
mientras hacer, la cual como su nombre lo dice, ejecuta las sentencias
mientras se cumpla la condición, cuando no se cumpla el ciclo se rompe y
dejará de repetir las instrucciones.
Mientras hacer
Instrucción que repite indeterminado número de veces, las instrucciones
dentro de un bloque siempre y cuando la condición se cumpla.
Recuerda
Sintaxis:
mientras xxx hacer
inicio
instruccion1;
.
.
instrucción n;
fin;
Donde: xxx = condición o condiciones que se evaluará.
En el capitulo anterior conocimos las instrucciones Y, O y NO las cuales
también pueden ser aplicadas en la condición que se deberá evaluar en
el ciclo, teniendo entonces la posibilidad de tener de una hasta todas las
condiciones que Karel puede detectar unidas con las palabras reservadas
Y, O y NO
OMIJal Gira‐Izquierda;
‐ 42 ‐
Al igual que en la instrucción anterior (repetir), si tu ciclo solo está
constituido por una sola sentencia entonces podemos reducirlo a lo
siguiente:
Recuerda
Sintaxis:
mientras xxx hacer yyy;
Comúnmente podemos ver utilizada esta instrucción en ciclos que
permitan que Karel avance hasta que tenga el frente, izquierda o derecha
bloqueada lo cual permite que al agregar dentro del ciclo alguna
instrucción se verifique si Karel está junto algún zumbador a cada paso
que da, podemos tener entonces el código de un programa básico de
Karel.
Error
No verificar al inicio del programa antes de ejecutar cualquier instrucción si
Karel está o no junto a un o unos zumbadores según sea el problema por
resolver.
Del mismo modo no verificar las esquinas y orillas del mundo en el que
Karel se desplaza.
A continuación desarrollaremos un código aplicando la instrucción
anterior y las condiciones, e instrucciones aprendidas hasta aquí.
Ejemplo
Karel tendrá que caminar hacia el frente hasta que encuentre una pared o se
acaben sus zumbadores en la mochila, tendrá que ir dejando un zumbador a
cada paso.
iniciar-programa
inicia-ejecucion
mientras frente-libre Y algun-zumbador-en-la-
mochila hacer
inicio
OMIJal Gira‐Izquierda;
‐ 43 ‐
avanza;
deja-zumbador;
fin;
apagate;
termina-ejecucion
finalizar-programa
El mundo inicial de Karel
Primero se tendrá que validar si tiene zumbadores en su
mochila y si tiene el frente libre, como podemos
observar en las imágenes iniciales ambas condiciones se
cumplen por tanto entrará y ejecutará el código del ciclo
dando un paso al frente y dejando un zumbador.
Ahora tendrá que volver a validar la condición del ciclo
con las nuevas condiciones que tiene. Ambas
nuevamente se cumplen por lo tanto ejecuta de nuevo
el contenido del ciclo.
Al regresar a las condiciones se verifica el estado de
ambas y como aun se cumplen ejecuta el código
nuevamente dando un paso al frente y dejando un
zumbador.
OMIJal Gira‐Izquierda;
‐ 44 ‐
Al validar otra vez las condiciones en el ciclo, la condición de “algún‐
zumbador‐en‐la‐mochila “no se cumplirá” ya que no tiene
zumbadores y como estamos usando un “Y” únicamente entra su
cumplió las dos condiciones por ello el ciclo no se volverá a ejecutar
y se apagará el programa finalizando la ejecución.
Un ciclo anidado se crea cuando dentro de un ciclo se inserta otro ciclo,
en estos casos podemos decir que tenemos ciclos anidados, es posible
incluir más de un ciclo dentro de cada ciclo.
Al implementar ciclos anidados en un programa debemos de tener
mucho cuidado ya que podemos cometer errores los cuales podrían
ocasionar que nuestro código no funcione correctamente ó se formen
ciclos que nunca terminen (infinitos).
Se pueden construir diferentes formas de implementar un ciclo anidado
en un programa, ahora analizaremos uno de los más comunes.
Recuerda
Sintaxis:
mientras xxx hacer
inicio
yyy;
mientras zzz hacer
inicio
www;
fin;
vvv;
fin;
OMIJal Gira‐Izquierda;
‐ 45 ‐
Donde:
xxx = condición (o condiciones) que se evaluará en el ciclo principal.
yyy = sentencias pueden ser algún si, otro ciclo, un repetir instrucciones
básicas o lo que necesites.
zzz= condición o condiciones que se evalúan en el ciclo secundario.
www= sentencias que se ejecutan mientras la condición del ciclo
secundario (zzz) se cumpla.
vvv= mas sentencias que se ejecutarán al finalizar el ciclo anterior, es
decir cuando la condición no se cumpla.
Para comprender mejor el uso de ciclos anidados programaremos un
pequeño código en Karel en el cual nuestro Robot caminará mientras no
tenga la pared bloqueada y recogerá todos los zumbadores que
encuentre a cada paso.
mientras frente-libre hacer
inicio
avanza;
mientras junto-a-zumbador hacer
inicio
coge-zumbador;
fin;
fin;
El mundo inicial de Karel
Si se cumple la condición del primer ciclo, es
decir si tiene el frente libre entonces entrará al
ciclo y ejecutará todo el código dentro de él.
La primera condición que ejecuta es avanzar
un paso.
OMIJal Gira‐Izquierda;
‐ 46 ‐
Ahora mientras se cumpla la condición del
segundo ciclo, Karel estará recogiendo todos
los zumbadores que encuentre hasta que se
quede sin zumbadores ese espacio.
El proceso se seguirá repitiendo hasta que Karel se tope con pared, en
ese caso ya no entrará al primer ciclo y se terminará el programa.
¡A programar!
En base a lo que has aprendido ya eres capaz de realizar los
problemandos básicos del apéndice E los números: 2‐8 y el 11.
Recuerda que en el apéndice F puedes encontrar los códigos ideales para
resolver los problemas del apéndice E, pero antes de visitarlo intenta
resolverlos por ti mismo.
OMIJal Gira‐Izquierda;
‐ 47 ‐
5
FUNCIONES
Introducción
En muchas ocasiones tendrás la necesidad de hacer que determinado
código se utilice en diferentes partes de un programa, en estos casos se
pueden utilizar las funciones, las cuales permiten hacer programas más
eficientes y con menos líneas de código y reutilizando instrucciones.
Antes de conocer cómo se desarrollan las funciones debemos conocer las
partes que conforma un programa en Karel:
iniciar‐programa
Implementación de funciones
inicia‐ejecucion
Programa principal
apagate;
termina‐ejecucion
finalizar‐programa
Hasta ahora siempre hemos trabajado con el programa principal
colocando dentro de él, todo el conjunto de instrucciones, a continuación
aprenderemos como crear y utilizar otro tipo de instrucciones las cuales
llamamos funciones, cada una tendrá un nombre único que las diferencia
de las demás.
En la parte de implementación de funciones tenemos que colocar todas
las funciones que necesitaremos y cuales instrucciones contendrán,
OMIJal Gira‐Izquierda;
‐ 48 ‐
siempre deberán ir arriba del programa principal ya que si las ubicas en
otro lado el programa no las podrá encontrar y marcara errores.
Error
No poner la implementación de funciones arriba del programa principal.
Recuerda
Sintaxis:
define‐nueva‐instrucción Nombre_de_función como
inicio
yyy;
fin;
Donde: yyy= es cualquier número de sentencias que desees utilizar.
A lo anterior lo conocemos como implementación de una función, y esta
se tiene que colocar antes del código principal, ente “iniciar‐programa”
e “inicia‐ejecucion”. Pero ¿Cómo podemos utilizar las funciones y el
código que pusimos en cada implementación?, a la forma de utilizar el
contenido en una función se le conoce como “llamada a función”, está
llamada puede estar en cualquier sitio del programa, ya sea dentro del
programa principal o dentro de alguna función declarada, incluso dentro
de ella misma eso se llama recursividad y lo veremos mas adelante.
de instrucciones que se encuentran después de la línea donde mando
llamar a la función, este proceso se seguirá llevando a cabo cada vez que
encuentre una función dentro del código.
Error
Llamar a dos o más funciones con el mismo nombre siendo que cada una tiene
que tener un nombre único que las caracterice y diferencie.
Es muy importante que cuando quieres dentro de una función mandar
llamar a otra, la función a llamar deberá estar desarrollada arriba de la
primera función para que el programa la pueda encontrar.
Correcto
El programa de Karel siempre busca las funciones desde donde se encuentra
hacia arriba y de no encontrarlas marca un error.
La función más común que se puede utiliza en Karel es una función que
permita dar vueltas a la derecha, utilizando la instrucción gira‐izquierda.
Ejemplo
A continuación veremos un ejemplo de cómo se puede definir la función gira‐
derecha;
iniciar-programa
define-nueva-instruccion gira-derecha como
inicio
repetir 3 veces gira-izquierda;
fin;
inicia-ejecucion
avanza;
gira-derecha;
fin;
apagate;
termina-ejecucion
finalizar-programa
OMIJal Gira‐Izquierda;
‐ 50 ‐
Este programa ordenará a Karel que camine una calle y gire a la derecha
Ejemplo
A continuación veremos un ejemplo donde Karel camina por el contorno de un
mundo cuadrado.
iniciar-programa
define-nueva-instruccion caminar como
inicio
mientras frente-libre hacer avanza;
fin;
define-nueva-instruccion gira-derecha como
inicio
repetir 3 veces gira-izquierda;
fin;
inicia-ejecucion
repetir 4 veces
inicio
caminar;
gira-derecha;
fin;
apagate;
termina-ejecucion
finalizar-programa
Como podemos observar tenemos 2 funciones ubicadas antes del inicia‐
ejecución, además es muy importante resaltar, que la función gira‐
derecha podría mandar llamar a la función caminar; sin embargo la
función caminar no puede mandar llamar a la función gira‐derecha, ya
que esta ultima esta ubicada debajo de la función caminar.
Cada función tiene un objetivo específico; la función gira‐derecha,
permite que Karel aprenda a dar vueltas a la derecha, mientras que la
función caminar hace que Karel camine en línea recta hasta encontrar la
pared bloqueada.
OMIJal Gira‐Izquierda;
‐ 51 ‐
El mundo inicial de Karel
Lo primero que se ejecutará al iniciar el
programa es el ciclo repetir 4 veces.
Después encontramos la función caminar, la
cual al ser ejecutada el código principal será
pausado y ejecutara el código dentro de la
función, es decir, que Karel comenzará a
caminar hacia el frente mientras tenga el
frente libre.
Al terminar la ejecución de la función, se
seguirá ejecutando el código principal.
Posteriormente tendrá que ser ejecutada la
llamada a función de gira‐derecha, igual que
en la paso anterior el código principal
quedará pausado y se comenzará a ejecutar
el código de gira‐derecha, el cual solo
contiene un conjunto de instrucciones que
permite simular una vuelta a la derecha.
Lo anterior se repetirá 3 veces más para concluir el ciclo
y logrando con ello completar la vuelta.
OMIJal Gira‐Izquierda;
‐ 52 ‐
Es aquella que al realizar la llamada a función se envía un número el cual
será guardado en una letra y podrá ser utilizado solo dentro de la
función, esto permite que cada vez que mandas llamar esta función
puedas enviarle un número.
El número que envías deberá estar entre paréntesis en la llamada a
función, y en la implantación deberás colocar dentro de los paréntesis
una letra o palabra que hará referencia al número que envíes, dicho
número se mantendrá constante durante toda la ejecución de la función.
Recuerda
Sintaxis Implementación:
define‐nueva‐instrucción Nombre (letra) como
inicio
yyy
fin;
Sintaxis Llamada a función:
nombre (#);
En el próximo capítulo entraremos más de lleno en este tema ya que el
paso de parámetro tiene una importante aplicación en el desarrollo de
programas avanzados, mientras tanto, veremos un pequeño ejemplo
para reafirmar el modo de enviar datos a funciones.
OMIJal Gira‐Izquierda;
‐ 53 ‐
Ejemplo
Karel tendrá que dar tres pasos e ir recogiendo zumbadores, el primero
paso tendrá un zumbador, el segundo dos y el tercero tres.
iniciar-programa
define-nueva-instruccion levantar (n) como
inicio
repetir n veces
coge-zumbador;
fin;
inicia-ejecucion
avanza;
levantar(1);
avanza;
levantar(2);
avanza;
levantar(3);
apagate;
termina-ejecucion
finalizar-programa
El mundo inicial de Karel
Primero Karel dará un paso hacia delante, después se
mandará llamar la función “levantar” enviándole como
parámetro un número 1, el cual indicará que solo recoja
una vez el zumbador.
OMIJal Gira‐Izquierda;
‐ 54 ‐
Karel dará otro paso hacia delante, pero esta vez se le
enviará a la función un número 2, logrando así que se
recojan dos zumbadores.
Por último dará otro paso hacia delante, recogiendo
ahora 3 zumbadores ya que se le enviaría un número 3
a la función.
5.3 Recursividad
Otro de los conceptos importantes, y que necesitarás dominar muy bien
para llegar a niveles TOP en Karel, es la recursividad. La cual permite
crear programas desarrollando un código más sencillo y con mayor
aplicación.
La recursividad se define como la propiedad que tienen algunos
lenguajes de programación para permitir que una función se mande
llamar así mismo; es decir que por ejemplo la función caminar dentro de
su desarrollo, mande llamar a la misma función caminar, a esto se le
conoce como función recursiva.
Cuando utilizamos la recursividad es muy importante que coloques una
condición para que sólo en determinado momento, se deje de mandar
llamar la función recursiva y no se genere un ciclo infinito y que
imposibilite continuar la ejecución del programa.
Error
No colocar una condición de ruptura para dejar de mandar llamar la misma
función en el programa.
OMIJal Gira‐Izquierda;
‐ 55 ‐
Las partes básicas e importantes de una función recursiva son:
Recuerda
Sintaxis:
define-nueva-instruccion caminar como
inicio
xxx;
si condicion entonces
inicio
yyy;
caminar;
www;
fin;
zzz;
fin;
La sintaxis anterior es un ejemplo básico de cómo debería ir desarrollada
una función recursiva, es importante resaltar, que dentro de la condición
del “si”, podemos encontrar la autollamada a la función, además que tu
puedes incluir mas llamadas a otras funciones, ciclos, instrucciones
básicas, etc., según necesites en tu programa, incluso reemplazar el “si”,
por un “si–sino” todo esto depende de la aplicación que le quieras dar a
tu función, además no afecta si incluyes la llamada a función antes o
después de las instrucciones yyy o www.
Al principio esto puede resultarte complicado pero ya que lo practiques
conocerás su utilidad y todos los beneficios que te aportará.
Ejemplo
Karel tendrá que caminar hasta toparse con una pared, dar media vuelta y
regresar a donde comenzó.
iniciar-programa
define-nueva-instruccion caminar como
inicio
si frente-libre entonces
inicio
avanza;
OMIJal Gira‐Izquierda;
‐ 56 ‐
caminar;
avanza;
fin
sino
inicio
gira-izquierda;
gira-izquierda;
fin;
fin;
inicia-ejecucion
caminar;
apagate;
termina-ejecucion
finalizar-programa
El mundo inicial de Karel
Como podrás observar el código principal no tiene más
que la llamada a función caminar y el apágate.
1.‐ Primero llamara la función “caminar” y verificará si
Karel tiene el frente‐libre, si lo tiene entrará al “si” y
ejecutará la instrucción “avanza”, posteriormente se
encontrará con otra llamada a función “caminar” por lo
que permanecerá pausado hasta donde se quedó y se
ejecutará una nueva instrucción “caminar” desde el
principio…
2.‐ Posteriormente ejecutará la misma función por segunda
vez desde el principio, por lo cual volverá a validar que
tenga el frente‐libre, como aún lo tiene entonces volverá a
entrar en el “si” y avanzará un paso hacia adelante y
nuevamente tendrá que quedar pausado por que
encontrará de nuevo la llamada a función “caminar”.
OMIJal Gira‐Izquierda;
‐ 57 ‐
3.‐ Por ultimo tendrá que ejecutar otra vez la misma función
caminar desde el inicio, pero en este caso al verificar el
estado de Karel se encontrará con que ya no tiene el frente‐
libre por lo que entrará al “sino” y dará la vuelta de 180º al
sentido que lleva Karel y terminará de ejecutar esa función.
Ahora que terminó de ejecutar completamente la función “caminar” tendrá que
regresar a ejecutar lo que sigue a partir de donde quedo pausada la ejecución,
comenzando con la última que pausó y así progresivamente con la anterior hasta
terminar con la primera función pausada (es decir en orden regresivo).
Regresará a continuar la ejecución donde está el paso #2 y ejecutará la
siguiente línea después de la llamada a función en este caso “avanzar” y como
ya no hay mas código por ejecutar después de esa instrucción se finalizará la
ejecución de esa función volviendo ahora al paso #1.
Igual que en el paso anterior se ejecuta la siguiente línea
después de la llamada a función, logrando que Karel de otro
paso, y dado que ya no hay mas funciones que quedaron
pendientes termina de ejecutar el código de caminar y
regresará al programa principal.
Para finalizar, tendrá que ejecutar la instrucción
“apágate” y habrá terminado el programa. Como podrás
observar Karel pudo ir hasta la pared que tenía enfrente
de él, tocarla y regresar a su posición inicial por medio
de recursividad con un código relativamente pequeño.
Esto también se podría lograr utilizando ciclos pero
hubiera sido un trabajo muy tedioso y mucho más
extenso, este es un ejemplo de las grandes ventajas que
nos ofrece esta forma de desarrollar funciones.
¡A Programar!
Ahora estás listo para un reto mayor, desarrolla un código que resuelva los
problemandos del apéndice E números: 9, 10 y 12.
Recuerda que en el apéndice F puedes encontrar los códigos ideales para
resolver los problemas del apéndice E, pero antes de visitarlo intenta
resolverlos por ti mismo.
OMIJal Gira‐Izquierda;
‐ 58 ‐
6
Aritmética con Karel
6.1 Sucede
Ya vimos las funciones en Karel, y además es posible mandar parámetros
numéricos a las funciones. Ahora bien, en Karel no es posible codificar
expresiones matemáticas como sumas y restas y tampoco existe la
asignación convencional de valores con el signo “=”.
Sin embargo Karel nos ofrece una alternativa: incremento y decremento
de variables en 1. Esto se logra con las funciones “sucede” y “precede”.
La función sucede, recibe un parámetro entero (ya sea constante como
un “2”, o variable como una “n”), y retorna el valor numérico entero igual
al mismo mas uno.
De manera que repetiría las instrucciones de la cláusula “repetir” un total
de 4 veces.
La instrucción anterior, repetiría las instrucciones dentro del “repetir” un
total de N+1 veces. Dependiendo del valor que reciba la función como
parámetro “n”.
OMIJal Gira‐Izquierda;
‐ 59 ‐
Ejemplo
A continuación veremos un ejemplo de cómo utilizar el sucede dentro
de un código.
iniciar-programa
define-nueva-instruccion regalar(n) como inicio
repetir n veces inicio
deja-zumbador;
fin;
fin;
define-nueva-instruccion camina(n) como inicio
repetir (sucede n) veces inicio
avanza;
regalar (sucede (n));
fin;
fin;
inicia-ejecucion
camina(3);
apagate;
termina-ejecucion
finalizar-programa
El mundo inicial de Karel
Se manda llamar la función “camina” con el
parámetro 3. Dentro de ella se encuentra una
función “repetir” con un sucede, por lo tanto se
repetirá 4 veces.
También se manda llamar la otra función
“regalar” con un sucede en la llamada a
función. Pero “n” sigue valiendo 3, por lo
tanto las instrucciones del “repetir” de la
función se ejecutarán también 4 veces. 4
zumbadores serán dejados.
OMIJal Gira‐Izquierda;
‐ 60 ‐
Finalmente Karel, se encuentra en su penúltima
ejecución de la función “camina”, en total dará
4 pasos, y en cada uno dejará 4 zumbadores.
Este valor se puede modificar si es diferente el
valor inicial de “n”.
6.2 Precede
La función sucede, recibe un parámetro entero (ya sea constante como
un “2”, o variable como una “n”), y retorna el valor numérico entero igual
al mismo menos uno.
De manera que repetiría las instrucciones de la cláusula “repetir” un total
de 2 veces.
La instrucción anterior, repetiría las instrucciones dentro del “repetir” un
total de N‐1 veces. Dependiendo del valor que reciba la función como
parámetro “n”.
Ejemplo
A continuación veremos el mismo ejemplo anterior pero con la
función precede:
OMIJal Gira‐Izquierda;
‐ 61 ‐
iniciar-programa
define-nueva-instruccion regalar(n) como inicio
repetir n veces inicio
deja-zumbador;
fin;
fin;
define-nueva-instruccion camina(n) como inicio
repetir (precede n) veces inicio
avanza;
regalar (precede (n));
fin;
fin;
inicia-ejecucion
camina(3);
apagate;
termina-ejecucion
finalizar-programa
El mundo inicial de Karel
Se manda llamar la función “camina” con el
parámetro 3. Dentro de ella se encuentra una
función “repetir” con un precede, por lo tanto
se repetirá 2 veces.
También se manda llamar la otra función “regalar” con
un precede en la llamada a función. Pero “n” sigue
valiendo 3, por lo tanto las instrucciones del “repetir”
de la función se ejecutarán también 2 veces. 2
zumbadores serán dejados.
Finalmente Karel, se encuentra en su última
ejecución de la función “camina”, en total dará 2
pasos, y en cada uno dejará 2 zumbadores.
Este valor se puede modificar si es diferente el valor
inicial de “n”.
OMIJal Gira‐Izquierda;
‐ 62 ‐
APÉNDICE
OMIJal Gira‐Izquierda;
‐ 63 ‐
A
APÉNDICE
KAREL A VELOCIDAD LUZ
¾ MENUS
Los menús del Karel son:
Mundos.‐
• Creación.‐ Situar a Karel (hacia el norte, sur, este u oeste),
colocación de zumbadores (número en específico, 'n'
zumbadores o zumbadores infinitos) y creación de paredes se
realizar con el 'click' izquierdo del ratón sobre la mitad de dos
calles. Recuerde que un mundo está rodeado por una pared
infranqueable.
• Modificación. Permite cambiar las posiciones de los zumbadores,
quitar zumbadores (para eliminar los zumbadores de una
esquina, seleccione colocar 0 zumbadores del menú contextual
que aparece al presionar el botón derecho del mouse en una
esquina del mundo).
• Guardar y Guardar como. El mundo es guardado en la carpeta
indicada con la extensión MDO. Si el mundo ya fue guardado
previamente, se guarda con el mismo nombre al seleccionar la
primera opción. Guardar como permite archivar el mundo con
otro nombre o en otro dispositivo diferente al de origen.
• Indicar zumbadores en la mochila. Aquí colocaremos el número
de zumbadores que Karel traerá inicialmente en la mochila.
• Viajar a través del mundo. Los cuatro botones permiten viajar a
través del mundo, como este no cabe totalmente en la pantalla,
con ellos podemos visualizar otras partes de éste.
OMIJal Gira‐Izquierda;
‐ 64 ‐
Programa.‐
• Adelante. Permite continuar un programa detenido.
• Detener. Esta opción detendrá el programa en la línea en la cual
se está ejecutando, una vez pausado puede ser ejecutado desde
este punto o inicializado.
• Correr. Inicia la ejecución del programa que está cargado en la
memoria y ha sido compilado.
• Inicializar. Inicializa el programa en la primera línea y limpia las
variables de control a los valores por omisión o iniciales.
• Zumbadores en la mochila. Indica la cantidad de zumbadores
que Karel llevará en la mochila; esta cantidad deberá ir acorde a
las necesidades del programa que se va a ejecutar.
OMIJal Gira‐Izquierda;
‐ 65 ‐
OMIJal Gira‐Izquierda;
‐ 66 ‐
B
APÉNDICE
PRACTICA XPRESS
Primer Problema PROBLEMA: La Moneda
Karel se encuentra en su casa (posición 1,1) viendo hacia el este y se ha
dado cuenta que a dos pasos de el se encuentra una moneda, su misión
es ir a recogerla y regresar a su casa.
PASOS:
1 ‐ CREAR MUNDO
OMIJal Gira‐Izquierda;
‐ 67 ‐
Por último deberás grabar el mundo, dándole un nombre adecuado, la
extensión de los mundos es MDO
2 – PROGRAMA
Ahora es momento de hacer el programa que solucione el problema y
ayude a Karel a recoger la moneda, ve a la pestaña de PROGRAMA y da
click en NUEVO, se creara un programa por default,
iniciar-programa
inicia-ejecucion
apagate;
termina-ejecucion
finalizar-programa
Es momento de iniciar la programación, hazlo escribiendo tus
instrucciones después de la línea “inicia‐ejecucion”, al final, tu código
quedaría de la siguiente manera:
iniciar-programa
inicia-ejecucion
avanza;
avanza;
coge-zumbador;
gira-izquierda;
gira-izquierda;
avanza;
avanza;
deja-zumbador;
apagate;
termina-ejecucion
finalizar-programa
Al terminar presiona el botón de “COMPILAR” y
de recibir el mensaje de compilación correcta
deberás “GUARDAR” tu programa.
3 – EJECUTAR
OMIJal Gira‐Izquierda;
‐ 68 ‐
Tu programa está listo y el mundo creado, ahora es momento de ejecutar
y saber si KAREL pudo cumplir con su misión. Da click al botón de
“EJECUTAR” y ahí observaras una pantalla dividida; de un lado tú código,
del otro tú mundo.
Para ejecutar el programa,
presiona “INICIALIZAR” y
posteriormente “CORRER” y veras
como Karel está siguiendo las
instrucciones del programa hasta
llegar a una ventana de
Terminación normal.
En la ventana de ejecución además
existe una caja de texto (Retardo de
Ejecución) donde el usuario puede
aumentar o disminuir la velocidad
de Karel en la ejecución del
programa.
Es reconfortante ver correr y funcionar un programa sin error, lo has
logrado, pero tenemos que recordarte que este fue un mundo “manual”
es decir, si el mundo sufre algún cambio, tu programa ya no servirá, y en
Karel, cada problema que se aplica se prueba con 5 o 10 mundos
diferentes, por lo tanto la programación “manual” no es muy
recomendada para resolver problemas de competencia.
OMIJal Gira‐Izquierda;
‐ 69 ‐
C
APÉNDICE
Pasos para resolver un problema
Tip: “No te aceleres, no hay prisa por empezar a escribir tu
código en la computadora, primero toma tu tiempo, piensa en
grande, sigue un proceso y al final tendrás un mejor resultado”
1) Entender el problema: Es importante realizar los siguientes
pasos antes de pensar en una solución para el problema.
• Leer cuidadosamente el problema que te dan.
• Separar la “historia” del problema en sí.
• Entender el objetivo final del problema (solución pedida).
• Analizar las consideraciones y si tienes dudas hacerlas
durante el tiempo previsto para esto durante los exámenes,
o por email en caso de exámenes en línea.
2) Pseudocódigo: Estas son las herramientas con las que te puedes
apoyar para hacer tu solución del problema.
• Dibujos.
• Esquemas.
• Diagramas.
• Escritos a manera de Notas.
3) Codificar: A grandes rasgos estos son los pasos para implementar
tu solución.
• Hacer el programa que de la solución al problema.
OMIJal Gira‐Izquierda;
‐ 70 ‐
• Capturar el programa en Karel, teniendo extremo cuidado de
faltas ortográficas.
• Hacer pruebas parciales al programa cada que terminas una
sección de tu código.
4) Prueba y Error: Es muy importante que pruebes tu solución, para
asegurarte que funcionará en el mayor número de casos posibles
( y si se puede en todos, mejor! ).
• Prueba la solución con el caso (mundo) de ejemplo (recuerda
que el caso de ejemplo NO es un caso que se evalúa).
• Cuando tu solución resuelva el caso de ejemplo prueba con
por lo menos otros 5 casos de prueba (mundos).
5) Código perfecto: Trata de pensar como evaluador e imaginar los
casos de prueba. Los casos de prueba se dividen en:
• Extremos: Son los casos donde el mundo está lo más grande
posible y basándose en las consideraciones, en pocas
palabras son los casos más “difíciles” y los cuales
generalmente sirven para saber quiénes serán los ganadores
de los eventos
• Tontos: Son casos de prueba de solución trivial, por ejemplo
mundos vacios donde incluso un código que solo diga
APAGATE; funcionaria!!! Pero recuerda de estos casos te
encontrarás a lo mucho 2 mundos por problema
• Parecidos al ejemplo: Son casos en los que el mundo inicial
es similar al que viene en el caso de ejemplo con variantes
mínimas.
• Normales: Son los casos (mundos) variados, que aunque no
extremos si usan las consideraciones básicas y ofrecen una
diversidad de opciones, por lo general el 50% de los casos de
evaluación están en este punto.
OMIJal Gira‐Izquierda;
‐ 71 ‐
Ejemplo:
Vamos a utilizar los pasos descritos para resolver problema,
concretamente el problema “La Torre” No.16 del Problemando Básico 2.
1. Leer el Problema cuidadosamente
Problema 16
Nivel: Básico
La Torre
Karel consiguió chamba como demoledor de edificios en la ciudad y su
primer trabajo es tumbar la torre más alta de la ciudad.
Problema:
Ayuda a Karel a tirar la torre más alta del mundo.
Consideraciones:
• No se sabe donde inicia Karel.
• El mundo es rectangular o cuadrado y no tiene obstáculos
adentro.
• Karel termina en la base de la torre encima del montón de
escombros.
• Si hay dos torres del mismo tamaño Karel tiene que tumbar la de
la izquierda.
Ejemplo:
Entrada Salida
OMIJal Gira‐Izquierda;
‐ 72 ‐
2. Entender el problema.
Leemos la historia del problema que nos dice:
Karel consiguió trabajo como demoledor de edificios en la ciudad y su
primer trabajo es tumbar la torre más alta de la ciudad.
Separando la historia del problema, tenemos que en el mundo se
encuentran unas columnas de zumbadores cuya altura desconocemos y
el objetivo es buscar la más alta y poner todos sus zumbadores en la
primera fila de la columna.
Las consideraciones del problema:
• No se sabe donde inicia Karel.
• El mundo es rectangular o cuadrado y no tiene obstáculos adentro.
• Karel termina en la base de la torre encima del montón de escombros.
• Si hay dos torres del mismo tamaño Karel tiene que tumbar la de la
izquierda.
Las consideraciones las debemos de tener en cuenta cuando pensamos
en nuestra solución, por ejempló, si en mi solución quiero que Karel
recorra el mundo por filas, tengo que tener en cuenta que la primera
consideración me dice que Karel puede iniciar en cualquier parte, por lo
tanto lo primero que hará mi programa es mandar a Karel a la esquina
por la cual comenzara a recorrer. Además por la cuarta consideración,
concluyo en que el recorrido de Karel en mi solución tiene que ser de
izquierda a derecha, para que si hay dos columnas con la misma altura
máxima siempre encuentre primero la de la izquierda.
3. Codificar
Se tiene que implementar la solución para el problema, para este
problema podemos dividirlo en 3 “sub‐problemas”, el primero podría ser
mandar a Karel a la esquina superior‐izquierda, el segundo sub‐problema
sería recorrer las filas de izquierda a derecha, de arriba hacia abajo, hasta
encontrar un zumbador, el tercer sub‐problema seria, una vez
OMIJal Gira‐Izquierda;
‐ 73 ‐
encontrado un zumbador, coger todos los que estén debajo de él y
dejarlos todos en la primera fila.
Una vez que tienes una parte funcional del código puedes probarla para
irte asegurando de que cada parte del problema funciona.
4. Prueba y Error.
Este pasó en muy importante, debes de probar primero tu código con el
caso de ejemplo, si no funciona entonces debes de depurarlo, tratar de
encontrar el error y corregirlo, una vez que tu programa soluciona el caso
de ejemplo correctamente, debes de probar con más casos de prueba
con estos podrás darte cuenta de mas errores que puedas tener en tu
código.
5. Código Perfecto.
Una vez que has depurado todos los errores de tu código, puedes pasar
al paso final que es en donde te puedes dar cuenta si aspiras o no a un
puntaje perfecto en el problema, tienes que probar tu código con casos
de prueba de las 4 categorías apuntadas arriba, pero sobretodo con
casos de prueba extremos y tontos.
Ejemplos de caso extremo:
OMIJal Gira‐Izquierda;
‐ 74 ‐
Ejemplos de caso tonto:
Si tu programa logra resolver todos los casos de prueba anteriores
correctamente, tienes un 99% de probabilidades de sacar puntaje
perfecto.
OMIJal Gira‐Izquierda;
‐ 75 ‐
D
APÉNDICE
COMANDOS
• apagate. Este comando permite apagar a Karel y dejarlo
inmóvil, terminando el programa.
• avanza. Karel avanzará una calle en la dirección hacia donde
está orientado, siempre y cuando no exista una
pared enfrente.
• gira‐izquierda. Le indica a Karel, que en la misma posición en
que está, gire 90 grados a su izquierda.
• coge‐zumbador. Karel tomará uno de los zumbadores
disponibles en la lugar donde se encuentre.
• deja‐zumbador. Karel dejará uno de los zumbadores que trae
en su mochila.
• mientras expresión hacer. Serie de comandos los cuales van a
ser ejecutados mientras la expresión sea verdadera o
se cumpla. Los comandos se encuentran 'encerrados'
entre las expresiones inicio y fin.
• repetir numero veces expresión. Karel ejecutará a expresión
tanta veces como el número le indique.
• define‐nueva‐instruccion identificador como expresion. Para
minimizar el tiempo y hacer más eficiente el
programa, Karel permite la definición de módulos o
procesos los cuales podrán ser llamados como sean
identificados, estos constarán de una serie de
instrucciones las cuales van a ser ejecutadas cada vez
que el proceso sea llamado.
• { y } ó (* y *) Son para incluir comentarios en el programa y
Karel no los tomará en cuenta. Estos deben de ir
encerrados en las llaves { y } ó con (* y *)
OMIJal Gira‐Izquierda;
‐ 76 ‐
FUNCIONES BOOLEANAS
• frente‐libre. Regresa verdadero si el frente hacia el cual está
orientado Karel, está libre.
• frente‐bloqueado. Regresa verdadero si el frente hacia el cual
está orientado Karel, está bloqueado (existe una
pared).
• izquierda‐libre. Regresa verdadero si la calle de la izquierda con
respecto a la situación de Karel, está libre.
• izquierda‐bloqueada. Regresa verdadero si la calle de la
izquierda con respecto a la situación de Karel, está
bloqueada.
• derecha‐libre. Regresa verdadero si la calle de la derecha con
respecto a la situación de Karel, está libre.
• derecha‐bloqueada. Regresa verdadero si la calle de la derecha
con respecto a la situación de Karel, está
bloqueada.
• junto‐a‐zumbador. Regresa verdadero si en la esquina de la
calle donde está situado Karel, existe al menos un
zumbador.
no‐junto‐a‐zumbador. Regresa verdadero si en la esquina de la
calle donde está situado Karel, no existe ningún
zumbador.
• algun‐zumbador‐en‐la‐mochila. Permite evaluar si Karel tiene
al menos un zumbador en su mochila.
• ningun‐zumbador‐en‐la‐mochila. Permite evaluar si Karel no
tiene ningún zumbador en su mochila.
• orientado‐al‐norte. Regresa verdadero si Karel está orientado
hacia el norte.
• orientado‐al‐sur. Regresa verdadero si Karel está orientado
hacia el sur.
• orientado‐al‐este. Regresa verdadero si Karel está orientado
hacia el este.
• orientado‐al‐oeste. Regresa verdadero si Karel está orientado
hacia el oeste.
• no‐orientado‐al‐norte. Regresa verdadero si Karel no está
orientado hacia el norte.
OMIJal Gira‐Izquierda;
‐ 77 ‐
OMIJal Gira‐Izquierda;
‐ 78 ‐
E
APÉNDICE
PROBLEMAS
A continuación encontrarás la primer parte de los problemandos básicos
de Karel, los cuales hemos desarrollado con la intención que te sirvan de
práctica, es recomendable que cada que termines un problema, lo
pruebes en diversos mundos, y que antes de pasar al siguiente problema
tu mismo redactes problemas similares para que te sirva de refuerzo.
En el Apéndice G esta el formulario que deberás llenar, escanear y
enviar por correo a omijal@gmail.com para ser usuario certificado
de Gira‐Izquierda y tener total acceso a los mundos de prueba y los
problemandos complementarios, así como para ser de los primeros
en recibir actualizaciones y ejercicios, no olvides registrarte!
También en la página de la OMIJAL
puedes encontrar más programas para
practicar con diferentes niveles de
dificultad.
Sitio Web OMIJal
http://www.omijal.org.mx
(sección gira‐karel)
El siguiente material contiene los siguientes problemas‐ejemplo que
podrás tú mismo realizar, estos problemas están ordenados por
dificultad de super‐basico a básico y en cada uno de ellos tendrás que
aplicar lo aprendido en cada capítulo.
En el apéndice F podrás encontrar los códigos resueltos.
OMIJal Gira‐Izquierda;
‐ 79 ‐
Problema #1 La Cartera
Historia:
Karel llega a su casa y se da cuenta que se le olvido su cartera en la casa
de su amigo Mando, que vive a tres casas de la suya.
Problema:
Ayuda a Karel a ir por su cartera a casa de Mando y regresar a su
casa para seguir haciendo la tarea.
Consideraciones:
• Karel inicia en su casa orientado al norte. (posición 1,1)
• La casa de Mando esta a tres casas de la suya. (posición 1,4)
• No existen obstáculos de por medio.
• La cartera es representada por un zumbador.
• Karel debe finalizar en su casa sin importar su orientación.
• Karel deberá dejar al finalizar el zumbador en su casa. ( fila 1 ,
columna 1 )
• Karel 3D fue diseñado por Claudio Jiménez
Verifica que tu código funcione en el siguiente mundo:
INICIAL FINAL
OMIJal Gira‐Izquierda;
‐ 80 ‐
Problema #2 La Moneda
Historia:
Karel llega a su casa de la tienda y se da cuenta que le falta UNA moneda,
la cual se extravió en un punto entre la tienda y su casa y decide regresar
a buscarla.
Problema:
Karel perdió una moneda en el camino de la tienda a su casa. Ayúdale a
encontrarla pues su mama se molestará si no la recupera.
Consideraciones:
• Karel siempre empieza en su casa viendo hacia el este.
• No se sabe la distancia de la tienda a su casa.
• La tienda se encuentra en la misma fila que Karel.
• No existen obstáculos de por medio.
• La moneda es representada por un zumbador.
• Karel debe finalizar en su casa sin importar su orientación.
• Karel debe dejar la moneda en su casa.
• La tienda es verde.
Verifica que tu código funcione en los siguientes mundos:
INICIAL FINAL
INICIAL FINAL
NOTA: En este mundo, lo que se prueba es la capacidad del código de identificar y recoger
zumbadores al estar caminando.
OMIJal Gira‐Izquierda;
‐ 81 ‐
Problema #3 La(s) Moneda(s)
Historia:
Karel llega a su casa de la tienda y se da cuenta que le falta dinero, el cual
extravió en su camino de regreso a casa
Problema:
Karel perdió dinero de la tienda a su casa por lo que deberá regresar a
buscarlo, tu misión será ayudar a Karel a solucionar el problema.
Consideraciones:
• Karel inicia en su casa orientado hacia el este.
• No se sabe cuántas monedas perdió Karel.
• No se sabe la distancia de la tienda a su casa.
• Karel debe dejar las monedas en su casa.
• La tienda se encuentra en la misma fila que Karel.
• No existen obstáculos de por medio.
• Las monedas son representadas por zumbadores.
• Karel debe finalizar en su casa sin importar su orientación.
• Las monedas perdidas están en montones solo de 1.
• Come frutas y verduras.
Verifica que tu código funcione en el siguiente mundo:
INICIAL FINAL
OMIJal Gira‐Izquierda;
‐ 82 ‐
Problema #4 La Bomba
Historia:
Robocharro se ha enojado con Karel y al pasar por su casa le ha aventado
una bomba de agua al jardín, por lo que Karel tiene que ir a recogerla y
sacarla de su casa.
Problema:
Ayuda a Karel a encontrar la bomba y dejarla fuera de su jardín, para así
poder regresar a su casa.
Consideraciones:
• Karel inicia en su casa orientado hacia el este.
• No se sabe en qué parte del jardín cayó la bomba.
• No se sabe la distancia de la casa de Karel a la barda perimetral.
• La bomba está representada con un zumbador.
• Karel tiene que regresar a su posición original.
• No importa la orientación final de Karel.
• La barda mide 1 metro de alto.
• Robocharro se enojó con Karel pues se dio cuenta que lo quiere
desplazar de mascota de OMIJAL 2011, será cierto
Verifica que tu código funcione en los siguientes mundos:
INICIAL FINAL
INICIAL FINAL
NOTA: Es importante considerar que la distancia a la tienda puede ser irreal y esté limitada a
sólo su posición inicial, o que el zumbador puede estar pegado a una pared. Este último mundo
puede ser causa de errores en muchos códigos.
OMIJal Gira‐Izquierda;
‐ 83 ‐
Problema #5 La Bomba 2
Historia:
Robocharro está todavía más enojado con Karel y ahora parece le ha
tirado varias bombas y en diferentes lugares del jardín.
Problema:
Ayuda a Karel a encontrar las bombas, llevarlas fuera de su jardín y
regresar a su casa.
Consideraciones:
• Karel inicia en su casa orientado el este.
• No se sabe donde cayeron las bombas.
• Solo puede haber una bomba por posición.
• No se sabe dónde está la barda de su jardín.
• No se sabe que tan alta es la barda.
• Las bombas están representadas con un zumbador.
• Karel tiene que regresar a su posición original.
• No importa la orientación final de Karel.
• Karel deberá dejar todas las bombas en la FILA 1 y en la
COLUMNA inmediata posterior a su barda
Verifica que tu código funcione en el siguiente mundo:
INICIAL FINAL
OMIJal Gira‐Izquierda;
‐ 84 ‐
Problema #6 La Bomba 3
Historia:
Esta vez Robocharro ya se paso!, le ha tirado a Karel varias bombas y
estas pudieron caer en una misma posición.
Problema:
Ayuda a Karel a encontrar todas las bombas, sacarlas de su jardín y
regresar a su casa.
Consideraciones:
• Karel inicia en su casa orientado el este.
• No se sabe donde cayeron las bombas.
• Puede haber más de una bomba en cada posición.
• No se sabe dónde está la barda de su jardín.
• No se sabe la altura de la barda.
• Las bombas están representadas con zumbadores.
• Karel tiene que regresar a su posición original.
• Puede haber más de una bomba en cada posición.
• No importa donde termine Karel.
• La venganza no es buena.
• Karel deberá dejar todas las bombas en la FILA 1 y en la
COLUMNA inmediata posterior a su barda
Verifica que tu código funcione en el siguiente mundo:
INICIAL FINAL
OMIJal Gira‐Izquierda;
‐ 85 ‐
Problema #7 Karel y Gretel
Historia:
Karel sale a visitar a su guapísima novia Gretel, pero Karel es muy
despistado y siempre se le olvida el camino de vuelta a su casa entonces
decide llevarse un montón de migajas de pan para ir dejándolas mientras
camina y así saber por donde regresar
Problema:
Ayuda a Karel a dejar las migajas de pan en su camino a casa de Gretel.
Consideraciones:
• Karel inicia en su casa orientado el este.
• No se sabe cuántas migajas (zumbadores) lleva Karel en su
mochila.
• No existen obstáculos de por medio.
• Karel debe detenerse cuando se le terminen las migajas que lleva
en su mochila.
• La verdad, Gretel no es tan guapa.
Verifica que tu código funcione en el siguiente mundo:
INICIAL FINAL
Nota: este programa luce diferente a los anteriores, como TIP, te sugerimos revisar el punto 4.2
Repeticiones Condicionales donde se explica el comando Mientras…
OMIJal Gira‐Izquierda;
‐ 86 ‐
Problema #8 La Puerta
Historia:
Karel está atrapado en un cuarto oscuro y no encuentra la puerta. Karel
necesita salir del cuarto para poder ir a visitar a su novia Gretel.
Problema:
Ayuda a Karel a encontrar la puerta del cuarto oscuro y salirse.
Consideraciones:
• Karel inicia en su casa orientado el este.
• No se sabe en qué posición esta la puerta
• No existen obstáculos de por medio.
• Karel debe finalizar afuera del cuarto sin importar su orientación
final.
• La puerta es de madera.
Verifica que tu código funcione en los siguientes mundos:
INICIAL FINAL
OMIJal Gira‐Izquierda;
‐ 87 ‐
Problema #9 El Cuarto
Historia:
Karel está atrapado nuevamente, pero ahora en un centro comercial, ya
que el cansancio le ganó y se quedo dormido en una tienda
departamental, pero él sabe existe la puerta de vigilancia y debe
localizarla.
Problema:
Ayuda a Karel a encontrar la puerta de salida del centro comercial y se
pueda salir.
Consideraciones:
• Karel inicia pegado a una de las paredes del cuarto.
• Karel es de izquierda, por eso se mueve en contra de las
manecillas del reloj.
• El cuarto siempre es rectangular o cuadrado.
• No se sabe en qué posición esta la puerta.
• No existen obstáculos de por medio.
• Karel debe finalizar afuera del cuarto sin importar su orientación
final.
Verifica que tu código funcione en los siguientes mundos:
INICIAL FINAL
OMIJal Gira‐Izquierda;
‐ 88 ‐
En este mundo de prueb,a Karel se encuentra con la solución del problema a un solo
paso. Es importante que el programador se de cuenta que Karel puede evaluar su
estado antes de comenzar a avanzar..
En este caso, la salida se encuentra en una de las esquinas hacia las que Karel se
encuentra orientado a lo largo del camino y no en el centro de las paredes. Es
importante que Karel no solo evalúe el frente libre al hacer su recorrido del mundo,
sino también considere su “derecha” bloqueada.
Por último en este caso, la salida también se encuentra en una de las esquinas del
mundo, sin embargo, Karel no se toparía de frente con ella, si el recorrido esta
correctamente efectuado (sentido inverso a las manecillas del reloj). En este caso, Karel
deberá analizar una última vez si su derecha se encuentra desbloqueada antes de
proceder a dar la vuelta.
OMIJal Gira‐Izquierda;
‐ 89 ‐
Problema #10 La Suma
Historia:
Karel está en un examen de matemáticas y tiene que resolver una suma
pero ya se le olvido como sumar y no puede reprobar el examen,
ayudale!
Problema:
Ayuda a Karel a pasar su examen y hacer la suma.
Consideraciones:
• Los números que Karel tiene que sumar son representados con
zumbadores.
• Karel empieza arriba de los números orientado hacia el sur.
• Hay una barda debajo de los números.
• Karel tiene que colocar el resultado debajo de la barda.
• Karel no tiene zumbadores en la mochila.
Verifica que tu código funcione en el siguiente mundo:
INICIAL FINAL
OMIJal Gira‐Izquierda;
‐ 90 ‐
Problema #11 El Loco
Historia:
Karel se volvió loco y tiene que dejar la torre de juguetes de su cuarto del
otro lado, pero su locura le impide pensar correctamente y moverá sus
juguetes de uno por uno.
Problema:
Ayuda a Karel a no sentirse tan solo en este momento de histeria y
acompáñalo a pasar todos los zumbadores uno por uno al otro lado del
cuarto.
Consideraciones:
• Karel inicia apuntando al este.
• No se sabe que tan largo es el cuarto.
• El número de zumbadores a mover estará en la posición 1,1.
• Karel termina en su posición original.
• No importa el lugar, ni la orientación final de Karel.
• Lo importante de concursar es ganar.
Verifica que tu código funcione en el siguiente mundo:
INICIAL FINAL
OMIJal Gira‐Izquierda;
‐ 91 ‐
Problema #12 Los Juguetes
Este problema es como el examen del principiante, antes de realizarlo
te recomendamos estudies bien la forma como lo desarrollarás, si
tienes dudas de cómo resolverlo y eres usuario certificado Gira‐
Izquierda, solicita los tips para resolver este problema.
Historia:
Karel se encuentra en su cuarto y tiene que recoger todos sus juguetes y
dejarlos en su posición original.
Problema:
Ayuda a Karel a recoger todos los juguetes y dejarlos en su esquina.
Consideraciones:
• Karel inicia en la esquina inferior derecha.
• No se sabe las dimensiones del cuarto.
• El cuarto siempre está lleno de UN juguete por cada posición.
• Karel termina en su posición original.
• No importa el lugar, ni la orientación final de Karel.
• Karel tiene que dejar todos los juguetes en la esquina (1,1).
Verifica que tu código funcione en los siguientes mundos:
INICIAL FINAL
INICIAL FINAL
OMIJal Gira‐Izquierda;
‐ 92 ‐
Para mundos bidimensionales es necesario hacer recorridos de filas y
columnas (el algoritmo es bastante libre y versátil), pero es común que el
mundo pueda tratarse de un vector de una sola fila (o columna). En ese
caso, hay que cuidar que Karel no intente dar por hecho que puede dar un
paso a una “segunda fila” que no existe y responda erróneamente al
tratar de cruzar una pared.
Si lograste terminar los problemas básicos sin o con poca ayuda has
cumplido la primer parte que es el aprender a pensar como
programador.
OMIJal Gira‐Izquierda;
‐ 93 ‐
F
APÉNDICE
SOLUCIONES
Ahora podrás ver cuál era el código ideal para resolver cada uno de los
problemas planteado en el apéndice anterior y poderlos comparar con
tus propios programas desarrollados.
Problema #01: La Cartera
iniciar‐programa
inicia‐ejecucion
(* Avanzamos 3 pasos adelante *)
avanza;
avanza;
avanza;
coge‐zumbador;
(* Damos media vuelta *)
gira‐izquierda;
gira‐izquierda;
(* Avanzamos 3 pasos para regresar *)
avanza;
avanza;
avanza;
deja‐zumbador;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 94 ‐
Problema #02: La Moneda
iniciar‐programa
inicia‐ejecucion
(* Avanzamos mientras no se encuentre el zumbador *)
mientras no‐junto‐a‐zumbador hacer avanza;
coge‐zumbador;
(* Damos media vuelta *)
gira‐izquierda;
gira‐izquierda;
(* Avanzamos hasta que karel tope *)
mientras frente‐libre hacer avanza;
deja‐zumbador;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 95 ‐
Problema #03: La(s) Moneda(s)
iniciar‐programa
inicia‐ejecucion
(* Avanzamos hasta la tienda comprobando si hay zumbador en cada
posición *)
mientras frente‐libre hacer
inicio
avanza;
si junto‐a‐zumbador entonces coge‐zumbador;
fin;
(* Damos media vuelta *)
gira‐izquierda;
gira‐izquierda;
(* Avanzamos hasta la casa *)
mientras frente‐libre hacer avanza;
(* Dejamos todos los zumbadores *)
mientras algun‐zumbador‐en‐la‐mochila hacer deja‐zumbador;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 96 ‐
Problema #04: La Bomba
iniciar‐programa
inicia‐ejecucion
(* Verificamos si el zumbador se encuentra en la primera posición *)
si junto‐a‐zumbador entonces coge‐zumbador;
(* Avanzamos hasta el tope comprobando si se encuentran zumbadores *)
mientras frente‐libre hacer
inicio
avanza;
si junto‐a‐zumbador entonces coge‐zumbador;
fin;
(*Saltamos la cerca *)
gira‐izquierda;
avanza;
(* Gira a la derecha *)
repetir 3 veces gira‐izquierda;
avanza;
repetir 3 veces gira‐izquierda;
avanza;
deja‐zumbador;
(* Volvemos a saltar la cerca *)
repetir 2 veces gira‐izquierda;
avanza;
gira‐izquierda;
avanza;
gira‐izquierda;
avanza;
repetir 3 veces gira‐izquierda;
(* Avanzamos hasta el tope *)
mientras frente‐libre hacer avanza;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 97 ‐
Problema #05: La Bomba 2
iniciar‐programa
inicia‐ejecucion
(* Comprobamos si hay zumbador en la primera posición *)
si junto‐a‐zumbador entonces coge‐zumbador;
(* Avanzamos hasta el tope
comprobando si se encuentran zumbadores *)
mientras frente‐libre hacer
inicio
avanza;
si junto‐a‐zumbador entonces coge‐zumbador;
fin;
(* salta la cerca de cualquier altura*)
gira‐izquierda;
mientras derecha‐bloqueada hacer avanza;
repetir 3 veces gira‐izquierda;
avanza;
repetir 3 veces gira‐izquierda;
mientras frente‐libre hacer avanza;
(* Se dejan todos los zumbadores *)
mientras algun‐zumbador‐en‐la‐mochila hacer deja‐zumbador;
(* Volvemos a subir la cerca *)
repetir 2 veces gira‐izquierda;
mientras izquierda‐bloqueada hacer avanza;
(* Regresamos a la posicion inicial *)
gira‐izquierda;
mientras frente‐libre hacer avanza;
gira‐izquierda;
mientras frente‐libre hacer avanza;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 98 ‐
Problema #6: La Bomba 3
iniciar‐programa
inicia‐ejecucion
(* Comprobamos si hay zumbadores en la primera posición *)
mientras junto‐a‐zumbador hacer coge‐zumbador;
(* Avanzamos hasta el tope comprobando si se encuentran zumbadores *)
mientras frente‐libre hacer
inicio
avanza;
mientras junto‐a‐zumbador hacer coge‐zumbador;
fin;
(* Se salta la cerca *)
gira‐izquierda;
mientras derecha‐bloqueada hacer avanza;
repetir 3 veces gira‐izquierda;
avanza;
repetir 3 veces gira‐izquierda;
mientras frente‐libre hacer avanza;
(* Se dejan todos los zumbadores *)
mientras algun‐zumbador‐en‐la‐mochila hacer deja‐zumbador;
(* Volvemos a subir la cerca *)
repetir 2 veces gira‐izquierda;
mientras izquierda‐bloqueada hacer avanza;
(* Regresamos a la posicion inicial *)
gira‐izquierda;
mientras frente‐libre hacer avanza;
gira‐izquierda;
mientras frente‐libre hacer avanza;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 99 ‐
Problema #7: Karel y Gretel
iniciar‐programa
inicia‐ejecucion
(* Mientras los zumbadores no se agoten dejamos uno por posición antes de
avanzar *)
mientras algun‐zumbador‐en‐la‐mochila hacer
inicio
deja‐zumbador;
avanza;
fin;
apagate;
termina‐ejecucion
finalizar‐programa
Problema #8: La Puerta
iniciar‐programa
inicia‐ejecucion
(* Avancemos hasta que no haya pared a nuestra izquierda *)
mientras izquierda‐bloqueada hacer avanza;
(* Una vez encontrada la puerta giramos y avanzamos para salir *)
gira‐izquierda;
avanza;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 100 ‐
Problema #9: El Cuarto
iniciar‐programa
inicia‐ejecucion
(* Se rodea el cuarto hasta encontrar la puerta *)
mientras derecha‐bloqueada hacer
inicio
si frente‐libre entonces avanza
sino gira‐izquierda;
fin;
(* Se comprueba si se está YA afuera del cuarto *)
si frente‐libre entonces
inicio
avanza;
si derecha‐bloqueada entonces
inicio
repetir 2 veces gira‐izquierda;
avanza;
repetir 2 veces gira‐izquierda;
fin sino inicio
repetir 2 veces gira‐izquierda;
avanza;
apagate;
fin;
fin;
(* Si seguimos dentro del cuarto se gira a la derecha y se avanza *)
repetir 3 veces gira‐izquierda;
avanza;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 101 ‐
Problema #10: La Suma
iniciar‐programa
inicia‐ejecucion
(* Avanzamos hasta topar cogiendo todos los zumbadores que se
encuentren *)
mientras frente‐libre hacer
inicio
avanza;
mientras junto‐a‐zumbador hacer coge‐zumbador;
fin;
(* Pasamos al otro lado de la linea *)
repetir 3 veces gira‐izquierda;
avanza;
gira‐izquierda;
avanza;
gira‐izquierda;
avanza;
(* Dejamos todos los zumbadores *)
mientras algun‐zumbador‐en‐la‐mochila hacer deja‐zumbador;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 102 ‐
Problema # 11: El Loco
iniciar‐programa
inicia‐ejecucion
(* Repetimos el proceso hasta que se acaben los zumbadores *)
mientras junto‐a‐zumbador hacer
inicio
(* Tomamos un zumbador *)
coge‐zumbador;
(* Avanzamos hasta el tope *)
mientras frente‐libre hacer avanza;
(*Dejamos el zumbador al final del cuarto *)
deja‐zumbador;
(* Damos media vuelta *)
repetir 2 veces gira‐izquierda;
(* Avanzamos hasta el tope para regresar ala posicion original *)
mientras frente‐libre hacer avanza;
(* Damos media vuelta *)
repetir 2 veces gira‐izquierda;
fin;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 103 ‐
Problema # 12: Los Juguetes
iniciar‐programa
(* Definimos una instrucción‐funcion que recoga todos los zumbadores de
una columna *)
define‐nueva‐instruccion linea como inicio
(* Cogemos el zumbador de la primera posicion *)
coge‐zumbador;
(* Tomamos todos los zumbadores que estan antes de topar *)
mientras frente‐libre hacer
inicio
avanza;
coge‐zumbador;
fin;
(* Finalmente regresamos a la posicion inicial *)
repetir 2 veces gira‐izquierda;
mientras frente‐libre hacer avanza;
fin;
inicia‐ejecucion
(* Orientamos a karel hacia el este *)
mientras no‐orientado‐al‐este hacer gira‐izquierda;
(* Por cada columna mandamos llamar la funcion linea y avanzamos un
paso al este *)
mientras frente‐libre hacer
inicio
gira‐izquierda;
linea;
gira‐izquierda;
avanza;
fin;
(* Llamamos la funcion linea en la estando columna *)
gira‐izquierda;
linea;
(* Regresamos a la posicion inicial *)
repetir 3 veces gira‐izquierda;
mientras frente‐libre hacer avanza;
(* Dejamos todos los zumbadores *)
mientras algun‐zumbador‐en‐la‐mochila hacer deja‐zumbador;
apagate;
termina‐ejecucion
finalizar‐programa
OMIJal Gira‐Izquierda;
‐ 104 ‐
G
APÉNDICE
REGISTRO DE USUARIO
GIRAIZQUERDA;
El ser usuario registrado te dará acceso a material exclusivo, y prioridad en el
envío de información respecto a Karel, guía para solucionar problemas, etc.
Deberás llenar este formulario, escanearlo y enviarlo a omijal@gmail.com para
su validación, solo el usuario registrado teniendo su número de Acceso e ‐email
podrá tener este beneficio
FORMATO DE REGISTRO
NUM. ACCESO:______________
NOMBRE DEL USUARIO:______________________________________
NICKNAME:________________________________________________
ESCUELA:__________________________________________________
CIUDAD:______________________ PAIS:_______________________
FECHA NACIMIENTO: DIA:_____ MES:__________ AÑO: __________
e‐MAIL:____________________________________
Recortar, escanear y enviar este formulario a omijal@gmail.com desde la
misma cuenta de correo que se esta registrando
OMIJal Gira‐Izquierda;
Val
idadopor
:
www.
sol
acyt
.or
g