You are on page 1of 10

Manual de Karel avanzado

Karel no puede hacer algo como y= ((f^p)+7)/q es decir, no soporta signos ni operaciones. Sin embargo, hay maneras de elevar un nmero al cuadrado, de sumar, de restar, de dividir etctera. Por ejemplo, sumar. Debes sumar lo que hay en las coordenadas (1,1) y en (1,2). Una manera de hacerlo es recogiendo todos los zumbadores en (1,1) y todos en (1,2) y despus dejarlos. Es decir, suponiendo que Karel ya est en (1,1) y viendo al norte.

Cdigo: mientras junto-a-zumbador hacer coge-zumbador; (* Coge todos los zumbadores en 1,1*) repetir 3 veces gira-izquierda; (*giro a la derecha*) avanza; (*avanzo*) mientras junto-a-zumbador hacer coge-zumbador; (*Coge todos los zumbadores en 1,2*) repetir 2 veces gira-izquierda; (*media-vuelta*) avanza; (*avanzo*) mientras algun-zumbador-en-la-mochila hacer deja-zumbador; (*dejo todos los zumbadores*)

Esa es la forma ms sencilla, sin embargo si les digo que deben dejar los zumbadores donde estaban, es decir: Karel esta originalmente orientado al sur en (1,1) y tiene infinitos zumbadores en la mochila, debes colocar en (1,4) la suma de la cantidad de zumbadores en (1,2) ms (1,3) dejando los sumandos donde estn al finalizar la ejecucin. Hay otras miles de maneras de hacerlo, se podra hacer una funcin que copie los valores arriba, y despus los baje etc.

Pero hoy les voy a ensear recursividad y paso de variables.

Les pondr el cdigo completo, pero lo voy a explicar ms abajo.

1 By Fantasa

Cdigo: iniciar-programa define-nueva-instruccion suma(s) como inicio si junto-a-zumbador entonces inicio coge-zumbador; suma(sucede(s)); deja-zumbador; fin sino inicio repetir 2 veces gira-izquierda; mientras frente-libre hacer avanza; repetir 2 veces gira-izquierda; repetir 3 veces avanza; repetir s veces deja-zumbador; repetir 2 veces gira-izquierda; mientras junto-a-zumbador hacer avanza; repetir 2 veces gira-izquierda; fin; fin; inicia-ejecucion mientras no-orientado-al-este hacer gira-izquierda; avanza; suma(0); avanza; suma(0); apagate; termina-ejecucion finalizar-programa

Antes de explicar el cdigo necesito explicar cmo funciona la recursividad de funciones. Miren: Citar define-nueva-instruccion [nombre] como inicio si [condicin de salida inversa] entonces acciones a ejecutar [llamada a la misma funcin] acciones a ejecutar despus al final, la cantidad de veces que la funcin fue llamada fin; fin;

2 By Fantasa

Es decir, en este ejemplo: Cdigo: define-nueva-instruccion karel como inicio si junto-a-zumbador entonces inicio coge-zumbador; avanza; deja-zumbador; gira-izquierda;gira-izquierda; avanza; gira-izquierda;gira-izquierda; karel; deja-zumbador; fin; fin; Se copia el nmero de zumbadores en el espacio de adelante. Veamos porque Cdigo: define-nueva-instruccion karel como inicio creamos la funcin.

Cdigo: si junto-a-zumbador entonces inicio Esta es nuestra condicin de salida, es decir la recursividad (llamada a una funcin dentro de su misma) solo se ejecuta mientras esta condicin sea verdadera.

Cdigo: coge-zumbador; avanza; deja-zumbador; gira-izquierda; gira-izquierda; avanza; gira-izquierda; gira-izquierda; Esto es la seccin donde coge el zumbador, lo deja adelante, y regresa a la posicin original. Cdigo: karel; Aqu esta la llamada a s misma.

3 By Fantasa

