07 logica programacion

17
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.317 views

Category:

Education


3 download

DESCRIPTION

Sentencia IF y ELSE

TRANSCRIPT

Page 1: 07 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: 07 Logica Programacion

Ejecución condicional de instrucciones 2

Instrucción IF/THEN/ELSE (1)El segundo tipo de instrucción IF en el vocabulario de Karel es la

instrucción IF/THEN/ELSE

La instrucción IF/THEN/ELSE resulta útil cuándo, dependiendo del resultado de alguna prueba, Karel debe ejecutar una de dos instrucciones alternativas.

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

IF <prueba> THEN begin <instrucción-1>;

endELSEbegin <instrucción-2>;

end;

Page 3: 07 Logica Programacion

Ejecución condicional de instrucciones 3

Instrucción IF/THEN/ELSE (2)La forma de IF/THEN/ELSE es similar a la instrucción IF/THEN, excepto

por incluir además una cláusula ELSE.

La forma de IF/THEN/ELSE puede verificar las mismas pruebas que la instrucción IF/THEN.

El error de puntuación más común en IF/THEN/ELSE consiste en colocar un punto y coma antes de la palabra reservada ELSE. No se debe colocar ningún punto y coma en ese lugar.

Las cláusulas THEN Y ELSE tienen la misma sangría.

IF <prueba> THEN begin <instrucción-1>;

endELSEbegin <instrucción-2>;

end;

Page 4: 07 Logica Programacion

Ejecución condicional de instrucciones 4

Instrucción IF/THEN/ELSE (3)

Karel ejecuta esta instrucción casi de la misma forma que una IF/THEN: primero determina si <prueba> es cierto o falso en la situación presente. Si determina que <prueba> es cierto, Karel ejecuta <instrucción-1>; de lo contrario, si determina que <prueba> es falso, ejecuta <instrucción-2>. Así, dependiendo de su situación, Karel ejecuta ya sea <instrucción-1> o <instrucción-2> pero no ambas.

IF <prueba> THEN begin

<instrucción-1>;endELSEbegin

<instrucción-2>;end;

Page 5: 07 Logica Programacion

Ejecución condicional de instrucciones 5

Instrucción IF/THEN/ELSE (4)

Ahora se verá una nueva tarea que, convenientemente, implica la instrucción IF/THEN/ELSE.

Supóngase que se desea programar a Karel para que corra una carrera de obstáculos de una milla, en donde secciones verticales de pared representan las vallas. Se sabe que las vallas tienen una altura de tan sólo una cuadra, pero pueden estar colocadas al azar entre cualesquiera dos esquinas en el curso de la carrera. Uno de los diversos cursos para esta carrera se ilustra en la figura.

Situación inicial Situación final y trayectoria seguida por Karel

Page 6: 07 Logica Programacion

Ejecución condicional de instrucciones 6

Instrucción IF/THEN/ELSE (5)

beginning-of-execution corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; turnoff;end-of-execution

define-new-instruction corre-a-zancadas as begin IF front-is-clear THEN begin

move; end ELSE begin

brinca-la-valla; end; end;

define-new-instruction brinca-la-valla asbegin

brinca;move;baja;

end;define-new-instruction brinca asbegin

turnleft;move;turnright;

end;define-new-instruction baja asbegin

turnright;move;turnleft;

end;define-new-instruction turnright as begin turnleft; turnleft; turnleft; end;

Se debe programar a Karel para moverse en línea recta mientras pueda, y brincando las vallas sólo cuando deba hacerlo. Utilizando el refinamiento paso por paso.

Page 7: 07 Logica Programacion

Ejecución condicional de instrucciones 7

Instrucción IF/THEN/ELSE (6)

define-new-instruction corre-a-zancadas as begin IF front-is-clear THEN begin

move; end ELSE begin

brinca-la-valla; end; end;

beginning-of-execution corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; corre-a-zancadas; turnoff; end-of-executionend-of-program

beginning-of-program define-new-instruction turnright as begin turnleft; turnleft; turnleft; end; define-new-instruction baja as begin

turnright;move;turnleft;

end;

define-new-instruction brinca as begin

turnleft;move;turnright;

end;

define-new-instruction brinca-la-valla as begin

brinca;move;baja;

end;

El orden de las instrucciones se debe invertir al incorporarlas al programa completo

Page 8: 07 Logica Programacion

Ejecución condicional de instrucciones 8

Instrucciones IF incluidas (1)

Las instrucciones IF incluidas se escriben en la forma de una instrucción IF incluida dentro de la cláusula THEN o ELSE de otro IF.

No se requieren nuevas reglas de ejecución para simular IF incluidas, pero sí se requiere seguir paso a paso las reglas establecidas.

Page 9: 07 Logica Programacion

Ejecución condicional de instrucciones 9

Instrucciones IF incluidas (2)Para demostrar una instrucción IF incluida, se propone una tarea que redistribuye los zumbadores en un

