Introduccion a la Programaci...

111
DRAFT Introducci´ on a la Programaci´ on Gerardo M. Sarria M. - Mario Juli´ an Mora Borrador de 3 de agosto de 2012

Transcript of Introduccion a la Programaci...

Page 1: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

Introduccion a la Programacion

Gerardo M. Sarria M. - Mario Julian Mora

Borrador de 3 de agosto de 2012

Page 2: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

Este libro fue creado usando LATEX.Ningun animal fue maltratado durante el desarrollo de este escrito.Copyright c© 2012 - Gerardo M. Sarria M. y Mario Julian Mora

Page 3: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

Dedicado a las todas las hamburguesas y las gaseosas del mundo...

Page 4: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

Page 5: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

Indice general

Indice de figuras 7

Indice de cuadros 9

Indice de algoritmos 11

1. Introduccion 131.1. Sobre este libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.2. Sobre los algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.3. Para los profesores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2. Nocion de Sistema 192.1. Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.2. Observacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3. Nocion de Estado 293.1. Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

4. Nocion de Abstraccion 394.1. Abstraccion de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

4.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

5. Nocion de Condicion 535.1. Condicion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

5.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

6. Nocion de Repeticion 656.1. Iteracion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

6.2. Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

6.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

5

Page 6: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

Indice general

7. Nocion de Abstraccion de Datos 877.1. Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

Bibliografıa 111

6

Page 7: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

Indice de figuras

2.1. Sistema Solar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.2. Cajero electronico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

2.3. Wiimote y consola Wii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.4. Algunos sistemas y un modelo computacional de ellos . . . . . . . . . . . . 23

3.1. Mundo de la Tortuga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.2. Cambios de estado en el Mundo de la Tortuga . . . . . . . . . . . . . . . . . 31

3.3. Estado inicial y final para dibujar una persona . . . . . . . . . . . . . . . . 33

3.4. Problema de sacar la tortuga del laberinto . . . . . . . . . . . . . . . . . . . 36

3.5. Solucion al problema de sacar la tortuga del laberinto . . . . . . . . . . . . 36

3.6. Problema de llevar la tortuga donde su mama . . . . . . . . . . . . . . . . . 38

4.1. Resultado de aplicar el algoritmo para dibujar una casa cuatro veces . . . . 43

4.2. Resultado esperado de aplicar el algoritmo para dibujar una casa cuatro veces 44

5.1. Estado inicial del problema de mayorıa de edad . . . . . . . . . . . . . . . . 55

5.2. Los dos posibles casos del problema de mayorıa de edad . . . . . . . . . . . 56

5.3. Flujo de ejecucion de la funcion esMayorDeEdad() . . . . . . . . . . . . . . 57

5.4. Tablero de tiro al blanco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

6.1. Flujo de ejecucion de la funcion adivinar() . . . . . . . . . . . . . . . . . . 68

6.2. Posiciones del juego Triqui . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

6.3. Fractal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

6.4. Flujo de ejecucion de la funcion factorial(5) . . . . . . . . . . . . . . . . 77

6.5. Torres de Hanoi - Configuracion inicial . . . . . . . . . . . . . . . . . . . . . 78

6.6. Torres de Hanoi - Configuracion final . . . . . . . . . . . . . . . . . . . . . . 78

6.7. Torres de Hanoi - Configuracion intermedia 1 . . . . . . . . . . . . . . . . . 79

6.8. Torres de Hanoi - Configuracion intermedia 2 . . . . . . . . . . . . . . . . . 79

6.9. Torres de Hanoi - Proceso completo para n = 4 . . . . . . . . . . . . . . . . 81

6.10. Triangulo de Sierpinski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

7.1. Juego Ahorcado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

7

Page 8: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

INDICE DE FIGURAS

7.2. Saludo Inicial en el juego Ahorcado . . . . . . . . . . . . . . . . . . . . . . . 927.3. Etapas del ahorcado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 967.4. Estados finales del juego ahorcado . . . . . . . . . . . . . . . . . . . . . . . 997.5. Buscaminas en Windows 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037.6. Ventana del juego de las elecciones . . . . . . . . . . . . . . . . . . . . . . . 109

8

Page 9: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

Indice de cuadros

3.1. Operaciones basicas en el Mundo de la Tortuga . . . . . . . . . . . . . . . . 333.2. Operaciones de colores en el Mundo de la Tortuga . . . . . . . . . . . . . . 37

4.1. Operaciones de posicionamiento y orientacion en el Mundo de la Tortuga . 464.2. Operaciones y constantes clasicas de un sistema matematico . . . . . . . . . 484.3. Porcentaje de notas de un curso Introduccion a la Programacion . . . . . . 494.4. Operacion de escritura en el Mundo de la Tortuga . . . . . . . . . . . . . . 50

5.1. Operaciones y constantes clasicas de un sistema Booleano . . . . . . . . . . 545.2. Operaciones basicas de un sistema de numeros aleatorios . . . . . . . . . . . 595.3. Operaciones basicas de un sistema de cadenas de texto . . . . . . . . . . . . 62

6.1. Operaciones basicas de entrada y salida . . . . . . . . . . . . . . . . . . . . 696.2. Operaciones basicas del sistema Tkinter . . . . . . . . . . . . . . . . . . . . 816.3. Operaciones para dibujar en un Canvas de Tkinter . . . . . . . . . . . . . . 84

7.1. Operaciones basicas del sistema de listas . . . . . . . . . . . . . . . . . . . . 907.2. Operaciones basicas y algunas constantes del sistema Pygame . . . . . . . . 917.3. Operaciones basicas del modulo de fuentes en el sistema Pygame . . . . . . 947.4. Operaciones basicas del modulo de superficies en el sistema Pygame . . . . 947.5. Operaciones basicas del modulo de rutas de archivos del sistema operativo . 96

9

Page 10: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

INDICE DE CUADROS

10

Page 11: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

Indice de algoritmos

1.1. Carga del sistema matematico . . . . . . . . . . . . . . . . . . . . . . . . . . 141.2. Carga del sistema de la Tortuga . . . . . . . . . . . . . . . . . . . . . . . . . 153.1. Dibuja una persona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.2. Sale del laberinto cuadrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354.1. Dibuja las extremidades de una persona . . . . . . . . . . . . . . . . . . . . . 404.2. Dibuja el tronco de una persona . . . . . . . . . . . . . . . . . . . . . . . . . 404.3. Dibuja la cabeza de una persona . . . . . . . . . . . . . . . . . . . . . . . . . 414.4. Dibuja completamente una persona . . . . . . . . . . . . . . . . . . . . . . . 414.5. Dibuja una casa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424.6. Dibuja cuatro casas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.7. Dibuja una casa con posicion . . . . . . . . . . . . . . . . . . . . . . . . . . . 454.8. Dibuja cuatro casas especificando las posiciones . . . . . . . . . . . . . . . . 464.9. Dibuja la letra A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474.10. Retorna la nota final del curso . . . . . . . . . . . . . . . . . . . . . . . . . . 494.11. Escribe la nota final del curso . . . . . . . . . . . . . . . . . . . . . . . . . . 494.12. Retorna la longitud de la hipotenusa de un triangulo rectangulo . . . . . . . 504.13. Retorna el dıa del Domingo de Pascua . . . . . . . . . . . . . . . . . . . . . . 515.1. Retorna si un numero es mayor o igual a 18 . . . . . . . . . . . . . . . . . . . 565.2. Retorna el puntaje dado un disparo . . . . . . . . . . . . . . . . . . . . . . . 595.3. Simula un juego de tiro al blanco . . . . . . . . . . . . . . . . . . . . . . . . . 605.4. Escribe correctamente la fecha del domingo de Pascua . . . . . . . . . . . . . 615.5. Retorna el medio de transporte para ir a un sitio de acuerdo a unas condiciones 636.1. Juego de adivinar un numero, sin ciclo . . . . . . . . . . . . . . . . . . . . . 666.2. Juego de adivinar un numero, con ciclo . . . . . . . . . . . . . . . . . . . . . 676.3. Juego de Triqui incompleto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706.4. Desglose de dinero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716.5. Imprime la lista de numero primos entre 1 y n . . . . . . . . . . . . . . . . . 726.6. Recibe lıneas de codigo y quita los comentarios . . . . . . . . . . . . . . . . . 746.7. Halla el factorial de un numero n . . . . . . . . . . . . . . . . . . . . . . . . 766.8. Imprime el proceso para solucionar las torres de hanoi de n discos . . . . . . 806.9. Dibuja el triangulo de Sierpinski . . . . . . . . . . . . . . . . . . . . . . . . . 837.1. Juego ahorcado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

11

Page 12: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

INDICE DE ALGORITMOS

7.2. Pantalla de inicio del juego ahorcado . . . . . . . . . . . . . . . . . . . . . . 937.3. Dibuja/Actualiza la pantalla principal del juego ahorcado . . . . . . . . . . . 957.4. Retorna la letra que el usuario presione en el juego ahorcado . . . . . . . . . 977.5. Termina el juego ahorcado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 987.6. Simulador de elecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007.7. Retorna un candidato en el juego de elecciones . . . . . . . . . . . . . . . . . 1017.8. Ordena las listas de candidato y votos en el juego de elecciones . . . . . . . . 1027.9. Juego buscaminas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047.10. Crea y retorna una matriz de dimensiones ancho× alto . . . . . . . . . . . . 1057.11. Llena el tablero del buscaminas con minas y pistas . . . . . . . . . . . . . . . 1067.12. Modificacion del algoritmo para llenar el tablero del buscaminas con pistas . 1077.13. Funcion que determina si se han descubierto todas las ubicaciones que no

tienen mina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

12

Page 13: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

1 Introduccion

La programacion se ha convertido en una ciencia basica. Su importancia dentro de todaslas ingenierıas se ha vuelto notoria dado que cualquiera de las corrientes de ingenierıa tienecomponentes que involucran nociones de programacion: problemas que pueden ser resueltossiguiendo una serie de pasos (nocion de algoritmo), variables que deben ser tomadas encuenta al realizar observaciones, datos que deben ser procesados, e incluso el mismo usodel computador.

En las actividades cotidianas de los adolescentes actuales tambien podemos ver nocionesde programacion: comprar un reproductor mp3, descargar una cancion de internet (de lasque sı se pueden descargar sin romper ninguna ley) y copiarla en el reproductor, practicarun deporte, etc. Mucho mas en actividades mas cercanas a las profesiones de ingenierıa:construccion de una vıa, transporte de mercancıa, inter-conectar una red de celulares,instalar un computador/servidor con un sistema operativo como linux, entre otros.

1.1. Sobre este libro

La mayorıa de libros de introduccion a la programacion usan la metodologıa de ensenanzade programacion teach-a-languague, es decir, mediante un lenguaje de programacion. Estametodologıa presume que si el estudiante aprende un lenguaje de programacion entoncesaprende a programar. Nosotros pensamos que esta metodologıa ya no es apropiada para laactual generacion de estudiantes. Por esta razon proponemos una nueva metodologıa y comocreemos en los metodos formales, este libro esta basado en las nociones de programacionen vez de herramientas y lenguajes.

En este escrito usamos la idea del paradigma del paracaidista [1] utilizado en especifi-cacion de modelos formales de sistemas. Vamos a pasar por muchas nociones, empezandopor la de sistema, la nocion de observacion, la de estado, abstraccion, condicion, iteracion,recursion, abstraccion de datos y terminando en la nocion de persistencia. En este libro noensenamos como se escribe una lınea de codigo, esperamos que eso se aprenda de una ma-nera natural. Sabemos que es necesario usar un lenguaje de programacion para practicar,de manera que usaremos Python (como veremos en la siguiente seccion) ya que tenemosconfianza en que mejora el proceso de ensenanza, que es el cuarto principio en un cursoinicial a la programacion [6]. Sin embargo, como veremos, el uso de Python no es el nucleo

13

Page 14: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

1 Introduccion

del libro porque las nociones de programacion son aquellas que estaran en la vida diariade los estudiantes por siempre.

El profesor Edsger W. Dijkstra dijo alguna vez: “Las nociones son fundamentales entoda actividad de programacion. Ellas son tan fundamentales que no seran divididas enconceptos mas primitivos.”. Entonces para resaltarlas, las nociones de programacion podranNocionverse marcadas al lado del texto, como una nota al margen.

