06 Logica Programacion

1,463 views

Published on

Sentencia IF

Published in: Education, Travel, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,463
On SlideShare
0
From Embeds
0
Number of Embeds
54
Actions
Shares
0
Downloads
33
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

06 Logica Programacion

  1. 1. 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
  2. 2. Introducción (1) <ul><li>Hasta el momento siempre se ha indicado claramente la situación inicial en la que Karel estaría colocado al inicio de su tarea. </li></ul><ul><li>Cuando se escribieron los programas , esta información permitió ordenar fácilmente a Karel para que levantara zumbadores y evitara chocar con las paredes. </li></ul><ul><li>Pero estos programas no eran muy generales . </li></ul><ul><li>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. </li></ul><ul><li>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. </li></ul>
  3. 3. Introducción (2) <ul><li>La instrucción IF que se estudiará (IF/THEN e IF/THEN/ELSE) suministra a Karel esta habilidad de decisión. </li></ul><ul><li>Ambas le ordenan a Karel que pruebe su entorno y, dependiendo del resultado de la prueba, le permiten ejecutar una instrucción adecuada. </li></ul><ul><li>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. </li></ul>
  4. 4. Instrucción IF/THEN (1) <ul><li>IF <prueba> THEN </li></ul><ul><li>begin </li></ul><ul><li><instrucción>; </li></ul><ul><li>end; </li></ul><ul><li>IF <prueba> THEN </li></ul><ul><li>begin </li></ul><ul><li> <instrucción>; </li></ul><ul><li> : : </li></ul><ul><li> : : </li></ul><ul><li> <instrucción>; </li></ul><ul><li>end; </li></ul>La instrucción IF/THEN tiene la siguiente forma general: La instrucción IF/THEN introduce las dos nuevas palabras reservadas IF y THEN.
  5. 5. Instrucción IF/THEN (2) <ul><li>Karel ejecuta la instrucción IF/THEN verificando primero si <prueba> es verdadero o falso en la situación actual. </li></ul><ul><li>Si prueba es verdadero, Karel ejecuta <instrucción>; si prueba es falso, Karel ignora <instrucción>. </li></ul><ul><li>En cualquier caso termina de ejecutar la instrucción IF/THEN completamente. </li></ul><ul><li>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.. </li></ul>IF <prueba> THEN begin <instrucción>; end;
  6. 6. Instrucción IF/THEN (3) <ul><li>Karel ejecuta esta instrucción IF/THEN verificando primero si está colocado junto a un beeper, en la misma esquina. </li></ul><ul><li>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. </li></ul>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;
  7. 7. Instrucción IF/THEN (4) <ul><li>Ahora supóngase que no hay beeper en la esquina donde Karel ejecuta este fragmento de programa. </li></ul><ul><li>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. </li></ul><ul><li>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. </li></ul><ul><li>¿En alguno de estos casos, con la instrucción pickbeeper, puede ocurrir un paro por error? </li></ul> IF next-to-a-beeper THEN begin pickbeeper; end; move;
  8. 8. Instrucción IF/THEN (5) <ul><li>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. </li></ul> IF next-to-a-beeper THEN begin pickbeeper; end; move;
  9. 9. Las condiciones que puede probar Karel (1) <ul><li>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. </li></ul><ul><li>Karel trata estas palabras en forma muy parecida a sus instrucciones primitivas; por lo tanto, también están escritas en minúscula </li></ul><ul><li>Cada una de las condiciones puede estar en forma tanto positiva como negativa (por ejemplo, despejado al frente y bloqueado al frente) </li></ul>not-facing-west facing-south right-is-blocked not-facing-east facing-north right-is-clear not-facing-south no-beepers-in-beeper-bag left-is-blocked not-facing-north any-beepers-in-beeper-bag  left-is-clear facing-west not-next-to-a-beeper front-is-blocked facing-east next-to-a-beeper front-is-clear
  10. 10. Las condiciones que puede probar Karel (2) <ul><li>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. </li></ul><ul><li>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. </li></ul><ul><li>Karel consulta con su brújula siempre que deba probar si está o no volteado hacia una dirección en particular. </li></ul><ul><li>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. </li></ul>
  11. 11. <ul><li>beginning-of-program </li></ul><ul><li>define-new-instruction gira-a-la-derecha as </li></ul><ul><li>begin </li></ul><ul><li>turnleft; </li></ul><ul><li>turnleft; </li></ul><ul><li>turnleft; </li></ul><ul><li>end; </li></ul><ul><li>define-new-instruction colocate-para-siguientes-2 as </li></ul><ul><li>begin </li></ul><ul><li>gira-a-la-derecha; </li></ul><ul><li>move; </li></ul><ul><li>gira-a-la-derecha; </li></ul><ul><li>end; </li></ul><ul><li>define-new-instruction ve-a-siguiente-surco as </li></ul><ul><li>begin </li></ul><ul><li>turnleft; </li></ul><ul><li>move; </li></ul><ul><li>turnleft; </li></ul><ul><li>end; </li></ul>Tarea de recolección 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-execution end-of-program
  12. 12. Ejemplos simples de la instrucción IF/THEN (1) <ul><li>La instrucción recolecta-un-surco </li></ul><ul><li>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. </li></ul><ul><li>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. </li></ul><ul><li>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. </li></ul><ul><li>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. </li></ul>Figura 1: Una tarea de recolección modificada (no todas las esquinas tienen zumbadores)
  13. 13. Ejemplos simples de la instrucción IF/THEN (2) <ul><li>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. </li></ul><ul><li>define-new-instruction recolecta-un-surco as </li></ul><ul><li>begin </li></ul><ul><li>levanta-un-zumbador-si-hay; </li></ul><ul><li>move; </li></ul><ul><li>levanta-un-zumbador-si-hay; </li></ul><ul><li>move; </li></ul><ul><li>levanta-un-zumbador-si-hay; </li></ul><ul><li>move; </li></ul><ul><li>levanta-un-zumbador-si-hay; </li></ul><ul><li>move; </li></ul><ul><li>levanta-un-zumbador-si-hay; </li></ul><ul><li>end; </li></ul><ul><li>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. </li></ul><ul><li>define-new-instruction levanta-un-zumbador-si-hay as </li></ul><ul><li>begin </li></ul><ul><li>IF next-to-a-beeper THEN </li></ul><ul><li>begin </li></ul><ul><li>pickbeeper; </li></ul><ul><li>end; </li></ul><ul><li>end; </li></ul>
  14. 14. Ejemplos simples de la instrucción IF/THEN (3) <ul><li>La instrucción gira-sólo-si-está-bloqueado </li></ul><ul><li>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. </li></ul>
  15. 15. Ejemplos simples de la instrucción IF/THEN (4) <ul><li>La instrucción gira-sólo-si-está-bloqueado </li></ul><ul><li>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. </li></ul><ul><li>define-new-instruction gira-sólo-si-está-bloqueado as </li></ul><ul><li>begin </li></ul><ul><li>IF front-is-blocked THEN </li></ul><ul><li>begin </li></ul><ul><li>turnleft; </li></ul><ul><li>turnleft; </li></ul><ul><li>end; </li></ul><ul><li>end; </li></ul>
  16. 16. Ejemplos simples de la instrucción IF/THEN (5) <ul><li>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á. </li></ul><ul><li>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. </li></ul><ul><li>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. </li></ul><ul><li>¿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? </li></ul>
  17. 17. Ejemplos simples de la instrucción IF/THEN (6) <ul><li>Podría funcionar en forma correcta en algunas situaciones pero no en otras. </li></ul><ul><li>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). </li></ul><ul><li>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. </li></ul><ul><li>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. </li></ul>
  18. 18. Ejemplos simples de la instrucción IF/THEN (7) <ul><li>La instrucción voltea-hacia-el-norte </li></ul><ul><li>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 </li></ul>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.
  19. 19. Ejemplos simples de la instrucción IF/THEN (8) <ul><li>Simulación detallada para la situación inicial en la que Karel esté volteado hacia el sur. </li></ul><ul><li>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. </li></ul><ul><li>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. </li></ul>
  20. 20. Ejemplos simples de la instrucción IF/THEN (9) <ul><li>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? </li></ul><ul><li>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. </li></ul>
  21. 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.

×