06 logica programacion

21
Curso de Lógica y Programación Tema 4: Ejecución condicional de instrucciones María Claudia Lara Universidad de San Buenaventura Cali Primer Semestre de 2008

Upload: ajrodriguez

Post on 18-Dec-2014

1.228 views

Category:

Education


0 download

DESCRIPTION

Sentencia IF

TRANSCRIPT

Page 1: 06 Logica Programacion

Curso de Lógica y Programación

Tema 4: Ejecución condicional de instrucciones

María Claudia Lara

Universidad de San Buenaventura CaliPrimer Semestre de 2008

Page 2: 06 Logica Programacion

Ejecución condicional de instrucciones 2

Introducción (1)

Hasta el momento siempre se ha indicado claramente la situación inicial en la que Karel estaría colocado al inicio de su tarea.

Cuando se escribieron los programas , esta información permitió ordenar fácilmente a Karel para que levantara zumbadores y evitara chocar con las paredes.

Pero estos programas no eran muy generales.

Si Karel trataba de ejecutarlos a partir de una situación inicial ligeramente distinta, con toda seguridad se veía forzado a efectuar un paro por error.

Lo que necesita Karel es la habilidad para investigar su entorno local y después decidir, con base en la información obtenida, qué hacer a continuación.

Page 3: 06 Logica Programacion

Ejecución condicional de instrucciones 3

Introducción (2)

La instrucción IF que se estudiará (IF/THEN e IF/THEN/ELSE) suministra a Karel esta habilidad de decisión.

Ambas le ordenan a Karel que pruebe su entorno y, dependiendo del resultado de la prueba, le permiten ejecutar una instrucción adecuada.

Estas instrucciones permiten escribir programas mucho más generales para Karel; programas que lo instruyen para llevar a cabo tareas sin importar la situación inicial en la que se encuentre.

Page 4: 06 Logica Programacion

Ejecución condicional de instrucciones 4

Instrucción IF/THEN (1)

IF <prueba> THENbegin

<instrucción>; end;

IF <prueba> THENbegin <instrucción>;

: : : : <instrucción>;

end;

La instrucción IF/THEN tiene la siguiente forma general:

La instrucción IF/THEN introduce las dos nuevas palabras reservadas IF y THEN.

Page 5: 06 Logica Programacion

Ejecución condicional de instrucciones 5

Instrucción IF/THEN (2)

Karel ejecuta la instrucción IF/THEN verificando primero si <prueba> es verdadero o falso en la situación actual.

Si prueba es verdadero, Karel ejecuta <instrucción>; si prueba es falso, Karel ignora <instrucción>.

En cualquier caso termina de ejecutar la instrucción IF/THEN completamente.

El bloque begin/end de la cláusula THEN, se coloca debajo de la cláusula IF/THEN y las instrucciones que él contenga llevan sangría..

IF <prueba> THEN begin

<instrucción>; end;

Page 6: 06 Logica Programacion

Ejecución condicional de instrucciones 6

Instrucción IF/THEN (3)

Karel ejecuta esta instrucción IF/THEN verificando primero si está colocado junto a un beeper, en la misma esquina.

Si Karel determina que next-to-a-beeper es verdadero, ejecutará entonces la cláusula THEN, la cual lo instruye para ejecutar levantar un beeper, es decir, pickbeeper. En este punto ha terminado de ejecutar la instrucción IF/THEN y continúa ejecutando el resto del programa comenzando en la instrucción move.

IF next-to-a-beeper THEN begin pickbeeper; end;

move;

Ejemplo: fragmento de programa el cual consta de una instrucción IF/THEN y una instrucción move;

Page 7: 06 Logica Programacion

Ejecución condicional de instrucciones 7

Instrucción IF/THEN (4)

Ahora supóngase que no hay beeper en la esquina donde Karel ejecuta este fragmento de programa.

En este caso <prueba> es falso, así que Karel no ejecuta la cláusula THEN. En lugar de esto, Karel brinca directamente a la instrucción move y continúa ejecutando el programa a partir de ese punto.