Los cuadros que se muestran en este documento describen solo unas cuantas operaciones(a veces incompletas) que pueden aplicarse y que pertenecen a algunos sistemas desarro-llados para Python. Sin embargo con ellos no pretendemos que los estudiantes tomen estelibro como un manual de referencia de las librerıas del lenguaje, por el contrario, deseamosque los estudiantes se motiven a consultar y estudiar mas las librerıas de Python (en sudocumentacion en lınea en http://www.python.org/doc/) de manera que sus programascontengan mejores caracterısticas. El lector que desee un libro tecnico sobre Python puedever [3] o [4].

1.2. Sobre los algoritmos

Los algoritmos mostrados en este documento siguen la sintaxis del lenguaje de progra-macion Python. De esta manera si se quieren probar los programas se debe instalar elcompilador del lenguaje, que puede ser descargado gratis de la pagina web de Python(http://www.python.org/).

Las funciones y procedimientos que se definan tendran la documentacion permitida porel lenguaje. Esta se especifica entre comillas debajo de la declaracion de la funcion oprocedimiento (en color verde).

Para probar los algoritmos que usan operaciones de distintos sistemas es necesario cargardichos sistemas. Para cargar el sistema matematico de Python (math), por ejemplo, antesdel codigo es necesario agregar una lınea fundamental para cargar el sistema, la cual sepuede ver en el algoritmo 1.1.

# Se carga el sistema matemáticoimport math

Algoritmo 1.1: Carga del sistema matematico

Por otro lado, para ejecutar los programas en el contexto del Mundo de la Tortugase debe hacer tal y como se carga el sistema matematico antes de la aplicacion de cual-quier operacion. Adicionalmente, para que el resultado de la ejecucion de los algoritmos

14

Page 15: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

1.2 Sobre los algoritmos

sea exacto a aquellos que se muestra en este libro, se deben aplicar algunas operacionesinmediatamente despues de la carga del sistema, que se pueden ver en el algoritmo 1.2.

# Se carga el sistema Mundo de la Tortuga import turtle

# Operacion para cambiar el titulo de la ventana turtle.title("El Mundo de la Tortuga")

# Operacion para cambiar el tamaño de la ventana turtle.setup(500,500)

# Operacion para cambiar la forma de la Tortuga turtle.shape("turtle")

# Operacion para reiniciar el sistematurtle.reset()

Algoritmo 1.2: Carga del sistema de la Tortuga

Puede notarse que para aplicar las operaciones de los sistemas es necesario anteponerel nombre del sistema (turtle en este caso). Los sistemas que se usaran como ejemplo eneste libro se listan a continuacion:

turtle – Sistema de la Tortuga

math – Sistema matematico

random – Sistema de numeros aleatorios

string – Sistema de cadenas de texto

Tkinter – Sistema de interfaces graficas

pygame – Sistema de creacion de juegos

os – Sistema de manejo de operaciones del sistema operativo

Adicionalmente en aquellos problemas donde se tiene un estado inicial determinado, esnecesario cargar dicho estado inicial como en la segunda lınea de los algoritmos anteriorescambiando el nombre del sistema (math y turtle, respectivamente) por el nombre delarchivo sin la extension pyc. Todos los archivos deben estar guardados en la misma carpeta.En la pagina web del libro estan enumerados los estados iniciales de los ejemplos y ejerciciosque los requieran.

15

Page 16: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

1 Introduccion

1.3. Para los profesores

En [5] propusimos una metodologıa para la ensenanza de la programacion. En ella no-sotros concebimos un curso de Introduccion a la Programacion como una secuencia desesiones de clase. Consideramos la duracion de un curso como un perıodo de 16 semanas,por lo que contamos con 32 sesiones de 2 horas. Tomamos entonces dos o mas sesionespara cada nocion incluyendo teorıa y practica (esperamos que mas practica que teorıa). Acontinuacion detallamos un poco la idea que proponemos con cada nocion:

Sistema Nosotros pensamos la nocion de sistema como un conjunto de elementos inter-activos en un dominio muy especıfico. No hay que profundizar en la definicion dela palabra sino en la aplicacion del concepto. Es bueno empezar con ejemplos quetodos los estudiantes conocen como el sistema solar, el sistema digestivo y el sistemaeconomico. Luego se puede mover a los sistemas actuales y populares (con los queel estudiante convive diariamente) como los cajeros automaticos, la television, lasconsolas de juego y los computadores, por supuesto.

La idea en esta nocion es mostrar que todo lo que nos rodea es un sistema y lamayorıa (sino todos) de sistemas son modelables. Los programas de computadorson finalmente modelos computacionales de sistemas reales. Los estudiantes debenidentificar los elementos de los sistemas y describir sus interacciones. Es una bue-na idea pedir a los estudiantes que vacıen sus bolsillos para encontrar una grancantidad de sistemas que sirven como material para la clase: iPods, celulares, tarje-tas de credito, CDs,/DVDs, memorias USB, etc. Adicionalmente, en la pagina webhttp://www.howstuffworks.com/ se encuentra una cantidad suficiente de artıculosde los dispositivos y sistemas recientemente nombrados los cuales pueden motivar alos estudiantes.

Se pueden emplear dos sesiones en esta nocion.

Observacion Una vez los estudiantes entienden un sistema, deben ser capaces de descri-birlo. En este punto nos interesamos en los elementos y no en el sistema como untodo. Siguiendo el paradigma del paracaidista bajamos un poco de manera que nosacerquemos al sistema y podamos preguntarles a los estudiantes que es estatico yque cambia en el. Lo que se mantiene estatico lo llamaremos “una constante” y loselementos que cambian seran llamados “variables”. Adicionalmente, para cada ele-mento detectamos los valores que puede tener. Este conjunto de valores define el tipode dato del elemento.

Esta nocion no necesita mas de dos sesiones para ser entendida.

16

Page 17: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

1.3 Para los profesores

Estado Bajando un poco mas en el sistema, se hace que los estudiantes noten que algu-nas veces unas variables tienen un valor y algunas veces ellas tienen otro valor. Lavaluacion de todas las variables define el estado del sistema. Los estudiantes debenidentificar como cambia el sistema de un estado a otro, de manera que se den cuentaque algunas operaciones tienen que ejecutarse para cambiar los valores de las varia-bles (y consecuentemente cambiar el estado). Aquı es donde la definicion del conceptode algoritmo surge: la secuencia de operaciones que lleva un estado a otro.

Las operaciones que se usan aquı pueden ser descritas en notacion Python para quelos estudiantes se familiaricen con el lenguaje. En este punto las operaciones sonconsideradas cajas negras con entradas y salidas. Como Python es un lenguaje deprogramacion tipado implıcito, esta caracterıstica evita el ruido que incorpora ladeclaracion de tipos de datos en los llamados a funciones.

Motivamos a los profesores a que se armen de ayudas pedagogicas para que los estu-diantes entiendan muy bien esta nocion, la cual es vital para el exito del aprendizaje.Cambiar el modo de pensar de una persona hacia un pensamiento sistemico (i.e. pen-sar todo el tiempo en terminos de secuencia de pasos, algoritmos) es muy difıcil. Usarel Mundo de la Tortuga, el robot LightBot (http://armorgames.com/play/2205)o un Lego MindStorm, son algunas alternativas.

Cuatro sesiones son una buena cantidad para esta nocion. Ademas, este es un buenpunto para hacer una primera evaluacion en el curso.

Abstraccion Entre mas complejos se vuelven los problemas, mas largos se vuelven losprogramas. De esta manera el estudiante siente la necesidad de tener una forma deprogramar con menos lıneas de codigo. Ası se les ensena a organizar varias operacionesen una sola. Las cajas negras se vuelven cajas blancas. Los estudiantes ahora puedenconstruir sus propias operaciones llamando las basicas. Con las nuevas operacionesellos pueden construir otras y ası sucesivamente. La nocion de niveles de abstraccionllega de una manera natural.

Otras cuatro sesiones pueden usarse en esta nocion.

Condicion Si el estado del sistema es desconocido el estudiante siente la necesidad de teneruna estructura de control para considerar varios casos. Esto hace que se introduzca lanocion de condicion. Sin embargo, para entender mejor el mecanismo de esta nocionse tienen que empezar por hacer ejercicios de los fundamentos basicos de la logicaproposicional: tablas de verdad y conectivos logicos. Tal como las nociones anterioresesto debe hacerse usando expresiones cercanas al conocimiento de los estudiantes.

Como las expresiones logicas son elementos muy abstractos se deben utilizar cuatrosesiones para esta nocion. El final de esta nocion es otro buen punto para hacer una

17

Page 18: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

1 Introduccion

evaluacion.

Iteracion Aunque pensamos que la recursion es la forma mas simple de repeticion ya que nocambia el estado de las variables, parece ser mas natural para los estudiantes aplicarotra estructura de repeticion que si cambie las variables. Ella es llamada iteracion.

En esta nocion es bueno quedarse un buen tiempo (ocho sesiones) ya que las nocionesson introducidas gradualmente, y con la inclusion de una nueva nocion se continuausando y practicando las anteriores. Ademas, los estudiantes ahora tienen todas lasherramientas para solucionar la mayorıa de problemas. De allı que al finalizar estanocion se pueda hacer otra evaluacion.

Recursion Como dijimos arriba, nosotros creemos que la recursion es la forma basica de re-peticion en programacion. Sin embargo esta nocion puede ser muy difıcil de entender.Por esta razon consideramos que ella puede ser opcional.

Nosotros simplificamos la idea considerando solo la recursion numerica y ensenandoesta nocion como lo que es: un llamado a funcion. Sabemos que se debe ensenar todosobre el caso base y las reglas para reducir los otros casos, pero tal como las otrasnociones, debe hacerse con ejemplos de la vida real que los estudiantes conozcan, yusando herramientas graficas.

Se podrıan usar dos o tres sesiones para practicar la recursion.

Abstraccion de Datos Esta nocion viene con la necesidad de agrupar una gran cantidadde informacion. Se puede pedir a los estudiantes, por ejemplo, que se calcule el pro-medio de todas las clases que han tomado. Si el numero de clases es poco entoncesno hay problema, pero si el estudiante ha tomado siete o mas clases, manejar estacantidad de variables es inconveniente (imagine la cantidad de variables de entradaa las funciones).

De todas las estructuras de datos hemos escogido listas por dos razones: son estruc-turas de datos basicas y su mecanismo de uso en Python es muy comodo.

Usamos las ultimas ocho sesiones para esta nocion y se puede hacer la cuarta y ultimaevaluacion.

Persistencia Al igual que recursion, dejamos esta nocion como opcional ya que ella nacede la necesidad de mantener los datos incluso despues de ejecutar los programas.Se debe ensenar entonces un poco sobre sistemas de archivos (sin entrar mucho endetalle sobre los sistemas operativos) y dispositivos de almacenamiento fısico comodiscos duros o memorias USB.

Aquı tambien se podrıan usar dos o tres sesiones.

18

Page 19: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

2 Nocion de Sistema

2.1. Sistema

Un sistema es un conjunto de elementos que interactuan en un dominio especıfico y Sistemacumplen ciertas propiedades. Dichos elementos se relacionan entre ellos y actuan con unproposito especıfico. El resultado del comportamiento y conectividad de los elementos des-cribe el objetivo del sistema.

Figura 2.1: Sistema Solar

Ejemplos de sistemas pueden verse en todos los ambitos. Entre los mas conocidos tenemosel sistema solar, el sistema digestivo y el sistema economico. La figura 2.11 muestra elsistema solar. En este sistema el conjunto de elementos esta compuesto por el Sol, los ocho

1Imagen tomada de http://www.ifir.edu.ar/planetario/nssolar.htm/

19

Page 20: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

2 Nocion de Sistema

planetas, los cinco planetas enanos y otra cantidad de astros. Todos estos elementos serelacionan entre sı por medio de la gravedad del Sol, la cual ocasiona que los planetas yastros se muevan en una orbita casi circular sobre el denominado plano eclıptico.

Existen otros multiples ejemplos de sistemas que tal vez ignoramos debido a que hacenparte de nuestra vida cotidiana y no llevan en su nombre la palabra sistema. Ejemplos deellos son los cajeros automaticos, la television, las consolas de juego y los computadores.Los ejemplos 2.1 y 2.2 muestran algunos de estos sistemas.

Ejemplo 2.1La figura 2.22 muestra un ejemplo de cajero automatico. Muy a grosso modo un cajeroautomatico es una terminal que acepta peticiones y se comunica, por medio de una red dedatos, con los computadores de un banco para atender dichas peticiones.

Figura 2.2: Cajero electronico

Los elementos que componen el cajero son: los botones, el teclado del cajero, el lectorde tarjetas, la ranura de depositos, la pantalla, el parlante, el dispensador de dinero y laimpresora de recibos.

Una de tantas interacciones que tiene un cajero electronico es la siguiente: un usuariorealiza una peticion por intermedio de una tarjeta que es introducida al lector de tarjetas.Algunos cajeros, una vez acepta la tarjeta, pide a traves de la pantalla y/o el parlante

2Imagen modificada de http://www.howstuffworks.com/

20

Page 21: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

2.1 Sistema

que introduzca la clave (otros cajeros la piden justo antes de realizar la transaccion). Pormedio los botones y el teclado se introduce la clave y se selecciona los datos apropiados delmenu para efectuar la transaccion deseada. Si es un retiro, entonces el cajero podrıa proveerel dinero por medio del dispensador o podrıa enviar un mensaje por la pantalla y/o elparlante diciendo que no se pudo efectuar la operacion (falta de dinero o alguna otra razon);si es una consulta simplemente se muestran los datos en la pantalla; y si es una consignacionse abre la ranura de depositos para entregar el dinero. Una vez termina cualquiera de lastransacciones anteriores, el cajero imprime un recibo y termina la interaccion.

? ? ?

Ejemplo 2.2Wii (figura 2.33) es una consola de juego lanzada en 2006 por la empresa de videojuegosNintendo. Como toda consola de juego el Wii es un computador de entretenimiento inter-activo que produce una senal de video, la cual puede ser interpretada por un televisor omonitor.

Figura 2.3: Wiimote y consola Wii

Al igual que un computador actual, el Wii cuenta con un procesador central, un proce-sador de video, 88 Mb de memoria interna, una memoria flash de 512 Mb (no cuenta con

3Imagen tomada de http://wii.com/.

21

Page 22: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

2 Nocion de Sistema

disco duro), tarjetas de video y sonido, y un lector de discos, entre otras cosas.

Sin embargo, el Wii es reconocido por el Wii Remote, tambien conocido como Wiimote.Este dispositivo es el control principal de la consola. El Wiimote cuenta con un sistema dedeteccion de movimiento en el espacio que permite manipular objetos en la pantalla, unapuntador optico y una serie de botones para interactuar con el usuario.

El funcionamiento del Wii es relativamente sencillo ya que la clave de la consola deNintendo se centra en el control. El sistema cuenta con un barra –llamada sensor bar– queemite luz infraroja y que es detectada por el Wiimote. De esta manera el sistema determinala posicion y orientacion relativa en 3D del control. El Wiimote se conecta a la consolausando Bluetooth (la tecnologıa abierta para el intercambio de datos entre dispositivoselectronicos en distancias cortas). Este diseno permite a los usuarios controlar los juegosusando movimientos corporales y las presiones de botones tradicionales.

? ? ?

Incluso si dejamos a un lado la electronica, podemos ver ejemplos de sistemas muchomas simples como por ejemplo un banco (sin la parte automatizada), una sala de cine, unclub social, una biblioteca, un telefono y una tienda de musica. Todos estos son sistemasy en cada uno de ellos se pueden identificar sus elementos e interacciones. De esta manerapodemos construir modelos de dichos sistemas.

Un modelo es la representacion de un objeto o sistema. Los modelos pueden ser fısicosModelo(e.g. un carro de juguete que represente un carro real) o no fısicos (e.g. una ecuacionmatematica que represente el movimiento del carro), pero todos tienen en comun quesirven para hacer simulaciones y probar propiedades en los sistemas.

Existe un tipo de modelo no fısico llamado modelo computacional. Este es un modeloabstracto que se desarrolla en computadores y es denominado comunmente como programa.ProgramaEn la actualidad es muy frecuente el uso de dispositivos computacionales como PCs, iPadsy Blackberrys. Todos ellos pueden ejecutar programas que sirven para una tarea especıfica.Sin embargo, si se mira bien dichos programas, puede verse que son representaciones desistemas reales. El lector que este familiarizado con programas como Skype, puede notarque son modelos de un sistema telefonico; aquel que este familiarizado con iTunes, podra verque es un modelo de una tienda de musica; Kindle es un modelo de una biblioteca; WindowsMedia Player es un modelo de una sala de cine; y Facebook es un modelo de un club social.En la figura 2.44pueden verse otros ejemplos de sistemas reales y un modelo computacionalde cada uno de ellos.

4Imagenes tomadas de http://recursos.cnice.mec.es/biosfera/alumno/1ESO/planeta_habitado/

index.htm (Tierra), http://www.olympiaph.com.ph/crm/typewriters.html (maquina de escribir), yhttp://www.revivesoundproductions.com/djseminar.html (dj)

22

Page 23: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

2.1 Sistema

(a) La Tierra y Google Earth

(b) Una Maquina de Escribir y MSWord

(c) Un DJ y VirtualDJ

Figura 2.4: Algunos sistemas y un modelo computacional de ellos

23

Page 24: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

2 Nocion de Sistema

2.2. Observacion

Al conocer los sistemas, existen muchas propiedades y caracterısticas interesantes quepodemos observar de ellos. Las descripciones que hagamos de los sistemas nos permitenidentificar los aspectos estaticos y dinamicos de ellos. Si tomamos un carro, por ejemplo,y observamos detenidamente sus caracterısticas, podemos encontrar que algunas de ellascambian a traves del tiempo, mientras que otras se quedan estaticas: la velocidad cambia, elkilometraje cambia, el nivel de gasolina cambia, el estado del motor (encendido o apagado)cambia y su posicion geografica cambia, mientras que la placa se mantiene, el color delcarro se mantiene (en terminos generales) y la forma se mantiene (si no se choca). Muchasotras cosas del carro cambian y muchas otras se mantienen igual a traves del tiempo, sinembargo, en primera instancia, estas son las mas notorias.

Aquellas caracterısticas que se mantienen igual en un sistema son llamadas constantes.ConstanteLas constantes tienen un papel muy importante en los sistemas dado que estan completa-mente fijas y, por lo tanto, sirven como referentes.

Por otro lado, aquellos componentes que cambian de un sistema son denominados varia-bles. En el ejemplo 2.3 se muestran algunas constantes y variables de algunos sistemas.Variable

Ejemplo 2.3Las siguientes tablas listan las constantes y variables de los sistemas: una sala de cine, unatienda de barrio y un rompecabezas.

Una sala de cine:

Constantes Variables

Numero de Sillas Numero de AsistentesPantalla Pelıcula

Configuracion de los Asistentes

Un rompecabezas:

Constantes Variables

Numero de fichas Ubicacion de las fichasTamano

Forma de las fichas

Una tienda de barrio:

24

Page 25: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

2.2 Observacion

Constantes Variables

El local Cantidad de productosEl vendedor(*) Dinero

Numero de clientesOrganizacion de los productos

Precio de los productos

(*) Aunque el vendedor puede variar se puede decir que siempre hay un vendedor.

? ? ?

Como se pudo notar en el ejemplo anterior, es normal que en la mayorıa de sistemasexistan mas variables que constantes. A nivel general, las variables son conjuntos logicosde atributos, es decir, sımbolos o nombres simbolicos dados a una cantidad de informacion.Esta informacion pertenece a un dominio de valores, esto es, una asociacion de datosque se clasifican de la misma manera (e.g. numeros, letras, objetos). Estos dominios quedeterminan los posibles valores de las variables son llamados tipos de datos5. En el ejemplo Tipo de Datosdel carro tenemos que las variables observadas son la velocidad, el kilometraje, el nivel degasolina, estado del motor y la posicion geografica. Para encontrar los tipos de datos paraestas variables hacemos el siguiente analisis:

La velocidad del carro es un valor numerico que varia dependiendo de la marca y elmodelo del carro, sin embargo tiene dos lımites, uno inferior y uno superior. El lımiteinferior es cero ya que lo mınimo que el carro puede hacer es quedarse quieto. Porotro lado, el lımite superior es una constante k, la cual es definida en el tiempo dediseno del carro. Un Renault Logan, por ejemplo, tiene una velocidad maxima de 185km/h. Por lo anterior esta variable tiene el dominio de valores en el rango [0, k], yentonces su tipo de dato es Natural.

El kilometraje es tambien un valor numerico que comienza en 0 (cero) cuando el carroes nuevo y nunca ha sido manejado. Este valor se incrementa a medida que el carroes usado y jamas decrece. De allı que el dominio de valores es el de los numeros realespositivos, luego su tipo de dato es Real.

El nivel de gasolina es otro valor numerico similar a la velocidad. Tiene un lımiteinferior (cuando el carro no tiene nada de gasolina) y un lımite superior (cuandoel carro esta “tanqueado”). La diferencia entre este dominio de valores y el de la

5Aunque las constantes no cambian su valor, dicho valor pertenece a un dominio especıfico y por lo tantopodemos decir que las constantes tienen tambien un tipo de dato.

25

Page 26: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

2 Nocion de Sistema

velocidad esta en que el dominio del nivel de gasolina representa un porcentaje, estoes, la variable tiene un valor entre 0 y 100. Por lo anterior el tipo de dato de lavariable nivel de gasolina es Real.

El estado del motor tiene uno de dos valores posibles: encendido o apagado. Estoquiere decir que si preguntan ¿esta encendido el carro?, en la observacion podemoscontestar Verdadero o Falso. Por esto su tipo de dato es Booleano6.

La posicion geografica del carro es un poco mas complicada ya que involucra dosejes. Estos ejes son comunmente llamados Latitud (posicion con respecto al norte osur del ecuador) y Longitud (posicion con respecto al oriente u occidente del primermeridiano o Greenwich). Ellos tienen sus valores en unidades de medida angular(UMA), es decir, grados, minutos y segundos. Entonces el tipo de datos para laposicion geografica es UMA × UMA.

Ejemplo 2.4Supongamos que tenemos los siguientes juegos: un buscaminas, una sopa de letras y unahorcado, ¿cuales son sus variables y tipos de datos correspondientes?

Un buscaminas:

Variable Tipo de Dato

Numero de minas Entero

Ubicacion de la mina i Entero × Entero

Numero de marcas Entero

Ubicacion de la marca j Entero × Entero

Numero de espacios destapados Entero

Espacio destapado k Entero × Entero

Una sopa de letras:

Variable Tipo de Dato

Numero de filas Entero

Numero de columnas Entero

Numero de palabras Entero

Letra de la ubicacion i, j Caracter

Palabras encontradas Lista de palabras

6El conjunto de valores Booleanos esta compuesto por dos elementos 1 (Verdadero) y 0 (Falso). Esteconjunto es la base fundamental del Algebra Logica de Boole, desarrollada por el matematico britanicoGeorge Boole en 1854.

26

Page 27: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT2.3 Ejercicios

Un ahorcado:

Variable Tipo de Dato

Palabras Lista de palabras

Numero total de letras de la palabra Entero

Letra correspondiente a la ubicacion i Caracter

Numero de letras descubiertas de la palabra Entero

Numero total de partes del muneco Entero

Numero de partes del muneco dibujadas Entero

Se ahorco Booleano

? ? ?

2.3. Ejercicios

2.1 De los siguientes sistemas escoja cinco (5) y describa sus elementos e interacciones:

Carro DVD Player iPod Partido de FutbolGobierno Casino Supermercado UniversidadTelevisor Kinect Estacion Espacial Minicomponente

MIO Pizzerıa Dispensador de Gaseosas Laboratorio de FısicaMonopoly Celular Discoteca Su Casa

2.2 ¿Cuales de los anteriores sistemas tienen un modelo computacional? Provea una des-cripcion del programa.

2.3 Tome cinco sistemas de los enumerados anteriormente (diferentes de los escogidos enel primer ejercicio) y muestre cuales de sus elementos son constantes y cuales sonvariables.

2.4 De los siguientes juegos determine sus variables y sus constantes, con sus respectivostipos de datos: blackjack, triqui, pinball.

27

Page 28: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

2 Nocion de Sistema

28

Page 29: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

3 Nocion de Estado

3.1. Estado

Las variables de un sistema cambian su valor a traves del tiempo. Cada vez que unavariable cambia su valor, el estado en el cual se encuentra sistema cambia. Un estado de Estadoun sistema es una configuracion unica de los elementos que componen dicho sistema. Elestado del sistema esta definido entonces por la valuacion de todas sus variables.

Para ejemplificar la nocion de estado vamos a introducir un sistema muy simple llamadoel mundo de la tortuga:

La tortuga vive en un mundo de dos dimensiones en el cual puede moverse.Ella siempre inicia en el centro del mundo. Este mundo es ilimitado y el centrode el esta en la posicion 0,0. La tortuga puede dibujar mientras se mueve ysus movimientos pueden ser: ir en lınea recta hacia adelante o hacia atras unadistancia determinada, cambiar su orientacion (a la izquierda o la derecha kgrados), moverse en un cırculo y escribir un texto. Adicionalmente la tortugapuede desplazarse sin dibujar a una posicion x, y y se le puede preguntar suposicion y orientacion.

En la figura 3.1 puede verse el mundo de la tortuga. En esta figura la tortuga ha dibujadouna casita. Para llegar a este estado del sistema, se ha debido pasar por varios estadosintermedios donde se ha cambiado el valor de las variables del sistema. En la figura 3.2 sedetallan los diferentes estados.

A continuacion se explica en detalle los cambios de estado de la figura 3.2.

1. Todo comienza en el estado inicial (Figura 3.2a), donde la tortuga esta en el centrodel mundo (posicion x = 0, y = 0) y su orientacion o sentido es cero (θ = 0).

2. La tortuga se mueve luego 50 unidades hacia adelante (Figura 3.2b). Su posicion hacambiado a x = 50, y = 0 y su orientacion queda igual.

3. Despues la tortuga cambia su orientacion a θ = 90, pero su posicion permance igualen x = 50, y = 0 (Figura 3.2c).

4. Acto seguido (Figura 3.2d) la tortuga se desplaza 100 unidades hacia adelante que-dando en x = 50, y = 100. Su orientacion se mantiene en θ = 90.

29

Page 30: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

3 Nocion de Estado

Figura 3.1: Mundo de la Tortuga

5. Ahora la tortuga rota noventa grados a la izquierda sin desplazarse cambiando suorientacion a θ = 180 (Figura 3.2e).

6. Una vez mas la tortuga se mueve 100 unidades hacia adelante modificando su posiciona x = −50 y y = 100 (Figura 3.2f).

7. De nuevo rota noventa grados a la izquierda sin trasladarse y su orientacion es ahoraθ = 270 (Figura 3.2g).

8. Otra vez viaja la tortuga hacia adelante 100 unidades (Figura 3.2h). Su nueva posiciones x = −50 y y = 0.

9. Luego la tortuga gira noventa grados a la izquierda volviendo a su orientacion inicialθ = 0 (Figura 3.2i).

10. La tortuga termina el cuadrado yendo hacia adelante 50 unidades y finalizando en lamisma posicion inicial x = 0, y = 0 (Figura 3.2j).

11. Para dibujar el techo de la casa, la tortuga primero se desplaza sin dibujar cincuentaunidades en el eje horizontal x = 50 (Figura 3.2k).

30

Page 31: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

3.1 Estado

(a) Estado Inicial (b) Estado 2 (c) Estado 3 (d) Estado 4

(e) Estado 5 (f) Estado 6 (g) Estado 7 (h) Estado 8

(i) Estado 9 (j) Estado 10 (k) Estado 11 (l) Estado 12

(m) Estado 13 (n) Estado 14 (n) Estado 15 (o) Estado Final

Figura 3.2: Cambios de estado en el Mundo de la Tortuga

31

Page 32: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

3 Nocion de Estado

12. Despues se mueve cien unidades en el eje vertical y = 100 (Figura 3.2l) tambien sindibujar.

13. Como el techo tiene dos lıneas diagonales, la tortuga tiene que rotar 135 grados(Figura 3.2m) y cambia su orientacion a θ = 135.

14. Dibuja la primera lınea desplazandose 70.7 unidades1 (Figura 3.2n). Su posicioncambia a x = 0 y y = 150

15. Posteriormente la tortuga rota noventa grados a la izquierda, dejando θ = 215 (Figura3.2n).

16. Finalmente la tortuga se mueve otras 70.7 unidades llegando al estado final x = −50,y = 100 y θ = 215 (Figura 3.2o).

Los anteriores son los pasos para llevar el sistema del estado inicial al estado final. Demanera general, el conjunto ordenado de pasos que llevan un sistema de un estado a otroes comunmente llamado algoritmo. Los pasos que se ejecutan en un algoritmo realizanAlgoritmooperaciones que modifican las variables del sistema y, por ende, el estado del mismo. Lasoperaciones son acciones que pueden efectuarse dentro del sistema y son definidas en eltiempo de creacion del sistema. Para el caso del mundo de la tortuga, el conjunto nucleode operaciones2 se encuentra en el cuadro 3.1.

Ejemplo 3.1Dados los estados inicial y final en la figura 3.3, ¿cuales son las operaciones necesarias parallevar al sistema del estado inicial al estado final?

El algoritmo 3.1 muestra los pasos para llevar el sistema de un estado al otro. Las lıneasrojas que comienzan con el sımbolo ’#’ son denominados comentarios. Los comentariosComentarioson anotaciones en algoritmos que sirven para documentar el codigo y hacerlo mas facil deentender, pero que no se tienen en cuenta a la hora de ejecutar el algoritmo.

? ? ?

1Este valor es determinado facilmente aplicando el teorema de Pitagoras: En todo triangulo rectangulo elcuadrado de la hipotenusa es igual a la suma de los cuadrados de los catetos. Como los catetos de estetriangulo miden 50 unidades se tiene entonces d =

√502 + 502 = 70,7.

2Existen muchas mas acciones que se iran introduciendo a medida que se necesiten.

32

Page 33: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

3.1 Estado

Operacion Accion

forward(u) Avanza u pixeles (dibuja dependiendo del estado del lapiz)circle(r,a) En la posicion actual realiza una porcion del un cırculo de radio

r (la porcion y direccion dibujada depende del parametro a, 360para todo)

left(a) A partir de la orientacion actual, rota la tortuga a grados en sen-tido contrario a las manecillas del reloj

penup() Levanta el lapiz (cualquier movimiento no dibujara su recorrido)pendown() Baja el lapiz (cualquier movimiento dibujara su recorrido)position() Reporta el valor de la posicion de la tortugaheading() Reporta el valor de la orientacion de la tortugaundo() Deshace la ultima accion ejecutada por la tortugaclear() Borra todo lo dibujado por la tortuga (no mueve la tortuga)home() Lleva la tortuga al centro del mundo (no borra lo dibujado)reset() Reinicia todo el sistema y posiciona la tortuga en la posicion x = 0

y y = 0, con orientacion θ = 0

Cuadro 3.1: Operaciones basicas en el Mundo de la Tortuga

Figura 3.3: Estado inicial y final para dibujar una persona

33

Page 34: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

3 Nocion de Estado

# Se posiciona para dibujar la cabeza turtle.penup()turtle.left(90) turtle.forward(100)turtle.left(270)

# Dibuja la cabezaturtle.pendown()turtle.circle(50,360)

# Dibuja el cuerpoturtle.left(270)turtle.forward(200)

# Dibuja la pierna izquierdaturtle.left(45)turtle.forward(100)

# Se posiciona para dibujar la pierna derechaturtle.penup()turtle.left(180)turtle.forward(100)turtle.left(90)

# Dibuja la pierna derechaturtle.pendown()turtle.forward(100)

# Se posiciona para dibujar los brazosturtle.penup()turtle.left(180)turtle.forward(100)turtle.left(45)turtle.forward(150)turtle.left(90)turtle.forward(75)turtle.left(180)

# Dibuja los dos brazosturtle.pendown()turtle.forward(150)

Algoritmo 3.1: Dibuja una persona

Cuando se tiene un sistema cuyo estado actual no es el deseado, se dice que se tiene un

34

Page 35: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

3.1 Estado

problema. La solucion a un problema es una serie de pasos (ejecuciones de operaciones) Problemaque llevan del estado en que estan las cosas en el sistema al estado que se desean, es decir,un algoritmo.

Ejemplo 3.2La tortuga Junior se encuentra atrapada en el laberinto de la figura 3.4. Resuelva el pro-blema de sacar a Junior del laberinto. Inicialmente la tortuga se encuentra en la posicion(-175,175). Los lados del cuadrado externo del laberinto tienen una longitud de 400 pixeles,la esquina superior izquierda esta en (-200,200) y el ancho de los pasadizos del laberinto esde 50 pixeles.

# Se cambia el color del lápiz turtle.pencolor("red")

# Sale del laberintoturtle.forward(350)turtle.left(90)turtle.forward(150)turtle.left(90)turtle.forward(50)turtle.left(90)turtle.forward(100)turtle.left(270)turtle.forward(200)turtle.left(270)turtle.forward(150)turtle.left(270)turtle.forward(100)turtle.left(90)turtle.forward(50)turtle.left(90)turtle.forward(150)turtle.left(270)turtle.forward(100)turtle.left(270)turtle.forward(300)turtle.left(90)turtle.forward(50)

Algoritmo 3.2: Sale del laberinto cuadrado

El algoritmo 3.2 muestra los pasos para resolver el problema. Si se aplica dicho algoritmoen el estado inicial del problema, se obtendra como resultado el estado en la figura 3.5.

? ? ?

35

Page 36: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

3 Nocion de Estado

Figura 3.4: Problema de sacar la tortuga del laberinto

Figura 3.5: Solucion al problema de sacar la tortuga del laberinto

36

Page 37: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT3.2 Ejercicios

El algoritmo 3.2 usa una nueva operacion llamada pencolor(c) para cambiar el colordel lapiz con el cual dibuja la tortuga. Otras operaciones similares para hacer mas vistosoel mundo estan en la tabla 3.2.

Operacion Accion

pencolor(c) Cambia el color del lapiz a c (c debe ser una cadena de texto, e.g.”red”, ”orange”, ”green”)

fillcolor(c) Cambia el color de rellenado de las figuras a c (c debe ser unacadena de texto, e.g. ”red”, ”orange”, ”green”)

begin fill() Las figuras cerradas que dibuje la tortuga seran rellenas con elcolor definido en la operacion fillcolor(c). Para que las figurasse coloreen, se debe llamar a end fill() despues de dibujar

end fill() Termina el proceso de rellenar las figuras cerradasbgcolor(c) Cambia el color de fondo de la ventana a c (c debe ser una cadena

de texto, e.g. ”red”, ”orange”, ”green”)

Cuadro 3.2: Operaciones de colores en el Mundo de la Tortuga

3.2. Ejercicios

3.1 Haga un algoritmo que ponga a la tortuga a dibujar su nombre y apellido.

3.2 Mejore el algoritmo de dibujar una persona. Agregue los ojos, la nariz, la boca,camiseta, pantalon, manos y pies. Use colores.

3.3 Resuelva el problema de llevar a la tortuga Junior (tortuga negra) donde su mama (tor-tuga roja). El laberinto del problema se puede ver en la figura 3.6.

La tortuga mama se encuentra en el centro del mundo (0,0) mientras que Junior seencuentra en (-150,180). Los semi-cırculos que rodean a la mama son concentricos ysi se enumeraran desde el mas interno hasta el mas externo, el semi-cırculo 1 tieneun radio de 33 pixeles, el semi-cırculo 2 tiene un radio de 60 pixeles, el semi-cırculo3 tiene un radio de 90 pixeles, el semi-cırculo 4 tiene un radio de 120 pixeles y elsemi-cırculo 5 tiene un radio de 150 pixeles.

3.4 Desarrolle un algoritmo para que la tortuga construya una sopa de letras.

37

Page 38: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

3 Nocion de Estado

Figura 3.6: Problema de llevar la tortuga donde su mama

38

Page 39: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4 Nocion de Abstraccion

4.1. Abstraccion de Control

Normalmente, a medida que se van resolviendo problemas mas complicados, la cantidadde operaciones basicas que deben realizarse y la cantidad de datos a procesar es mayor.Adicionalmente, muchas veces el algoritmo que resulta no es lo suficientemente intuitivocomo para entenderlo facilmente, por el contrario, se puede ver como una lista de coman-dos cuyo proposito es indefinido. Por ejemplo, si tomamos el algoritmo 3.1 (ejemplo 3.1),eliminamos los comentarios y omitimos el proposito del algoritmo, una persona solo conmirar el codigo tendrıa dificultad en encontrar su objetivo. Esto se debe a que el nivel deabstraccion del algoritmo es bajo.

Abstraccion es el proceso en el que datos y algoritmos son agrupados de acuerdo a una Abstraccionsemantica particular, de manera que se reduzcan los detalles. El proceso de abstraccionpuede aplicarse a operaciones o a datos. En este capıtulo veremos la abstraccion que invo-lucra algoritmos, llamada abstraccion de control. En el capıtulo 7 se vera la abstraccion dedatos.

El nivel de abstraccion de un sistema define la cantidad de detalles a tener en cuenta alrealizar el modelo computacional del sistema. El mundo de la tortuga, por ejemplo, tiene unalto nivel de abstraccion ya que las operaciones basicas son claras en cuanto a su propositoy el programador sabe que si ejecuta una operacion, el resultado se vera graficamente, noimporta el computador en el que se ejecute. Si el nivel de abstraccion del mundo de latortuga fuera bajo, el programador tendrıa que lidiar con operaciones del procesador y latarjeta de video del computador en el que quiera ejecutar el programa, es decir, rutinaspropias de la maquina. En el ejemplo 4.1 se muestra como aumentar el nivel de abstracciondel algoritmo 3.1.

Ejemplo 4.1Si queremos dibujar una persona, podemos dividir el dibujo en las partes del cuerpo: cabeza,tronco, y extremidades, y definimos cada una de estas partes como una operacion diferente.

Las nuevas operaciones para dibujar las extremidades, el tronco y la cabeza estan defi-nidas en los algoritmos 4.1, 4.2 y 4.3.

39

Page 40: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4 Nocion de Abstraccion

def dibujarExtremidades(): "Dibuja las extremidades de una persona" # Dibuja la pierna izquierda turtle.left(45) turtle.forward(100)

# Se posiciona para dibujar la pierna derecha turtle.penup() turtle.left(180) turtle.forward(100) turtle.left(90)

# Dibuja la pierna derecha turtle.pendown() turtle.forward(100)

# Se posiciona para dibujar los brazos turtle.penup() turtle.left(180) turtle.forward(100) turtle.left(45) turtle.forward(150) turtle.left(90) turtle.forward(75) turtle.left(180)

# Dibuja los dos brazos turtle.pendown() turtle.forward(150)

Algoritmo 4.1: Dibuja las extremidades de una persona

def dibujarTronco(): "Dibuja el tronco de una persona" # Dibuja el cuerpo turtle.left(270) turtle.forward(200)

Algoritmo 4.2: Dibuja el tronco de una persona

40

Page 41: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4.1 Abstraccion de Control

def dibujarCabeza(): "Dibuja la cabeza de una persona" # Se posiciona para dibujar la cabeza turtle.penup() turtle.left(90) turtle.forward(100) turtle.left(270)

# Dibuja la cabeza turtle.pendown() turtle.circle(50,360)

Algoritmo 4.3: Dibuja la cabeza de una persona

El algoritmo para dibujar una persona se reduce ahora a cargar y aplicar las operacionesrecien creadas, como en el algoritmo 4.4. Note que si a dicho algoritmo le quitamos loscomentarios, aun ası el usuario que lea el algoritmo tiene una idea de cual es su propositosolo con echarle un vistazo.

# Dibuja la cabezadibujarCabeza()

# Dibuja el cuerpodibujarTronco()

# Dibuja las extremidadesdibujarExtremidades()

Algoritmo 4.4: Dibuja completamente una persona

? ? ?

En los algoritmos 4.3, 4.2, y 4.1 se han definido las operaciones dibujarExtremidades(),dibujarTronco() y dibujarCabeza(). La definicion de una operacion especifica un iden- Definiciontificador (que va a ser usado para aplicar la operacion) y el cuerpo de dicha operacion. Laespecificacion del cuerpo de una operacion es denominada implementacion de la operacion. Implementacion

En el algoritmo 4.4 se usan las operaciones previamente definidas. Cuando una operaciones usada de esta manera, se dice que se hace una aplicacion de la operacion. Aplicar una Aplicacionoperacion es, finalmente, hacer el llamado a la operacion.

Ejemplo 4.2Supongamos que queremos dibujar un conjunto de casas. La manera mas sencilla es crear

41

Page 42: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4 Nocion de Abstraccion

una operacion para dibujar una sola casa y luego ejecutar dicha operacion tantas vecescomo numero de casas se quiera. El algoritmo 4.5 define una operacion para dibujar unacasa.

def dibujarCasa(): "Dibuja una casa" # Dibuja la pared turtle.pendown() turtle.left(270) turtle.forward(100) turtle.left(270) turtle.forward(100) turtle.left(270) turtle.forward(100) turtle.left(270) turtle.forward(100)

# Dibuja el techo turtle.left(135) turtle.forward(70.7) turtle.left(90) turtle.forward(70.7))

# Dibuja la puerta y termina turtle.penup() turtle.left(45) turtle.forward(100) turtle.left(90) turtle.forward(40) turtle.left(90) turtle.pendown() turtle.forward(30) turtle.left(270) turtle.forward(20) turtle.left(270) turtle.forward(30) turtle.left(90) turtle.penup() turtle.forward(40) turtle.left(90) turtle.forward(100)

Algoritmo 4.5: Dibuja una casa

Luego ejecutamos la operacion para dibujar una casa varias veces, como en el algoritmo4.6, en el cual se dibujan cuatro casas.

42

Page 43: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4.1 Abstraccion de Control

# Dibuja cuatro casasdibujarCasa()dibujarCasa()dibujarCasa()dibujarCasa()

Algoritmo 4.6: Dibuja cuatro casas

? ? ?

Podemos ver que el nivel de abstraccion del algoritmo 4.5 puede aumentarse separandolas partes de la casa y definiendolas como operaciones separadas.

Por otra parte, el lector que pruebe el algoritmo 4.6 puede darse cuenta que el resultadoque se obtiene no es el esperado. La figura 4.1 muestra lo que la tortuga dibuja despues deaplicado el algoritmo.

Figura 4.1: Resultado de aplicar el algoritmo para dibujar una casa cuatro veces

Es claro que la tortuga dibuja cuatro casas, pero no es el resultado esperado; el resultadoque se quisiera es el que se muestra en la figura 4.2.

43

Page 44: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4 Nocion de Abstraccion

Figura 4.2: Resultado esperado de aplicar el algoritmo para dibujar una casa cuatro veces

El problema que ocurre es que la posicion y la orientacion inicial de la tortuga en cadaejecucion de la operacion no es la correcta. Por lo tanto, debemos darle a la operacion estosdatos para que la tortuga pueda dibujar las casas como deseamos. En el algoritmo 4.7 sedefine la operacion con la posicion en x y en y como datos de entrada.

Cuando se definen operaciones, a los datos de entrada de ellas se les llama parametros.Un parametro de una operacion es entonces, un tipo especial de variable que provee datosParametronecesarios que pueden ser usados en la operacion.

Con la nueva definicion de la operacion para dibujar una casa, se puede hacer un algo-ritmo mas adecuado para dibujar cuatro casas y que, de hecho, queden como en la figura4.2. El resultado es el algoritmo 4.8.

Los valores que se proveen como datos de entrada a la ejecucion de una operacion sonllamados los argumentos de la operacion. En el algoritmo 4.8, por ejemplo, −100 y 0 sonArgumentolos argumentos de la primera aplicacion de la operacion dibujarCasa().

En el algoritmo 4.7 se incorporan nuevas operaciones del mundo de la tortuga. Estasoperaciones sirven para posicionar y orientar la tortuga en un lugar particular del mundosin necesidad de llevarla hasta alla con left() y forward(). Estas y otras operacionesestan en el cuadro 4.1.

44

Page 45: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4.1 Abstraccion de Control

def dibujarCasa(x,y): "Dibuja una casa dada una posicion" # Se posiciona donde quiere dibujar la casa y orienta a la # tortuga en 0 grados turtle.penup() turtle.setx(x) turtle.sety(y) turtle.seth(0)

# Dibuja la pared turtle.pendown() turtle.left(270) turtle.forward(100) turtle.left(270) turtle.forward(100) turtle.left(270) turtle.forward(100) turtle.left(270) turtle.forward(100)

# Dibuja el techo turtle.left(135) turtle.forward(70.7) turtle.left(90) turtle.forward(70.7))

# Dibuja la puerta y termina turtle.penup() turtle.left(45) turtle.forward(100) turtle.left(90) turtle.forward(40) turtle.left(90) turtle.pendown() turtle.forward(30) turtle.left(270) turtle.forward(20) turtle.left(270) turtle.forward(30) turtle.left(90) turtle.penup() turtle.forward(40) turtle.left(90) turtle.forward(100)

Algoritmo 4.7: Dibuja una casa con posicion

45

Page 46: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4 Nocion de Abstraccion

# Dibuja cuatro casas especificando su posiciondibujarCasa(-100,0)dibujarCasa(0,0)dibujarCasa(100,0)dibujarCasa(200,0)

Algoritmo 4.8: Dibuja cuatro casas especificando las posiciones

Operacion Accion

goto(x,y) Traslada la tortuga a la posicion x = x, y = y. La orientacionpermanece igual

setx(x) Traslada la tortuga a la coordenada x = x sin cambiar la coorde-nada y. La orientacion permanece igual

sety(y) Traslada la tortuga a la coordenada y = y sin cambiar la coorde-nada x. La orientacion permanece igual

seth(h) Orienta la tortuga al angulo a = h

xcor() Reporta el valor de la posicion de la tortuga en el eje xycor() Reporta el valor de la posicion de la tortuga en el eje y

Cuadro 4.1: Operaciones de posicionamiento y orientacion en el Mundo de la Tortuga

Ejemplo 4.3Ahora queremos que la tortuga escriba la letra ’A’ pero en diferentes escalas, es decir, conun tamano que depende de un valor de entrada. Para esto se necesita definir una operacionque tenga un parametro escala cuyo dominio de valores se encuentre entre 1 y 100. Esteparametro sera usado para determinar las longitudes de las lıneas que componen la letra’A’ y los angulos que debe usar la tortuga para hacer el dibujo. El algoritmo 4.9 resuelveeste problema.

Se asume que la letra a una escala 100 ocupa la mayor parte de la ventana y el dibujo dela letra mas pequena tiene una escala 1. Como la ventana es de 500× 500 pixeles, entoncesla tortuga se movera inicialmente a una posicion determinada por la escala y un factor de−2,3. Ası, si la escala es 100, la posicion inicial sera (−230,−230), mientras que si la escalaes 1, la posicion sera (−2,3,−2,3).

Como puede verse para hallar las longitudes de las lıneas diagonales se usa (de nuevo) elteorema de Pitagoras, y para hallar el angulo que debe tomar la tortuga para dibujar lasdiagonales se usa la funcion trigonometrica arcoseno. Estas operaciones necesarias en esteproblema (y en algunos siguientes) hacen parte de un sistema matematico; algunas de las

46

Page 47: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4.1 Abstraccion de Control

operaciones mas usadas de este sistema se encuentran en el cuadro 4.2.

def letraAescala(escala): "Dibuja la letra 'A' con una escala dada" # Se posiciona para dibujar turtle.penup() turtle.setx(-2.3*escala) turtle.sety(-2.3*escala) turtle.seth(0)

# Calcula los valores necesarios para la letra, a partir de # la escala longitud = math.sqrt((2.3*escala * 2.3*escala) + \ (4.6*escala * 4.6*escala)) angulo = (math.asin(4.6*escala/longitud)*360)/(2*math.pi)

# Dibuja la primera diagonal turtle.pendown() turtle.left(angulo) turtle.forward(longitud)

# Dibuja la segunda diagonal turtle.seth(0) turtle.left(360-angulo) turtle.forward(longitud) # Se posiciona para dibujar la linea intermedia turtle.left(180) turtle.penup() turtle.forward(longitud/3)

# Dibuja la linea intermedia turtle.seth(180) turtle.pendown() linea = turtle.xcor()*2 turtle.forward(linea)

# Mueve la tortuga a una posicion que permita ver el resultado turtle.penup() turtle.goto(-235,235) turtle.seth(0)

Algoritmo 4.9: Dibuja la letra A

? ? ?

47

Page 48: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4 Nocion de Abstraccion

El lector puede notar que en el algoritmo 4.9 se han usado unas variables longitud,angulo y linea. Estas variables se dice que son locales ya que son declaradas (usadas porDeclaracionprimera vez o por lo menos anunciadas de que existen) dentro del contexto de la operaciondefinida. Por fuera del contexto (en el caso de las variables longitud, angulo y linea, porfuera de la operacion letraAescala()), dichas variables no son visibles o accesibles. Porotro lado, las variables globales son aquellas que pueden ser usadas en cualquier contexto,es decir, en cualquier parte del codigo del modelo computacional. Por lo tanto, el contextoen el que son declaradas las variables define su alcance, esto es, la visibilidad o accesibilidadAlcancede las variables en diferentes partes del modelo computacional.

Operacion Accion

pow(x,y) Retorna x elevado a la y

sqrt(x) Retorna la raiz cuadrada de x

log(x,b) Retorna el logaritmo base b de x

sin(v) Retorna el seno de a, en radianescos(v) Retorna el coseno de a, en radianestan(v) Retorna la tangente de a, en radianesasin(v) Retorna el arcoseno de a, en radianesacos(v) Retorna el arcocoseno de a, en radianesatan(v) Retorna la arcotangente de a, en radianesdegrees(a) Retorna la conversion del angulo a de radianes a gradosradians(a) Retorna la conversion del angulo a de grados a radianes

Constante Valor

pi El valor matematico π = 3,141592...e El valor matematico e = 2,718281...

Cuadro 4.2: Operaciones y constantes clasicas de un sistema matematico

Los valores de las variables locales longitud, angulo y linea son obtenidos al aplicar lasoperaciones sqrt(), asin() y xcor(), respectivamente. Estas operaciones en su definicionhan hecho aplicaciones de otras operaciones y calculos internos, y al final ellas (sqrt(),asin() y xcor()) reportan un valor, el cual es retornado a la operacion donde fueronaplicadas (en este caso letraAescala()) y se asignan a las variables longitud, angulo ylinea. Cuando una operacion reporta un valor que es retornado al final de su definicion,a dicha operacion se le denomina funcion.Funcion

Ejemplo 4.4El curso de Introduccion a la programacion se evalua con tres examenes parciales, tareas

48

Page 49: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4.1 Abstraccion de Control

y un proyecto. El cuadro 4.3 muestra los porcentajes que tienen estos elementos en la notafinal del curso.

Evaluacion Porcentaje

Examen Parcial 1 25 %Examen Parcial 2 20 %Examen Parcial 3 20 %

Tareas 15 %Proyecto 20 %

Cuadro 4.3: Porcentaje de notas de un curso Introduccion a la Programacion

Si quisieramos que la tortuga escribiera la nota final del curso dados los datos de lasevaluaciones, primero tenemos que hacer la funcion que retorne la nota final y luego hacerque la tortuga escriba este valor reportado. La funcion esta definida en el algoritmo 4.10.

def notaFinal(p1, p2, p3, t, pry): "Funcion que haya la nota final del curso" nota = (p1*0.25) + (p2*0.2) + (p3*0.2) + (t*0.15) + (pry*0.2) return nota

Algoritmo 4.10: Retorna la nota final del curso

Esta funcion puede usarse entonces en un algoritmo que haga dibujar a la tortuga lanota final, como el algoritmo 4.11.

def escribirNotaFinal(): "Escribe la nota final de un curso" # Halla el dia del domingo de Pascua valor = notaFinal(4.5, 4.0, 5.0, 4.0, 5.0)

# Escribe la nota y termina turtle.write(valor, False, align="center", \ font=("Arial",32,"normal")) turtle.penup() turtle.goto(-235,235)

Algoritmo 4.11: Escribe la nota final del curso

? ? ?

En el algoritmo 4.11 se usa una operacion para escritura. Esta operacion esta descrita

49

Page 50: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4 Nocion de Abstraccion

en el cuadro 4.4.

Operacion Accion

write(t,m,a,f) Escribe en la posicion actual el texto t. El parametro m es unvalor logico (True o False) que especifica si la tortuga se despla-zara cuando escriba el texto. El parametro a define la alineaciondel texto (“left”, “center”, o “right”). El parametro f es una es-tructura que describe la fuente del texto (esta estructura se co-difica entre parentesis con los datos separados por comas, ası:(nombre, tamano, tipo), e.g. (“Arial”,18,“italic”))

Cuadro 4.4: Operacion de escritura en el Mundo de la Tortuga

Las operaciones que no reportan un valor y, por lo tanto, no es retornado a la operaciondonde se aplica se les llama procedimientos. Todas las operaciones que se han definido hastaProcedimientoel momento, excepto notaFinal(), son procedimientos.

Las funciones, dado que retornan un valor que puede asignarse a una variable y, porlo tanto, puede usarse en otras operaciones, pueden aplicarse como argumento de otraaplicacion. Este proceso es conocido como composicion de funciones. El ejemplo 4.5 muestraComposicionun algoritmo con composicion de funciones.

Ejemplo 4.5Supongamos que queremos construir la funcion que retorna la longitud de la hipotenusade un triangulo rectangulo, dadas las longitudes de los dos catetos (esto nos sirve de ayudaen varios ejemplos vistos). Para resolver este problema se usa el teorema de pitagoras. Elalgoritmo 4.12 muestra su uso de dos maneras diferentes.

def longitudHipotenusa1(cateto1, cateto2): "Retorna la longitud de la hipotenusa de un triangulo rectangulo" valor1 = math.pow(cateto1,2) valor2 = math.pow(cateto2,2) hipotenusa = math.sqrt(valor1+valor2) return hipotenusa

def longitudHipotenusa2(cateto1, cateto2): "Retorna la longitud de la hipotenusa de un triangulo rectangulo" return math.sqrt(math.pow(cateto1,2)+math.pow(cateto2,2))

Algoritmo 4.12: Retorna la longitud de la hipotenusa de un triangulo rectangulo

Las dos funciones retornan exactamente lo mismo. La primera funcion declara dos va-riables locales que contendran el valor resultado de elevar al cuadrado las longitudes de

50

Page 51: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4.1 Abstraccion de Control

los dos catetos y luego aplica la funcion de raız cuadrada con la suma de las dos variablescomo argumento. El resultado de la funcion raız cuadrada se asigna a una ultima variablelocal, cuyo valor sera retornado por la funcion.

La segunda funcion se ahorra la declaracion de las variables aplicando directamente lafuncion de raız cuadrada con el resultado de la funcion de elevar al cuadrado los catetos ysumarlos, es decir, componiendo las funciones.

? ? ?

Ejemplo 4.6A principio de cada ano una de las preguntas mas frecuentes entre nosotros es ¿en que fechacae Semana Santa?

La tortuga Sabelotodo encontro que una formula para calcular la fecha del Domingo dePascua en los anos 1982–2048, inclusive, es ası1: sea a = ano%19, b = ano%4, c = ano%7,d = (19a + 24) %30, e = (2b + 4c + 6d + 5) %7, entonces el dıa del Domingo de Pascua esMarzo 22 + d+ e.

Esta formula la podemos usar para crear la funcion Pascua. Esta funcion tiene comoparametro un ano y retorna el dıa del Domingo de Pascua de ese ano. El algoritmo 4.13muestra la funcion.

def Pascua(ano): "Funcion que halla el día del domingo de pascua" a = ano%19 b = ano%4 c = ano%7 d = (19*a + 24)%30 e = (2*b + 4*c + 6*d + 5)%7 dia = 22 + d + e return dia

Algoritmo 4.13: Retorna el dıa del Domingo de Pascua

Usando esta funcion, podemos poner a la tortuga a escribir la fecha del Domingo dePascua (o toda la Semana Santa) con un algoritmo similar al algoritmo 4.11.

? ? ?

Si el lector prueba el algoritmo 4.13, aplicandolo con diferentes anos como argumento,podra notar que en algunas ocasiones se obtendran resultados inconsistentes cronologica-mente. Por ejemplo, la funcion Pascua con un argumento 2000 retorna 54. Sin embargo no

1La operacion modulo ’ %’ halla el residuo de la division entera entre dos numeros.

51

Page 52: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

4 Nocion de Abstraccion

existe la fecha Marzo 54 de 2000, Marzo tiene solo 31 dıas y el dıa siguiente es Abril 1. Deesta manera, es necesario considerar los casos para los que la fecha esta en Marzo y aquellosdonde la fecha esta en Abril. La estructura de control para tener dichas consideraciones severa en el capıtulo 5.

4.2. Ejercicios

4.1 Mejore los procedimientos 4.1, 4.2 y 4.3, creandoles parametros que especifiquen lasposiciones donde van a ser dibujados.

4.2 Baje el nivel de abstraccion del dibujo de una persona, desarrollando los procedimien-tos y funciones para dibujar todas partes del cuerpo humano. Por ejemplo, en vez dedibujarCabeza(), puede construir las operaciones dibujarOjos(), dibujarNariz(),dibujarBoca(), dibujarOrejas(), etc., con sus respectivos parametros de posicion yotros parametros que se deseen (e.g. dibujarOjos() puede tener ademas un parame-tro que especifique el color de los ojos).

4.3 Desarrolle un procedimiento para que la tortuga escriba su nombre en diferentesescalas.

4.4 Se quiere que la tortuga dibuje una pequena ciudad con un carro en ella. Cree entoncesun procedimiento que lo haga y que permita dibujar el carro en diferentes calles deella. Adicionalmente el procedimiento debe tener la capacidad de hacer zoom encualquier parte de la pequena ciudad (piense en un Google Maps – http://maps.

google.com/ – muy muy sencillo).

4.5 Escriba una funcion con dos parametros correspondientes a la base y la altura de untriangulo isosceles y haga que la tortuga dibuje el triangulo. La funcion debe retornarel valor del area del triangulo.

4.6 Desarrolle un algoritmo para que la tortuga construya un sudoku y luego defina lasoperaciones para resolver cualquier sudoku.

52

Page 53: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

5 Nocion de Condicion

5.1. Condicion

Cuando el estado en que se encuentra un sistema se desconoce, no podemos garantizarque un algoritmo desarrollado llegue al estado deseado. Lo anterior debido a que no tenemosforma de saber que operaciones deben realizarse a partir de dicho estado desconocido paralograr llegar al estado final. Sin embargo si consideraramos todos los casos posibles, entoncessı garantizarıamos llegar al estado final. Para diferenciar un caso de otro es necesario queel estado del sistema cumpla una condicion.

Una condicion es: Condicion

una relacion logica entre variables, o

una funcion que retorna un valor de tipo Booleano.

Una relacion logica entre variables se construye utilizando operadores de relacion. Losoperadores de relacion entre variables son ==, <, >, <=, >=, ! =, <>. Por ejemplo, sitenemos la siguiente relacion:

x >= 5

esta relacion es verdadera en el caso en que la variable x sea asignada con valores mayoreso iguales a 5. De lo contrario la relacion es falsa. La semantica de los operadores de relaciones como sigue:

el operador < significa menor que.

el operador > significa mayor que.

el operador == significa igual que.

el operador <= significa menor o igual que.

el operador >= significa mayor o igual que.

los operadores ! = y <> significan distinto de.

53

Page 54: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

5 Nocion de Condicion

Operacion Accion

p and q Retorna True cuando los valores de ambas variables p y q sonTrue. De lo contrario retorna False. Esto se ve mas claramenteen la siguiente tabla de verdad:

p q p and q

True True True

True False False

False True False

False False False

p or q Retorna True cuando el valor de cualquiera de las dos variablesp y q es True. De lo contrario retorna False. Esto se ve masclaramente en la siguiente tabla de verdad:

p q p or q

True True True

True False True

False True True

False False False

not p Retorna True cuando el valor de la variable p es False. De locontrario retorna False. Esto se ve mas claramente en la siguientetabla de verdad:

p not p

True False

False True

Constante Valor

True El valor Booleano 1False El valor Booleano 0

Cuadro 5.1: Operaciones y constantes clasicas de un sistema Booleano

De otro lado, la implementacion de funciones que retornan valores de tipo Booleano selogra combinando constantes logicas (True y False), variables logicas (i.e. con tipo de dato

54

Page 55: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT5.1 Condicion

Booleano) y operaciones logicas. Las operaciones logicas son aquellas que al ser aplicadasproducen un valor Booleano. Algunas de estas operaciones se pueden ver en el cuadro 5.1.

Un condicional es una sentencia que evalua una condicion y de acuerdo al resultado de Condicionaldicha evaluacion, ejecuta o no, un conjunto de operaciones.

Ejemplo 5.1Supongamos que la tortuga Junior tiene dos opciones para divertirse esta noche. Una opciones ir a una discoteca mientras que la otra es ir a comer helado. La decision depende de laedad que tenga Junior dado que para entrar a las discotecas se requiere tener mas de 18anos.

La figura 5.1 muestra el estado inicial del problema, con Junior al frente de ambosedificios.

Figura 5.1: Estado inicial del problema de mayorıa de edad

El algoritmo 5.1 desarrolla la funcion esMayorDeEdad() la cual recibe como parametro unnumero natural que representa la edad y retorna True o False dependiendo si el argumentopasado a la funcion en su aplicacion es mayor o igual a 18, o no.

Para hacer que Junior vaya a la discoteca, debemos entonces aplicar la funcionesMayorDeEdad() del algoritmo 5.1 con un numero mayor o igual a 18 como argumento.Esto hace que la funcion retorne True y el estado final del sistema sea el de la figura 5.2a.Por otro lado, si aplicamos la funcion con un numero menor a 18, ella retornara False (yaque la condicion no se cumple (edad >= 18), la variable mayor no se modifica y se queda

55

Page 56: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

5 Nocion de Condicion

con el valor que se le dio en su declaracion, es decir, False) y el estado final del sistemasera el de la figura 5.2b.

def esMayorDeEdad(edad): "Funcion que retorna si es mayor de edad o no" mayor = False if edad >= 18: mayor = True return mayor

Algoritmo 5.1: Retorna si un numero es mayor o igual a 18

(a) Solucion 1 (b) Solucion 2

Figura 5.2: Los dos posibles casos del problema de mayorıa de edad

? ? ?

En el ejemplo 5.1 puede notarse que en algunos casos se ejecutan unas operaciones yen otros se ejecutan otras operaciones. El orden de ejecucion de las operaciones de unprograma determina el flujo de ejecucion del programa. La figura 5.3 da una explicacionFlujo de Ejecuciongrafica del flujo de la funcion esMayorDeEdad(). La asignacion mayor = False siempre se

56

Page 57: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT5.1 Condicion

ejecuta. La condicion edad >= 18 es evaluada y de acuerdo al resultado se puede ir poruno de dos caminos: si el resultado de la condicion es True entonces se ejecuta la asignacionmayor = True y luego se retorna la variable mayor (es decir se retorna True); si el resultadode la condicion es False entonces simplemente se retorna la variable mayor, que en estecaso tiene asignado el valor original False.

mayor = False

mayor = True

return mayor

¿edad >= 18?

Cierto Falso

edad

Figura 5.3: Flujo de ejecucion de la funcion esMayorDeEdad()

Ejemplo 5.2Supongamos que la tortuga Junior ha dibujado un tablero de tiro al blanco para jugar unrato. El tablero que ha dibujado se muestra en la figura 5.4.

Como puede apreciarse, un tablero de tiro al blanco consiste en un numero fijo de cir-cunferencias concentricas separadas por una distancia usualmente constante. En este casoparticular, el tablero tiene ocho circunferencias concentricas cada una separada 25 unidadesde la siguiente. La circunferencia mas pequena (negra) tiene un radio de 25 unidades.

El juego consiste en disparar al tablero y de acuerdo al lugar donde ocurrio el disparo,se obtiene un puntaje. Este puntaje es acumulado hasta que se acaben los disparos. Eljugador que mas puntaje obtenga al final sera el ganador.

57

Page 58: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

5 Nocion de Condicion

Figura 5.4: Tablero de tiro al blanco

Lo primero que debemos hacer es construir una funcion que, dado un disparo, retorne elpuntaje correspondiente. Un disparo se puede ver como una posicion en el mundo, es decir,una posicion en el eje x y una posicion en el eje y. De allı que si hallamos la distancia desdeese punto hasta el origen (0,0), podrıamos saber entre que par de cırculos cayo el disparo y,por lo tanto, saber el puntaje asociado. Entonces la distancia podemos conocerla aplicandouna de las funciones para hallar la hipotenusa del ejemplo 4.5. Luego comparamos el valorobtenido en la aplicacion con cada una de las distancias de las circunferencias y de estamanera conocemos el puntaje. El algoritmo 5.2 muestra la funcion.

Vemos que si se aplica esta funcion con un disparo en la posicion (100,100), el puntajeobtenido es 300 ya que la distancia calculada (

√1002 + 1002 = 141,42) se encuentra entre

125 y 150. Podemos notar ademas que si se calcula una distancia mayor a 200, el puntajeretornado es cero; de allı que se puede asumir que el disparo no le pego al tablero.

Ahora hacemos el procedimiento para simular un juego. Para realizar la simulacion usa-mos un sistema de numeros aleatorios. Este sistema nos permite asumir disparos al azar,es decir, no tenemos que inventarnos unos numeros y cada vez que ejecutemos la simula-cion obtendremos disparos diferentes (un sistema inicial desconocido). Las operaciones delsistema de numeros aleatorios se encuentra en el cuadro 5.2.

El procedimiento para la simulacion se encuentra en el algoritmo 5.3. Primero se hallanlos disparos utilizando la funcion randint(), luego se hallan los puntajes y con ellos se

58

Page 59: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT5.1 Condicion

Operacion Accion

random() Retorna el siguiente numero real aleatorio en el rango [0,0, 1,0)randrange(i,f,p) Retorna numero aleatorio en la lista de numeros entre i y f con

intervalos de p. Por ejemplo, si queremos un numero aleatorio parentre 0 y 10, le enviamos los argumentos a la funcion: i=0, f=10,p = 2 (la lista de numeros entre 0 y 10 con intervalos de 2 es{0, 2, 4, 6, 8, 10})

randint(a,b) Retorna un numero entero aleatorio n de manera que a ≤ n ≤ b

Cuadro 5.2: Operaciones basicas de un sistema de numeros aleatorios

encuentra el ganador.

def puntajeXdisparo(x,y): "Funcion que retorna el puntaje dado el disparo" distancia = longitudHipotenusa2(x,y) puntaje = 0 if distancia <= 25: puntaje = 1000 if distancia > 25 and distancia <= 50: puntaje = 800 if distancia > 50 and distancia <= 75: puntaje = 600 if distancia > 75 and distancia <= 100: puntaje = 500 if distancia > 100 and distancia <= 125: puntaje = 400 if distancia > 125 and distancia <= 150: puntaje = 300 if distancia > 150 and distancia <= 175: puntaje = 200 if distancia > 175 and distancia <= 200: puntaje = 100 return puntaje

Algoritmo 5.2: Retorna el puntaje dado un disparo

En el algoritmo 5.3 pueden notarse algunas cosas. El juego consiste en tres disparos quese representan con seis variables (la posicion en x y y de cada disparo). Con estas seisvariables se calculan los tres puntales obtenidos en los tres disparos, que se suman paratener el puntaje total. Lo anterior se realiza para los dos jugadores. Puede verse que todas

59

Page 60: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

5 Nocion de Condicion

las variables (excepto las de puntaje total) son asignadas dos veces, esto esta bien ya queuna vez se usan las variables para realizar los calculos, su valor deja de ser necesario. Porotro lado, cada posicion de un disparo se tiene despues de aplicar la funcion randint() conargumentos 0 y 250; como la distancia maxima para obtener un punto es 200, este valor(250) permite simular un jugador que realiza un tiro malo.

def tiroAlBlanco(): "Procedimiento que simula un juego de tiro al blanco" # Jugador 1 disparo1x = random.randint(0,250) disparo1y = random.randint(0,250) disparo2x = random.randint(0,250) disparo2y = random.randint(0,250) disparo3x = random.randint(0,250) disparo3y = random.randint(0,250) puntaje1 = puntajeXdisparo(disparo1x,disparo1y) puntaje2 = puntajeXdisparo(disparo2x,disparo2y) puntaje3 = puntajeXdisparo(disparo3x,disparo3y) puntajeTotalJugador1 = puntaje1 + puntaje2 + puntaje3

# Jugador 2 disparo1x = random.randint(0,250) disparo1y = random.randint(0,250) disparo2x = random.randint(0,250) disparo2y = random.randint(0,250) disparo3x = random.randint(0,250) disparo3y = random.randint(0,250) puntaje1 = puntajeXdisparo(disparo1x,disparo1y) puntaje2 = puntajeXdisparo(disparo2x,disparo2y) puntaje3 = puntajeXdisparo(disparo3x,disparo3y) puntajeTotalJugador2 = puntaje1 + puntaje2 + puntaje3

# Ganador if puntajeTotalJugador1 > puntajeTotalJugador2: turtle.write("El ganador es el jugador 1") if puntajeTotalJugador1 < puntajeTotalJugador2: turtle.write("El ganador es el jugador 2") if puntajeTotalJugador1 == puntajeTotalJugador2: turtle.write("El juego quedo empatado")

Algoritmo 5.3: Simula un juego de tiro al blanco

? ? ?

En algunas ocasiones solo se tiene una posible condicion en el sistema que se esta mode-

60

Page 61: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT5.1 Condicion

lando. Por esto si la condicion se cumple entonces el flujo de ejecucion del programa va porun camino, pero si no se cumple el flujo debe ir por otro. En estos casos, se puede hacer usodel complemento opcional de un condicional (if) llamada la condicion por defecto (else). Condicion por Defecto

El ejemplo 5.3 muestra el uso de la condicion por defecto.

Ejemplo 5.3Retomando el ejemplo 4.6, si quisieramos que la tortuga escribiera la fecha cronologica-mente bien (que no escriba Marzo 54 de 2000, por ejemplo) entonces despues de aplicarla funcion Pascua() debemos tener en cuenta los casos. Si el numero retornado es menoro igual que 31, entonces la tortuga debe escribir la fecha en Marzo, de lo contrario debeescribir la fecha en Abril.

El algoritmo 5.4 muestra el codigo para la escritura correcta de la fecha del domingode Pascua de cualquier ano. Es claro que si el dıa no es menor o igual a 31 entonces debeser mayor a 31 (es la unica otra opcion), por lo tanto se puede utilizar la condicion pordefecto, es decir, no hay necesidad de especificar “if dıa > 31:”. Adicionalmente, paraescribir la fecha correcta es necesario utilizar unas operaciones para manejo de cadenas detexto. El cuadro 5.3 describe algunas operaciones basicas de cadenas de texto.

def PascuaMejorado(ano): "Escribe el día del domingo de Pascua de acuerdo a un ano" # Halla el día del domingo de Pascua dia = Pascua(ano)

# Si el dia pertenece a Marzo o a Abril if(dia <= 31): fecha = "Marzo " + str(dia) + " de " + str(ano) else: dia = dia - 31 fecha = "Abril " + str(dia) + " de " + str(ano)

# Escribe la fecha turtle.write(fecha, False, align="center", font=("Arial",32,"normal")) turtle.penup() turtle.goto(-235,235)

Algoritmo 5.4: Escribe correctamente la fecha del domingo de Pascua

? ? ?

61

Page 62: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

5 Nocion de Condicion

Operacion Accion

str(w) Retorna una cadena de texto que contiene una representacion im-primible del objeto w

len(w) Retorna el numero de caracteres de la cadena w

find(w,s) Retorna la posicion mas cercana al inicio donde se encuentre lasubcadena s dentro de la cadena w. Si la subcadena no se encuentraen w, retorna -1

capitalize(w) Retorna la cadena w en mayusculasw1 + w2 Retorna la concatenacion de las cadenas w1 y w2

w * n Retorna n copias de la cadena w concatenadasc in w Retorna un booleano que indica si el caracter c se encuentra en la

cadena w

Cuadro 5.3: Operaciones basicas de un sistema de cadenas de texto

Ejemplo 5.4Supongamos que la tortuga Junior debe ir a un sitio particular de la ciudad. Las opcionesde transporte son: Bus, Taxi o Carro Particular. Si Junior necesitase llegar antes de 15minutos y tuviera $30000, entonces Junior escoge mejor irse en Taxi, sin embargo si tuvieraun poco mas de tiempo e igual cantidad de dinero, serıa indiferente el medio de transporte.Si tuviera 1 hora o mas para llegar a su destino, la tortuga preferirıa ahorrar el dinero eirse en Bus. Lo anterior se calcula solo si Junior no tuviera a nadie que lo lleve en CarroParticular.

Para resolver este problema es necesario tener en cuenta todas las condiciones necesariaspara cada opcion de transporte. El algoritmo 5.5 muestra una forma de solucionar elproblema.

La funcion transporte() tiene tres parametros: dinero, tiempo y carro. El dineroy el tiempo son entonces variables de tipo entero, mientras que carro es una variablede tipo Booleano. Por comodidad, el transporte por defecto sera “Carro Particular” (lavariable local transporte se declara con este valor). Si el argumento que se manda para elparametro carro en la aplicacion de esta funcion es True entonces simplemente se retornael transporte por defecto. De lo contrario, se debe verificar el tiempo: si es mayor o igual auna hora entonces el transporte sera Bus, sino tenemos que consultar el dinero: si se tienenlos $30000 pero no hay problema con el tiempo (la tortuga necesita llegar entre 15 y 60minutos) entonces se toma el Bus, sin embargo si hay prisa (15 minutos o menos) se tieneque tomar Taxi.

? ? ?

62

Page 63: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT5.2 Ejercicios

def transporte(dinero, tiempo, carro): "Decide el medio de transporte para ir a un sitio" transporte = "Carro Particular" if not carro: if tiempo >= 60: transporte = "Bus" else: if dinero == 30000: if tiempo > 15 and tiempo < 60: transporte = "Bus" else: transporte = "Taxi" else: transporte = "Bus"

return transporte

Algoritmo 5.5: Retorna el medio de transporte para ir a un sitio de acuerdo a unascondiciones

5.2. Ejercicios

5.1 Dado el estado inicial del problema de mayorıa de edad (ejemplo 5.1) y la funcionesMayorDeEdad(), escriba el algoritmo necesario para que la tortuga vaya al sitioadecuado dependiendo de la edad que tiene, deje una lınea punteada por el caminoque recorre y se abran las puertas del sitio, como en la figura 5.2.

5.2 Modifique los algoritmos necesarios del ejemplo 5.2 para que graficamente se muestrenlos disparos cuando se realicen (i.e. en las posiciones retornadas por la operacion delsistema aleatorio).

5.3 La formula de Pascua del ejemplo 4.6 funciona para cualquiera ano en el rangode 1900–2099 excepto para 1954, 1981, 2049 y 2076. Para estos 4 anos la formulaproduce una fecha que esta una semana despues. Escriba la funcion Pascua2() conlas modificaciones necesarias para que la formula funcione para todos los anos.

5.4 Un ano es bisiesto si es divisible por 4, a menos que sea un ano que no es divisiblepor 400 (1800 y 1900 no son bisiestos, mientras que 1600 y 2000 sı lo son). Escribala funcion Bisiesto() que retorne True si el ano que le entra es bisiesto, y retorneFalse de lo contrario.

63

Page 64: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

5 Nocion de Condicion

5.5 Escriba la funcion FechaValida() que tenga tres parametros correspondientes a unafecha (dıa, mes y ano), y retorne True si la fecha es valida, y False de lo contrario.Por ejemplo 〈dıa: 24, mes: 5, ano: 1962〉 es valida, pero 〈dıa: 31, mes: 9, ano: 2000〉no lo es (Septiembre solo tiene 30 dıas).

5.6 Los dıas del ano pueden numerarse del 1 al 365 (o 366). Este numero puede sercalculado en tres pasos usando un sistema de numeros enteros:

a) NumeroDia = 31(mes− 1) + dia

b) si el mes esta despues de Febrero, reste (4mes+ 23)/10

c) si es un ano bisiesto y despues de Febrero 29, sume 1

