1 Condicion A Les
1 Condicion A Les
1 Condicion A Les
La instrucción if{..} permite escribir programas más generales para robots que
logran la misma tarea, en situaciones iguales o diferentes.
Los programas del robot contienen varias clases de instrucciones. La primera y
más importante, es el mensaje a un robot. Estos mensajes son enviados al
robot, por el piloto (cuando aparecen en el bloque de la tarea principal) o por
otro robot (cuando ocurren en un método de una cierta clase).
La acción asociada a esta clase de instrucción es definida por la clase del robot
a la cual se dirige el mensaje. Otra clase de instrucción es la especificación de
la entrega, que se envía a la fábrica para construir un robot nuevo y para hacer
que el piloto del helicóptero la entregue.
3
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
A continuación se presentan las dos posibilidades de estado inicial y estado
final, figura 1.
2
) )
Primer Estado Inicial Primer Estado Final
Karel tiene 0 pitos en la bolsa Karel tiene 3 pitos en la bolsa
2
) )
Las instrucciones que permiten ejecutar una acción u otra, dependen de las
condiciones del entorno en un momento dado, éstas se llaman instrucciones
condicionales.
1.2 INSTRUCCIÓN if
If <condición >
{
< Instrucciones >
}
4
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
Si sólo hay una instrucción dentro del if, se tiene que dejar los corchetes { }. Su
uso se puede observar en la figura 2:
SI Ejecuta
la
Instrucción
¿Se
cumple la
condición?
No Ejecuta
la
NO Instrucción
Toda instrucción if{..} sirve para indicar a Karel cómo cambiar el estado del
mundo en el que se encuentra. A diferencia de las instrucciones primitivas, la
instrucción condicional, le indica a Karel que debe revisar su mundo antes de
realizar una acción. Así, el estado final al que deba llegar Karel depende del
estado inicial y de la condición planteada en el if{..}
5
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
Se tiene la instrucción que le indica a Karel que si hay pitos en su esquina debe
recoger uno, esta instrucción se ejecuta de la siguiente manera, dependiendo
del estado inicial. Cuando Karel oye un pito, concluye que la condición
planteada es verdadera y realiza la instrucción dentro del {…}, cogiendo un
pito. El estado final tiene un pito menos en la esquina y uno más en la bolsa de
Karel.
if (nextToABeeper()) {
pickBeeper() };
) )
if (nextToABeeper()) {
pickBeeper() };
) )
1.3 . CONDICIONES
Una condición es una característica del mundo que Karel puede evaluar para
saber si es cierta o falsa en un momento dado.
Las capacidades que tiene Karel, le permiten evaluar las condiciones, cuando
se refiere a los pitos del mundo y de la bolsa, orientación y la presencia de los
muros al frente o a los lados.
6
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
1.3.2 Presencia de Muros: Con las tres cámaras de visión que tiene, Karel
puede saber si hay o no muros al frente, a su derecha o a su izquierda.
7
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
La instrucción return sólo se usa en los predicados. Ella no puede ser usada
en métodos (void) ordinarios, tampoco en la condición de la tarea principal. Por
ejemplo: un robot de clase inspector puede realizar las siguientes instrucciones:
boolean not_nextToABeeper()
{ return (!nextToABeeper())
;
}
8
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
En consecuencia, rightIsClear() debe ejecutar una instrucción de giro, además
de tomar un valor true o false.
boolean rightIsClear()
{ turnRight();
if ( frontIsClear() )
{ turnLeft();
return true;
}
turnLeft();
return false;
9
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
1.4 . INSTRUCCIÓN if/else
Las condiciones que se utilizan en esta instrucción condicional son las mismas
que se usan en el if. La estructura de está instrucción es:
If <condición>
{
<bloque-1>
}
else
{
<bloque-2>
}
Karel evalúa la <condición> y determina si en ese momento es cierta. Si se
cumple entonces Karel ejecuta la <instrucción1> (el bloque de instrucciones del
{…}); si la <condición> no se cumple, Karel ejecuta la <instrucción2> (el bloque
del else {…}). Si es una sola instrucción, se puede suprimir el {…}.
SI
Bloque-1
¿Se
cumple la
condición?
NO
Bloque-2
10
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
Problema: En cada una de las esquinas del mundo de Karel, sobre la calle 1
entre las avenidas 1 y 6 hay 0, 1, 2 ó 3 pitos. Programe a Karel para que,
partiendo del origen, mirando al este, sin pitos en la bolsa, riegue un pito en
cada una de estás esquinas sobre la avenida en la que se encuentra. Karel
debe terminar en la esquina (1,7) mirando al este.
3 2
) )
Estado Inicial Estado Final
Karel tiene 0 pitos en la bolsa. Karel tiene 0 pitos en la bolsa
Solución: La idea es repetir seis veces el paso de recoger los pitos de una
esquina, enviarlos hacia arriba y pasar a la esquina siguiente. De está forma el
bloque principal de ejecución será:
task
{
ur_Robot karel(1,1,East,0); // Inicializar el robot en su posición inicial, orientación y el número
// de pitos en su bolsa.
loop(6)
{
karel.paso;
karel.turnOff();
11
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
}
}
paso
)3 )
i i+1 i i+1
Karel tiene 0 pitos Karel tiene 0 pitos
en la bolsa ∩ en la bolsa
recoja
riegue baje
)
i i+1 i i+1
Karel tiene 3 pitos Karel tiene 0 pitos
en la bolsa en la bolsa
12
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
if (nextToABeeper())
{
pickBeeper();
if (nextToABeeper())
{
pickBeeper();
if (nextToABeeper())
{
pickBeeper();
}
}
}
}
void Distribuidor :: ponga_y_siga()
{
if (anyBeepersInBeeperBag())
{
putBeeper();
move();
}
}
13
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
{
move();
if (frontIsClear())
{
move();
}
}
}
}
Programa Completo
14
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
}
}
void Distribuidor :: ponga_y_siga()
{
if (anyBeepersInBeeperBag())
{
putBeeper();
move();
}
}
void Distribuidor :: riegue()
{
turnLeft();
loop(3)
{
coloque_y_siga();
}
}
void Distribuidor :: baje()
{
turnRight();
move();
turnRight();
if (frontIsClear())
{
move();
if (frontIsClear())
{
move();
if (frontIsClear())
{
move();
}
}
}
}
void Distribuidor :: paso()
{
recoja();
15
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
riegue();
baje();
}
task
{
Distribuidor karel(1,1,East,0);
loop(6)
{
karel.paso;
karel.turnOff();
}
}
) )
Estado Inicial Estado Final
Karel tiene 0 pitos en la bolsa Karel tiene 3 pitos en la bolsa
16
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
task
{
ur_Robot karel(1,1,East,0);
loop(3)
{
karel.move();
karel.pickBeeper();
karel.turnLeft();
}
karel.move();
karel.turnLeft();
karel.turnOff();
}
task
{
ur_Robot karel(1,1,East,0);
karel.turnLeft();
loop(3)
{
karel.move();
karel.pickBeeper();
karel.turnRight();
}
karel.move();
kael.turnLeft();
karel.turnLeft();
karel.turnOff();
}
17
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
Forma general:
If <condicion>
{
<instruccion1>
}
else
{
<instruccion2>
}
if <no condición>
{
<instruccion2>
}
else
{
<instruccion1>
18
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
Ejemplo:
If (nextToABeeper())
{
pickBeeper();
}
else
{ move();
}
if (!nextToABeeper()) {
move();
}
else
{
pickBeeper();
}
Forma general:
Caso A
If <condición>
{
<instrucción 1>
<instrucción 3>
}
else
{
<instrucción 2>
<instrucción 3>
}
19
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
Caso B
if <condición>
{
<instrucción 1>
}
else
{
<instrucción 2>
<instrucción 3>
}
Ejemplo:
Caso A
If (nextToABeeper())
{
pickBeeper();
move();
}
else
{
putBeeper();
move();
}
Caso B
if (nextToABeeper())
{
pickBeeper();
}
else
{
putBeeper();
}
move();
20
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
Forma general:
Caso A
If <condición>
{
<instrucción 1>
<instrucción 2>
}
else
{
<instrucción 1>
<instrucción 3>
}
Caso B
<instrucción 1>
if <condición>
{
<instrucción 2>
}
else
{
<instrucción 3>
}
21
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
Ejemplo (aplicación incorrecta de la factorización hacia arriba)
Caso A
If (nextToABeeper())
{
move();
turnLeft();
}
else
{
move();
turnRigth();
}
Caso B
move();
if (nextToABeeper())
{
turnLeft();
}
else
{
turnRigth();
}
Caso A
if (anyBeepersInBeeperBag())
{
move();
turnLeft();
}
else
22
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
{
move();
turnRight();
}
Caso B
move();
if (anyBeepersInBeeperBag() )
{
turnLeft();
}
else
{
turnRight();
}
Ejemplo:
Caso A
If (facingNorth())
{
move();
if (facingNorth())
{
turnLeft();
}
}
Caso B
if (facingNorth())
23
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
{
move();
turnLeft();
}
Segmento A
If (nexttoABeeper())
{
turnLeft();
}
else
{
if (!nextToABeeper())
{
putBeeper();
turnRight();
}
else
{
turnRight();
}
}
Segmento B
If (nextToABeeper())
{
turnLeft();
}
else
{
turnRight();
24
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
}
Segmento A
if (anyBeepersInBeeperBag() )
{
pickBeeper();
turnRight();
}
else
{
if (anyBeepersInBeeperBag() )
{
pickBeeper();
turnRight();
}
else
{
turnLeft();
}
}
Segmento B
if (!anyBeepersInBeeperBag() )
{
turnLeft();
}
else
{
pickBeeper();
turnRight();
}
25
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
Void saltador::baje()
{
if ( frontIsClear() )
{
turnRight();
move();
move();
if ( frontIsClear() )
{
move();
turnLeft();
}
else
{
turnRight();
move();
turnLeft();
}
}
}
26
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
Segmento A
If (!nextToABeeper())
{
If (anyBeepersInBeeperBag() )
{
putBeeper();
}
else
{
pickBeeper();
}
}
Segmento B
If (nextToABeeper())
{
pickBeeper();
}
else
{
If (anyBeepersInBeeperBag() )
{
putBeeper();
}
}
27
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
1.8.5 Determine si las siguientes parejas de código son o no equivalentes:
Segmento A
void saltador:: baje()
{
move();
if ( frontIsClear() )
{
move();
}
if ( frontIsClear() )
{
move();
}
turnLeft();
}
Segmento B
28
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
2 2
2 2 2
2
2 2
) 2 ) 2
1.8.7 Karel trabaja en una librería y debe colocar todos los libros en los cuatro
anaqueles de la biblioteca; en cada anaquel caben hasta dos libros; Karel ya
colocó los libros (pitos) frente a cada anaquel, prográmelo para que los guarde.
2
) )
Estado Inicial Estado Final
Karel tiene 0 pitos en la bolsa Karel tiene 0 pitos en la bolsa
29
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
1.8.8 Haga un programa para que Karel se oriente de acuerdo con los pitos
que tiene en su bolsa, de la siguiente manera: si no tiene pitos en la bolsa,
debe quedar mirando al sur, si tiene un pito debe mirar hacia el este, si tiene 2
hacia el norte y con 3 hacia el oeste. Karel parte mirando en cualquier dirección
y al terminar debe haber colocado en su esquina todos los pitos de su bolsa.
1.8.9 Karel va a hacer una fiesta y desea preparar los pasabocas. Para esto va
a su despensa de galletas (pitos). La despensa consta de cajas de diferentes
tamaños que se extienden hacia el sur desde la calle 5 entre las avenidas 2 y
8. En cada una de estás avenidas puede haber cajas de tamaño 0, 1, 2, ó 4.
Las cajas están llenas de galletas (una en cada esquina). Programe a Karel
para que saque estás galletas y las coloque “encima” de cada caja, es decir,
sobre la calle 5 a la altura de la avenida de donde las tomó.
3 2 4
) )
4
) )
1 10
Estado Inicial Estado Final
Karel tiene 10 pitos en la bolsa
Figura 12. Posible estado inicial y final del problema sin pitos
30
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
2 3 3 2 2 2
) )
Estado Inicial Estado Final
Karel tiene 0 pitos en la bolsa Karel tiene 0 pitos en la bolsa
Figura 13. Posible estado inicial y final del problema subir un pito
1.8.12 Karel tiene un criadero de conejos, formados por cuatro corrales. Todos
los días Karel saca a los conejos de su corral y los pone frente a la entrada
para que coman. En cada corral puede haber hasta 3 conejos. Haga un
programa para que Karel saque los conejos de cada corral y los ponga frente a
la entrada (una esquina al oeste). Karel parte del origen mirando al este y
termina igual. Ayuda: antes de comenzar a resolver el problema asegúrese de
entender cuáles son las condiciones que deben estar presentes en todos los
estados iniciales posibles.
2 2
) )
Estado Inicial Estado Final
Karel tiene 0 pitos en la bolsa Karel tiene 0 pitos en la bolsa
Figura 14. Posible estado inicial y final del problema criadero de conejos
1.8.13 Karel se está entrenando para una carrera de obstáculos en una pista
de 12 millas de largo, en la que hay (entre las esquinas (1,1) y (1,12))
31
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
obstáculos de 0,1,2 ó 3 metros de altura. Programe a Karel para que salte los
obstáculos colocando detrás de cada una, a la altura de la calle 1 tantos pitos
como metros midan el obstáculo y regrese al origen. Suponga que Karel parte
con suficientes pitos.
3 2 3 2
) C 2
Figura 15. Posible estado inicial y final del problema carrera de obstáculos
∩ ∩
Estado Inicial Estado Final
Karel tiene 8 pitos en la bolsa Karel tiene 3 pitos en la bolsa
32
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
1.8.16 Karel, que hace poco se volvió vegetariano decidió plantar unas
lechugas en su huerta (que tiene forma de diamante de lado 4). Karel es un
poco descuidado y plantó en algunas de las esquinas 2 lechugas (pitos),
dejando otras esquinas sin lechuga. Ayúdelo a redistribuir las lechugas,
quitando una en las esquinas donde hay dos y colocando una en las esquinas
que no tienen nada.
2
∩
2 2
2
∩
Estado Inicial Estado Final
Karel tiene 20 pitos en la bolsa Karel tiene 17 pitos en la bolsa
Figura 17. Posible estado inicial y final del problema del vegetariano
1.8.17 Karel parte de la esquina (3,1) mirando al este. Sobre la calle 2 hay una
serie de cajas de un bloque de ancho y un bloque de alto, que tienen una
entrada hacia alguno de sus lados. Las cajas están separadas por una avenida.
El final de las cajas está marcado por un bloque vertical de altura 3. Karel parte
con suficientes pitos en su bolsa (más que el número de cajas). Prográmelo
para que coloque un pito dentro de cada una de las cajas (en la esquina interior
de la caja) y termine sobre la avenida 3 frente al muro de 3 bloques de alto.
33
Universidad de Pamplona Fundamentos de Programación Orientada a Objetos
) )
Figura 18. Posible estado inicial y final del problema de las cajas
1.8.18 Karel se encuentra en el origen mirando al este. En las primeras 7
esquinas del mundo sobre la calle 1 (de la avenida 1 a la 7) hay una serie de
pitos (0,1,2 ó 3 en cada esquina). Haga un programa para que Karel “mueva”
este “patrón” de pitos 3 calles más arriba (en la calle 4). Karel debe terminar en
el origen, mirando al este.
2 3 2
3 2
)2 )
Estado Inicial Estado Final
Karel tiene 0 pitos en la bolsa Karel tiene 0 pitos en la bolsa
Figura 19. Posible estado inicial y final del problema de subir pitos
34