El resultado de este segundo caso es que Karel ejecuta la instrucción IF/THEN no haciendo nada más que verificar si está colocado junto a un beeper.

¿En alguno de estos casos, con la instrucción pickbeeper, puede ocurrir un paro por error?

IF next-to-a-beeper THEN begin

pickbeeper; end;

move;

Page 8: 06 Logica Programacion

Ejecución condicional de instrucciones 8

Instrucción IF/THEN (5)

En ninguno de estos casos puede ocurrir un paro por error, ya que Karel ejecuta la instrucción pickbeeper solamente si confirma la presencia de cuando menos un zumbador en su esquina.

IF next-to-a-beeper THEN begin pickbeeper; end;

move;

Page 9: 06 Logica Programacion

Ejecución condicional de instrucciones 9

Las condiciones que puede probar Karel (1) A continuación se describen la lista completa de las palabras del

vocabulario que pueden sustituir a la palabra entre corchetes <prueba> en la instrucción IF/THEN.

Karel trata estas palabras en forma muy parecida a sus instrucciones primitivas; por lo tanto, también están escritas en minúscula

Cada una de las condiciones puede estar en forma tanto positiva como negativa (por ejemplo, despejado al frente y bloqueado al frente)

front-is-clear next-to-a-beeper facing-east

front-is-blocked not-next-to-a-beeper facing-west

left-is-clear any-beepers-in-beeper-bag  not-facing-north

left-is-blocked no-beepers-in-beeper-bag not-facing-south

right-is-clear facing-north not-facing-east

right-is-blocked facing-south not-facing-west

Page 10: 06 Logica Programacion

Ejecución condicional de instrucciones 10

Las condiciones que puede probar Karel (2) Karel detecta las paredes que se encuentran a media cuadra de distancia,

por ejemplo, él prueba right-is-clear (despejado a la derecha), verificando si hay una pared entre él y la primera esquina hacia su derecha.

La prueba next-to-a-beeper (junto a un zumbador) es cierta cuando Karel está en la misma esquina que uno o más zumbadores. No puede escuchar zumbadores que se encuentren a una mayor distancia y no puede escuchar los zumbadores que se encuentran en su bolsa a prueba de ruidos.

Karel consulta con su brújula siempre que deba probar si está o no volteado hacia una dirección en particular.

La prueba any-beepers-in-beeper-bag (algún zumbador en la bolsa para zumbadores) es cierta cuando Karel tiene al menos un zumbador en su bolsa para zumbadores.

Page 11: 06 Logica Programacion

Ejecución condicional de instrucciones 11

beginning-of-program define-new-instruction gira-a-la-derecha as begin turnleft; turnleft; turnleft; end; define-new-instruction colocate-para-siguientes-2 as begin gira-a-la-derecha; move; gira-a-la-derecha; end; define-new-instruction ve-a-siguiente-surco as begin turnleft; move; turnleft; end;

define-new-instruction recolecta-un-surco as begin pickbeeper; move; pickbeeper; move; pickbeeper; move; pickbeeper; move; pickbeeper; end;

define-new-instruction recolecta-2-surcos as begin recolecta-un-surco; ve-a-siguiente-surco; recolecta-un-surco; end;

beginning-of-execution move; recolecta-2-surcos; colocate-para-siguientes-2; recolecta-2-surcos; colocate-para-siguientes-2; recolecta-2-surcos; move; turnoff; end-of-executionend-of-program

Tarea de recolección

Page 12: 06 Logica Programacion

Ejecución condicional de instrucciones 12

Ejemplos simples de la instrucción IF/THEN (1)La instrucción recolecta-un-surco

La nueva tarea de Karel requiere que recolecte un campo del mismo tamaño, pero en esta ocasión no existe ninguna garantía de que haya un zumbador en cada esquina.