Escriba la funcion NumeroDia() que tome una fecha (igual que el problema anterior,es decir, representada en tres entradas dıa, mes y ano), verifique que es una fechavalida (usando la funcion del problema anterior), y calcule el numero asociado al dıadel ano.

64

Page 65: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

En la mayorıa de sistemas existen operaciones que se repiten una y otra vez. En el sistemasolar, por ejemplo, se ve que la traslacion de los planetas se repite, al igual que la rotacionde la Tierra; en un sistema de produccion las maquinas repiten un proceso de fabricacion;en la formula 1 los carros repiten un recorrido un numero partıcular de veces. Todas lasrepeticiones mencionadas se hacen hasta que el sistema llega un estado deseado (algunasde ellas son tantas que su cantidad podrıa entenderse como infinito).

En modelos computacionales las repeticiones pueden hacerse de manera explıcita oimplıcita, es decir, con estructuras que controlan el flujo de la ejecucion o con aplica-ciones circulares de funciones que vayan reduciendo las entradas hasta un caso base. Unarepeticion explıcita es comunmente llamada iteracion mientras que la aplicacion circular deuna funcion (repeticion implıcita) es denominada recursion. A continuacion se vera cadauna de ellas.

6.1. Iteracion

Un ciclo es una secuencia de aplicacion de operaciones que se especifican una sola vez Ciclopero son ejecutadas un numero determinado de veces de manera sucesiva. Cada repeticionde la secuencia es llamada una iteracion. El estado en el que queda el sistema despues de Iteracionuna iteracion resulta ser el estado inicial de la siguiente iteracion. Las iteraciones terminancuando se llega a un estado particular, es decir, se continua la ejecucion del ciclo mientrasse cumpla una condicion. Por ejemplo, la Tierra seguira dando vueltas alrededor del Solmientras el sistema solar se encuentre en un estado en el que el Sol exista, i.e. mientrasse cumpla la condicion de que el Sol siga ahı; los corredores de la formula 1 dan vueltasmientras el sistema se encuentre en un estado en el que los corredores no hayan dado unnumero particular de vueltas, i.e. mientras se cumpla la condicion de que el numero devueltas de los corredores sea menor a un numero k.