Cdigo: deja-zumbador; Y esto es lo que va a hacer por cada zumbador que tomo, es decir dejar otro en su lugar. En otras palabras, lo que hace es: Cdigo: si hay zumbadores agarro uno lo pongo adelante de nuevo lo mismo X veces dejo X zumbadores. Fin fin; Para los que aun no entienden, por ejemplo si hay 2 zumbadores el cdigo que ejecuta el programa realmente es este (sustituyo la llamada a karel por el cdigo del mismo). Cdigo: define-nueva-instruccion karel como inicio si junto-a-zumbador entonces inicio coge-zumbador; avanza; deja-zumbador; gira-izquierda;gira-izquierda; avanza; gira-izquierda;gira-izquierda; si junto-a-zumbador entonces inicio (*ESTA ES LA MISMA FUNCION OTRA VEZ*) coge-zumbador; avanza; deja-zumbador; gira-izquierda;gira-izquierda; avanza; gira-izquierda;gira-izquierda; si junto-a-zumbador entonces inicio (*AQUI LA CONDICION YA NO SE CUMPLE*) fin; deja-zumbador; fin; (*AQUI TERMINA*) deja-zumbador; fin; fin; En fin, les he explicado de 3 maneras distintas la teora de recursividad.

4 By Fantasa

Si aun no entienden, haber si me entienden este otro ejemplo: Citar define-nueva-instruccion ve-arriba como inicio si no-orientado-al-norte entonces inicio gira-izquierda; ve-arriba; fin; fin; Este cdigo girara a la izquierda hasta que este no se cumpla: "no-orientado-al-norte" es decir, girar: "mientras no-orientado-al-norte".

Una vez que hayan entendido recursividad. Ya podrn entender mejor el cdigo, solo me faltan 2 cosas por explicar. La primera es que diablos es "sucede" jeje la primera vez que yo vi esa instruccin no le encontraba sentido.. Bueno, aqu esta un ejemplo: 4= sucede(3); 3= sucede(2); Si me entienden? sucede es igual al valor que tiene dentro de los parntesis MAS 1. Bueno, sucede tiene una funcin hermana, llamada precede. 4= precede(5); 3= precede(4); Precede es igual al valor que tiene dentro de los parntesis MENOS 1. Una cosa ms. Las funciones de Karel pueden recibir parmetros, y almacenarlos en variables. Parmetro = dato extra pasado a una funcin Variable = letra o palabra que almacena un numero. (En karel solo se pueden almacenar nmeros) En fin. 5 By Fantasa

Por ejemplo, si creamos una funcin as: Cdigo: define-nueva-instruccion rec(x) como inicio repetir x veces avanza; fin; al llamar: Cdigo: rec(5); Karel avanzara 5 posiciones, porque la X vale 5. Ahora s, ya sabes todo lo necesario para entender el primer cdigo que les puse. Cdigo: define-nueva-instruccion suma(s) como inicio si junto-a-zumbador entonces inicio coge-zumbador; suma(sucede(s)); deja-zumbador; fin sino inicio repetir 2 veces gira-izquierda; mientras frente-libre hacer avanza; repetir 2 veces gira-izquierda; repetir 3 veces avanza; repetir s veces deja-zumbador; repetir 2 veces gira-izquierda; mientras junto-a-zumbador hacer avanza; repetir 2 veces gira-izquierda; fin; fin; Esa es la funcin, lo importante es que cuando mandamos llamar la funcin la mandamos llamar as: Cdigo: suma(0); Es decir inicialmente vale 0. Bueno, una cosa ms respecto a esta funcin. Si usas un sino, el cdigo que este en la accin del "sino" se ejecutara una sola vez cuando por primera vez no se cumpla la condicin. 6 By Fantasa

Si no me entendieron, lanlo de nuevo: Si usas un sino, el cdigo que este en la accin del "sino" se ejecutara una sola vez cuando por primera vez no se cumpla la condicin.

