Libro Juegos en Python
Libro Juegos en Python
Introducci
on a la Programaci
on
Gerardo M. Sarria M. - Mario Julian Mora
DR
A
FT
DR
A
FT
DR
A
DR
A
FT
Indice de figuras
Indice de cuadros
Indice de algoritmos
FT
Indice general
7
11
13
13
14
16
2. Noci
on de Sistema
2.1. Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Observaci
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
19
24
27
3. Noci
on de Estado
3.1. Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
29
37
4. Noci
on de Abstracci
on
4.1. Abstracci
on de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
39
52
5. Noci
on de Condici
on
5.1. Condici
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
53
63
6. Noci
on de Repetici
on
6.1. Iteraci
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2. Recursi
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
65
74
83
DR
A
1. Introducci
on
1.1. Sobre este libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Sobre los algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3. Para los profesores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Indice general
7. Noci
on de Abstracci
on de Datos
87
7.1. Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
7.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
111
DR
A
FT
Bibliografa
FT
Indice de figuras
Sistema Solar . . . . . . . . . . . . . . . . . . . . . . .
Cajero electr
onico . . . . . . . . . . . . . . . . . . . .
Wiimote y consola Wii . . . . . . . . . . . . . . . . . .
Algunos sistemas y un modelo computacional de ellos
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
19
20
21
23
3.1.
3.2.
3.3.
3.4.
3.5.
3.6.
Mundo de la Tortuga . . . . . . . . . . . . . . . . . . .
Cambios de estado en el Mundo de la Tortuga . . . . .
Estado inicial y final para dibujar una persona . . . .
Problema de sacar la tortuga del laberinto . . . . . . .
Soluci
on al problema de sacar la tortuga del laberinto
Problema de llevar la tortuga donde su mama . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
30
31
33
36
36
38
DR
A
2.1.
2.2.
2.3.
2.4.
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.
5.2.
5.3.
5.4.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
55
56
57
58
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
68
69
75
77
78
78
79
79
81
82
88
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
INDICE DE FIGURAS
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 92
. 96
. 99
. 103
. 109
DR
A
FT
7.2.
7.3.
7.4.
7.5.
7.6.
FT
Indice de cuadros
3.1. Operaciones b
asicas en el Mundo de la Tortuga . . . . . . . . . . . . . . . .
3.2. Operaciones de colores en el Mundo de la Tortuga . . . . . . . . . . . . . .
33
37
4.1.
4.2.
4.3.
4.4.
.
.
.
.
46
48
49
50
54
59
62
6.1. Operaciones b
asicas de entrada y salida . . . . . . . . . . . . . . . . . . . .
6.2. Operaciones b
asicas del sistema Tkinter . . . . . . . . . . . . . . . . . . . .
6.3. Operaciones para dibujar en un Canvas de Tkinter . . . . . . . . . . . . . .
69
81
84
7.1.
7.2.
7.3.
7.4.
7.5.
90
91
94
94
96
DR
A
Operaciones
Operaciones
Operaciones
Operaciones
Operaciones
b
asicas
b
asicas
b
asicas
b
asicas
b
asicas
.
.
.
.
.
DR
A
FT
INDICE DE CUADROS
10
FT
Indice de algoritmos
DR
A
14
15
34
35
40
40
41
41
42
43
45
46
47
49
49
50
51
56
59
60
61
63
66
67
70
71
72
74
76
80
83
89
11
INDICE DE ALGORITMOS
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
pistas .
que no
. . . . .
93
95
97
98
100
101
102
104
105
106
107
DR
A
FT
12
108
FT
1 Introducci
on
DR
A
La programaci
on se ha convertido en una ciencia basica. Su importancia dentro de todas
las ingenieras se ha vuelto notoria dado que cualquiera de las corrientes de ingeniera tiene
componentes que involucran nociones de programacion: problemas que pueden ser resueltos
siguiendo una serie de pasos (noci
on de algoritmo), variables que deben ser tomadas en
cuenta al realizar observaciones, datos que deben ser procesados, e incluso el mismo uso
del computador.
En las actividades cotidianas de los adolescentes actuales tambien podemos ver nociones
de programaci
on: comprar un reproductor mp3, descargar una cancion de internet (de las
que s se pueden descargar sin romper ninguna ley) y copiarla en el reproductor, practicar
un deporte, etc. Mucho m
as en actividades mas cercanas a las profesiones de ingeniera:
construccion de una va, transporte de mercanca, inter-conectar una red de celulares,
instalar un computador/servidor con un sistema operativo como linux, entre otros.
1.1.
13
1 Introducci
on
FT
1.2.
Los algoritmos mostrados en este documento siguen la sintaxis del lenguaje de programaci
on Python. De esta manera si se quieren probar los programas se debe instalar el
compilador 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 por
el lenguaje. Esta se especifica entre comillas debajo de la declaracion de la funci
on o
procedimiento (en color verde).
Para probar los algoritmos que usan operaciones de distintos sistemas es necesario cargar
dichos sistemas. Para cargar el sistema matematico de Python (math), por ejemplo, antes
del c
odigo es necesario agregar una lnea fundamental para cargar el sistema, la cual se
puede ver en el algoritmo 1.1.
DR
A
Nocion
del libro porque las nociones de programacion son aquellas que estaran en la vida diaria
de los estudiantes por siempre.
El profesor Edsger W. Dijkstra dijo alguna vez: Las nociones son fundamentales en
toda actividad de programaci
on. Ellas son tan fundamentales que no ser
an divididas en
conceptos m
as primitivos.. Entonces para resaltarlas, las nociones de programacion podr
an
verse 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 desarrollados para Python. Sin embargo con ellos no pretendemos que los estudiantes tomen este
libro como un manual de referencia de las libreras del lenguaje, por el contrario, deseamos
que los estudiantes se motiven a consultar y estudiar mas las libreras de Python (en su
documentaci
on en lnea en http://www.python.org/doc/) de manera que sus programas
contengan mejores caractersticas. El lector que desee un libro tecnico sobre Python puede
ver [3]
o [4].
Por otro lado, para ejecutar los programas en el contexto del Mundo de la Tortuga
se debe hacer tal y como se carga el sistema matematico antes de la aplicacion de cualquier operaci
on. Adicionalmente, para que el resultado de la ejecucion de los algoritmos
14
sea exacto a aquellos que se muestra en este libro, se deben aplicar algunas operaciones
inmediatamente despues de la carga del sistema, que se pueden ver en el algoritmo 1.2.
FT
DR
A
Puede notarse que para aplicar las operaciones de los sistemas es necesario anteponer
el nombre del sistema (turtle en este caso). Los sistemas que se usaran como ejemplo en
este libro se listan a continuaci
on:
turtle Sistema de la Tortuga
math Sistema matem
atico
random Sistema de n
umeros aleatorios
string Sistema de cadenas de texto
15
1 Introducci
on
1.3.
FT
DR
A
Observaci
on Una vez los estudiantes entienden un sistema, deben ser capaces de describirlo. En este punto nos interesamos en los elementos y no en el sistema como un
todo. Siguiendo el paradigma del paracaidista bajamos un poco de manera que nos
acerquemos al sistema y podamos preguntarles a los estudiantes que es est
atico y
que cambia en el. Lo que se mantiene estatico lo llamaremos una constante y los
elementos que cambian seran llamados variables. Adicionalmente, para cada elemento detectamos los valores que puede tener. Este conjunto de valores define el tipo
de dato del elemento.
Esta noci
on no necesita mas de dos sesiones para ser entendida.
16
FT
DR
A
Motivamos a los profesores a que se armen de ayudas pedagogicas para que los estudiantes 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. pensar todo el tiempo en terminos de secuencia de pasos, algoritmos) es muy difcil. Usar
el 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 buen
punto para hacer una primera evaluacion en el curso.
Abstracci
on Entre mas complejos se vuelven los problemas, mas largos se vuelven los
programas. De esta manera el estudiante siente la necesidad de tener una forma de
programar con menos lneas de c
odigo. As se les ense
na a organizar varias operaciones
en una sola. Las cajas negras se vuelven cajas blancas. Los estudiantes ahora pueden
construir sus propias operaciones llamando las basicas. Con las nuevas operaciones
ellos pueden construir otras y as sucesivamente. La nocion de niveles de abstraccion
llega de una manera natural.
Otras cuatro sesiones pueden usarse en esta nocion.
Condici
on Si el estado del sistema es desconocido el estudiante siente la necesidad de tener
una estructura de control para considerar varios casos. Esto hace que se introduzca la
nocion de condici
on. Sin embargo, para entender mejor el mecanismo de esta nocion
se tienen que empezar por hacer ejercicios de los fundamentos basicos de la logica
proposicional: tablas de verdad y conectivos logicos. Tal como las nociones anteriores
esto debe hacerse usando expresiones cercanas al conocimiento de los estudiantes.
Como las expresiones l
ogicas son elementos muy abstractos se deben utilizar cuatro
sesiones para esta noci
on. El final de esta nocion es otro buen punto para hacer una
17
1 Introducci
on
evaluaci
on.
Iteraci
on Aunque pensamos que la recursion es la forma mas simple de repeticion ya que no
cambia el estado de las variables, parece ser mas natural para los estudiantes aplicar
otra estructura de repeticion que si cambie las variables. Ella es llamada iteraci
on.
FT
En esta noci
on es bueno quedarse un buen tiempo (ocho sesiones) ya que las nociones
son introducidas gradualmente, y con la inclusion de una nueva nocion se contin
ua
usando y practicando las anteriores. Ademas, los estudiantes ahora tienen todas las
herramientas para solucionar la mayora de problemas. De all que al finalizar esta
noci
on se pueda hacer otra evaluacion.
Recursi
on Como dijimos arriba, nosotros creemos que la recursion es la forma basica de repetici
on en programacion. Sin embargo esta nocion puede ser muy difcil de entender.
Por esta raz
on consideramos que ella puede ser opcional.
DR
A
Abstracci
on de Datos Esta nocion viene con la necesidad de agrupar una gran cantidad
de informaci
on. Se puede pedir a los estudiantes, por ejemplo, que se calcule el promedio de todas las clases que han tomado. Si el n
umero de clases es poco entonces
no hay problema, pero si el estudiante ha tomado siete o mas clases, manejar esta
cantidad de variables es inconveniente (imagine la cantidad de variables de entrada
a las funciones).
De todas las estructuras de datos hemos escogido listas por dos razones: son estructuras de datos b
asicas y su mecanismo de uso en Python es muy comodo.
Usamos las u
ltimas ocho sesiones para esta nocion y se puede hacer la cuarta y u
ltima
evaluaci
on.
Persistencia Al igual que recursion, dejamos esta nocion como opcional ya que ella nace
de la necesidad de mantener los datos incluso despues de ejecutar los programas.
Se debe ense
nar entonces un poco sobre sistemas de archivos (sin entrar mucho en
detalle sobre los sistemas operativos) y dispositivos de almacenamiento fsico como
discos duros o memorias USB.
Aqu tambien se podran usar dos o tres sesiones.
18
2.1.
Sistema
FT
2 Noci
on de Sistema
DR
A
Ejemplos de sistemas pueden verse en todos los ambitos. Entre los mas conocidos tenemos
el sistema solar, el sistema digestivo y el sistema economico. La figura 2.11 muestra el
sistema solar. En este sistema el conjunto de elementos esta compuesto por el Sol, los ocho
1
19
Sistema
2 Noci
on de Sistema
FT
planetas, los cinco planetas enanos y otra cantidad de astros. Todos estos elementos se
relacionan entre s por medio de la gravedad del Sol, la cual ocasiona que los planetas y
astros se muevan en una
orbita casi circular sobre el denominado plano eclptico.
Existen otros m
ultiples ejemplos de sistemas que tal vez ignoramos debido a que hacen
parte de nuestra vida cotidiana y no llevan en su nombre la palabra sistema. Ejemplos de
ellos son los cajeros autom
aticos, la television, las consolas de juego y los computadores.
Los ejemplos 2.1 y 2.2 muestran algunos de estos sistemas.
DR
A
Ejemplo 2.1
La figura 2.22 muestra un ejemplo de cajero automatico. Muy a grosso modo un cajero
autom
atico es una terminal que acepta peticiones y se comunica, por medio de una red de
datos, con los computadores de un banco para atender dichas peticiones.
Los elementos que componen el cajero son: los botones, el teclado del cajero, el lector
de tarjetas, la ranura de depositos, la pantalla, el parlante, el dispensador de dinero y la
impresora de recibos.
Una de tantas interacciones que tiene un cajero electronico es la siguiente: un usuario
realiza una petici
on 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
2
20
2.1 Sistema
FT
que introduzca la clave (otros cajeros la piden justo antes de realizar la transaccion). Por
medio los botones y el teclado se introduce la clave y se selecciona los datos apropiados del
men
u para efectuar la transacci
on deseada. Si es un retiro, entonces el cajero podra proveer
el dinero por medio del dispensador o podra enviar un mensaje por la pantalla y/o el
parlante 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 consignacion
se abre la ranura de dep
ositos para entregar el dinero. Una vez termina cualquiera de las
transacciones anteriores, el cajero imprime un recibo y termina la interaccion.
? ? ?
DR
A
Ejemplo 2.2
Wii (figura 2.33 ) es una consola de juego lanzada en 2006 por la empresa de videojuegos
Nintendo. Como toda consola de juego el Wii es un computador de entretenimiento interactivo que produce una se
nal de video, la cual puede ser interpretada por un televisor o
monitor.
Al igual que un computador actual, el Wii cuenta con un procesador central, un procesador de video, 88 Mb de memoria interna, una memoria flash de 512 Mb (no cuenta con
3
21
2 Noci
on de Sistema
FT
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 de
detecci
on de movimiento en el espacio que permite manipular objetos en la pantalla, un
apuntador
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 de
Nintendo se centra en el control. El sistema cuenta con un barra llamada sensor bar que
emite luz infraroja y que es detectada por el Wiimote. De esta manera el sistema determina
la posici
on y orientaci
on relativa en 3D del control. El Wiimote se conecta a la consola
usando Bluetooth (la tecnologa abierta para el intercambio de datos entre dispositivos
electr
onicos en distancias cortas). Este dise
no permite a los usuarios controlar los juegos
usando movimientos corporales y las presiones de botones tradicionales.
? ? ?
DR
A
Modelo
Programa
Im
agenes tomadas de http://recursos.cnice.mec.es/biosfera/alumno/1ESO/planeta_habitado/
index.htm (Tierra), http://www.olympiaph.com.ph/crm/typewriters.html (m
aquina de escribir), y
http://www.revivesoundproductions.com/djseminar.html (dj)
22
FT
2.1 Sistema
DR
A
(b) Una M
aquina de Escribir y MSWord
(c) Un DJ y VirtualDJ
23
2 Noci
on de Sistema
2.2.
Ejemplo 2.3
Las siguientes tablas listan las constantes y variables de los sistemas: una sala de cine, una
tienda de barrio y un rompecabezas.
DR
A
Variable
FT
Constante
Observaci
on
Constantes
N
umero de Sillas
Pantalla
Variables
N
umero de Asistentes
Pelcula
Configuracion de los Asistentes
Un rompecabezas:
Constantes
N
umero de fichas
Tama
no
Forma de las fichas
24
Variables
Ubicacion de las fichas
2.2 Observacion
Variables
Cantidad de productos
Dinero
N
umero de clientes
Organizacion de los productos
Precio de los productos
FT
Constantes
El local
El vendedor(*)
(*) Aunque el vendedor puede variar se puede decir que siempre hay un vendedor.
? ? ?
DR
A
Aunque las constantes no cambian su valor, dicho valor pertenece a un dominio especfico y por lo tanto
podemos decir que las constantes tienen tambien un tipo de dato.
25
Tipo de Datos
2 Noci
on de Sistema
velocidad est
a en que el dominio del nivel de gasolina representa un porcentaje, esto
es, la variable tiene un valor entre 0 y 100. Por lo anterior el tipo de dato de la
variable nivel de gasolina es Real.
FT
El estado del motor tiene uno de dos valores posibles: encendido o apagado. Esto
quiere decir que si preguntan esta encendido el carro?, en la observacion podemos
contestar Verdadero o Falso. Por esto su tipo de dato es Booleano6 .
La posici
on geogr
afica del carro es un poco mas complicada ya que involucra dos
ejes. Estos ejes son com
unmente llamados Latitud (posicion con respecto al norte o
sur del ecuador) y Longitud (posicion con respecto al oriente u occidente del primer
meridiano
o Greenwich). Ellos tienen sus valores en unidades de medida angular
(UMA), es decir, grados, minutos y segundos. Entonces el tipo de datos para la
posici
on geogr
afica es UMA UMA.
Ejemplo 2.4
Supongamos que tenemos los siguientes juegos: un buscaminas, una sopa de letras y un
ahorcado, cu
ales son sus variables y tipos de datos correspondientes?
DR
A
Un buscaminas:
Variable
N
umero de minas
Ubicacion de la mina i
N
umero de marcas
Ubicacion de la marca j
N
umero de espacios destapados
Espacio destapado k
Tipo de Dato
Entero
Entero Entero
Entero
Entero Entero
Entero
Entero Entero
Variable
N
umero de filas
N
umero de columnas
N
umero de palabras
Letra de la ubicacion i, j
Palabras encontradas
Tipo de Dato
Entero
Entero
Entero
Caracter
Lista de palabras
26
2.3 Ejercicios
Un ahorcado:
Tipo de Dato
Lista de palabras
Entero
Caracter
Entero
Entero
Entero
Booleano
FT
Variable
Palabras
N
umero total de letras de la palabra
Letra correspondiente a la ubicacion i
N
umero de letras descubiertas de la palabra
N
umero total de partes del mu
neco
N
umero de partes del mu
neco dibujadas
Se ahorc
o
? ? ?
2.3.
Ejercicios
2.1 De los siguientes sistemas escoja cinco (5) y describa sus elementos e interacciones:
DVD Player
Casino
Kinect
Pizzera
Celular
iPod
Supermercado
Estacion Espacial
Dispensador de Gaseosas
Discoteca
DR
A
Carro
Gobierno
Televisor
MIO
Monopoly
Partido de F
utbol
Universidad
Minicomponente
Laboratorio de Fsica
Su Casa
2.2 Cuales de los anteriores sistemas tienen un modelo computacional? Provea una descripcion del programa.
2.3 Tome cinco sistemas de los enumerados anteriormente (diferentes de los escogidos en
el primer ejercicio) y muestre cu
ales de sus elementos son constantes y cuales son
variables.
2.4 De los siguientes juegos determine sus variables y sus constantes, con sus respectivos
tipos de datos: blackjack, triqui, pinball.
27
DR
A
FT
2 Noci
on de Sistema
28
3.1.
Estado
FT
3 Noci
on de Estado
Las variables de un sistema cambian su valor a traves del tiempo. Cada vez que una
variable cambia su valor, el estado en el cual se encuentra sistema cambia. Un estado de
un sistema es una configuraci
on u
nica de los elementos que componen dicho sistema. El
estado del sistema est
a definido entonces por la valuacion de todas sus variables.
Para ejemplificar la noci
on de estado vamos a introducir un sistema muy simple llamado
el mundo de la tortuga:
DR
A
En la figura 3.1 puede verse el mundo de la tortuga. En esta figura la tortuga ha dibujado
una casita. Para llegar a este estado del sistema, se ha debido pasar por varios estados
intermedios donde se ha cambiado el valor de las variables del sistema. En la figura 3.2 se
detallan los diferentes estados.
A continuaci
on 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 centro
del mundo (posici
on 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 ha
cambiado a x = 50, y = 0 y su orientacion queda igual.
3. Despues la tortuga cambia su orientacion a = 90, pero su posicion permance igual
en x = 50, y = 0 (Figura 3.2c).
4. Acto seguido (Figura 3.2d) la tortuga se desplaza 100 unidades hacia adelante quedando en x = 50, y = 100. Su orientacion se mantiene en = 90.
29
Estado
FT
3 Noci
on de Estado
DR
A
30
(b) Estado 2
(e) Estado 5
(f) Estado 6
(c) Estado 3
(d) Estado 4
(g) Estado 7
(h) Estado 8
DR
A
FT
3.1 Estado
(i) Estado 9
(j) Estado 10
(k) Estado 11
(l) Estado 12
(m) Estado 13
(n) Estado 14
(
n) Estado 15
31
3 Noci
on de Estado
12. Despues se mueve cien unidades en el eje vertical y = 100 (Figura 3.2l) tambien sin
dibujar.
FT
13. Como el techo tiene dos lneas diagonales, la tortuga tiene que rotar 135 grados
(Figura 3.2m) y cambia su orientacion a = 135.
14. Dibuja la primera lnea desplazandose 70.7 unidades1 (Figura 3.2n). Su posici
on
cambia a x = 0 y y = 150
15. Posteriormente la tortuga rota noventa grados a la izquierda, dejando = 215 (Figura
3.2
n).
16. Finalmente la tortuga se mueve otras 70.7 unidades llegando al estado final x = 50,
y = 100 y = 215 (Figura 3.2o).
DR
A
Algoritmo
Los anteriores son los pasos para llevar el sistema del estado inicial al estado final. De
manera general, el conjunto ordenado de pasos que llevan un sistema de un estado a otro
es com
unmente llamado algoritmo. Los pasos que se ejecutan en un algoritmo realizan
operaciones que modifican las variables del sistema y, por ende, el estado del mismo. Las
operaciones son acciones que pueden efectuarse dentro del sistema y son definidas en el
tiempo de creaci
on del sistema. Para el caso del mundo de la tortuga, el conjunto n
ucleo
de operaciones2 se encuentra en el cuadro 3.1.
Comentario
Ejemplo 3.1
Dados los estados inicial y final en la figura 3.3, cuales son las operaciones necesarias para
llevar 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 lneas
rojas que comienzan con el smbolo # son denominados comentarios. Los comentarios
son anotaciones en algoritmos que sirven para documentar el codigo y hacerlo mas f
acil de
entender, pero que no se tienen en cuenta a la hora de ejecutar el algoritmo.
? ? ?
32
3.1 Estado
left(a)
penup()
pendown()
position()
heading()
undo()
clear()
home()
reset()
Acci
on
Avanza u pixeles (dibuja dependiendo del estado del lapiz)
En la posici
on actual realiza una porcion del un crculo de radio
r (la porci
on y direccion dibujada depende del parametro a, 360
para todo)
A partir de la orientacion actual, rota la tortuga a grados en sentido contrario a las manecillas del reloj
Levanta el l
apiz (cualquier movimiento no dibujara su recorrido)
Baja el l
apiz (cualquier movimiento dibujara su recorrido)
Reporta el valor de la posicion de la tortuga
Reporta el valor de la orientacion de la tortuga
Deshace la u
ltima accion ejecutada por la tortuga
Borra todo lo dibujado por la tortuga (no mueve la tortuga)
Lleva la tortuga al centro del mundo (no borra lo dibujado)
Reinicia todo el sistema y posiciona la tortuga en la posicion x = 0
y y = 0, con orientacion = 0
FT
Operaci
on
forward(u)
circle(r,a)
DR
A
33
3 Noci
on de Estado
# Dibuja la cabeza
turtle.pendown()
turtle.circle(50,360)
# Dibuja el cuerpo
turtle.left(270)
turtle.forward(200)
FT
DR
A
Cuando se tiene un sistema cuyo estado actual no es el deseado, se dice que se tiene un
34
3.1 Estado
problema. La soluci
on a un problema es una serie de pasos (ejecuciones de operaciones)
que llevan del estado en que est
an las cosas en el sistema al estado que se desean, es decir,
un algoritmo.
DR
A
FT
Ejemplo 3.2
La tortuga Junior se encuentra atrapada en el laberinto de la figura 3.4. Resuelva el problema 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 est
a en (-200,200) y el ancho de los pasadizos del laberinto es
de 50 pixeles.
Problema
El algoritmo 3.2 muestra los pasos para resolver el problema. Si se aplica dicho algoritmo
en el estado inicial del problema, se obtendra como resultado el estado en la figura 3.5.
? ? ?
35
FT
3 Noci
on de Estado
DR
A
36
3.2 Ejercicios
El algoritmo 3.2 usa una nueva operacion llamada pencolor(c) para cambiar el color
del lapiz con el cual dibuja la tortuga. Otras operaciones similares para hacer mas vistoso
el mundo estan en la tabla 3.2.
fillcolor(c)
begin fill()
end fill()
bgcolor(c)
Acci
on
Cambia el color del lapiz a c (c debe ser una cadena de texto, e.g.
red, orange, green)
Cambia el color de rellenado de las figuras a c (c debe ser una
cadena de texto, e.g. red, orange, green)
Las figuras cerradas que dibuje la tortuga seran rellenas con el
color definido en la operacion fillcolor(c). Para que las figuras
se coloreen, se debe llamar a end fill() despues de dibujar
Termina el proceso de rellenar las figuras cerradas
Cambia el color de fondo de la ventana a c (c debe ser una cadena
de texto, e.g. red, orange, green)
FT
Operaci
on
pencolor(c)
Ejercicios
DR
A
3.2.
3.4 Desarrolle un algoritmo para que la tortuga construya una sopa de letras.
37
DR
A
FT
3 Noci
on de Estado
38
4.1.
Abstracci
on de Control
FT
4 Noci
on de Abstracci
on
DR
A
Ejemplo 4.1
Si 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 definidas en los algoritmos 4.1, 4.2 y 4.3.
39
Abstracci
on
4 Noci
on de Abstracci
on
FT
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)
DR
A
def dibujarTronco():
"Dibuja el tronco de una persona"
# Dibuja el cuerpo
turtle.left(270)
turtle.forward(200)
40
# Dibuja la cabeza
turtle.pendown()
turtle.circle(50,360)
FT
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)
El algoritmo para dibujar una persona se reduce ahora a cargar y aplicar las operaciones
recien creadas, como en el algoritmo 4.4. Note que si a dicho algoritmo le quitamos los
comentarios, a
un as el usuario que lea el algoritmo tiene una idea de cual es su proposito
solo con echarle un vistazo.
DR
A
# Dibuja la cabeza
dibujarCabeza()
# Dibuja el cuerpo
dibujarTronco()
En los algoritmos 4.3, 4.2, y 4.1 se han definido las operaciones dibujarExtremidades(),
dibujarTronco() y dibujarCabeza(). La definici
on de una operacion especifica un identificador (que va a ser usado para aplicar la operacion) y el cuerpo de dicha operacion. La
especificacion del cuerpo de una operaci
on es denominada implementaci
on de la operacion.
En el algoritmo 4.4 se usan las operaciones previamente definidas. Cuando una operacion
es usada de esta manera, se dice que se hace una aplicaci
on de la operacion. Aplicar una
operacion es, finalmente, hacer el llamado a la operacion.
Ejemplo 4.2
Supongamos que queremos dibujar un conjunto de casas. La manera mas sencilla es crear
41
Definici
on
Implementaci
on
Aplicaci
on
4 Noci
on de Abstracci
on
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)
DR
A
# Dibuja el techo
turtle.left(135)
turtle.forward(70.7)
turtle.left(90)
turtle.forward(70.7))
FT
una operaci
on para dibujar una sola casa y luego ejecutar dicha operacion tantas veces
como n
umero de casas se quiera. El algoritmo 4.5 define una operacion para dibujar una
casa.
Luego ejecutamos la operacion para dibujar una casa varias veces, como en el algoritmo
4.6, en el cual se dibujan cuatro casas.
42
FT
? ? ?
DR
A
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 resultado
que se quisiera es el que se muestra en la figura 4.2.
43
FT
4 Noci
on de Abstracci
on
DR
A
Figura 4.2: Resultado esperado de aplicar el algoritmo para dibujar una casa cuatro veces
Parametro
Argumento
44
# 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)
DR
A
# Dibuja el techo
turtle.left(135)
turtle.forward(70.7)
turtle.left(90)
turtle.forward(70.7))
FT
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)
45
4 Noci
on de Abstracci
on
FT
DR
A
seth(h)
xcor()
ycor()
Acci
on
Traslada la tortuga a la posicion x = x, y = y. La orientaci
on
permanece igual
Traslada la tortuga a la coordenada x = x sin cambiar la coordenada y. La orientacion permanece igual
Traslada la tortuga a la coordenada y = y sin cambiar la coordenada x. La orientacion permanece igual
Orienta la tortuga al angulo a = h
Reporta el valor de la posicion de la tortuga en el eje x
Reporta el valor de la posicion de la tortuga en el eje y
Ejemplo 4.3
Ahora queremos que la tortuga escriba la letra A pero en diferentes escalas, es decir, con
un tama
no que depende de un valor de entrada. Para esto se necesita definir una operaci
on
que tenga un par
ametro escala cuyo dominio de valores se encuentre entre 1 y 100. Este
par
ametro ser
a usado para determinar las longitudes de las lneas que componen la letra
A y los
angulos que debe usar la tortuga para hacer el dibujo. El algoritmo 4.9 resuelve
este problema.
Se asume que la letra a una escala 100 ocupa la mayor parte de la ventana y el dibujo de
la letra m
as peque
na tiene una escala 1. Como la ventana es de 500 500 pixeles, entonces
la tortuga se mover
a 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 escala
es 1, la posici
on ser
a (2,3, 2,3).
Como puede verse para hallar las longitudes de las lneas diagonales se usa (de nuevo) el
teorema de Pit
agoras, y para hallar el angulo que debe tomar la tortuga para dibujar las
diagonales se usa la funci
on trigonometrica arcoseno. Estas operaciones necesarias en este
problema (y en algunos siguientes) hacen parte de un sistema matematico; algunas de las
46
operaciones m
as usadas de este sistema se encuentran en el cuadro 4.2.
FT
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)
DR
A
? ? ?
47
4 Noci
on de Abstracci
on
Operaci
on
pow(x,y)
sqrt(x)
log(x,b)
sin(v)
cos(v)
tan(v)
asin(v)
acos(v)
atan(v)
degrees(a)
radians(a)
Acci
on
Retorna
Retorna
Retorna
Retorna
Retorna
Retorna
Retorna
Retorna
Retorna
Retorna
Retorna
Constante
pi
e
Valor
El valor matematico = 3,141592...
El valor matematico e = 2,718281...
x elevado a la y
la raiz cuadrada de x
el logaritmo base b de x
el seno de a, en radianes
el coseno de a, en radianes
la tangente de a, en radianes
el arcoseno de a, en radianes
el arcocoseno de a, en radianes
la arcotangente de a, en radianes
la conversion del angulo a de radianes a grados
la conversion del angulo a de grados a radianes
DR
A
Alcance
FT
Declaracion
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 por
primera vez o por lo menos anunciadas de que existen) dentro del contexto de la operaci
on
definida. Por fuera del contexto (en el caso de las variables longitud, angulo y linea, por
fuera de la operaci
on letraAescala()), dichas variables no son visibles o accesibles. Por
otro 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 contexto
en el que son declaradas las variables define su alcance, esto es, la visibilidad o accesibilidad
de las variables en diferentes partes del modelo computacional.
Funcion
48
y un proyecto. El cuadro 4.3 muestra los porcentajes que tienen estos elementos en la nota
final del curso.
Porcentaje
25 %
20 %
20 %
15 %
20 %
FT
Evaluaci
on
Examen Parcial 1
Examen Parcial 2
Examen Parcial 3
Tareas
Proyecto
Si quisieramos que la tortuga escribiera la nota final del curso dados los datos de las
evaluaciones, primero tenemos que hacer la funcion que retorne la nota final y luego hacer
que la tortuga escriba este valor reportado. La funcion esta definida en el algoritmo 4.10.
DR
A
Esta funcion puede usarse entonces en un algoritmo que haga dibujar a la tortuga la
nota 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)
En el algoritmo 4.11 se usa una operacion para escritura. Esta operacion esta descrita
49
4 Noci
on de Abstracci
on
en el cuadro 4.4.
Acci
on
Escribe en la posicion actual el texto t. El parametro m es un
valor logico (True o False) que especifica si la tortuga se desplazar
a cuando escriba el texto. El parametro a define la alineaci
on
del texto (left, center, o right). El parametro f es una estructura que describe la fuente del texto (esta estructura se codifica entre parentesis con los datos separados por comas, as:
(nombre, tama
no, tipo), e.g. (Arial,18,italic))
FT
Operaci
on
write(t,m,a,f)
Procedimiento
DR
A
Composicion
Las dos funciones retornan exactamente lo mismo. La primera funcion declara dos variables locales que contendran el valor resultado de elevar al cuadrado las longitudes de
50
FT
DR
A
Ejemplo 4.6
A principio de cada a
no una de las preguntas mas frecuentes entre nosotros es en que fecha
cae Semana Santa?
La tortuga Sabelotodo encontr
o que una formula para calcular la fecha del Domingo de
Pascua en los a
nos 19822048, inclusive, es as1 : sea a = ano %19, b = ano %4, c = ano %7,
d = (19a + 24) %30, e = (2b + 4c + 6d + 5) %7, entonces el da del Domingo de Pascua es
Marzo 22 + d + e.
Esta formula la podemos usar para crear la funcion Pascua. Esta funcion tiene como
parametro un a
no y retorna el da del Domingo de Pascua de ese a
no. El algoritmo 4.13
muestra la funci
on.
def Pascua(ano):
"Funcion que halla el da 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
La operaci
on m
odulo % halla el residuo de la divisi
on entera entre dos n
umeros.
51
4 Noci
on de Abstracci
on
4.2.
Ejercicios
FT
existe la fecha Marzo 54 de 2000, Marzo tiene solo 31 das y el da siguiente es Abril 1. De
esta manera, es necesario considerar los casos para los que la fecha esta en Marzo y aquellos
donde la fecha est
a en Abril. La estructura de control para tener dichas consideraciones se
ver
a en el captulo 5.
4.1 Mejore los procedimientos 4.1, 4.2 y 4.3, creandoles parametros que especifiquen las
posiciones donde van a ser dibujados.
4.2 Baje el nivel de abstraccion del dibujo de una persona, desarrollando los procedimientos y funciones para dibujar todas partes del cuerpo humano. Por ejemplo, en vez de
dibujarCabeza(), puede construir las operaciones dibujarOjos(), dibujarNariz(),
dibujarBoca(), dibujarOrejas(), etc., con sus respectivos parametros de posici
on y
otros par
ametros que se deseen (e.g. dibujarOjos() puede tener ademas un par
ametro que especifique el color de los ojos).
DR
A
52
5.1.
Condici
on
FT
5 Noci
on de Condici
on
DR
A
una funci
on que retorna un valor de tipo Booleano.
Una relacion l
ogica entre variables se construye utilizando operadores de relacion. Los
operadores de relaci
on entre variables son ==, <, >, <=, >=, ! =, <>. Por ejemplo, si
tenemos la siguiente relaci
on:
x >= 5
esta relacion es verdadera en el caso en que la variable x sea asignada con valores mayores
o iguales a 5. De lo contrario la relaci
on es falsa. La semantica de los operadores de relacion
es como sigue:
el operador < significa menor que.
el operador > significa mayor que.
53
Condici
on
5 Noci
on de Condici
on
Operaci
on
p and q
Acci
on
Retorna True cuando los valores de ambas variables p y q son
True. De lo contrario retorna False. Esto se ve mas claramente
en la siguiente tabla de verdad:
p or q
q
True
False
True
False
DR
A
p
True
True
False
False
not p
p or q
True
True
True
False
Constante
True
False
p and q
True
False
False
False
FT
p
True
True
False
False
not p
False
True
Valor
El valor Booleano 1
El valor Booleano 0
54
5.1 Condicion
Booleano) y operaciones l
ogicas. Las operaciones logicas son aquellas que al ser aplicadas
producen un valor Booleano. Algunas de estas operaciones se pueden ver en el cuadro 5.1.
Un condicional es una sentencia que eval
ua una condicion y de acuerdo al resultado de
dicha evaluacion, ejecuta o no, un conjunto de operaciones.
DR
A
FT
Ejemplo 5.1
Supongamos que la tortuga Junior tiene dos opciones para divertirse esta noche. Una opcion
es ir a una discoteca mientras que la otra es ir a comer helado. La decision depende de la
edad que tenga Junior dado que para entrar a las discotecas se requiere tener mas de 18
a
nos.
La figura 5.1 muestra el estado inicial del problema, con Junior al frente de ambos
edificios.
Condicional
55
5 Noci
on de Condici
on
con el valor que se le dio en su declaracion, es decir, False) y el estado final del sistema
ser
a el de la figura 5.2b.
FT
def esMayorDeEdad(edad):
"Funcion que retorna si es mayor de edad o no"
mayor = False
if edad >= 18:
mayor = True
return mayor
DR
A
(a) Soluci
on 1
(b) Soluci
on 2
Figura 5.2: Los dos posibles casos del problema de mayora de edad
Flujo de Ejecucion
? ? ?
En el ejemplo 5.1 puede notarse que en algunos casos se ejecutan unas operaciones y
en otros se ejecutan otras operaciones. El orden de ejecucion de las operaciones de un
programa determina el flujo de ejecuci
on del programa. La figura 5.3 da una explicaci
on
gr
afica del flujo de la funci
on esMayorDeEdad(). La asignacion mayor = False siempre se
56
5.1 Condicion
FT
ejecuta. La condici
on edad >= 18 es evaluada y de acuerdo al resultado se puede ir por
uno de dos caminos: si el resultado de la condicion es True entonces se ejecuta la asignacion
mayor = True y luego se retorna la variable mayor (es decir se retorna True); si el resultado
de la condicion es False entonces simplemente se retorna la variable mayor, que en este
caso tiene asignado el valor original False.
edad
mayor = False
DR
A
mayor = True
Falso
return mayor
Ejemplo 5.2
Supongamos que la tortuga Junior ha dibujado un tablero de tiro al blanco para jugar un
rato. El tablero que ha dibujado se muestra en la figura 5.4.
Como puede apreciarse, un tablero de tiro al blanco consiste en un n
umero fijo de circunferencias concentricas separadas por una distancia usualmente constante. En este caso
particular, el tablero tiene ocho circunferencias concentricas cada una separada 25 unidades
de la siguiente. La circunferencia m
as peque
na (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. El
jugador que m
as puntaje obtenga al final sera el ganador.
57
FT
5 Noci
on de Condici
on
DR
A
Lo primero que debemos hacer es construir una funcion que, dado un disparo, retorne el
puntaje correspondiente. Un disparo se puede ver como una posicion en el mundo, es decir,
una posici
on en el eje x y una posicion en el eje y. De all que si hallamos la distancia desde
ese punto hasta el origen (0,0), podramos saber entre que par de crculos cayo el disparo y,
por lo tanto, saber el puntaje asociado. Entonces la distancia podemos conocerla aplicando
una de las funciones para hallar la hipotenusa del ejemplo 4.5. Luego comparamos el valor
obtenido en la aplicaci
on con cada una de las distancias de las circunferencias y de esta
manera 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 puntaje
obtenido 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 puntaje
retornado 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 simulaci
on usamos un sistema de n
umeros aleatorios. Este sistema nos permite asumir disparos al azar,
es decir, no tenemos que inventarnos unos n
umeros y cada vez que ejecutemos la simulaci
on obtendremos disparos diferentes (un sistema inicial desconocido). Las operaciones del
sistema de n
umeros aleatorios se encuentra en el cuadro 5.2.
El procedimiento para la simulacion se encuentra en el algoritmo 5.3. Primero se hallan
los disparos utilizando la funcion randint(), luego se hallan los puntajes y con ellos se
58
5.1 Condicion
randint(a,b)
Acci
on
Retorna el siguiente n
umero real aleatorio en el rango [0,0, 1,0)
Retorna n
umero aleatorio en la lista de n
umeros entre i y f con
intervalos de p. Por ejemplo, si queremos un n
umero aleatorio par
entre 0 y 10, le enviamos los argumentos a la funcion: i=0, f=10,
p = 2 (la lista de n
umeros entre 0 y 10 con intervalos de 2 es
{0, 2, 4, 6, 8, 10})
Retorna un n
umero entero aleatorio n de manera que a n b
FT
Operaci
on
random()
randrange(i,f,p)
encuentra el ganador.
DR
A
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
En el algoritmo 5.3 pueden notarse algunas cosas. El juego consiste en tres disparos que
se representan con seis variables (la posicion en x y y de cada disparo). Con estas seis
variables se calculan los tres puntales obtenidos en los tres disparos, que se suman para
tener el puntaje total. Lo anterior se realiza para los dos jugadores. Puede verse que todas
59
5 Noci
on de Condici
on
FT
las variables (excepto las de puntaje total) son asignadas dos veces, esto esta bien ya que
una vez se usan las variables para realizar los calculos, su valor deja de ser necesario. Por
otro lado, cada posici
on de un disparo se tiene despues de aplicar la funcion randint() con
argumentos 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
DR
A
# 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")
En algunas ocasiones solo se tiene una posible condicion en el sistema que se est
a mode-
60
5.1 Condicion
FT
Ejemplo 5.3
Retomando el ejemplo 4.6, si quisieramos que la tortuga escribiera la fecha cronologicamente bien (que no escriba Marzo 54 de 2000, por ejemplo) entonces despues de aplicar
la funcion Pascua() debemos tener en cuenta los casos. Si el n
umero retornado es menor
o igual que 31, entonces la tortuga debe escribir la fecha en Marzo, de lo contrario debe
escribir la fecha en Abril.
El algoritmo 5.4 muestra el c
odigo para la escritura correcta de la fecha del domingo
de Pascua de cualquier a
no. Es claro que si el da no es menor o igual a 31 entonces debe
ser mayor a 31 (es la u
nica otra opci
on), por lo tanto se puede utilizar la condicion por
defecto, es decir, no hay necesidad de especificar if d
a > 31:. Adicionalmente, para
escribir la fecha correcta es necesario utilizar unas operaciones para manejo de cadenas de
texto. El cuadro 5.3 describe algunas operaciones basicas de cadenas de texto.
Condici
on por Defecto
DR
A
def PascuaMejorado(ano):
"Escribe el da del domingo de Pascua de acuerdo a un ano"
# Halla el da 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)
61
5 Noci
on de Condici
on
len(w)
find(w,s)
capitalize(w)
w1 + w2
w * n
c in w
Acci
on
Retorna una cadena de texto que contiene una representacion imprimible del objeto w
Retorna el n
umero de caracteres de la cadena w
Retorna la posicion mas cercana al inicio donde se encuentre la
subcadena s dentro de la cadena w. Si la subcadena no se encuentra
en w, retorna -1
Retorna la cadena w en may
usculas
Retorna la concatenacion de las cadenas w1 y w2
Retorna n copias de la cadena w concatenadas
Retorna un booleano que indica si el caracter c se encuentra en la
cadena w
FT
Operaci
on
str(w)
DR
A
Ejemplo 5.4
Supongamos que la tortuga Junior debe ir a un sitio particular de la ciudad. Las opciones
de transporte son: Bus, Taxi o Carro Particular. Si Junior necesitase llegar antes de 15
minutos y tuviera $30000, entonces Junior escoge mejor irse en Taxi, sin embargo si tuviera
un poco mas de tiempo e igual cantidad de dinero, sera indiferente el medio de transporte.
Si tuviera 1 hora o m
as para llegar a su destino, la tortuga preferira ahorrar el dinero e
irse en Bus. Lo anterior se calcula solo si Junior no tuviera a nadie que lo lleve en Carro
Particular.
Para resolver este problema es necesario tener en cuenta todas las condiciones necesarias
para cada opci
on de transporte. El algoritmo 5.5 muestra una forma de solucionar el
problema.
La funci
on transporte() tiene tres parametros: dinero, tiempo y carro. El dinero
y el tiempo son entonces variables de tipo entero, mientras que carro es una variable
de tipo Booleano. Por comodidad, el transporte por defecto sera Carro Particular (la
variable local transporte se declara con este valor). Si el argumento que se manda para el
par
ametro carro en la aplicacion de esta funcion es True entonces simplemente se retorna
el transporte por defecto. De lo contrario, se debe verificar el tiempo: si es mayor o igual a
una hora entonces el transporte sera Bus, sino tenemos que consultar el dinero: si se tienen
los $30000 pero no hay problema con el tiempo (la tortuga necesita llegar entre 15 y 60
minutos) entonces se toma el Bus, sin embargo si hay prisa (15 minutos o menos) se tiene
que tomar Taxi.
62
? ? ?
5.2 Ejercicios
return transporte
FT
Ejercicios
DR
A
5.2.
5.1 Dado el estado inicial del problema de mayora de edad (ejemplo 5.1) y la funcion
esMayorDeEdad(), escriba el algoritmo necesario para que la tortuga vaya al sitio
adecuado dependiendo de la edad que tiene, deje una lnea punteada por el camino
que 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 muestren
los disparos cuando se realicen (i.e. en las posiciones retornadas por la operacion del
sistema aleatorio).
5.3 La formula de Pascua del ejemplo 4.6 funciona para cualquiera a
no en el rango
de 19002099 excepto para 1954, 1981, 2049 y 2076. Para estos 4 a
nos la formula
produce una fecha que est
a una semana despues. Escriba la funcion Pascua2() con
las modificaciones necesarias para que la formula funcione para todos los a
nos.
5.4 Un a
no es bisiesto si es divisible por 4, a menos que sea un a
no que no es divisible
por 400 (1800 y 1900 no son bisiestos, mientras que 1600 y 2000 s lo son). Escriba
la funcion Bisiesto() que retorne True si el a
no que le entra es bisiesto, y retorne
False de lo contrario.
63
5 Noci
on de Condici
on
FT
b) si el mes est
a despues de Febrero, reste (4mes + 23)/10
c) si es un a
no bisiesto y despues de Febrero 29, sume 1
DR
A
Escriba la funci
on NumeroDia() que tome una fecha (igual que el problema anterior,
es decir, representada en tres entradas da, mes y a
no), verifique que es una fecha
v
alida (usando la funcion del problema anterior), y calcule el n
umero asociado al da
del a
no.
64
FT
6 Noci
on de Repetici
on
DR
A
En la mayora de sistemas existen operaciones que se repiten una y otra vez. En el sistema
solar, por ejemplo, se ve que la traslaci
on de los planetas se repite, al igual que la rotacion
de la Tierra; en un sistema de producci
on las maquinas repiten un proceso de fabricacion;
en la formula 1 los carros repiten un recorrido un n
umero partcular de veces. Todas las
repeticiones mencionadas se hacen hasta que el sistema llega un estado deseado (algunas
de ellas son tantas que su cantidad podra entenderse como infinito).
En modelos computacionales las repeticiones pueden hacerse de manera explcita o
implcita, es decir, con estructuras que controlan el flujo de la ejecucion o con aplicaciones circulares de funciones que vayan reduciendo las entradas hasta un caso base. Una
repeticion explcita es com
unmente llamada iteracion mientras que la aplicacion circular de
una funcion (repetici
on implcita) es denominada recursion. A continuacion se vera cada
una de ellas.
6.1.
Iteraci
on
65
Ciclo
Iteraci
on
6 Noci
on de Repetici
on
DR
A
FT
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))
66
6.1 Iteracion
FT
DR
A
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
Tal como puede verse en los anteriores algoritmos, para solicitar un dato al usuario e
imprimir informaci
on en pantalla, pueden usarse tres operaciones basicas de entrada y
salida, las cuales pueden verse en el cuadro 6.1.
El flujo de ejecuci
on del algoritmo 6.2 (figura 6.1) muestra la semantica de un ciclo: el
cuerpo de un ciclo se ejecuta repetidamente mientras la condicion sea cierta. Una vez la
condicion 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
condicion es falsa, no se ejecute nada del cuerpo del ciclo.1
1
67
Ciclo while
6 Noci
on de Repetici
on
n
adivinar(n)
FT
oportunidad = 1
oportunidad <= 5?
Falso
Cierto
numero = input()
numero == n?
Cierto
print()
oportunidad = 5
Falso
oportunidad == 5?
DR
A
Cierto
Falso
print()
numero > n?
Cierto
print()
Falso
print()
oportunidad = oportunidad + 1
garantiza que el cuerpo del ciclo se ejecute por lo menos una vez (ciclo do-while), (2) aquel en el que
no se prueba una condici
on sino que se especifica explcitamente cu
antas iteraciones se har
an en el ciclo
(ciclo for) y (3) aquel en el que se hace una iteraci
on sobre los elementos de una lista (ciclo for-each).
68
6.1 Iteracion
Operaci
on
input(t)
raw input(t)
FT
print(t)
Acci
on
Solicita al usuario un dato por medio del texto t y retorna lo que
el usuario entre con el tipo de dato apropiado
Solicita al usuario un dato por medio del texto t, pero retorna lo
que el usuario entre como una cadena de texto
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 las
operaciones del cuadro 6.1.
DR
A
Ejemplo 6.1
El juego Triqui (Tic-Tac-Toe en ingles) consiste en una grilla de 3 3, donde dos jugadores X y O se turnan colocando su marca en una posicion vaca de la grilla. Cuando un
jugador logra colocar tres de sus marcas en lnea (vertical, horizontal o diagonal) gana el
juego. Luego, cada jugador lo que debe hacer es escoger una posicion y marcarla, y esto se
debe hacer mientras el juego no haya terminado (i.e. no haya un ganador o el tablero no
este lleno).
p1
p2
p3
p4
p5
p6
p7
p8
p9
69
6 Noci
on de Repetici
on
FT
def JuegoTriqui():
"Programa para jugar Triqui"
# Inicializa las variables locales
jugador = "X"
p1 = p2 = p3 = p4 = p5 = p6 = p7 = p8 = p9 = ""
DR
A
# 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")
70
6.1 Iteracion
FT
Ejemplo 6.2
En un negocio de venta de productos al detal (e.g. una tienda de barrio, un supermercado o
restaurante) un cliente paga por un producto y si el dinero que entrega es mayor al precio
del producto, la empresa debe devolverle al cliente la cantidad excedente de dinero (el
cambio). Dicha cantidad debe ser desglosada en una denominacion que sea factible dadas
las 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 tienen
billetes de 10000, de 2000 y monedas de 500, entonces el cambio es factible de dar.
DR
A
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
denominacin = siguienteDenominacion(denominacion)
71
6 Noci
on de Repetici
on
denominaci
on), si se le pasa 20000, retornara 10000, y as sucesivamente.2
? ? ?
FT
Ejemplo 6.3
Supongamos que queremos imprimir la lista de los n
umeros primos del 1 al n. Para hacer
esto debemos hacer un ciclo desde 1 hasta n imprimiendo el n
umero i (1 i n) en
cada iteraci
on. Sin embargo i se debe imprimir solo si es primo y esto lo sabemos si dicho
n
umero es divisible solo entre 1 y el mismo, es decir, si el residuo de la division entre i y
todos los n
umeros entre 2 y i 1 es diferente de cero. Para esto u
ltimo debemos hacer otro
ciclo. El algoritmo 6.5 muestra el anterior procedimiento.
def primos(n):
"Procedimiento que imprime los nmeros 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
DR
A
Ciclos Anidados
Existen algunos problemas cuya solucion requiere que en el cuerpo del ciclo, es decir, en
medio de las operaciones que se quieren repetir, hayan otros ciclos. Estos son com
unmente
llamados ciclos anidados.
Es normal que en algunos problemas el objetivo que se quiere lograr al realizar un ciclo
se cumpla antes de terminar el ciclo, es decir, cuando todava la condicion es cierta. Para
2
72
6.1 Iteracion
Rompimiento
FT
estos casos resulta ineficiente continuar realizando iteraciones ya que lo que se pretenda ya
se ha cumplido. Hay dos posibles soluciones para estos problemas: (1) forzar manualmente
a que se incumpla la condici
on del ciclo, o (2) usar una instruccion de rompimiento. Un
3
rompimiento es una estructura de control que altera la forma de proceder de una iteracion, causando que el ciclo m
as interno en el que se encuentra el rompimiento se termine
inmediatamente cuando es ejecutado.
De igual manera, en algunos ciclos resulta u
til que en alg
un punto de la iteracion el flujo
de ejecucion se mueva a la siguiente iteracion sin continuar mas alla en el cuerpo de la
actual iteracion. Estas estructuras de control son llamadas continuaciones.
En el ejemplo 6.4 se muestra una situacion com
un donde el uso de los rompimientos y
continuaciones es adecuado.
DR
A
Ejemplo 6.4
Supongamos que necesitamos hacer un interpretador on-line del lenguaje de programacion
Python. Esta es una tarea bastante laboriosa y requiere un conocimiento muy avanzado,
por lo que queremos empezar simplemente quitando los comentarios, ya que estos, por
definicion, son solo anotaciones y siempre son ignorados por los interpretadores. Para esto,
entonces, debemos pedir al usuario que vaya ingresando lnea por lnea, el codigo del programa que esta desarrollando, y cada vez que el usuario escribe una lnea, revisar el primer
caracter de dicha lnea y si es un smbolo # significa que esa lnea es un comentario y
no debe ser interpretada. El algoritmo 6.6 muestra este procedimiento.
Puede notarse que la condici
on del ciclo es la constante True, esto significa que la condicion siempre ser
a cierta y por lo tanto el n
umero de iteraciones esta indeterminado. Lo
anterior es necesario ya que de antemano no se sabe cuantas lneas de codigo va a ingresar el usuario. Una vez se obtiene la lnea de codigo (un texto), se pregunta si el primer
caracter de dicho texto es el smbolo # y si la respuesta es afirmativa no hay necesidad
de seguir con el resto del cuerpo del ciclo sino que simplemente se vuelve a pedir una lnea
de codigo. Si la respuesta es negativa se revisa si lo que hizo fue presionar enter en cuyo
caso 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 procedimiento
para interpretar el c
odigo que se ha introducido, el cual no sera implementado aqu.
? ? ?
73
Continuaci
on
6 Noci
on de Repetici
on
FT
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
DR
A
6.2.
Recursi
on
A diferencia de la repetici
on por medio de iteracion, la repeticion por medio de recursi
on
no cambia el estado del sistema en cada repeticion. Lo que hace es abstraer el c
odigo a
repetir y luego repite la aplicacion de dicha abstraccion reduciendo los argumentos en cada
repetici
on hasta cumplir una condicion. De esta manera la recursion hace que el problema
que se est
a resolviendo se divida en dos o mas piezas conceptuales (i.e. idea matem
atica
de dividir y conquistar), cada una de ellas siendo una version mas peque
na del problema
original.
Los fractales son ejemplos reales de la idea de recursion. En la figura 6.34 puede verse
un helecho, el cual est
a constituido de helechos con una medida mas peque
na, que a su vez
4
74
6.2 Recursion
DR
A
FT
Como en recursi
on el conjunto de operaciones que se quiere repetir es abstrado en un
procedimiento o funci
on, la forma de hacer repeticion es aplicando dicho procedimiento o
funcion dentro de la misma abstracci
on. De all que la nocion de recursi
on sea descrita
como una operaci
on definida en terminos de s misma. Por ejemplo, encontrar el factorial
de un n
umero n es igual a encontrar el factorial del n
umero anterior, n 1, y multiplicar
su resultado por n, es decir, f act(n) = f act(n 1) n.
Sin embargo, si desarrollamos la recursion del factorial as como esta: f act(n) = n
75
Recursi
on
6 Noci
on de Repetici
on
f act(n 1), podemos ver que es infinita, es decir, nunca para:
f act(n) = n f act(n 1)
f act(n 1) = (n 1) f act(n 2)
FT
f act(n 2) = (n 2) f act(n 3)
..
.
DR
A
def factorial(n):
"Funcion que halla el factorial de un numero"
if n == 0:
return 1
else:
return n * factorial(n-1)
76
6.2 Recursion
n=5
factorial(5)
nivel 0
n == 0?
Cierto
return 1
Falso
return 5 * factorial(n-1)
n=4
factorial(4)
nivel 1
n == 0?
Cierto
return 1
Falso
return 4 * factorial(n-1)
retorna 24
n=3
factorial(3)
nivel 2
n == 0?
Cierto
return 1
FT
retorna 120
Falso
return 3 * factorial(n-1)
retorna 6
n=2
DR
A
factorial(2)
nivel 3
n == 0?
Cierto
return 1
Falso
return 2 * factorial(n-1)
retorna 2
n=1
factorial(1)
nivel 4
n == 0?
Cierto
return 1
Falso
return 1 * factorial(n-1)
retorna 1
n=0
n == 0?
Cierto
return 1
factorial(0)
nivel 5
Falso
return n * factorial(n-1)
retorna 1
77
6 Noci
on de Repetici
on
FT
flujo de ejecuci
on cambia y la funcion, en el nivel 5 de recursion, retorna 1. Este cambio en
el flujo hace que se empiece a conocer el resultado de las aplicaciones de las funcion: en el
nivel 4, factorial(1-1) es igual a 1, de all que la funcion factorial en el nivel 4 retorne
1 1 = 1; este resultado hace que se conozca factorial(2-1) y se retorne 2 1 = 2 en el
nivel 3; y as sucesivamente hasta volver al nivel 0 donde se retornara el resultado final.
A continuaci
on se muestran otros ejemplos de algoritmos recursivos.
DR
A
Ejemplo 6.5
Cuenta la leyenda que en un templo de Hanoi, bajo la c
upula que se
nala el centro del mundo,
hay una bandeja de bronce con tres largas agujas. Al crear el mundo, Dios coloco en una
de ellas sesenta y cuatro discos de oro, cada uno de ellos mas peque
no que el anterior hasta
llegar al de la cima. Da y noche, incesantemente, los monjes transfieren discos de una
aguja a otra siguiendo las inmutables leyes de Dios, que dicen que debe moverse cada vez
el disco superior de los ensartados en una aguja a otra y que bajo el no puede haber un
disco 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 problema para cuatro discos esta en la figura 6.5.
La leyenda fue inventada por De Parville en 1884, en Mathematical Recreations and Essays, un libro
de pasatiempos matem
aticos. La ambientaci
on era diferente: el templo estaba en Benares y el dios era
Brahma.
78
6.2 Recursion
FT
Aunque solo se puede tocar el disco superior de un monton, se debe pensar en el disco
del fondo. Ese disco debe pasar de la primera aguja a la tercera, y para que eso sea posible,
se debe alcanzar la configuraci
on de la figura 6.7.
DR
A
Solo en ese caso se puede pasar el disco mas grande a la tercera aguja, es decir, alcanzar
la configuracion de la figura 6.8.
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
6 Noci
on de Repetici
on
Los par
ametros que necesita el procedimiento son el n
umero de discos que vamos a
mover, la aguja origen y la aguja destino. Se identificara cada aguja con un n
umero. El
procedimiento se encuentra en el algoritmo 6.8.
FT
DR
A
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 procedimiento torresHanoi(4,1,3). El programa imprimira las ordenes correspondientes a los
movimientos de la figura 6.9.
Interfaz Grafica
? ? ?
La soluci
on para el problema de las torres de Hanoi esta bien, pero no muestra gr
aficamente el proceso, es decir, solo describe textualmente los pasos para resolver el problema.
Para los siguientes problemas vamos a introducir un sistema para desarrollar interfaces
gr
aficas llamado Tkinter6 . Una interfaz gr
afica es un espacio de interaccion entre una persona y un programa con im
agenes en vez de comandos de texto. Algunas operaciones del
6
80
6.2 Recursion
2)
3)
4)
5)
6)
7)
8)
9)
10)
11)
12)
13)
14)
15)
16)
FT
1)
Acci
on
Crea y retorna la ventana principal de un programa
Crea y retorna un nuevo boton en la ventana v con
texto t y que realiza la accion a cuando se oprime
Crea y retorna una nueva etiqueta en la ventana v
con texto t
Crea y retorna un nuevo campo de texto en la ventana v para un n
umero de caracteres c
Crea y retorna un nuevo campo de dibujo en la
ventana v de ancho w y alto h
Toma el widget y lo hace visible
Hace que la ventana se quede esperando los eventos
que puedan ocurrir hasta que se cierre la ventana
DR
A
Operaci
on
Tk()
Button(v,text=t,command=a)
Label(v,text=t)
Text(v,width=c)
Canvas(v,width=w,height=h)
pack()
mainloop()
Ejemplo 6.6
El Triangulo de Sierpinski es un fractal creado por Waclaw Sierpi
nski en 1915. El concepto
del Triangulo de Sierpinski es muy simple: Se toma un triangulo (usualmente, pero no
necesariamente, equil
atero) como la primera imagen de la figura 6.10; se conectan los
puntos medios de cada lado para formar cuatro triangulos separados y se corta el triangulo
del centro, como en la segunda imagen de la figura; para cada uno de los tres triangulos
81
6 Noci
on de Repetici
on
FT
...
DR
A
La construcci
on de este fractal muestra claramente una recursion que puede ser implementada como la funci
on sierpinski() del algoritmo 6.9. La idea de este algoritmo se
centra en que el nivel de recursion en el que se encuentre el proceso determina el n
umero
de tri
angulos a dibujar: si estamos en un nivel inicial (cero) solo se dibuja un triangulo, en
el 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 particular y un tama
no especfico, y entre mas alto sea el nivel, la posicion cambiara de manera
mon
otona y dicho tama
no es mas peque
no (el tama
no de un lado de cualquiera de los tres
tri
angulos es la mitad del tama
no de un lado del triangulo superior).
Los par
ametros del procedimiento sierpinski() incluyen el canvas y las coordenadas
x y y donde ser
a dibujado el triangulo, el tama~
no del triangulo a dibujar y el nivel en el que
se encuentra la recursi
on. En el nivel cero simplemente se dibuja un triangulo usando el
procedimiento para crear polgonos (vease el cuadro 6.3); en cualquier otro nivel se realizan
tres llamados recursivos, correspondientes a los tres triangulos que se deben dibujar dentro
del tri
angulo superior.
El procedimiento gui-sierpinski() en el algoritmo 6.9 recibe como parametro el nivel
de profundidad del Tri
angulo de Sierpinski. Su proceso es simple: primero crea una ventana
y se la asigna a la variable v; entonces dentro de dicha ventana crea un canvas (asignado a
la variable miCanvas) de tama
no 500500 donde se dibujara el Triangulo de Sierpinski y se
hace visible con la operaci
on miCanvas.pack(); luego se hace el llamado al procedimiento
para construir y dibujar el triangulo enviando como argumento el canvas recien creado,
la posici
on dentro del canvas (100,400), el tama
no del triangulo mas grande y el nivel de
profundidad; finalmente se aplica la operacion para dejar a la ventana v lista para cualquier
82
6.3 Ejercicios
evento.
FT
DR
A
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()
Puede intuirse entonces que si se quisiera crear un Triangulo de Sierpinski con una
profundidad 4, se debera 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 tablero
de Triqui y retorna True si alguno de los dos jugadores gano o si el tablero ya
esta completo y ninguno de los jugadores gano, de lo contrario retorna False.
ImprimirTriqui() recibe como parametros las nueve posiciones de un tablero
de Triqui e imprime el tablero de Triqui de una manera visualmente correcta
(i.e. como se ve normalmente el juego).
83
6 Noci
on de Repetici
on
Operaci
on
create arc(x0,y0,x1,y1)
create bitmap(x,y,bitmap=b)
create oval(x0,y0,x1,y1)
FT
create image(x,y,image=i)
create line(x0,y0,x1,y1,...,xn,yn)
create polygon(x0,y0,x1,y1,...,xn,yn)
create rectangle(x0,y0,x1,y1)
DR
A
create text(x,y,text=t)
Acci
on
Construye un arco desde el punto
(x0,y0) hasta el punto (x1,y1)
Muestra el mapa de bits b en el punto
(x,y)
Muestra la imagen i en el punto (x,y)
Construye una lnea que va por la serie de puntos (x0,y0), (x1,y1), . . . ,
(xn,yn)
Construye el ovalo que calza en el
rectangulo definido por los puntos
(x0,y0) y (x1,y1)
Construye un polgono cuya geometra
es especificada por los vertices definidos con los puntos (x0,y0), (x1,y1),
. . . , (xn,yn)
Construye el rectangulo definido por
los puntos (x0,y0) y (x1,y1)
Muestra el texto t en el punto (x,y)
6.2 El juego de Triqui del algoritmo 6.3 tiene algunos problemas, por ejemplo un jugador
puede seleccionar una posicion donde ya haba un smbolo, o si un jugador no ingresa
un n
umero entre 1 y 9 (las posiciones del tablero), pierde el turno. Corrija estos y
otros problemas que tiene el juego.
6.3 El algoritmo 6.4 tiene dos problemas, (1) si se paga con una cantidad menor al
costo del producto, no se da cambio, pero tampoco se especifica que le falta dinero
y (2) la funci
on siguienteDenominacion() no esta implementada. Solucione estos
problemas.
6.4 Asuma que en el problema del desglose de dinero se tiene una cantidad limitada de
billetes y monedas. Modifique el algoritmo 6.4 para que se tenga en cuenta el n
umero
84
6.3 Ejercicios
FT
DR
A
6.10 Modifique el algoritmo 6.8 para mostrar graficamente el proceso de solucion de las
Torres de Hanoi. Puede usar el Mundo de la Tortuga o el sistema Tkinter.
85
DR
A
FT
6 Noci
on de Repetici
on
86
FT
7 Noci
on de Abstracci
on de Datos
En el captulo 4 se describi
o la abstraccion como el proceso en el que datos y algoritmos son agrupados dentro de una categora que los conecta. En este captulo veremos la
abstraccion que involucra datos.
7.1.
Listas
DR
A
La abstracci
on de datos, al igual que la abstraccion de control, permite ocultar informacion de manera que se presenten solo los datos relevantes a un contexto particular. De
esta forma se hace visible al usuario solo una interfaz de los datos mientras que los datos
como tal se vuelven privados y son accedidos solo a traves de dicha interfaz. Las interfaces, en general, son herramientas computacionales que sirven como punto de interaccion
entre componentes, los cuales pueden ser de bajo nivel como los sistemas operativos que
permiten interactuar piezas de hardware con programas, o de mas alto nivel como graficas (que brevemente se describieron en el captulo anterior) y estructuras de datos. Una
estructura de datos es un grupo de piezas de informacion reunidas bajo un mismo nombre. Su proposito es organizar eficientemente dicha informacion de manera que operaciones
como b
usqueda y ordenamiento se realicen de la mejor manera posible y se conserven las
propiedades matem
aticas que puedan existir en esas operaciones. Las estructuras de datos
comprenden, entre muchos otras, arreglos, registros, conjuntos, pilas, colas, arboles, grafos
y tablas hash, pero quiz
as las m
as usadas sean las listas.
Una lista es una secuencia de datos llamados elementos los cuales pueden ser accedidos
directamente por medio de un ndice. Para una lista X, el primer elemento tiene ndice
cero, es decir es el elemento X[0], el segundo elemento tiene ndice uno, o sea que es el
X[1], y as sucesivamente hasta el u
ltimo elemento cuyo ndice es igual al tama
no de la
lista menos uno, es decir que si n es el n
umero de elementos de la lista, el u
ltimo elemento
sera X[n 1].
Para ejemplificar la noci
on de lista y la necesidad de contar con ella, consideremos
un juego simple como el ahorcado. Este juego consiste en dos jugadores, uno de ellos
piensa en una palabra y dibuja lneas que representan las letras de dicha palabra, y el otro
jugador debe descifrar cu
al es esa palabra secreta. En cada turno el primer jugador dice
una letra y si esta letra pertenece a la palabra secreta el otro jugador escribira la letra
sobre la correspondiente lnea, pero si la letra no pertenece a la palabra el segundo jugador
87
Interfaz
Estructura de Datos
Lista
7 Noci
on de Abstracci
on de Datos
dibujar
a una parte de un hombre ahorcado. Si el primer jugador puede adivinar la palabra
secreta antes que se dibuje por completo el ahorcado, este gana, de lo contrario pierde. La
figura 7.1 muestra un juego de ahorcado: el primer jugador ha acertado 5 letras y fallado
igual n
umero de veces, por esto el dibujo del ahorcado esta muy cerca de terminarse.
FT
Letras Falladas:
U, S, E, T, L, B, V, K, Q
RA
DR
A
PRO
ON
88
7.1 Listas
FT
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
DR
A
89
7 Noci
on de Abstracci
on de Datos
Acci
on
Agrega el elemento x al final de la lista
Inserta el elemento x en la posicion i de la lista
Borra el primer elemento de la lista que tenga valor x
Retorna y borra el elemento de la lista cuya posicion es i
Retorna el tama
no de la lista l
Retorna un booleano que indica si el elemento x se encuentra
en la lista l
Retorna una lista con los n
umeros del cero al n-1 como
elementos
DR
A
Operaci
on
append(x)
insert(i,x)
remove(x)
pop(i)
len(l)
x in l
FT
tido). Las otras dos listas sirven para llevar un registro de las letras que el jugador va
diciendo, en una van las letras que efectivamente se encuentran en la palabra secreta y en
la 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 teora se
debe mostrar una splash screen 1 ) con un procedimiento no implementado aqu llamado
saludoInicial(), y despues arranca el ciclo del juego: primero dibuja o actualiza el tablero
con el procedimiento dibujarTablero(), el cual debe mostrar una imagen como la figura
7.1 dada la palabra secreta y las listas de registro de letras; acto seguido le pide una letra
al jugador con la funci
on pedirLetra(); por u
ltimo, de acuerdo a la letra dada se realiza
el proceso correspondiente, es decir, agregar la letra a la lista letrasAcertadas o a la lista
letrasFalladas y, si es el caso, terminar el juego ya sea porque encontro todas las letras
de 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 como
append y in. Estas y otras operaciones basicas del sistema de listas se pueden ver en el
cuadro 7.1.
range(n)
Una splash screen o pantalla de inicio, es una imagen que se muestra al inicio de un programa para presentar el logo y/o ttulo del programa, y adem
as para notificar al usuario que el programa se
est
a cargando.
90
7.1 Listas
FT
display.update()
event.get()
mouse.get pos()
DR
A
font.SysFont(f,t)
draw.rect(s,c,r,w)
Acci
on
Inicializa todo el sistema pygame
Termina el sistema
Inicializa una ventana para trabajar y retorna un display
(dispositivo de salida). Su parametro r representa la resoluci
on de la ventana (una pareja (w, h) donde w es el ancho y
h es el alto de la ventana)
Actualiza la ventana
Retorna una lista con los eventos que recibe el sistema
Retorna una pareja, i.e. lista de dos elementos, con la posici
on (x, y) de la ventana donde se hizo clic con el mouse
Retorna la fuente con tipo f y tama
no t para ser usada
Dibuja un rectangulo en la superficie s con color c, anchura
del borde w (w=0 significa que el rectangulo estara lleno del
color c) y cuyos puntos se encuentran en las posiciones dadas
por los elementos de la lista r
Carga y retorna la imagen contenida en el archivo f
Toma la imagen i y la escala a las nuevas dimensiones (w,
h)
Carga el archivo de sonido w
Interpreta el archivo de sonido cargado previamente
image.load(f)
transform.scale(i,(w,h))
mixer.music.load(w)
mixer.music.play()
Constantes
QUIT
KEYUP
KEYDOWN
MOUSEMOTION
MOUSEBUTTONUP
MOUSEBUTTONDOWN
K RETURN
K SPACE
K A3
2
3
http://www.pygame.org/
Las constantes para todos los dem
as botones del teclado tienen la misma forma: K <tecla>.
91
7 Noci
on de Abstracci
on de Datos
A continuaci
on, en el ejemplo 7.1, se desarrollan las funciones y procedimientos no implementados del procedimiento juegoAhorcado() en el algoritmo 7.1, usando operaciones
del sistema pygame.
FT
Ejemplo 7.1
DR
A
La funci
on saludoInicial() (algoritmo 7.2) comienza inicializando el sistema pygame y
construyendo la ventana principal del programa (que puede verse en la figura 7.2). Despues
de esto selecciona la fuente con la que se escribira en esta funcion, que en este caso es
Arial de tama
no 30. Acto seguido asigna las variables que contienen las frases que se van
a imprimir en la pantalla. Dichas frases deben ser renderizadas, es decir, se deben generar
im
agenes a partir de unos modelos, que en este caso son texto. La renderizacion se produce
aplicando la operaci
on render() del modulo de fuentes del sistema (las operaciones de este
m
odulo pueden verse en el cuadro 7.3). Luego comienza un ciclo infinito en el cual primero
se borra completamente la pantalla, se se muestran las frases renderizadas y se espera a
que el usuario realice un evento. Si el evento resulta ser oprimir una tecla y esa tecla es
RETURN o ENTER, entonces el ciclo se rompe con la instruccion break y se termina la
funci
on retornando la ventana principal del programa.
Una ventana en el sistema pygame es una superficie (surface en ingles) que sirve para
almacenar im
agenes. Dichas imagenes deben ser transferidas a la superficie como mapas
de bits (de all que el texto deba ser renderizado para poder ser mostrado, como se mencion
o 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
7.1 Listas
esquina inferior derecha. En el cuadro 7.4 pueden detallarse dos operaciones de superficies
en pygame.
FT
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)
DR
A
return ventana
Por otro lado, los eventos que ocurren en un programa de pygame tienen un tipo y
una 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 boton
del teclado, y MOUSEMOTION, MOUSEBUTTONUP y MOUSEBUTTONDOWN para mover el mouse,
93
7 Noci
on de Abstracci
on de Datos
size(t)
set underline(b)
set bold(b)
set italic(b)
Acci
on
Crea una nueva superficie donde se imprime el texto t con
color c (una tipleta que representa el color en formato RGB).
El argumento a es un booleano que especifica si el texto
llevara antialias
Retorna las dimensiones necesarias (ancho,alto) para imprimir el texto t
De acuerdo al argumento booleano b, subraya el texto a
imprimir
De acuerdo al argumento booleano b, pone en negrilla el
texto a imprimir
De acuerdo al argumento booleano b, pone el texto a imprimir en italica
FT
Operaci
on
render(t,a,c)
DR
A
Operaci
on
blit(s,d)
fill(c)
Ciclo for-each
presionar un bot
on 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 cual
es retornada por la funci
on pygame.event.get(). Esta lista puede recorrerse, es decir,
conocer sus elementos, usando un ciclo while, sin embargo, como se dijo en el captulo 6,
existe otro tipo de ciclo que realiza iteraciones sobre los elementos de una lista, llamado
ciclo for-each . Este tipo de ciclo tiene dos particularidades: (1) en cada iteraci
on una
variable definida en el ciclo toma el valor de un elemento de la lista en el orden en que
se encuentran los elementos en la lista, y (2) no se tienen que manejar los ndices de
los elementos de la lista. Estas caractersticas hacen valioso este tipo de ciclo ya que el
programador no se preocupa por los ndices de la lista los cuales pueden llevar facilmente
a 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 como
par
ametros la ventana donde se dibujara, la palabra secreta y las listas de letras acertadas
y letras falladas. Como el tama
no de las letras que se van encontrando de la palabra secreta y el tama
no de las letras falladas son distintos, primero se crean dos fuentes. Luego se
94
7.1 Listas
FT
DR
A
# Actualiza el sistema
pygame.display.update()
95
7 Noci
on de Abstracci
on de Datos
(a)
(b)
(c)
(d)
FT
construye la palabra que se va a mostrar recorriendo cada una de las letras de la palabra
secreta y adicion
andolas (en may
uscula) a una cadena de caracteres si la letra se encuentra
en la lista de letras acertadas. Si la letra no se encuentra en la lista entonces se adiciona una lnea de subrayado. Acto seguido se limpia la pantalla y se dibuja el estado del
ahorcado. Este estado es dibujado cargando una imagen previamente hecha cuyo nombre
es ahorcadoX.jpg donde X es un n
umero entre 1 y 10 (estas imagenes, que pueden verse
en la figura 7.3, se encuentran como archivos en el sistema operativo y son cargadas en
el programa por medio del modulo de rutas de archivos del sistema os cuyas operaciones
b
asicas pueden verse en el cuadro 7.54 ). Despues se muestran las letras fallas y el estado
actual de la palabra secreta. Por u
ltimo se actualiza el sistema.
(e)
(f)
(g)
(h)
(i)
(j)
DR
A
Operaci
on
path.exists(p)
path.basename(p)
path.dirname(p)
path.join(p1,p2,p3,...)
Acci
on
Retorna true si la ruta p existe, false de lo contrario
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 de
aplicar esta funcion es programa)
Retorna el nombre del directorio de la ruta p (e.g.
si el sistema operativo actual es windows y p es
C:\windows\temp\programa entonces el resultado de
aplicar esta funcion es C:\windows\temp)
Junta las rutas de archivos p1,p2,... de manera adecuada (e.g. si el sistema operativo actual es windows,
p1 es C: y p2 es temp, entonces el resultado de aplicar
esta funcion es C:\temp)
Cuadro 7.5: Operaciones basicas del modulo de rutas de archivos del sistema operativo
En el captulo ?? se profundizar
a un poco en el sistema os y se usar
a el m
odulo de manejo de archivos
y directorios del sistema operativo.
96
7.1 Listas
FT
Las letras que el jugador quiere probar en el juego las solicita simplemente presionando la
tecla correspondiente. En el algoritmo 7.4 se muestra el proceso para hacer esto. Se define
un ciclo infinito para esperar indefinidamente hasta que el usuario realice alg
un evento. Si
el evento realizado es presionar una tecla, se verifica si esa tecla corresponde a una letra y
si 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 interpretar
un sonido, que en este caso es un archivo de tipo wav que contiene un beep.
DR
A
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"
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()
Finalmente el algoritmo 7.5 para acabar el juego simplemente dibuja dos rectangulos
rellenos en la ventana y escribe en ellos las frases de ganador o perdedor. Mientras tanto
espera a que el jugador presione alguna tecla y cuando esto ocurre termina el sistema. Un
97
7 Noci
on de Abstracci
on de Datos
ejemplo del juego con los dos posibles finales puede verse en la figura 7.4.
FT
DR
A
Ejemplo 7.2
Supongamos que queremos crear un juego que simule las elecciones para presidente. El
juego debe recibir el voto de cada uno de los n ciudadanos del pas y luego contar el
n
umero de votos para cada candidato de manera que se sepa quien es el presidente electo.
La tarjeta o tarjet
on electoral es un documento donde se encuentra la lista de candidatos
y el voto el blanco. Para votar, un ciudadano simplemente marca alguno de los candidatos
o la casilla del voto en blanco. Cuando se realiza el escrutinio, se cuentan cuantos votos se
marcaron para cada candidato y el que haya sacado la mayor cantidad es el ganador.
La informaci
on anterior provee los datos necesarios para construir el algoritmo 7.6 el
98
(a) Gan
o el juego ahorcado
FT
7.1 Listas
(b) Perdi
o el juego ahorcado
DR
A
cual simula las elecciones. Se tienen dos listas: la lista de los nombres de los candidatos y la
lista de los votos. En la lista de votos se iran contabilizando los votos que cada candidato
obtenga. Las listas listaNombres y listaVotos son correspondientes, es decir, el candidato
1, el cual es el elemento 1 de listaNombres, tiene el n
umero de votos del primer elemento
de listaVotos, el n
umero de votos del candidato 2 (elemento 2 de la lista) es el n
umero
que se encuentra en la segunda posici
on de la lista de votos, y as sucesivamente. Es de
notarse que en la lista de candidatos se tiene como u
ltimo elemento voto nulo, esto es
necesario para contabilizar este tipo de voto aunque no sea un candidato como tal. La
posicion donde se encuentra el voto nulo se almacena en la variable posVotoNulo para su
uso en la contabilidad de dicho voto.
La ventana se crea en la funci
on comienzoElecciones(), la cual se deja como ejercicio
para el lector.
El ciclo para hacer las votaciones hace n iteraciones, siendo n un parametro del procedimiento. En cada iteraci
on se obtiene el nombre del candidato por el que se vota mediante la
aplicacion de la funci
on sufragar(). Este nombre retornado por sufragar() se busca en
listaNombres y si existe se le agrega un voto a su elemento correspondiente. Si el nombre
no existe en la lista, entonces se contabiliza en el u
ltimo 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 recibieron
cada uno de los candidatos. Esto se hace en la funcion ordenar(). Luego de esta aplicacion,
en la primera posici
on de listaNombres queda el nombre del ganador de las elecciones,
el cual es mostrado en el procedimiento mostrarGanador(), que tambien se deja como
99
7 Noci
on de Abstracci
on de Datos
FT
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()
DR
A
La funci
on sufragar() (algoritmo 7.7) recibe como parametros la ventana donde se
har
an las votaciones y la lista de candidatos. En ella se declara una variable donde se
almacenar
a el nombre del candidato elegido y luego, en un ciclo infinito, se maneja el
evento de presionar un bot
on del mouse. Cuando este evento sucede se obtiene la posici
on
donde 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
7.1 Listas
la accion de hacer clic se hace fuera de los rectangulos que limitan las imagenes de los
candidatos, se considera que el voto fue nulo y la variable elegido es retornada con su
valor por defecto, es decir, una cadena vaca.
FT
DR
A
101
7 Noci
on de Abstracci
on de Datos
FT
Esto lo logra realizando dos ciclos anidados. El ciclo externo recorre las listas desde el
primer elemento hasta el u
ltimo, encontrando el menor elemento y ubicandolo en la posici
on adecuada seg
un el orden que se desea. El menor elemento se encuentra realizando el
ciclo interno, desde la posicion donde se encuentra el recorrido de las listas hasta el final,
buscando saber cu
al 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
DR
A
return listaNombres,listaVotos
Ordenamiento
Matriz
? ? ?
102
7.1 Listas
n
umero de dimensiones que tiene la matriz. En el ejemplo 7.3 se trabajara con listas de
listas, es decir, matrices de dos dimensiones.
DR
A
FT
Ejemplo 7.3
Buscaminas es un juego muy popular cuyo objetivo es limpiar un campo minado sin
detonar ninguna mina. El campo minado es una grilla de n m ubicaciones, en las cuales
puede o no haber una mina.
Este es un juego de un solo jugador, quien debe explorar el campo minado haciendo
clic en las ubicaciones de manera estrategica para no detonar una mina. Cuando se limpia
(se hace clic en) una ubicaci
on que no tiene una mina, esta revela una pista acerca de las
ubicaciones adyacentes. La pista es un n
umero, el cual hace referencia a la cantidad de
minas que hay alrededor de dicha ubicacion.
El juego termina cuando se hace clic en una mina o cuando se ha limpiado la totalidad
de ubicaciones que no tienen mina. En la figura 7.5 puede verse un ejemplo del buscaminas
para Windows 7.
103
7 Noci
on de Abstracci
on de Datos
por lo tanto, las pistas. La otra matriz (tableroVisible) representa el tablero tal y como
se ve en el juego, por lo que inicia vaca y a medida que se escoge una ubicacion, se va
revelando el contenido del tablero.
FT
DR
A
La parte gr
afica de este algoritmo se maneja de manera similar al algoritmo 7.1 del ejemplo del juego ahorcado, simplemente cambian algunos parametros e implementaciones de las
funciones y procedimientos saludoInicial(), dibujarTablero(), obtenerUbicacion()
(que en el ahorcado se llamaba pedirLetra()) y acabarJuego(). El proceso para obtener
el dato ingresado por el usuario es, quizas, el que mas cambia dado que ahora dicho dato es
una coordenada que representa la ubicacion que quiere explorar en el tablero. Todas estas
funciones se dejan como ejercicio para implementar.
Para trabajar con el tablero primero debe construirse la matriz. El proceso es bastante
simple y puede verse en el algoritmo 7.10. Se tienen dos ciclos anidados, el primero se
104
7.1 Listas
for i in range(alto):
listatemp = []
for j in range(ancho):
listatemp.append(' ')
matriz.append(temp)
return matriz
FT
DR
A
Una vez el tablero ha sido construido, se debe llenar con las minas y pistas. Este proceso
se realiza en el algoritmo 7.11. Primero se crea la matriz que representa el tablero. Luego
esta matriz se empieza a llenar con las minas (smbolo M). Las posiciones de las minas
son halladas de manera aleatoria y poniendo mucho cuidado de no repetir ninguna.
105
7 Noci
on de Abstracci
on de Datos
FT
DR
A
El algoritmo 7.12 es una modificacion de la parte de las pistas del algoritmo 7.11. En el
106
7.1 Listas
DR
A
FT
107
7 Noci
on de Abstracci
on de Datos
segunda tarea.
FT
Ejercicios
DR
A
7.2.
7.1 La operaci
on in para listas, revisa si un elemento se encuentra en una lista. As, si
escribimos if letra in letrasFalladas, lo que queremos saber es si el elemento
letra se encuentra en la lista letrasFalladas.
Desarrolle, sin usar dicha operacion in, la funcion buscarElemento() que tome como
argumentos una lista y un elemento, y retorne True si el elemento efectivamente se
encuentre en la lista, y False de lo contrario.
7.2 En el juego Ahorcado visto en este captulo se pueden repetir las letras falladas y
esto 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 programa
muestre una aviso al jugador diciendo, cuando se repite una letra fallada, que ya se
escogi
o dicha letra y la pida de nuevo sin anexarla de nuevo a la lista y sin dibujar
un elemento m
as del ahorcado.
7.3 La u
ltima letra que se presiona y el dibujo completo en el juego ahorcado no se
alcanza a mostrar cuando termina el juego. Modifique los algoritmos necesarios para
que efectivamente se muestre la u
ltima letra presionada y se dibuje completamente
el 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
7.2 Ejercicios
FT
DR
A
7.5 La funci
on ordenamiento del ejemplo 7.2 retorna las listas en orden ascendente, es
decir, de menor a mayor, de acuerdo a los votos obtenidos. Desarrolle la funcion
invertirLista() para tomar estas listas y retornarlas en orden invertido (i.e. de
mayor a menor).
7.6 Investigue e implemente en el juego de las elecciones los siguientes metodos de ordenamiento: 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 de
pygame. Modifique las funciones necesarias para hacerlo.
109
DR
A
FT
7 Noci
on de Abstracci
on de Datos
110
FT
Bibliografa
[1] Jean-Raymond Abrial. Guidelines to formal system studies. MATISSE project, November 2000.
[2] Donald E. Knuth. Structured programming with go to statements. ACM Computing
Surveys, 6(4):261301, December 1974.
[3] Guido Van Rossum and Fred L Drake Jr. An Introduction to Python. Network Theory
Ltd, 2011.
[4] Guido Van Rossum and Fred L Drake Jr. The Python Language Reference Manual.
Network Theory Ltd, 2011.
DR
A
[5] Gerardo Sarria. Introduction to programming for engineers following the parachute
paradigm. In 39th ASEE/IEEE Frontiers in Education. IEEE, San Antonio, TX, USA,
1821 October 2009.
[6] G. Michael Schneider. The introductory programming course in computer science: ten
principles. In Papers of the SIGCSE/CSA technical symposium on Computer science
education, SIGCSE 78, pages 107114, New York, NY, USA, 1978. ACM.
111