En modelos computacionales funciona igual. Supongamos que queremos crear un juegomuy simple de adivinar un numero del 1 al 100. El jugador que quiere adivinar el numerosolo tiene cinco oportunidades de adivinar. Cada vez que el jugador intenta adivinar se leda una pista que consiste en decirle si el numero a adivinar es menor o mayor al numeroque acaba de decir. El algoritmo 6.1 codifica el juego anterior.

65

Page 66: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

def adivinar(n): "Procedimiento para jugar a adivinar un numero" # Primera oportunidad numero = input("Cual es el numero?") if numero == n: print("Adivino!!!") else: if numero > n: print("El numero es menor") else: print("El numero es mayor") # Segunda oportunidad numero = input("Cual es el numero?") if numero == n: print("Adivino!!!") else: if numero > n: print("El numero es menor") else: print("El numero es mayor") # Tercera oportunidad numero = input("Cual es el numero?") if numero == n: print("Adivino!!!") else: if numero > n: print("El numero es menor") else: print("El numero es mayor") # Cuarta oportunidad numero = input("Cual es el numero?") if numero == n: print("Adivino!!!") else: if numero > n: print("El numero es menor") else: print("El numero es mayor") # Quinta oportunidad numero = input("Cual es el numero?") if numero == n: print("Adivino!!!") else: print("Perdio, el numero era" + str(n))