Debido a que el programa original de Karel para esta tarea generaría un paro por error en todas aquellas ocasiones en que existiera una esquina vacía, se tiene que modificar para evitar la ejecución de instrucciones pickbeeper no válidas. Karel debe recolectar un zumbador únicamente cuando haya determinado que sí hay uno presente.

Ahora que ya se sabe acerca de la instrucción IF/THEN de Karel, se puede escribir un programa para esta tarea un poco más general (es más general porque cualquier programa que resuelve la tarea de recolección modificada también resuelve la tarea de recolección original). Una situación inicial se muestra en la figura 1.

Hay que observar que ésta es sólo una de las muchas situaciones iniciales posibles. El programa deberá ser capaz de recolectar un campo de este tamaño (seis por cinco) sin importar cuales esquinas contienen un zumbador y cuales no.

Figura 1: Una tarea de recolección modificada (no todas las esquinas tienen zumbadores)

Page 13: 06 Logica Programacion

Ejecución condicional de instrucciones 13

Ejemplos simples de la instrucción IF/THEN (2)Casi todo el programa anterior para una tarea de recolección puede ser reutilizado, ventaja de una

programación clara y concisa. Todo lo que se necesita es modificar la instrucción recolecta-un-surco reemplazando pickbeeper por levanta-un-zumbador-si-hay.

define-new-instruction recolecta-un-surco as begin levanta-un-zumbador-si-hay; move; levanta-un-zumbador-si-hay; move; levanta-un-zumbador-si-hay; move; levanta-un-zumbador-si-hay; move; levanta-un-zumbador-si-hay; end;Por supuesto, también deberá escribir la instrucción levanta-un-zumbador-si-hay, pero esto puede

hacerse fácilmente empleando la instrucción IF/THEN.

define-new-instruction levanta-un-zumbador-si-hay as begin IF next-to-a-beeper THEN begin pickbeeper; end; end;

Page 14: 06 Logica Programacion

Ejecución condicional de instrucciones 14

Ejemplos simples de la instrucción IF/THEN (3)

La instrucción gira-sólo-si-está-bloqueado

Defina una instrucción que haga girar a Karel cuando el espacio hacia el frente este bloqueado, pero que no cambia la posición de Karel si el frente está despejado.

Page 15: 06 Logica Programacion

Ejecución condicional de instrucciones 15

Ejemplos simples de la instrucción IF/THEN (4)La instrucción gira-sólo-si-está-bloqueado

A continuación se define una instrucción que hace girar a Karel cuando el espacio hacia el frente está bloqueado, pero que no cambia la posición de Karel si el frente está despejado.

define-new-instruction gira-sólo-si-está-bloqueado as begin IF front-is-blocked THEN begin turnleft; turnleft; end;end;

Page 16: 06 Logica Programacion

Ejecución condicional de instrucciones 16

Ejemplos simples de la instrucción IF/THEN (5) Es sumamente indispensable verificar si la instrucción es correcta

simulando su ejecución por Karel, tanto cuando el frente está bloqueado como cuando no lo está.

Para verificar si una instrucción IF es correcta, hay que recordar que Karel debe ser probado en todas las situaciones que pudiera encontrar al ejecutar la instrucción.

No se debe probar en forma pasiva una instrucción en varias situaciones; por el contrario, se debe pensar activamente en situaciones en donde la instrucción pueda fallar en cuanto al cumplimiento de la intención perseguida. Se debe simular a Karel en estas situaciones en forma rigorista y determinar si ejecuta la instrucción en la forma que se desea.

¿Qué sucedería si se probara en forma inadecuada una instrucción, se supusiera que es correcta y se utilizara en un programa que se ejecuta con frecuencia?

Page 17: 06 Logica Programacion

Ejecución condicional de instrucciones 17

Ejemplos simples de la instrucción IF/THEN (6) Podría funcionar en forma correcta en algunas situaciones pero no en otras. Podría funcionar en forma correcta en el programa durante varios días,