campo. Esta tarea requiere que Karel atraviese por un campo y coloque exactamente un zumbador en cada esquina. Debe plantar un zumbador en cada esquina vacía y levantar un zumbador de cada esquina en donde coexistan dos zumbadores. Todas las esquinas en esta tarea están limitadas a tener cero, uno o dos zumbadores. Una muestra de la situación inicial y final se ilustra en la figura. Se puede suponer que Karel cuenta con suficientes zumbadores en su bolsa como para replantar los zumbadores faltantes.

Situación inicial Situación final

Existen aproximadamente 200 trillones de campos distintos que el programa puede replantar en forma correcta (existen 3 distintas posibilidades y hay 30 esquinas en el campo. El número total de campos diferentes es 3 a la 30, en donde 3 se multiplica por sí mismo 30 veces. El número exacto de campos diferentes es 205,891,132,094,649)

Page 10: 07 Logica Programacion

Ejecución condicional de instrucciones 10

Instrucciones IF incluidas (3)

define-new-instruction replanta-exactamente-1-beeper as begin IF not-next-to-a-beeper THEN begin

putbeeper; end ELSE begin

pickbeeper;IF not-next-to-a-beeper THEN

begin putbeeper;

end; end; end;

Situación inicial

Situación final

La instrucción IF incluida se encuentra dentro de la cláusula ELSE del IF externo.

Page 11: 07 Logica Programacion

Ejecución condicional de instrucciones 11

Instrucciones IF incluidas (4)Se Simulará con Karel las tres posibles situaciones: en una esquina vacía, en una esquina

con un beeper y en una esquina con dos beepers.

En la situación de la esquina vacía Karel ejecuta el IF externo y determina que no está colocado junto a un zumbador; por lo tanto, ejecuta la instrucción putbeeper de la cláusula THEN del IF externo, colocando un beeper en la esquina. En ese momento ha ejecutado completamente la cláusula THEN de la instrucción IF externa, por lo que ha terminado de ejecutar el IF externo. Debido a que solamente existe una gran instrucción IF en esta definición, Karel ha terminado de ejecutar replanta-exactamente-1-beeper, la cual se ha verificado que es correcta en la situación en que no existe ningún beeper.

A continuación se supone que existe un beeper en la esquina de Karel. En este caso, Karel ejecuta el IF externo y determina que la prueba es falsa ya que sí está colocado junto a un beeper, así que comienza a ejecutar la cláusula ELSE. Esta cláusula es un bloque BEGIN/END que comprende dos instrucciones. Primero, Karel ejecuta pickbeeper, levantando el único zumbador colocado en la esquina. A continuación, Karel ejecuta la instrucción IF incluida y encuentra que no hay más beepers en su esquina; por lo tanto, ejecuta a continuación la cláusula THEN de esta instrucción IF, la cual le ordena colocar nuevamente un beeper en la esquina vacía. En este momento Karel ha concluido la instrucción IF incluida, el bloque BEGIN/END y toda la cláusula ELSE, el IF externo y toda la instrucción replanta-exactamente-1-beeper. Por lo tanto, Karel también maneja en forma correcta la situación en la que existe un zumbador.

Page 12: 07 Logica Programacion

Ejecución condicional de instrucciones 12

Instrucciones IF incluidas (5) Finalmente, se supone que Karel se encuentra en una esquina en donde hay dos

zumbadores. En este caso, Karel ejecuta el IF externo, determina que la prueba es falsa y después ejecuta la cláusula ELSE. Inicia el bloque BEGIN/END ejecutando primero pickbeeper, levantando uno de los dos zumbadores colocados en la esquina. En este punto Karel ha duplicado sus acciones respecto a la situación en la que solamente existe un zumbador, pero en este momento se presenta la diferencia en su ejecución. Al ejecutar la instrucción IF incluida, Karel determina que hay un zumbador en la esquina, así que se brinca a la cláusula THEN de la IF incluida. Nuevamente, Karel ha terminado de ejecutar la IF incluida, el bloque BEGIN/END, toda la cláusula ELSE, el IF externo y toda la definición de la instrucción replanta-exactamente-1-beeper. Como en los casos anteriores, el resultado es que ha dejado solamente un beeper en la esquina. Entonces, ya se ha verificado que la instrucción replanta-exactamente-1-beeper es completamente correcta.

Una buena regla general es evitar incluir instrucciones IF más allá del primer nivel de profundidad.

Para probar si el programa funciona correctamente es posible considerar el uso del viejo método de verificación y probar el programa con Karel colocado en todas las situaciones iniciales posibles, pero existen aproximadamente 200 trillones de campos distintos que este programa puede replantar en forma correcta. Resulta entonces hasta cierto punto imposible y sin sentido tratar de verificar el programa colocando a Karel en todas las situaciones iniciales posibles.