Algoritmo 6.1: Juego de adivinar un numero, sin ciclo

66

Page 67: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6.1 Iteracion

Si se aprecia bien el algoritmo de adivinar un numero, puede detallarse que una porciondel codigo se repite varias veces haciendo que el codigo se torne aburrido y sin elegancia.Adicionalmente, si el juego se extiende un poco, por ejemplo si el numero de intentos seincrementa, la implementacion de este algoritmo se vuelve inmanejable. Por esta razones mas conveniente utilizar un ciclo en este problema. El algoritmo 6.2 es equivalente alanterior algoritmo solo que utilizando ciclos. Utilizamos una variable temporal llamadaoportunidad para saber cuantas veces se ha repetido el ciclo, y mientras dicha variable seamenor o igual a cinco repetimos el proceso de pedir un numero y saber si lo adivino o no.Es de notar que cuando se adivina el numero se actualiza dicha variable temporal a cincopara que el ciclo termine sin realizar el resto de iteraciones.

def adivinar(n): "Procedimiento para jugar a adivinar un numero" oportunidad = 1 while oportunidad <= 5: numero = input("Cual es el numero?") if numero == n: print("Adivino!!!") oportunidad = 5 else: if oportunidad == 5: print("Perdio, el numero era" + str(n)) else: if numero > n: print("El numero es menor") else: print("El numero es mayor") oportunidad = oportunidad + 1

Algoritmo 6.2: Juego de adivinar un numero, con ciclo

Tal como puede verse en los anteriores algoritmos, para solicitar un dato al usuario eimprimir informacion en pantalla, pueden usarse tres operaciones basicas de entrada ysalida, las cuales pueden verse en el cuadro 6.1.

El flujo de ejecucion del algoritmo 6.2 (figura 6.1) muestra la semantica de un ciclo: elcuerpo de un ciclo se ejecuta repetidamente mientras la condicion sea cierta. Una vez lacondicion sea falsa el ciclo termina. Cabe anotar que la condicion de un ciclo, en este caso,se prueba al comienzo del ciclo (llamado ciclo while ), lo que hace que si inicialmente la Ciclo while

condicion es falsa, no se ejecute nada del cuerpo del ciclo.1

1Existen otros tres tipos de ciclo: (1) aquel en el que la condicion se prueba al final del ciclo, lo que

67

Page 68: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

adivinar(n)

oportunidad = 1

¿numero == n?

numero = input()

¿oportunidad <= 5?

Cierto

print() oportunidad = 5 ¿oportunidad == 5?

Cierto Falso

print() ¿numero > n?

print() print()

oportunidad = oportunidad + 1

Cierto

Cierto

Falso

Falso

Falso

n

Figura 6.1: Flujo de ejecucion de la funcion adivinar()

garantiza que el cuerpo del ciclo se ejecute por lo menos una vez (ciclo do-while), (2) aquel en el queno se prueba una condicion sino que se especifica explıcitamente cuantas iteraciones se haran en el ciclo(ciclo for) y (3) aquel en el que se hace una iteracion sobre los elementos de una lista (ciclo for-each).

68

Page 69: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6.1 Iteracion

Operacion Accion

input(t) Solicita al usuario un dato por medio del texto t y retorna lo queel usuario entre con el tipo de dato apropiado

raw input(t) Solicita al usuario un dato por medio del texto t, pero retorna loque el usuario entre como una cadena de texto

print(t) Imprime en pantalla el texto t

Cuadro 6.1: Operaciones basicas de entrada y salida

Los siguientes ejemplos muestran otros modelos computacionales que usan ciclos y lasoperaciones del cuadro 6.1.

Ejemplo 6.1El juego Triqui (Tic-Tac-Toe en ingles) consiste en una grilla de 3× 3, donde dos jugado-res X y O se turnan colocando su marca en una posicion vacıa de la grilla. Cuando unjugador logra colocar tres de sus marcas en lınea (vertical, horizontal o diagonal) gana eljuego. Luego, cada jugador lo que debe hacer es escoger una posicion y marcarla, y esto sedebe hacer mientras el juego no haya terminado (i.e. no haya un ganador o el tablero noeste lleno).

p1 p2 p3

p4 p5 p6

p7 p8 p9

Figura 6.2: Posiciones del juego Triqui

El algoritmo 6.3 muestra el codigo incompleto del juego. Dicho algoritmo esta dividido entres partes: la inicializacion de las variables locales, el juego como tal y la finalizacion dondese conoce si hubo un ganador o quedo empatado el juego. En la primera parte puede verseque el juego de Triqui se considera como un conjunto de nueve posiciones (p1 . . . p9) comoen la figura 6.2. Cada posicion, inicialmente con la cadena vacıa, puede contener el sımbolodel jugador (X o O). Como el juego es una secuencia de turnos, donde cada jugador realiza

En el capıtulo 7 se vera el ciclo for-each.

69

Page 70: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

def JuegoTriqui(): "Programa para jugar Triqui" # Inicializa las variables locales jugador = "X" p1 = p2 = p3 = p4 = p5 = p6 = p7 = p8 = p9 = "" # Juego while not TriquiTerminado(p1,p2,p3,p4,p5,p6,p7,p8,p9): jugada = input(jugador + ", escribe tu posicion") if jugada == 1: p1 = jugador elif jugada == 2: p2 = jugador elif jugada == 3: p3 = jugador elif jugada == 4: p4 = jugador elif jugada == 5: p5 = jugador elif jugada == 6: p6 = jugador elif jugada == 7: p7 = jugador elif jugada == 8: p8 = jugador elif jugada == 9: p9 = jugador ImprimirTriqui(p1,p2,p3,p4,p5,p6,p7,p8,p9) if jugador == "X": jugador = "O" else: jugador = "X"

# Final del Juego y Ganador ganador = QuienGanoTriqui(p1,p2,p3,p4,p5,p6,p7,p8,p9) if ganador == "X": print("Gano la X") elif ganador == "0": print("Gano la O") else: print("Empatado")

Algoritmo 6.3: Juego de Triqui incompleto

70

Page 71: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6.1 Iteracion

la misma accion (decide en que posicion escribe su sımbolo) hasta que termine el juego,esto se representa con segunda parte del algoritmo: mientras que el juego no esta termi-nado (la negacion de lo que retorna la funcion TriquiTerminado()) se pide al jugador laposicion donde decide colocar su sımbolo, se actualiza el tablero cambiando los valores delas variables locales, se imprime (con la funcion ImprimirTriqui()) y se cambia el turno.En la ultima parte se determina quien gana el juego con la funcion QuienGanoTriqui() yse imprime el resultado.

? ? ?

Ejemplo 6.2En un negocio de venta de productos al detal (e.g. una tienda de barrio, un supermercado orestaurante) un cliente paga por un producto y si el dinero que entrega es mayor al preciodel producto, la empresa debe devolverle al cliente la cantidad excedente de dinero (elcambio). Dicha cantidad debe ser desglosada en una denominacion que sea factible dadaslas restricciones de billetes y monedas que existen, por ejemplo, si el excedente es 12500,pero solo se tienen billetes de 10000, entonces no es posible dar el cambio, pero si se tienenbilletes de 10000, de 2000 y monedas de 500, entonces el cambio es factible de dar.

def desglose(): "Procedimiento que imprime el desglose de una cantidad de dinero" producto = 17500 dinero = input("Con cuanto va a pagar?") cambio = dinero - producto

print("Su cambio es:") denominacion = 50000 while cambio > 0: cantidad = cambio/denominacion if cantidad > 0: print(str(cantidad) + "de" + str(denominacion)) cambio = cambio%denominacion denominación = siguienteDenominacion(denominacion)

Algoritmo 6.4: Desglose de dinero

El algoritmo 6.4 es un procedimiento que pide al cliente el dinero para comprar unproducto e imprime la cantidad de billetes y monedas que debe dar como cambio. Seasume un solo producto con un costo fijo de 17500 e igualmente se asume la funcionsiguienteDenominacion() la cual, dado un numero que representa una denominacion dedinero, retorna la siguiente denominacion en orden descendente, i.e. si se le pasa comoargumento (un billete de) 50000, retornara (un billete de) 20000 (es decir, la siguiente

71

Page 72: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

denominacion), si se le pasa 20000, retornara 10000, y ası sucesivamente.2

? ? ?

Existen algunos problemas cuya solucion requiere que en el cuerpo del ciclo, es decir, enmedio de las operaciones que se quieren repetir, hayan otros ciclos. Estos son comunmentellamados ciclos anidados.Ciclos Anidados

Ejemplo 6.3Supongamos que queremos imprimir la lista de los numeros primos del 1 al n. Para haceresto debemos hacer un ciclo desde 1 hasta n imprimiendo el numero i (1 ≤ i ≤ n) encada iteracion. Sin embargo i se debe imprimir solo si es primo y esto lo sabemos si dichonumero es divisible solo entre 1 y el mismo, es decir, si el residuo de la division entre i ytodos los numeros entre 2 y i−1 es diferente de cero. Para esto ultimo debemos hacer otrociclo. El algoritmo 6.5 muestra el anterior procedimiento.

def primos(n): "Procedimiento que imprime los números primos de 1 a n" i = 1 while i < n: esprimo = True j = 2 while j <= i-1: if i%j == 0: esprimo = False j = j + 1 if esprimo == True: print(i) i = i + 1

Algoritmo 6.5: Imprime la lista de numero primos entre 1 y n

? ? ?

Es normal que en algunos problemas el objetivo que se quiere lograr al realizar un ciclose cumpla antes de terminar el ciclo, es decir, cuando todavıa la condicion es cierta. Para

2Es de notar que en el algoritmo 6.4 el desglose comienza desde la denominacion mas alta hasta la maspequena. Esta es la forma mas simple de hacerlo, pero no es la unica. Un estudiante puede afirmar quese podrıa dar cambio de 12500 solo con monedas de 500 y no como se menciono arriba. Lo importanteaquı es saber que el problema de encontrar todos los posibles desgloses de dinero es un problemacombinatorio, y por lo tanto, muy difıcil de resolver.

72

Page 73: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6.1 Iteracion

estos casos resulta ineficiente continuar realizando iteraciones ya que lo que se pretendıa yase ha cumplido. Hay dos posibles soluciones para estos problemas: (1) forzar manualmentea que se incumpla la condicion del ciclo, o (2) usar una instruccion de rompimiento. Unrompimiento3 es una estructura de control que altera la forma de proceder de una itera- Rompimientocion, causando que el ciclo mas interno en el que se encuentra el rompimiento se termineinmediatamente cuando es ejecutado.

De igual manera, en algunos ciclos resulta util que en algun punto de la iteracion el flujode ejecucion se mueva a la siguiente iteracion sin continuar mas alla en el cuerpo de laactual iteracion. Estas estructuras de control son llamadas continuaciones. Continuacion

En el ejemplo 6.4 se muestra una situacion comun donde el uso de los rompimientos ycontinuaciones es adecuado.

Ejemplo 6.4Supongamos que necesitamos hacer un interpretador on-line del lenguaje de programacionPython. Esta es una tarea bastante laboriosa y requiere un conocimiento muy avanzado,por lo que queremos empezar simplemente quitando los comentarios, ya que estos, pordefinicion, son solo anotaciones y siempre son ignorados por los interpretadores. Para esto,entonces, debemos pedir al usuario que vaya ingresando lınea por lınea, el codigo del pro-grama que esta desarrollando, y cada vez que el usuario escribe una lınea, revisar el primercaracter de dicha lınea y si es un sımbolo “#” significa que esa lınea es un comentario yno debe ser interpretada. El algoritmo 6.6 muestra este procedimiento.

Puede notarse que la condicion del ciclo es la constante True, esto significa que la con-dicion siempre sera cierta y por lo tanto el numero de iteraciones esta indeterminado. Loanterior es necesario ya que de antemano no se sabe cuantas lıneas de codigo va a ingre-sar el usuario. Una vez se obtiene la lınea de codigo (un texto), se pregunta si el primercaracter de dicho texto es el sımbolo “#” y si la respuesta es afirmativa no hay necesidadde seguir con el resto del cuerpo del ciclo sino que simplemente se vuelve a pedir una lıneade codigo. Si la respuesta es negativa se revisa si lo que hizo fue presionar enter en cuyocaso se revisa si se ha presionado enter dos veces seguidas y se termina la interpretacion,es decir, se interrumpe el ciclo. Si no pasa lo anterior, entonces se aplica el procedimientopara interpretar el codigo que se ha introducido, el cual no sera implementado aquı.