siempre y cuando no se ejecute esta instrucción en una situación donde no cumpla con la intención de la misma. Conforme pasen los días, el programador adquirirá mayor confianza sobre lo correcto de su programa. Pero tarde o temprano será necesario que se ejecute esta instrucción en una situación que no haya sido probada y, de repente, el programa comenzará a fallar. Para entonces, es probable que el programador haya olvidado cómo funciona el programa, y se enfrentará al problema de encontrar y corregir el error (especialmente si el programa estaba mal escrito desde el principio).

A partir de esta explicación se concluye que no existe ninguna garantía de que un programa cuyo funcionamiento haya sido probado en forma inadecuada seguirá funcionando en forma correcta en el futuro.

Esta explicación muestra por qué es tan importante verificar las instrucciones probándolas en todas las situaciones posibles inmediatamente después de haberlas escrito.

Page 18: 06 Logica Programacion

Ejecución condicional de instrucciones 18

Ejemplos simples de la instrucción IF/THEN (7)La instrucción voltea-hacia-el-norte

A continuación se define una nueva instrucción cuya ejecución hace a Karel voltear hacia el norte sin importar la dirección hacia la que está volteado inicialmente

define-new-instruction voltea-hacia-el-norte as begin IF not-facing-north THEN begin turnleft; end; IF not-facing-north THEN begin turnleft; end; IF not-facing-north THEN begin turnleft; end; end;

Para verificar si la instrucción voltea-hacia-el-norte es correcta, se debe simular la ejecución por Karel de esta instrucción en cada una de cuatro situaciones distintas:Volteado inicialmente hacia el norte, el sur, el este y el oeste.

Page 19: 06 Logica Programacion

Ejecución condicional de instrucciones 19

Ejemplos simples de la instrucción IF/THEN (8) Simulación detallada para la situación inicial en la que Karel esté volteado

hacia el sur.

Si se supone que Karel está inicialmente volteado hacia el sur, ejecutará la primera instrucción IF/THEN determinando que la prueba not-facing-north es cierta. Dado que <prueba> es cierta, ejecuta la cláusula THEN del IF, la cual lo instruye para girar a la izquierda. Después Karel ejecuta la segunda instrucción IF en la secuencia que define voltea-hacia-el-norte. Verifica la prueba not-facing-north y nuevamente determina que es cierta (ya que en este momento está volteado hacia el este); por lo tanto, Karel ejecuta la cláusula THEN y nuevamente gira a la izquierda. Aunque ya Karel está volteado hacia el norte (la dirección correcta), debe continuar ejecutando la instrucción IF/THEN restante del bloque begin/end. En el último IF, Karel determina que <prueba> es falso y se brinca la cláusula THEN, completando la definición de voltea-hacia-el-norte.

Ya se ha verificado que la instrucción voltea-hacia-el-norte es correcta en la situación inicial en que Karel está volteado al sur. Continúe este análisis para las otras tres posibles situaciones iniciales, para verificar que la instrucción sea completamente correcta.

Page 20: 06 Logica Programacion

Ejecución condicional de instrucciones 20

Ejemplos simples de la instrucción IF/THEN (9) Si se escribiera incorrectamente la instrucción voltea-hacia-el-norte

utilizando únicamente dos de las tres instrucciones IF, ¿qué situaciones provocarían que la instrucción fracasara en el logro de su propósito?

Si accidentalmente se instruyera una instrucción IF/THEN adicional en esta definición (haciendo que en total fueran cuatro), ¿qué situación(es) provocarían que la instrucción no logrará su propósito? Verifique sus respuestas a estas preguntas mediante una simulación similar a la anterior.

Page 21: 06 Logica Programacion

Ejecución condicional de instrucciones 21

Ejemplos simples de la instrucción IF/THEN (10)

define-new-instruction captura-un-zumbador as begin move; IF next-to-a-beeper THEN begin pickbeeper; da-la-vuelta; end; move; move; end;

Esta definición contiene cuatro instrucciones: el primer move, IF/THEN, el segundo move y el tercer move.