Page 13: 07 Logica Programacion

Ejecución condicional de instrucciones 13

Instrucciones IF incluidas (6) Como una alternativa, será suficiente un grado de corrección basado en el

siguiente argumento informal: 1. Se ha verificado que replanta-exactamente-1-beeper funciona

correctamente en cualquier esquina vacía o en cualquiera que contenga uno o dos beppers

2. Se puede verificar fácilmente si el programa ordena a Karel que ejecute esta instrucción en cada una de las esquinas del campo.

Por lo tanto, se pueden combinar estas dos verificaciones y concluir que el programa replanta todo el campo en forma correcta.

En general, se puede concluir informalmente que un programa es totalmente correcto verificando que:

1. Cada instrucción definida en el programa funciona correctamente en todas las situaciones posibles en que se puede ejecutar.

2. El programa ejecuta cada instrucción definida en el momento adecuado.

Este método permite verificar un programa dividiéndolo en verificaciones individuales más sencillas (de la misma forma que la refinación paso por paso permite escribir un programa dividiéndolo en instrucciones individuales más sencillas)

Page 14: 07 Logica Programacion

Ejecución condicional de instrucciones 14

TallerTaller individual.

Los problemas de esta sección requieren que se utilice la instrucción IF en sus dos formas. Trate de utilizar la refinación paso por paso en estos problemas, pero sin importar el método que emplee para obtener una solución, trate de escribir programas claros y comprensibles. Mantenga reducido el nivel de inclusión en aquellos problemas que requieran instrucciones IF incluidas. Utilice la puntuación y las reglas gramaticales adecuadas, especialmente dentro de las cláusulas THEN y ELSE de las instrucciones IF. Simule cuidadosamente cada definición y programa que escriba para asegurar que no haya errores de ejecución o de intento.

1. Defina voltea-al-sur, una instrucción nueva que hace que Karel voltee hacia el sur sin importar la dirección hacia la que está volteado inicialmente. Primero, hágalo sin utilizar voltea-al-norte como una instrucción conocida. Experimente con distintas formas de las instrucciones IF/THEN e IF/THEN/ELSE y escríbalas en el taller. Posteriormente, escriba la instrucción voltea-al-sur, suponiendo que la instrucción voltea-al-norte ya se ha definido. Esta segunda definición deberá ser mucho más sencilla y, dado que voltea-al-norte es correcta, deberá resultar mucho más fácil convencer a cualquier persona de que voltea-al-sur es correcta.

Page 15: 07 Logica Programacion

Ejecución condicional de instrucciones 15

Taller2. Supóngase que Karel se encuentra en una esquina que contiene uno o dos

zumbadores. Escriba una nueva instrucción que ordene a Karel que voltee hacia el norte si inicia su tarea en una esquina con un zumbador y que voltee hacia el sur si inicia su tarea en una esquina con dos zumbadores. Además de quedar volteado en la dirección requerida, después de que Karel haya terminado la ejecución de esta instrucción no deberá quedar ningún zumbador en la esquina. Nombre esta instrucción como encuentra-siguiente-dirección.

3. Escriba otra versión de encuentra-siguiente-dirección (véase el problema anterior). En esta versión, Karel finalmente deberá voltear en ambas direcciones, pero también deberá dejar el mismo número de zumbadores que había en la esquina en que se encontraba inicialmente.

4. Escriba una instrucción que apague a Karel si se encuentra completamente rodeado de paredes y le resulta imposible moverse en cualquier dirección. Si no se encuentra completamente rodeado, Karel deberá ejecutar esta instrucción permaneciendo encendido y quedándose en la misma esquina, volteado en la misma dirección en la cual inició su tarea. Nombre esta instrucción apágate-si-estás-rodeado. Clave: para escribir esta instrucción en forma correcta, deberá incluirse en ella una instrucción apágate. Esta combinación es perfectamente legal, pero es la primera ocasión en que utilizará una instrucción apágate fuera del bloque BEGINNING-OF-EXECUTION/END-OF-EXECUTION.

Page 16: 07 Logica Programacion

Ejecución condicional de instrucciones 16

Taller5. Programe a Karel para que corra una carrera con obstáculos variados de una

milla. El curso de la carrera es similar al de la carrera con obstáculos, pero en este problema las vallas pueden ser de una, dos o tres cuadras de alto. En la figura se ilustra una situación inicial de muestra, en la que la situación final y la trayectoria de Karel se indican a la derecha.

Page 17: 07 Logica Programacion

Ejecución condicional de instrucciones 17

Taller

6. Escriba una instrucción llamada sigue-pared-derecha suponiendo que siempre que Karel ejecuta esta instrucción hay una pared directamente a su derecha. La figura muestra los cuatro distintos cambios de posición que Karel debe ser capaz de efectuar. Esta instrucción es la piedra angular para un programa que dirige a Karel para salir de un laberinto.