? ? ?

3Hasta el dıa de hoy existe una fuerte discusion sobre si usar rompimientos es una buena o mala practica deprogramacion. Nosotros pensamos que todo depende del uso que se haga de la instruccion, e invitamos alos lectores a desarrollar varios ejemplos usandola y leer el famoso artıculo de Donald Knuth, “StructuredProgramming with go to Statements” [2] para sacar sus propias conclusiones.

73

Page 74: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

def quitarComentarios(): "Procedimiento que recibe lineas codigo en python" "las envia a interpretar, excepto los comentarios" print("Comienzo de la Interpretacion") enter = 1 # Ciclo para capturar todas las lineas while True: # Pide una linea de codigo al usuario linea = raw_input(">>> ")

# Verifica si la linea es un comentario if string.find(linea,"#") == 1: continue # Verifica si termina el codigo if linea == "": if enter == 2: print("Fin de la Interpretacion") break else: enter = enter + 1 # Envia la linea a interpretar y continua else: Interpretar(linea) enter = 1

Algoritmo 6.6: Recibe lıneas de codigo y quita los comentarios

6.2. Recursion

A diferencia de la repeticion por medio de iteracion, la repeticion por medio de recursionno cambia el estado del sistema en cada repeticion. Lo que hace es abstraer el codigo arepetir y luego repite la aplicacion de dicha abstraccion reduciendo los argumentos en cadarepeticion hasta cumplir una condicion. De esta manera la recursion hace que el problemaque se esta resolviendo se divida en dos o mas piezas conceptuales (i.e. idea matematicade dividir y conquistar), cada una de ellas siendo una version mas pequena del problemaoriginal.

Los fractales son ejemplos reales de la idea de recursion. En la figura 6.34 puede verseun helecho, el cual esta constituido de helechos con una medida mas pequena, que a su vez

4Imagen tomada de http://www.fresh-paper.com/

74

Page 75: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT6.2 Recursion

estan constituidos de helechos mas pequenos, y ası sucesivamente.

Figura 6.3: Fractal

Como en recursion el conjunto de operaciones que se quiere repetir es abstraıdo en unprocedimiento o funcion, la forma de hacer repeticion es aplicando dicho procedimiento ofuncion dentro de la misma abstraccion. De allı que la nocion de recursion sea descrita Recursioncomo una operacion definida en terminos de sı misma. Por ejemplo, encontrar el factorialde un numero n es igual a encontrar el factorial del numero anterior, n− 1, y multiplicarsu resultado por n, es decir, fact(n) = fact(n− 1)× n.

Sin embargo, si desarrollamos la recursion del factorial ası como esta: fact(n) = n ×

75

Page 76: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

fact(n− 1), podemos ver que es infinita, es decir, nunca para:

fact(n) = n× fact(n− 1)

fact(n− 1) = (n− 1)× fact(n− 2)

fact(n− 2) = (n− 2)× fact(n− 3)

...

Para evitar esto es necesario garantizar que en algun punto la recursion se detenga. Esepunto donde la recursion para es llamado el caso base. El caso base de la funcion factorial esel factorial de cero, ya que esta funcion no esta definida para numero negativos. Entonces sidecimos que fact(0) = 1, vemos que la funcion general (tambien llamada paso de reduccion)funciona hasta que llega a este punto, donde se termina la recursion. La implementacioncompleta de la funcion factorial esta en el algoritmo 6.7.

def factorial(n): "Funcion que halla el factorial de un numero" if n == 0: return 1 else: return n * factorial(n-1)

Algoritmo 6.7: Halla el factorial de un numero n

Seguir el flujo de ejecucion de un algoritmo recursivo no es algo intuitivo ya que esnecesario estar muy atento al nivel de recursion en el que se encuentra la ejecucion. Elnivel de recursion esta dado por el numero de aplicaciones del paso de reduccion: cadavez que se aplica el paso de reduccion se aumenta el nivel de recursion hasta que se llegaal caso base, una vez allı se comienza a devolver en los niveles hasta volver a la primeraaplicacion (nivel cero). La figura 6.4 muestra graficamente el flujo de la aplicacion de lafuncion factorial del algoritmo 6.7 para n = 5. Cada cuadro de la figura representa unaaplicacion de la funcion factorial(); cuando se hace la primera aplicacion (nivel 0), n esigual a 5, luego la condicion es falsa y el flujo de ejecucion se va por el paso de reduccion(return 5*factorial(n-1)). Como el resultado de factorial(5-1) no se conoce, estohace que se haga una nueva aplicacion de la funcion y, por lo tanto, aumente el nivel derecursion (nivel 1). En esta nueva aplicacion n es igual a 4, entonces la condicion es falsa y,con factorial(4-1) desconocido, de nuevo el flujo se va por el paso de reduccion, se haceuna nueva aplicacion de la funcion (nivel 2). Esto se repite tres veces mas hasta que en laaplicacion de la funcion n sea igual a cero; en este caso la condicion es cierta y entonces el

76

Page 77: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT6.2 Recursion

¿n == 0?

return 1 return 5 * factorial(n-1)

Cierto Falso

factorial(5)nivel 0

n=5

¿n == 0?

return 1 return 4 * factorial(n-1)

Cierto Falso

factorial(4)nivel 1

n=4

retorna 24

retorna 120

¿n == 0?

return 1 return 3 * factorial(n-1)

Cierto Falso

factorial(3)nivel 2

n=3

retorna 6

¿n == 0?

return 1 return 2 * factorial(n-1)

Cierto Falso

factorial(2)nivel 3

n=2

retorna 2

¿n == 0?

return 1 return 1 * factorial(n-1)

Cierto Falso

factorial(1)nivel 4

n=1

retorna 1

¿n == 0?

return 1 return n * factorial(n-1)

Cierto Falso

factorial(0)nivel 5

n=0

retorna 1

Figura 6.4: Flujo de ejecucion de la funcion factorial(5)

77

Page 78: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

flujo de ejecucion cambia y la funcion, en el nivel 5 de recursion, retorna 1. Este cambio enel flujo hace que se empiece a conocer el resultado de las aplicaciones de las funcion: en elnivel 4, factorial(1-1) es igual a 1, de allı que la funcion factorial en el nivel 4 retorne1× 1 = 1; este resultado hace que se conozca factorial(2-1) y se retorne 2× 1 = 2 en elnivel 3; y ası sucesivamente hasta volver al nivel 0 donde se retornara el resultado final.

A continuacion se muestran otros ejemplos de algoritmos recursivos.

Ejemplo 6.5Cuenta la leyenda que en un templo de Hanoi, bajo la cupula que senala el centro del mundo,hay una bandeja de bronce con tres largas agujas. Al crear el mundo, Dios coloco en unade ellas sesenta y cuatro discos de oro, cada uno de ellos mas pequeno que el anterior hastallegar al de la cima. Dıa y noche, incesantemente, los monjes transfieren discos de unaaguja a otra siguiendo las inmutables leyes de Dios, que dicen que debe moverse cada vezel disco superior de los ensartados en una aguja a otra y que bajo el no puede haber undisco de menor radio. Cuando los sesenta y cuatro discos pasen de la primera aguja a otra,todos los creyentes se convertiran en polvo y el mundo desaparecera con un estallido.5

El objetivo es modelar computacionalmente este problema. La situacion inicial del pro-blema para cuatro discos esta en la figura 6.5.

Figura 6.5: Torres de Hanoi - Configuracion inicial

Y se desea pasar a la situacion final de la figura 6.6.

Figura 6.6: Torres de Hanoi - Configuracion final

5La leyenda fue inventada por De Parville en 1884, en “Mathematical Recreations and Essays”, un librode pasatiempos matematicos. La ambientacion era diferente: el templo estaba en Benares y el dios eraBrahma.

78

Page 79: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT6.2 Recursion

Aunque solo se puede tocar el disco superior de un monton, se debe pensar en el discodel fondo. Ese disco debe pasar de la primera aguja a la tercera, y para que eso sea posible,se debe alcanzar la configuracion de la figura 6.7.

Figura 6.7: Torres de Hanoi - Configuracion intermedia 1

Solo en ese caso se puede pasar el disco mas grande a la tercera aguja, es decir, alcanzarla configuracion de la figura 6.8.

Figura 6.8: Torres de Hanoi - Configuracion intermedia 2

Esta claro que el disco mas grande no se va a mover ya de esa aguja, pues es su destinofinal. La pregunta que surge entonces es: ¿Como se han pasado los tres discos superioresa la segunda aguja? Pues simple, pasar una pila de tres discos de una aguja a otra no esmas que el problema de las torres de Hanoi para una torre de tres discos. De este punto loque falta por hacer es mover la pila de tres discos de la segunda aguja a la tercera, y eso,nuevamente, es el problema de la torres de Hanoi para tres discos. Ahı aparece la recursion.

Resolver el problema de las torres de Hanoi con n discos requiere entonces:

resolver el problema de las torres de Hanoi con n − 1 discos, aunque pasandolos dela aguja inicial a la aguja libre;

mover el ultimo disco de la aguja en que estaba inicialmente a la aguja de destino;

y resolver el problema de las torres de Hanoi con n − 1 discos de la aguja libre a laaguja final.

Hay un caso trivial o caso base: el problema de la torres de Hanoi para un solo disco(basta con mover el disco de la aguja en la que este insertado a la aguja final).

79

Page 80: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

Los parametros que necesita el procedimiento son el numero de discos que vamos amover, la aguja origen y la aguja destino. Se identificara cada aguja con un numero. Elprocedimiento se encuentra en el algoritmo 6.8.

def torresHanoi(n, inicial, final): "Procedimiento para resolver el problema de las torres de Haoi" if n == 1: print("Mover el disco superior de la aguja " + str(inicial)) print("a la aguja " + str(final)) else: # Determinar cual es la aguja libre if inicial != 1 and final != 1: libre = 1 else: if inicial != 2 and final != 2: libre = 2 else: libre = 3

# Primer subproblema: mover n-1 discos de inicial a libre torresHanoi(n-1, inicial, libre)

print("Mover el disco superior de la aguja " + str(inicial)) print("a la aguja " + str(final))

# Segundo subproblema: mover n-1 discos de libre a final torresHanoi(n-1, libre, final)

Algoritmo 6.8: Imprime el proceso para solucionar las torres de hanoi de n discos

Ahora, para resolver el problema con n = 4 se hace el llamado al procedi-miento torresHanoi(4,1,3). El programa imprimira las ordenes correspondientes a losmovimientos de la figura 6.9.

? ? ?

La solucion para el problema de las torres de Hanoi esta bien, pero no muestra grafica-mente el proceso, es decir, solo describe textualmente los pasos para resolver el problema.Para los siguientes problemas vamos a introducir un sistema para desarrollar interfacesgraficas llamado Tkinter6. Una interfaz grafica es un espacio de interaccion entre una per-Interfaz Graficasona y un programa con imagenes en vez de comandos de texto. Algunas operaciones del

6El sistema Tkinter (“Tk Interface”) es la interfaz estandar de Python para el sistema grafico Tk GUItoolkit.

80

Page 81: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT6.2 Recursion

1) 2) 3) 4)

5) 6) 7) 8)

9) 10) 11) 12)

13) 14) 15) 16)

Figura 6.9: Torres de Hanoi - Proceso completo para n = 4

sistema de interfaces graficas Tkinter pueden verse en el cuadro 6.2.

Operacion Accion

Tk() Crea y retorna la ventana principal de un programaButton(v,text=t,command=a) Crea y retorna un nuevo boton en la ventana v con

texto t y que realiza la accion a cuando se oprimeLabel(v,text=t) Crea y retorna una nueva etiqueta en la ventana v

con texto t

Text(v,width=c) Crea y retorna un nuevo campo de texto en la ven-tana v para un numero de caracteres c

Canvas(v,width=w,height=h) Crea y retorna un nuevo campo de dibujo en laventana v de ancho w y alto h

pack() Toma el widget y lo hace visiblemainloop() Hace que la ventana se quede esperando los eventos

que puedan ocurrir hasta que se cierre la ventana

Cuadro 6.2: Operaciones basicas del sistema Tkinter

Ejemplo 6.6El Triangulo de Sierpinski es un fractal creado por Waclaw Sierpinski en 1915. El conceptodel Triangulo de Sierpinski es muy simple: Se toma un triangulo (usualmente, pero nonecesariamente, equilatero) como la primera imagen de la figura 6.10; se conectan lospuntos medios de cada lado para formar cuatro triangulos separados y se corta el triangulodel centro, como en la segunda imagen de la figura; para cada uno de los tres triangulos

81

Page 82: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

restantes se realiza el mismo proceso como en la tercera imagen de la figura; y se repite elproceso indefinidamente construyendo la imagen final de la figura.

...

Figura 6.10: Triangulo de Sierpinski

La construccion de este fractal muestra claramente una recursion que puede ser imple-mentada como la funcion sierpinski() del algoritmo 6.9. La idea de este algoritmo secentra en que el nivel de recursion en el que se encuentre el proceso determina el numerode triangulos a dibujar: si estamos en un nivel inicial (cero) solo se dibuja un triangulo, enel nivel uno se dibujan tres triangulos, en el nivel dos se dibuja nueve y ası sucesivamente.Lo importante a notar es que cada triangulo que se va a dibujar tiene una posicion parti-cular y un tamano especıfico, y entre mas alto sea el nivel, la posicion cambiara de maneramonotona y dicho tamano es mas pequeno (el tamano de un lado de cualquiera de los trestriangulos es la mitad del tamano de un lado del triangulo superior).

Los parametros del procedimiento sierpinski() incluyen el canvas y las coordenadasx y y donde sera dibujado el triangulo, el tama~no del triangulo a dibujar y el nivel en el quese encuentra la recursion. En el nivel cero simplemente se dibuja un triangulo usando elprocedimiento para crear polıgonos (vease el cuadro 6.3); en cualquier otro nivel se realizantres llamados recursivos, correspondientes a los tres triangulos que se deben dibujar dentrodel triangulo superior.

El procedimiento gui-sierpinski() en el algoritmo 6.9 recibe como parametro el nivelde profundidad del Triangulo de Sierpinski. Su proceso es simple: primero crea una ventanay se la asigna a la variable v; entonces dentro de dicha ventana crea un canvas (asignado ala variable miCanvas) de tamano 500×500 donde se dibujara el Triangulo de Sierpinski y sehace visible con la operacion miCanvas.pack(); luego se hace el llamado al procedimientopara construir y dibujar el triangulo enviando como argumento el canvas recien creado,la posicion dentro del canvas (100,400), el tamano del triangulo mas grande y el nivel deprofundidad; finalmente se aplica la operacion para dejar a la ventana v lista para cualquier

82

Page 83: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT6.3 Ejercicios

evento.

def sierpinski(canvas, x, y, tamano, nivel): "Procedimiento que dibuja el triangulo de sierpinski" if (nivel == 0): canvas.create_polygon(x, y, x+tamano, y, x+tamano/2, y-tamano*math.sqrt(3)/2, outline="black", fill="orange") else: sierpinski(canvas, x, y, tamano/2, nivel-1) sierpinski(canvas, x+tamano/2, y, tamano/2, nivel-1) sierpinski(canvas, x+tamano/4, y-tamano*math.sqrt(3)/4, tamano/2, nivel-1)

def gui-sierpinski(nivel): "Procedimiento que dibuja la ventana del triangulo de sierpinski" v = Tkinter.Tk() miCanvas = Tkinter.Canvas(v, width=500, height=500) miCanvas.pack() sierpinski(miCanvas, 100, 400, 300, nivel) root.mainloop()

Algoritmo 6.9: Dibuja el triangulo de Sierpinski

Puede intuirse entonces que si se quisiera crear un Triangulo de Sierpinski con unaprofundidad 4, se deberıa hacer la aplicacion del procedimiento gui-sierpinski(5).

? ? ?

6.3. Ejercicios

6.1 Complete el juego de Triqui con las operaciones que no estan implementadas:

TriquiTerminado() recibe como parametros las nueve posiciones de un tablerode Triqui y retorna True si alguno de los dos jugadores gano o si el tablero yaesta completo y ninguno de los jugadores gano, de lo contrario retorna False.

ImprimirTriqui() recibe como parametros las nueve posiciones de un tablerode Triqui e imprime el tablero de Triqui de una manera visualmente correcta(i.e. como se ve normalmente el juego).

83

Page 84: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

Operacion Accion

create arc(x0,y0,x1,y1) Construye un arco desde el punto(x0,y0) hasta el punto (x1,y1)

create bitmap(x,y,bitmap=b) Muestra el mapa de bits b en el punto(x,y)

create image(x,y,image=i) Muestra la imagen i en el punto (x,y)create line(x0,y0,x1,y1,...,xn,yn) Construye una lınea que va por la se-

rie de puntos (x0,y0), (x1,y1), . . . ,(xn,yn)

create oval(x0,y0,x1,y1) Construye el ovalo que calza en elrectangulo definido por los puntos(x0,y0) y (x1,y1)

create polygon(x0,y0,x1,y1,...,xn,yn) Construye un polıgono cuya geometrıaes especificada por los vertices defini-dos con los puntos (x0,y0), (x1,y1),. . . , (xn,yn)

create rectangle(x0,y0,x1,y1) Construye el rectangulo definido porlos puntos (x0,y0) y (x1,y1)

create text(x,y,text=t) Muestra el texto t en el punto (x,y)

Cuadro 6.3: Operaciones para dibujar en un Canvas de Tkinter

QuienGanoTriqui() recibe como parametros las nueve posiciones de un tablerode Triqui y retorna una cadena de texto solo con el caracter correspondiente alganador del juego (‘‘X’’ o ‘‘O’’). Si no hubo ganador, la funcion debe retornarun sımbolo diferente.

6.2 El juego de Triqui del algoritmo 6.3 tiene algunos problemas, por ejemplo un jugadorpuede seleccionar una posicion donde ya habıa un sımbolo, o si un jugador no ingresaun numero entre 1 y 9 (las posiciones del tablero), pierde el turno. Corrija estos yotros problemas que tiene el juego.

6.3 El algoritmo 6.4 tiene dos problemas, (1) si se paga con una cantidad menor alcosto del producto, no se da cambio, pero tampoco se especifica que le falta dineroy (2) la funcion siguienteDenominacion() no esta implementada. Solucione estosproblemas.

6.4 Asuma que en el problema del desglose de dinero se tiene una cantidad limitada debilletes y monedas. Modifique el algoritmo 6.4 para que se tenga en cuenta el numero

84

Page 85: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT6.3 Ejercicios

de billetes y monedas y, llegado el caso, imprima que no es posible dar el cambiodebido a que no se cuenta con las denominaciones necesarias.

6.5 Asuma que el algoritmo solucion al problema del desglose va a ser usado en unrestaurante. Complete el algoritmo para que muestre un menu de comida, le pida alusuario seleccionar la comida que quiera (pueden ser varios platos), luego le pase lacuenta y muestre el cambio dado lo que el cliente dio de dinero.

6.6 Mejore el algoritmo del punto anterior (6.5) haciendo que haya un numero n declientes, los cuales ven el menu, escogen la comida y pagan. Este nuevo algoritmodebe retornar la cantidad de dinero que pagaron todos los clientes del restaurante.

6.7 Muestre el flujo de ejecucion de la aplicacion del procedimiento torresHanoi(5,1,3).

6.8 Pruebe la funcion torresHanoi() haciendo el llamado con los 64 discos de la leyenda,es decir torresHanoi(64,1,3). ¿Cuantos movimientos deben hacer los monjes?

6.9 De manera general ¿cuantos movimientos son necesarios para resolver el problema conn discos? Para responder esta pregunta escriba una funcion NumMovimientosHanoi()

que reciba un numero y devuelva el numero de movimientos necesarios para resolverel problema de las torres de Hanoi con ese numero de discos (se debe utilizar lafuncion torresHanoi()).

6.10 Modifique el algoritmo 6.8 para mostrar graficamente el proceso de solucion de lasTorres de Hanoi. Puede usar el Mundo de la Tortuga o el sistema Tkinter.

85

Page 86: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

6 Nocion de Repeticion

86

Page 87: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

En el capıtulo 4 se describio la abstraccion como el proceso en el que datos y algorit-mos son agrupados dentro de una categorıa que los conecta. En este capıtulo veremos laabstraccion que involucra datos.

7.1. Listas

La abstraccion de datos, al igual que la abstraccion de control, permite “ocultar” infor-macion de manera que se presenten solo los datos relevantes a un contexto particular. Deesta forma se hace visible al usuario solo una interfaz de los datos mientras que los datoscomo tal se vuelven privados y son accedidos solo a traves de dicha interfaz. Las interfa-ces, en general, son herramientas computacionales que sirven como punto de interaccion Interfazentre componentes, los cuales pueden ser de bajo nivel como los sistemas operativos quepermiten interactuar piezas de hardware con programas, o de mas alto nivel como grafi-cas (que brevemente se describieron en el capıtulo anterior) y estructuras de datos. Unaestructura de datos es un grupo de piezas de informacion reunidas bajo un mismo nom- Estructura de Datos