Una vez ms: Si usas un sino, el cdigo que este en la accin del "sino" se ejecutara una sola vez cuando por primera vez no se cumpla la condicin. Relean ese enunciado cuantas veces crean necesario. Ahora analicemos parte por parte el cdigo de la suma. Citar define-nueva-instruccion suma(s) como inicio Bueno, esa es la funcin. Citar si junto-a-zumbador entonces inicio Esta es la condicin de salida, cuando no se cumpla, se terminara de llamar a si misma. Citar coge-zumbador; Eso es lo que va a hacer cada vez que coja un zumbador. Citar suma(sucede(s)); y aqu es donde se llama la funcin a s misma, solo que esta vez avisa que S va a valer uno ms, de esta forma se va guardando en S la cantidad de zumbadores que haba.. Citar deja-zumbador; Aqu repone los zumbadores que cogi. Citar fin sino inicio Recuerdan la lnea que deben leer muchas veces hasta entenderla?, si no entiendes que hace esto aqu, lela de nuevo.

7 By Fantasa

Citar repetir 2 veces gira-izquierda; mientras frente-libre hacer avanza; repetir 2 veces gira-izquierda; repetir 3 veces avanza; repetir s veces deja-zumbador; repetir 2 veces gira-izquierda; mientras junto-a-zumbador hacer avanza; repetir 2 veces gira-izquierda; Esto lo que hace es ir a la posicin 3 dejar lo que valga "S" de zumbadores y regresar. Y al final son 2 "fin;", uno para terminar el "si/sino" y otro para terminar la funcin.

Pues esto fue un ejemplo de recursividad con Karel, y pues ahora ya deberan saber cmo funciona el 98% de Karel nos faltan 2 cosas, extremadamente fciles, y ya es todo lo que te puedo ensear de Karel, una prxima sesin ser de cmo resolver problemas que parecen muy complicados de la manera ms sencilla posible. Las 2 cosas que nos faltan son: Una vez que ya recibimos una variable en nuestra funcin, digamos que se llama "kora" podemos hacer algunas cosas con ella. Por ejemplo karel puede detectar si kora es igual a 0. Por ejemplo si kora vale 4, entonces en esta instruccin: Cdigo: si si-es-cero(kora) entonces inicio apagate; fin sino inicio avanza; fin; karel avanzara, porque kora no es cero. Difcil? Ahora tambin tenemos una cosa ms. NO Y O 8 By Fantasa

Y y O se usan para unir 2 o ms sentencias. Y regresa Verdadero si se cumplen las 2 condiciones. O regresa verdadero cuando se cumple alguna de las 2 condiciones. Estas son para modificar las condiciones que vimos al principio del taller. si-junto-a-zumbador frente-libre etc.. Por ejemplo podemos poner un "si" as: Cdigo: si junto-a-zumbador y frente-libre entonces ... o un "mientras" as: Cdigo: mientras junto-a-zumbador o frente-bloqueado hacer ...

o un "si" que te servira para las funciones recursivas: Cdigo: si no si-es-cero(precede(kora)) entonces ...

Recuerdan que la sintaxis de si es esta: si [condicion] entonces [accion] pues entonces la condicion es esta: no si-es-cero(precede(kora))

es decir.. si kora-1 (precede(kora) = kora-1 es cero (si-es-cero(kora-1)) cuando kora valga 4 entonces es cero (4-1) ? 9 By Fantasa

nos regresa FALSO. Pero si recuerdan nuestra condicin lleva un "no": si no si-es-cero(precede(kora)) entonces ... Este no lo que hace es cambiar las cosas.. es decir. FALSO va a regresar verdadero y al revs, es decir.. En nuestro caso de prueba el "no" convierte el FALSO en VERDADERO. Me entendieron? no FALSO = Verdadero no Verdadero = FALSO En fin las posibilidades de Karel son ilimitadas. Ahora, ya son aptos para hacer los ejercicios de Karel que tienen un nivel de dificultad mas grande, solo necesitan prctica y creatividad. Aqu pueden encontrar ejercicios, les prometo que con practica en Karel, van a poder entender a la perfeccin puntadores en C, funciones recursivas, y no tendrn problemas con arboles estructuras etc. ya que karel es una versin mas bsica de eso. Y adems cuando lleguen a un lenguaje de alto nivel van a ver todo lo que les sirvi aprender a programar con este robotito Estn atentos!! Saludos!!

10 By Fantasa

You might also like