bre. Su proposito es organizar eficientemente dicha informacion de manera que operacionescomo busqueda y ordenamiento se realicen de la mejor manera posible y se conserven laspropiedades matematicas que puedan existir en esas operaciones. Las estructuras de datoscomprenden, entre muchos otras, arreglos, registros, conjuntos, pilas, colas, arboles, grafosy tablas hash, pero quizas las mas usadas sean las listas.

Una lista es una secuencia de datos llamados elementos los cuales pueden ser accedidos Listadirectamente por medio de un ındice. Para una lista X, el primer elemento tiene ındicecero, es decir es el elemento X[0], el segundo elemento tiene ındice uno, o sea que es elX[1], y ası sucesivamente hasta el ultimo elemento cuyo ındice es igual al tamano de lalista menos uno, es decir que si n es el numero de elementos de la lista, el ultimo elementosera X[n− 1].

Para ejemplificar la nocion de lista y la necesidad de contar con ella, consideremosun juego simple como el ahorcado. Este juego consiste en dos jugadores, uno de ellospiensa en una palabra y dibuja lıneas que representan las letras de dicha palabra, y el otrojugador debe descifrar cual es esa palabra secreta. En cada turno el primer jugador diceuna letra y si esta letra pertenece a la palabra secreta el otro jugador escribira la letrasobre la correspondiente lınea, pero si la letra no pertenece a la palabra el segundo jugador

87

Page 88: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

dibujara una parte de un hombre ahorcado. Si el primer jugador puede adivinar la palabrasecreta antes que se dibuje por completo el ahorcado, este gana, de lo contrario pierde. Lafigura 7.1 muestra un juego de ahorcado: el primer jugador ha acertado 5 letras y falladoigual numero de veces, por esto el dibujo del ahorcado esta muy cerca de terminarse.

Letras Falladas:

U, S, E, T, L, B, V, K, Q

P A AO OR R NFigura 7.1: Juego Ahorcado

Es de notar que ahorcado es posible convertirlo en un juego de un jugador contra elcomputador ya que el segundo jugador que se nombro arriba solo se limita a interactuarcon las jugadas del primer jugador, es decir, solo selecciona una palabra y, cada vez queel primer jugador dice una letra, verifica dicha letra y realiza la accion correspondiente:escribir la letra en el espacio adecuado o dibujar una parte del cuerpo del ahorcado. Lapalabra seleccionada por el segundo jugador debe ser parte de un conjunto de palabrasque conoce, lo suficientemente grande para que se pueda jugar una y otra vez cambiandola palabra secreta y que ası el primer jugador no sepa cual es de manera anticipada. Siusaramos una variable para cada palabra, se tendrıa una cantidad absurda e inmanejablede variables, y si a eso le adicionamos las variables necesarias para conocer cuales son lasletras que ya se han probado, se complica aun mas el algoritmo. Por esto son indispensablesunas estructuras de datos que reunan y organicen las palabras y las letras sin necesidad decrear dicha cantidad de variables.

El procedimiento para jugar ahorcado se encuentra en el algoritmo 7.1. Se cuenta con treslistas listaPalabras, letrasAcertadas y letrasFalladas. El proposito de listaPalabrases intuitivo (aunque deberıa tener muchos mas elementos para hacer el juego mas diver-

88

Page 89: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7.1 Listas

def juegoAhorcado(): "Procedimiento para un juego de ahorcado" listaPalabras = ["abstraccion", "ciclo", "declaracion", "estado", "flujo", "implementacion", "grafica", "lista", "modelo", "parametro", "recursion", "sistema"] indice = random.randint(0, len(listaPalabras)-1) palabraSecreta = listaPalabras[indice] letrasAcertadas = [] letrasFalladas = [] juegoAcabado = False

# Dibuja la ventana inicial ventana = saludoInicial()

# Ciclo del juego while not juegoAcabado: # Dibuja/Actualiza el tablero dibujarTablero(ventana, palabraSecreta, letrasAcertadas, letrasFalladas)

# Pide una letra al jugador letra = pedirLetra(ventana)

# Procede de acuerdo a la letra dada letrasAcertadas.append(letra) if letra in palabraSecreta: # Chequea si encontro todas las letras num = 0 completoPalabra = True while num < len(palabraSecreta): if not palabraSecreta[num] in letrasAcertadas: completoPalabra = False break num = num + 1 if completoPalabra: acabarJuego(ventana, True) juegoAcabado = True else: # Chequea si se ha ahorcado if len(letrasFalladas) == 10: acabarJuego(ventana, False) juegoAcabado = True

Algoritmo 7.1: Juego ahorcado

89

Page 90: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

tido). Las otras dos listas sirven para llevar un registro de las letras que el jugador vadiciendo, en una van las letras que efectivamente se encuentran en la palabra secreta y enla otra aquellas que no.

Al inicio del juego se toma una palabra de manera aleatoria de la lista listaPalabras

y se asigna a la variable palabraSecreta. Luego se da un saludo inicial (en teorıa sedebe mostrar una splash screen1) con un procedimiento no implementado aquı llamadosaludoInicial(), y despues arranca el ciclo del juego: primero dibuja o actualiza el tablerocon el procedimiento dibujarTablero(), el cual debe mostrar una imagen como la figura7.1 dada la palabra secreta y las listas de registro de letras; acto seguido le pide una letraal jugador con la funcion pedirLetra(); por ultimo, de acuerdo a la letra dada se realizael proceso correspondiente, es decir, agregar la letra a la lista letrasAcertadas o a la listaletrasFalladas y, si es el caso, terminar el juego ya sea porque encontro todas las letrasde la palabra secreta o porque fallo diez letras y se termino de dibujar el ahorcado.

En el algoritmo 7.1 puede verse el uso de algunas operaciones para manejar listas comoappend y in. Estas y otras operaciones basicas del sistema de listas se pueden ver en elcuadro 7.1.

Operacion Accion

append(x) Agrega el elemento x al final de la listainsert(i,x) Inserta el elemento x en la posicion i de la listaremove(x) Borra el primer elemento de la lista que tenga valor xpop(i) Retorna y borra el elemento de la lista cuya posicion es i

len(l) Retorna el tamano de la lista l

x in l Retorna un booleano que indica si el elemento x se encuentraen la lista l

range(n) Retorna una lista con los numeros del cero al n-1 comoelementos

Cuadro 7.1: Operaciones basicas del sistema de listas

Las operaciones saludoInicial(), dibujarTablero(), pedirLetra() y acabarJuego()

aplicadas en el algoritmo 7.1 realizan procesos graficos, por lo que pueden ser implemen-tadas usando el sistema TkInter. Sin embargo, dado que ahorcado es un juego, podemosusar un sistema especializado en la construccion de juegos. De allı que vamos a introducirpygame, un sistema para el desarrollo de juegos.

1Una splash screen o pantalla de inicio, es una imagen que se muestra al inicio de un programa pa-ra presentar el logo y/o tıtulo del programa, y ademas para notificar al usuario que el programa seesta cargando.

90

Page 91: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7.1 Listas

Pygame2 es una librerıa disenada para construir software multimedia. Cuentacon operaciones para manejo de video y sonido que permiten desarrollar videojuegos. De igual manera, pygame tiene funciones para manejar graficos 2D,musica, entradas, fuentes, deteccion de colisiones, graficos 3D con OpenGL,joysticks, pelıculas, etc.

Las operaciones basicas y algunas constantes de pygame se pueden ver en el cuadro 7.2.

Operacion Accion

init() Inicializa todo el sistema pygamequit() Termina el sistemadisplay.set mode(r) Inicializa una ventana para trabajar y retorna un display

(dispositivo de salida). Su parametro r representa la resolu-cion de la ventana (una pareja (w, h) donde w es el ancho yh es el alto de la ventana)

display.update() Actualiza la ventanaevent.get() Retorna una lista con los eventos que recibe el sistemamouse.get pos() Retorna una pareja, i.e. lista de dos elementos, con la posi-

cion (x, y) de la ventana donde se hizo clic con el mousefont.SysFont(f,t) Retorna la fuente con tipo f y tamano t para ser usadadraw.rect(s,c,r,w) Dibuja un rectangulo en la superficie s con color c, anchura

del borde w (w=0 significa que el rectangulo estara lleno delcolor c) y cuyos puntos se encuentran en las posiciones dadaspor los elementos de la lista r

image.load(f) Carga y retorna la imagen contenida en el archivo f

transform.scale(i,(w,h)) Toma la imagen i y la escala a las nuevas dimensiones (w,h)

mixer.music.load(w) Carga el archivo de sonido w

mixer.music.play() Interpreta el archivo de sonido cargado previamente

Constantes

QUIT MOUSEMOTION K RETURNKEYUP MOUSEBUTTONUP K SPACEKEYDOWN MOUSEBUTTONDOWN K A3

Cuadro 7.2: Operaciones basicas y algunas constantes del sistema Pygame

2http://www.pygame.org/3Las constantes para todos los demas botones del teclado tienen la misma forma: K <tecla>.

91

Page 92: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

A continuacion, en el ejemplo 7.1, se desarrollan las funciones y procedimientos no im-plementados del procedimiento juegoAhorcado() en el algoritmo 7.1, usando operacionesdel sistema pygame.

Ejemplo 7.1

La funcion saludoInicial() (algoritmo 7.2) comienza inicializando el sistema pygame yconstruyendo la ventana principal del programa (que puede verse en la figura 7.2). Despuesde esto selecciona la fuente con la que se escribira en esta funcion, que en este caso es“Arial” de tamano 30. Acto seguido asigna las variables que contienen las frases que se vana imprimir en la pantalla. Dichas frases deben ser renderizadas, es decir, se deben generarimagenes a partir de unos modelos, que en este caso son texto. La renderizacion se produceaplicando la operacion render() del modulo de fuentes del sistema (las operaciones de estemodulo pueden verse en el cuadro 7.3). Luego comienza un ciclo infinito en el cual primerose borra completamente la pantalla, se se muestran las frases renderizadas y se espera aque el usuario realice un evento. Si el evento resulta ser oprimir una tecla y esa tecla esRETURN o ENTER, entonces el ciclo se rompe con la instruccion break y se termina lafuncion retornando la ventana principal del programa.

Figura 7.2: Saludo Inicial en el juego Ahorcado

Una ventana en el sistema pygame es una superficie (surface en ingles) que sirve paraalmacenar imagenes. Dichas imagenes deben ser transferidas a la superficie como mapasde bits (de allı que el texto deba ser renderizado para poder ser mostrado, como se men-ciono anteriormente). La posicion donde se quiere transferir la imagen es una coordenada(x, y) donde los valores de x y y van de (0, 0) (la esquina superior izquierda) a (w, h), la

92

Page 93: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7.1 Listas

esquina inferior derecha. En el cuadro 7.4 pueden detallarse dos operaciones de superficiesen pygame.

def saludoInicial(): "Funcion que inicializa el sistema grafico" "y muestra la ventana inicial" # Inicializa el sistema pygame.init() ventana = pygame.display.set_mode((640, 480))

# Selecciona el tipo de fuente fuente = pygame.font.SysFont("arial", 30)

# Construye las frases titulo = fuente.render("JUEGO AHORCADO", True, (0,0,0)) subtitulo = fuente.render("Presione enter para empezar", True,(0,0,0))

# Ciclo para que el usuario lea el saludo de inicio presionaEnter = False while True: # Muestra la informacion ventana.fill((255,255,255)) ventana.blit(titulo,(180,180)) ventana.blit(subtitulo,(140,240))

# Maneja el evento de presionar una tecla for e in pygame.event.get(): if e.type == pygame.KEYDOWN: if e.key == pygame.K_RETURN: presionaEnter = True if presionaEnter: break

# Actualiza el sistema pygame.display.update()

return ventana

Algoritmo 7.2: Pantalla de inicio del juego ahorcado

Por otro lado, los eventos que ocurren en un programa de pygame tienen un tipo yuna llave (o nombre). El tipo de los eventos identifica la accion que el usuario realiza,por ejemplo, el tipo QUIT para salir, KEYDOWN y KEYUP para presionar o soltar un botondel teclado, y MOUSEMOTION, MOUSEBUTTONUP y MOUSEBUTTONDOWN para mover el mouse,

93

Page 94: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

Operacion Accion

render(t,a,c) Crea una nueva superficie donde se imprime el texto t concolor c (una tipleta que representa el color en formato RGB).El argumento a es un booleano que especifica si el textollevara antialias

size(t) Retorna las dimensiones necesarias (ancho,alto) para impri-mir el texto t

set underline(b) De acuerdo al argumento booleano b, subraya el texto aimprimir

set bold(b) De acuerdo al argumento booleano b, pone en negrilla eltexto a imprimir

set italic(b) De acuerdo al argumento booleano b, pone el texto a impri-mir en italica

Cuadro 7.3: Operaciones basicas del modulo de fuentes en el sistema Pygame

Operacion Accion

blit(s,d) Dibuja la imagen s en la posicion d de la superficiefill(c) Llena la superficie con el color c

Cuadro 7.4: Operaciones basicas del modulo de superficies en el sistema Pygame

presionar un boton o soltarlo. La llave del tipo determina exactamente la fuente del evento,por ejemplo, K RETURN para la tecla RETURN o ENTER del teclado, K A para la tecla A,y ası sucesivamente.

Lo eventos que van sucediendo son almacenados temporalmente en una lista, la cuales retornada por la funcion pygame.event.get(). Esta lista puede recorrerse, es decir,conocer sus elementos, usando un ciclo while, sin embargo, como se dijo en el capıtulo 6,existe otro tipo de ciclo que realiza iteraciones sobre los elementos de una lista, llamadociclo for-each . Este tipo de ciclo tiene dos particularidades: (1) en cada iteracion unaCiclo for-each

variable definida en el ciclo toma el valor de un elemento de la lista en el orden en quese encuentran los elementos en la lista, y (2) no se tienen que manejar los ındices delos elementos de la lista. Estas caracterısticas hacen valioso este tipo de ciclo ya que elprogramador no se preocupa por los ındices de la lista los cuales pueden llevar facilmentea un error en el programa (e.g. tratar de acceder un elemento inexistente).

El procedimiento dibujarTablero() que se muestra en el algoritmo 7.3, tiene comoparametros la ventana donde se dibujara, la palabra secreta y las listas de letras acertadasy letras falladas. Como el tamano de las letras que se van encontrando de la palabra secre-ta y el tamano de las letras falladas son distintos, primero se crean dos fuentes. Luego se

94

Page 95: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7.1 Listas

def dibujarTablero(ventana, palabraSecreta, letrasAcertadas, letrasFalladas): "Procedimiento que dibuja/actualiza el tablero del juego" # Selecciona los tipos de fuente fuente1 = pygame.font.SysFont("arial", 35) fuente2 = pygame.font.SysFont("arial", 25)

# Crea la frase que va a mostrar dadas las letras acertadas palabraAMostrar = "" for letra in palabraSecreta: if letra in letrasAcertadas: palabraAMostrar = palabraAMostrar + \ string.capitalize(letra) + " " else: palabraAMostrar = palabraAMostrar + "_" + " "

# Borra completamente la ventana ventana.fill((255,255,255))

# Dibuja el estado del ahorcado dadas las letras falladas if len(letrasFalladas) > 0: ventana.blit(pygame.image.load(os.path.join("ahorcado" + \ str(len(letrasFalladas)) + \ ".jpg")),(80,90))

# Muestra la frase "Letras Falladas" ventana.blit(fuente2.render("Letras Falladas:",True,(0,0,0)), \ (330,100))

# Muestra las letras falladas i=0 if letra in letrasFalladas: ventana.blit(fuente2.render(string.capitalize(letra),True, \ (0,0,0)),(330+i,150)) i = i + 30

# Dibuja la frase actual ventana.blit(fuente1.render(palabraAMostrar,True,(0,0,0)), \ (100,380))

# Actualiza el sistema pygame.display.update()

Algoritmo 7.3: Dibuja/Actualiza la pantalla principal del juego ahorcado

95

Page 96: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

construye la palabra que se va a mostrar recorriendo cada una de las letras de la palabrasecreta y adicionandolas (en mayuscula) a una cadena de caracteres si la letra se encuentraen la lista de letras acertadas. Si la letra no se encuentra en la lista entonces se adicio-na una lınea de subrayado. Acto seguido se limpia la pantalla y se dibuja el estado delahorcado. Este estado es dibujado cargando una imagen previamente hecha cuyo nombrees ahorcadoX.jpg donde X es un numero entre 1 y 10 (estas imagenes, que pueden verseen la figura 7.3, se encuentran como archivos en el sistema operativo y son cargadas enel programa por medio del modulo de rutas de archivos del sistema os cuyas operacionesbasicas pueden verse en el cuadro 7.54). Despues se muestran las letras fallas y el estadoactual de la palabra secreta. Por ultimo se actualiza el sistema.

(a) (b) (c) (d) (e) (f) (g) (h) (i) (j)

Figura 7.3: Etapas del ahorcado

Operacion Accion

path.exists(p) Retorna true si la ruta p existe, false de lo contrariopath.basename(p) Retorna el nombre base de la ruta p (e.g. si

el sistema operativo actual es linux y p es/usr/local/bin/programa entonces el resultado deaplicar esta funcion es programa)

path.dirname(p) Retorna el nombre del directorio de la ruta p (e.g.si el sistema operativo actual es windows y p esC:\windows\temp\programa entonces el resultado deaplicar esta funcion es C:\windows\temp)

path.join(p1,p2,p3,...) Junta las rutas de archivos p1,p2,... de manera ade-cuada (e.g. si el sistema operativo actual es windows,p1 es C: y p2 es temp, entonces el resultado de aplicaresta funcion es C:\temp)

Cuadro 7.5: Operaciones basicas del modulo de rutas de archivos del sistema operativo

4En el capıtulo ?? se profundizara un poco en el sistema os y se usara el modulo de manejo de archivosy directorios del sistema operativo.

96

Page 97: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7.1 Listas

Las letras que el jugador quiere probar en el juego las solicita simplemente presionando latecla correspondiente. En el algoritmo 7.4 se muestra el proceso para hacer esto. Se defineun ciclo infinito para esperar indefinidamente hasta que el usuario realice algun evento. Siel evento realizado es presionar una tecla, se verifica si esa tecla corresponde a una letra ysi esto es cierto entonces se retorna la letra como una cadena de caracteres. De lo contrario,es decir si la tecla no es una letra, hacemos la aplicacion de la operacion para interpretarun sonido, que en este caso es un archivo de tipo wav que contiene un beep.

def pedirLetra(ventana): "Funcion que retorna la letra que el usuario ha ingresado" # Ciclo para que el usuario ingrese la letra while True: for e in pygame.event.get(): if e.type == pygame.KEYDOWN: # Si presiona una tecla que corresponde a una letra if e.key == pygame.K_a: return "a" if e.key == pygame.K_b: return "b" if e.key == pygame.K_c: return "c"

# ... aqui van los condicionales para las demas letras

if e.key == pygame.K_x: return "x" if e.key == pygame.K_y: return "y" if e.key == pygame.K_z: return "z" # Si presiona una tecla que no es una letra suena beep else: pygame.mixer.music.load("beep.wav") pygame.mixer.music.play()

# Actualiza el sistema pygame.display.update()

Algoritmo 7.4: Retorna la letra que el usuario presione en el juego ahorcado

Finalmente el algoritmo 7.5 para acabar el juego simplemente dibuja dos rectangulosrellenos en la ventana y escribe en ellos las frases de ganador o perdedor. Mientras tantoespera a que el jugador presione alguna tecla y cuando esto ocurre termina el sistema. Un

97

Page 98: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

ejemplo del juego con los dos posibles finales puede verse en la figura 7.4.

def acabarJuego(ventana, resultado): "Procedimiento que termina el juego ahorcado" # Selecciona la fuente y construye las frases finales fuente = pygame.font.SysFont("arial", 40) gano = fuente.render("Gano :-)", True, (255,0,0)) perdio = fuente.render("Perdio :-(", True, (255,0,0))

# Ciclo para que el usuario vea el resultado y termine acabo = False while True: # Si gano if resultado == True: pygame.draw.rect(ventana,(255,0,0),(335,240,215,85),5) ventana.blit(gano,(355,260)) # Si perdio else: pygame.draw.rect(ventana,(255,0,0),(335,240,240,85),5) ventana.blit(perdio,(355,260)) # Revisa los eventos que suceden for e in pygame.event.get(): if e.type == KEYDOWN: acabo = False # Actualiza el sistema pygame.display.update() # Si presiono una tecla termina el sistema if acabo: pygame.quit() break

Algoritmo 7.5: Termina el juego ahorcado

? ? ?

Ejemplo 7.2Supongamos que queremos crear un juego que simule las elecciones para presidente. Eljuego debe recibir el voto de cada uno de los n ciudadanos del paıs y luego contar elnumero de votos para cada candidato de manera que se sepa quien es el presidente electo.

La tarjeta o tarjeton electoral es un documento donde se encuentra la lista de candidatosy el voto el blanco. Para votar, un ciudadano simplemente marca alguno de los candidatoso la casilla del voto en blanco. Cuando se realiza el escrutinio, se cuentan cuantos votos semarcaron para cada candidato y el que haya sacado la mayor cantidad es el ganador.

La informacion anterior provee los datos necesarios para construir el algoritmo 7.6 el

98

Page 99: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7.1 Listas

(a) Gano el juego ahorcado (b) Perdio el juego ahorcado

Figura 7.4: Estados finales del juego ahorcado

cual simula las elecciones. Se tienen dos listas: la lista de los nombres de los candidatos y lalista de los votos. En la lista de votos se iran contabilizando los votos que cada candidatoobtenga. Las listas listaNombres y listaVotos son correspondientes, es decir, el candidato1, el cual es el elemento 1 de listaNombres, tiene el numero de votos del primer elementode listaVotos, el numero de votos del candidato 2 (elemento 2 de la lista) es el numeroque se encuentra en la segunda posicion de la lista de votos, y ası sucesivamente. Es denotarse que en la lista de candidatos se tiene como ultimo elemento “voto nulo”, esto esnecesario para contabilizar este tipo de voto aunque no sea un candidato como tal. Laposicion donde se encuentra el voto nulo se almacena en la variable posVotoNulo para suuso en la contabilidad de dicho voto.

La ventana se crea en la funcion comienzoElecciones(), la cual se deja como ejerciciopara el lector.

El ciclo para hacer las votaciones hace n iteraciones, siendo n un parametro del procedi-miento. En cada iteracion se obtiene el nombre del candidato por el que se vota mediante laaplicacion de la funcion sufragar(). Este nombre retornado por sufragar() se busca enlistaNombres y si existe se le agrega un voto a su elemento correspondiente. Si el nombreno existe en la lista, entonces se contabiliza en el ultimo elemento de la lista de votos,haciendo entender que fue un voto nulo.

Una vez termina el ciclo, se debe ordenar la lista de acuerdo a los votos que recibieroncada uno de los candidatos. Esto se hace en la funcion ordenar(). Luego de esta aplicacion,en la primera posicion de listaNombres queda el nombre del ganador de las elecciones,el cual es mostrado en el procedimiento mostrarGanador(), que tambien se deja como

99

Page 100: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

ejercicio para el lector.

def elecciones(n): "Procedimiento para simular unas elecciones de presidente" listaNombres = ["candidato1", "candidato2", "candidato3", "candidato4", "candidato5", "en blanco", "voto nulo"] listaVotos = [0, 0, 0, 0, 0, 0, 0] posVotoNulo = len(listaNombres) - 1

# Dibuja la tarjeta electoral ventana = comienzoElecciones()

# Comienzan las votaciones: Ciclo de n iteraciones i = 1 while i < n: # Se obtiene el nombre del candidato por el que se vota voto = sufragar(ventana, listaNombres) # Se busca el nombre dado en la lista de candidatos # y se le agrega un voto j = 0 while j < len(listaNombres) - 1: if voto == listaNombres[j]: listaVotos[j] = listaVotos[j] + 1 break j = j + 1 # Si el nombre no esta en la lista es un voto nulo if j == len(listaNombres): listaVotos[posVotoNulo] = listaVotos[posVotoNulo] + 1 i = i + 1 # Escrutinio: se ordena la lista de candidatos por orden de votos listaNombres = ordenar(listaNombres, listaVotos)

# Resultado mostrarGanador(ventana, listaNombres, listaVotos)

Algoritmo 7.6: Simulador de elecciones

La funcion sufragar() (algoritmo 7.7) recibe como parametros la ventana donde seharan las votaciones y la lista de candidatos. En ella se declara una variable donde sealmacenara el nombre del candidato elegido y luego, en un ciclo infinito, se maneja elevento de presionar un boton del mouse. Cuando este evento sucede se obtiene la posiciondonde se hizo clic y de acuerdo a ella se determina el candidato por el cual se quiere votar.Una vez se haya hecho clic, el ciclo se interrumpe y se retorna el candidato elegido. Si

100

Page 101: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7.1 Listas

la accion de hacer clic se hace fuera de los rectangulos que limitan las imagenes de loscandidatos, se considera que el voto fue nulo y la variable elegido es retornada con suvalor por defecto, es decir, una cadena vacıa.

def sufragar(ventana, listaNombres): "Funcion que retorna el candidato por el cual se ha votado" # Declaracion de la variable que tendrá el nombre del candidato elegido = ""

# Comienzan las votaciones: Ciclo de n iteraciones haceClic = False while True: # Maneja el evento de hacer clic for e in pygame.event.get(): if e.type == pygame.MOUSEBUTTONDOWN: haceClic = True pos = pygame.mouse.get_pos() if pos[0] >= 22 and pos[0] <= 122 and \ pos[1] >= 80 and pos[1] <= 200: elegido = listaNombres[0] if pos[0] >= 142 and pos[0] <= 242 and \ pos[1] >= 80 and pos[1] <= 200: elegido = listaNombres[1] if pos[0] >= 262 and pos[0] <= 362 and \ pos[1] >= 80 and pos[1] <= 200: elegido = listaNombres[2] if pos[0] >= 382 and pos[0] <= 482 and \ pos[1] >= 80 and pos[1] <= 200: elegido = listaNombres[3] if pos[0] >= 502 and pos[0] <= 602 and \ pos[1] >= 80 and pos[1] <= 200: elegido = listaNombres[4] if pos[0] >= 622 and pos[0] <= 722 and \ pos[1] >= 80 and pos[1] <= 200: elegido = listaNombres[5] if haceClic: break # Actualiza el sistema pygame.display.update() return elegido

Algoritmo 7.7: Retorna un candidato en el juego de elecciones

El algoritmo 7.8 ordena las listas de candidatos y votos por numero de votos obtenidos.

101

Page 102: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

Esto lo logra realizando dos ciclos anidados. El ciclo externo recorre las listas desde elprimer elemento hasta el ultimo, encontrando el menor elemento y ubicandolo en la posi-cion adecuada segun el orden que se desea. El menor elemento se encuentra realizando elciclo interno, desde la posicion donde se encuentra el recorrido de las listas hasta el final,buscando saber cual es la posicion del elemento con menos valor.

def ordenar(listaNombres, listaVotos): "Funcion que ordena las listas por numero de votos" # Ciclo que recorre las listas contador1 = 0 while contador1 < len(listaNombres): contador2 = contador1 posMenor = contador1

# Ciclo que encuentra la posicion del elemento menor while contador2 < len(listaNombres): if listaVotos[posMenor] > listaVotos[contador2]: posMenor = contador2 contador2 = contador2 + 1

# Ubica el menor en la posicion adecuada según el orden nombreTemp = listaNombres.pop(posMenor) listaNombres.insert(contador1, nombreTemp) votoTemp = listaVotos.pop(posMenor) listaVotos.insert(contador1, votoTemp)

contador1 = contador1 + 1 return listaNombres,listaVotos

Algoritmo 7.8: Ordena las listas de candidato y votos en el juego de elecciones

? ? ?

Ordenar una lista es organizar cada elemento de ella en un orden particular. En elOrdenamientoalgoritmo 7.8 se utilizo el metodo Selection Sort, el cual encuentra el mınimo valor en lalista, lo intercambia por el valor de la primera posicion y repite este proceso en el restode la lista (empezando en la segunda posicion y avanzando una posicion cada iteracion).Existen muchos otros algoritmos para ordenar una lista. Se deja como ejercicio para ellector investigar e implementar algunos de esos algoritmos.

Los elementos que tienen las listas pueden ser de cualquier tipo de datos. Esto significaque los elementos podrıan ser tambien listas. Cuando se tiene una lista de listas se diceque se tiene una matriz . La cantidad de niveles de anidamiento de las listas determina elMatriz

102

Page 103: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7.1 Listas

numero de dimensiones que tiene la matriz. En el ejemplo 7.3 se trabajara con listas delistas, es decir, matrices de dos dimensiones.

Ejemplo 7.3Buscaminas es un juego muy popular cuyo objetivo es “limpiar” un campo minado sindetonar ninguna mina. El campo minado es una grilla de n×m ubicaciones, en las cualespuede o no haber una mina.

Este es un juego de un solo jugador, quien debe explorar el campo minado haciendoclic en las ubicaciones de manera estrategica para no detonar una mina. Cuando se limpia(se hace clic en) una ubicacion que no tiene una mina, esta revela una pista acerca de lasubicaciones adyacentes. La pista es un numero, el cual hace referencia a la cantidad deminas que hay alrededor de dicha ubicacion.

El juego termina cuando se hace clic en una mina o cuando se ha limpiado la totalidadde ubicaciones que no tienen mina. En la figura 7.5 puede verse un ejemplo del buscaminaspara Windows 7.

Figura 7.5: Buscaminas en Windows 7

El procedimiento para jugar buscaminas se encuentra en el algoritmo 7.9. La idea detrasde este procedimiento es contar con dos matrices, una (tableroOculto) en la que se en-cuentra el tablero completo, es decir, se conoce plenamente la ubicacion de las minas y,

103

Page 104: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

por lo tanto, las pistas. La otra matriz (tableroVisible) representa el tablero tal y comose ve en el juego, por lo que inicia vacıa y a medida que se escoge una ubicacion, se varevelando el contenido del tablero.

def buscaminas(ancho, alto, numMinas): "Procedimiento para jugar buscaminas" tableroVisible = construirMatriz(ancho, alto) tableroOculto = llenarTablero(ancho, alto, numMinas) juegoAcabado = False

# Dibuja la ventana inicial ventana = saludoInicial()

# Ciclo del juego while not juegoAcabado: # Dibuja/Actualiza el tablero dibujarTablero(ventana, tableroVisible)

# Pide hacer clic en una posicion x,y = obtenerUbicacion(ventana)

# Procede de acuerdo a la ubicacion tableroVisible[x][y] = tableroOculto[x][y] # Si detono una mina (perdio) if tableroOculto[x][y] == 'M': acabarJuego(ventana, False) juegoAcabado = True else: # Si no detono una mina pero completo el tablero (gano) if tableroLleno(tableroVisible): acabarJuego(ventana, True) juegoAcabado = True

Algoritmo 7.9: Juego buscaminas

La parte grafica de este algoritmo se maneja de manera similar al algoritmo 7.1 del ejem-plo del juego ahorcado, simplemente cambian algunos parametros e implementaciones de lasfunciones y procedimientos saludoInicial(), dibujarTablero(), obtenerUbicacion()(que en el ahorcado se llamaba pedirLetra()) y acabarJuego(). El proceso para obtenerel dato ingresado por el usuario es, quizas, el que mas cambia dado que ahora dicho dato esuna coordenada que representa la ubicacion que quiere explorar en el tablero. Todas estasfunciones se dejan como ejercicio para implementar.

Para trabajar con el tablero primero debe construirse la matriz. El proceso es bastantesimple y puede verse en el algoritmo 7.10. Se tienen dos ciclos anidados, el primero se

104

Page 105: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7.1 Listas

encarga de crear las sublistas y el segundo de ingresar la cantidad apropiada de elementosa cada subsista. A medida que las sublistas van quedando construidas, se van adicionandouna lista inicialmente vacıa, creando ası la matriz, que es retornada al final.

def construirMatriz(ancho, alto): "Funcion que crea e inicializa con ' ' una matriz de anchoxalto" matriz = []

for i in range(alto): listatemp = [] for j in range(ancho): listatemp.append(' ') matriz.append(temp)

return matriz

Algoritmo 7.10: Crea y retorna una matriz de dimensiones ancho× alto

Una vez el tablero ha sido construido, se debe llenar con las minas y pistas. Este procesose realiza en el algoritmo 7.11. Primero se crea la matriz que representa el tablero. Luegoesta matriz se empieza a llenar con las minas (sımbolo ’M’). Las posiciones de las minasson halladas de manera aleatoria y poniendo mucho cuidado de no repetir ninguna.

La forma de hallar y poner las pistas es relativamente simple: se recorre la matriz unelemento a la vez y en cada ubicacion se pregunta si dicha ubicacion contiene una mina.Si esto es cierto, entonces se continua con la siguiente ubicacion, pero si es falso entoncesse revisa cada uno de los ocho lugares adyacentes a la ubicacion actual preguntando poruna mina. Cada vez que una mina sea encontrada en una posicion adyacente, una variablepista es aumentada una unidad en su valor, que inicialmente es cero. Ası, si se tienen tresminas alrededor, por ejemplo, entonces el valor de la variable terminara siendo tres y esenumero ira en la ubicacion correspondiente de la matriz.

Si el lector pone mucha atencion en la parte de las pistas del algoritmo 7.11 puededarse cuenta que hay problemas en ella. Supongamos que estamos en la posicion (0,0)de la matriz, es decir, recien iniciaron los dos ciclos, y en ella no hay una mina. Comoeste lugar en la matriz es la esquina superior izquierda, esto quiere decir que hay querevisar en las posiciones (0,1), (1,1) y (1,0), que son las unicas ubicaciones adyacentes a(0,0). Sin embargo, notese que en el algoritmo la revision de minas se hace sobre ochoubicaciones adyacentes, luego ¿que va a pasar en las cinco posiciones inexistentes que seestan revisando? Sale un error porque efectivamente no existen. Entonces hay que modificar

105

Page 106: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

el algoritmo para evitar estos problemas en los bordes de la matriz.

def llenarTablero(ancho, alto, numMinas): "Funcion que llena el tablero del buscaminas con minas y pistas" # Primero se crea la matriz que servira de tablero tableroOculto = construirMatriz(ancho, alto)

# Se llena el tablero con una cantidad numMinas de minas ('M') i = 0 while i < numMinas: dirx = random.randint(0, ancho - 1) diry = random.randint(0, alto - 1) if tableroOculto[dirx][diry] != 'M': tableroOculto[dirx][diry] = 'M' i = i + 1

# Se recorre el tablero poniendo las pistas for i in range(alto): for j in range(ancho): if tableroOculto[i][j] != 'M': pista = 0 if tableroOculto[i+1][j] == 'M': pista = pista + 1 if tableroOculto[i-1][j] == 'M': pista = pista + 1 if tableroOculto[i][j+1] == 'M': pista = pista + 1 if tableroOculto[i][j-1] == 'M': pista = pista + 1 if tableroOculto[i+1][j+1] == 'M': pista = pista + 1 if tableroOculto[i+1][j-1] == 'M': pista = pista + 1 if tableroOculto[i-1][j+1] == 'M': pista = pista + 1 if tableroOculto[i-1][j-1] == 'M': pista = pista + 1 tableroOculto[i][j] = pista

return tableroOculto

Algoritmo 7.11: Llena el tablero del buscaminas con minas y pistas

El algoritmo 7.12 es una modificacion de la parte de las pistas del algoritmo 7.11. En el

106

Page 107: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7.1 Listas

antes de revisar la ubicacion se pregunta si dicha ubicacion existe en la matriz.

# Se recorre el tablero poniendo las pistas for i in range(alto): for j in range(ancho): if tableroOculto[i][j] != 'M': pista = 0 if i < alto - 1: if tableroOculto[i+1][j] == 'M': pista = pista + 1 if i > 0: if tableroOculto[i-1][j] == 'M': pista = pista + 1 if j < ancho - 1: if tableroOculto[i][j+1] == 'M': pista = pista + 1 if j > 0: if tableroOculto[i][j-1] == 'M': pista = pista + 1 if i < alto - 1 and j < ancho - 1: if tableroOculto[i+1][j+1] == 'M': pista = pista + 1 if i < alto - 1 and j > 0: if tableroOculto[i+1][j-1] == 'M': pista = pista + 1 if i > 0 and j < ancho - 1: if tableroOculto[i-1][j+1] == 'M': pista = pista + 1 if i > 0 and j > 0: if tableroOculto[i-1][j-1] == 'M': pista = pista + 1 tableroOculto[i][j] = pista

Algoritmo 7.12: Modificacion del algoritmo para llenar el tablero del buscaminas conpistas

En el juego, para saber si el este acabo se deben realizar dos tareas: preguntar si en laubicacion que el jugador escogio hay una mina y revisar si todo el tablero ha sido explo-rado. La primera tarea es muy sencilla de hacer, solo se pregunta si en la ubicacion actualhay un caracter ’M’. La segunda tarea requiere hacer un recorrido por todo la matriztableroVisible buscando una ubicacion que tenga el valor inicial ’ ’ y cuya ubicacioncorrespondiente en tableroOculto no tenga una mina. Si no existe dicha ubicacion, en-tonces se hay llenado todo el tablero y el jugador gano. El algoritmo 7.13 muestra esta

107

Page 108: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

segunda tarea.

def tableroLleno(tableroVisible, tableroOculto): "Funcion que revisa si se han descubierto todas las ubicaciones" "sin mina" lleno = True for i in range(len(tableroVisible)): for j in range(len(tableroVisible[0])): if tableroVisible[i][j] == ' ' and \ tableroOculto[i][j] != 'M': lleno = False return lleno

Algoritmo 7.13: Funcion que determina si se han descubierto todas las ubicaciones queno tienen mina

? ? ?

7.2. Ejercicios

7.1 La operacion in para listas, revisa si un elemento se encuentra en una lista. Ası, siescribimos if letra in letrasFalladas, lo que queremos saber es si el elementoletra se encuentra en la lista letrasFalladas.

Desarrolle, sin usar dicha operacion in, la funcion buscarElemento() que tome comoargumentos una lista y un elemento, y retorne True si el elemento efectivamente seencuentre en la lista, y False de lo contrario.

7.2 En el juego Ahorcado visto en este capıtulo se pueden repetir las letras falladas yesto hace que se acumule la misma letra en la lista de letras falladas y, por lo tanto,se dibuje un elemento mas del ahorcado. Corrija esto haciendo que el programamuestre una aviso al jugador diciendo, cuando se repite una letra fallada, que ya seescogio dicha letra y la pida de nuevo sin anexarla de nuevo a la lista y sin dibujarun elemento mas del ahorcado.

7.3 La ultima letra que se presiona y el dibujo completo en el juego ahorcado no sealcanza a mostrar cuando termina el juego. Modifique los algoritmos necesarios paraque efectivamente se muestre la ultima letra presionada y se dibuje completamenteel ahorcado (cuando pierde).

7.4 Complete el ejemplo 7.2 de las elecciones desarrollando la funcion comienzoElecciones()

y el procedimiento mostrarGanador(). Para que los algoritmos aquı mostrados fun-

108

Page 109: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT7.2 Ejercicios

cionen correctamente, la ventana creada y retornada en comienzoElecciones() debetener unas dimensiones de 750× 350 y verse como la figura 7.6.

Figura 7.6: Ventana del juego de las elecciones

Es muy importante que en la ventana creada en comienzoElecciones() las fotosde los candidatos esten en unos cuadros de tamano 100 × 120 y las posiciones desus esquinas superior-izquierda sean: (22,80), (142,80), (262,80), (382,80), (502,80),y (622,80).

7.5 La funcion ordenamiento del ejemplo 7.2 retorna las listas en orden ascendente, esdecir, de menor a mayor, de acuerdo a los votos obtenidos. Desarrolle la funcioninvertirLista() para tomar estas listas y retornarlas en orden invertido (i.e. demayor a menor).

7.6 Investigue e implemente en el juego de las elecciones los siguientes metodos de orde-namiento: Bubble Sort, Insertion Sort y Shell Sort.

7.7 Desarrolle todas las funciones y procedimientos graficos del juego buscaminas.

7.8 El juego triqui del ejemplo 6.1 puede desarrollarse con una matriz y funciones depygame. Modifique las funciones necesarias para hacerlo.

109

Page 110: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

7 Nocion de Abstraccion de Datos

110

Page 111: Introduccion a la Programaci oncic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias:... · Ningun animal fue maltratado durante el desarrollo de ... Retorna la letra que

DRAFT

Bibliografıa

[1] Jean-Raymond Abrial. Guidelines to formal system studies. MATISSE project, No-vember 2000.

[2] Donald E. Knuth. Structured programming with go to statements. ACM ComputingSurveys, 6(4):261–301, December 1974.

[3] Guido Van Rossum and Fred L Drake Jr. An Introduction to Python. Network TheoryLtd, 2011.

[4] Guido Van Rossum and Fred L Drake Jr. The Python Language Reference Manual.Network Theory Ltd, 2011.

[5] Gerardo Sarria. Introduction to programming for engineers following the parachuteparadigm. In 39th ASEE/IEEE Frontiers in Education. IEEE, San Antonio, TX, USA,18–21 October 2009.

[6] G. Michael Schneider. The introductory programming course in computer science: tenprinciples. In Papers of the SIGCSE/CSA technical symposium on Computer scienceeducation, SIGCSE ’78, pages 107–114, New York, NY, USA, 1978. ACM.

111