Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Curso 2005-2006
Alumno:
D.N.I:
Centro Asociado:
Índice
1. Cuestiones preliminares 4
1.1. Objetivos de la Práctica de Programación II . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2. Comentarios al enunciado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3. Aspectos importantes sobre las prácticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2. Enunciado de la práctica 7
2.1. Cuestiones sobre el enunciado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3. Especificación 9
3.1. Consideraciones sobre la especificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2. Cuestiones sobre la especificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.3. Especificación formal de la función (trabajo del alumno) . . . . . . . . . . . . . . . . . . . 10
3.3.1. Especificación de simln, simbox y alfbox (trabajo del alumno) . . . . . . . . . . . 10
3.3.2. Especificación de unafila y nfilas (trabajo del alumno) . . . . . . . . . . . . . . 11
3.3.3. Especificación de unacolumna y ncolumnas (trabajo del alumno) . . . . . . . . . . 11
3.3.4. Especificación de unaregion y nregiones (trabajo del alumno) . . . . . . . . . . . 11
3.3.5. Especificación de sudoku (trabajo del alumno) . . . . . . . . . . . . . . . . . . . . . 12
6. Diseño iterativo 22
6.1. Cuestiones preliminares sobre el diseño iterativo . . . . . . . . . . . . . . . . . . . . . . . . . 22
6.2. Derivación del invariante desde de la postcondición (trabajo del alumno) . . . . . . . . . . 22
6.3. Inicialización del bucle (trabajo del alumno) . . . . . . . . . . . . . . . . . . . . . . . . . . 22
6.4. Instrucción avanzar del bucle (trabajo del alumno) . . . . . . . . . . . . . . . . . . . . . . 23
6.5. Restablecimiento del invariante (trabajo del alumno) . . . . . . . . . . . . . . . . . . . . . 23
6.6. Código del algoritmo iterativo de unafila−it y unacolumna−it (trabajo del alumno) . . 24
6.7. Estudio del coste (trabajo del alumno) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.8. Cuestiones sobre la función iterativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
ÍNDICE ÍNDICE
7. Implementación en Modula-2 26
7.1. Código Modula-2 y juegos de pruebas (trabajo del alumno) . . . . . . . . . . . . . . . . . 26
7.2. Módulos de apoyo a la implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
7.3. Módulos que implementará el Alumno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
7.4. Formato de entrada y salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
7.5. Juegos de pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
7.6. Estudio empı́rico del coste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7.7. Cuestiones sobre la función iterativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
.Referencias 31
3
Cuestiones preliminares
Introducción
1. Cuestiones preliminares
1.1. Objetivos de la Práctica de Programación II
El objetivo es que el alumno ponga en práctica, de forma monitorizada, las técnicas de diseño y análisis de
programas propias de la asignatura. En particular, se pretende:
Ilustrar el tipo de problemas que pueden ser objeto de examen, en un entorno controlado y extendido
a lo largo del cuatrimestre, de forma que, a la vez que se aprenden las técnicas concretas, se vaya
adquiriendo soltura con las herramientas de demostración y cálculo. Cabe notar que el detalle y la
extensión con que se tratan estos problemas en la práctica es muy superior al que se requiere en las
pruebas presenciales de la asignatura.
La práctica tiene un carácter formativo; por ello, es esencial que el alumno trabaje con ella antes de las
sesiones presenciales; que acuda a esas sesiones y resuelva en ellas sus dudas iniciales; y, finalmente, que
consulte a sus tutores (presenciales o virtuales) ante cualquier duda que le surja durante la realización de la
misma.
4
Cuestiones preliminares
Por último, para facilitar el uso de este cuadernillo como guı́a de estudio a lo largo del curso, en cada apartado
destacaremos, en un recuadro, los conocimientos previos que el alumno deberı́a tener antes de abordarlo, en
el bien entendido de que el uso del cuadernillo se presupone secuencial, por lo que dichos conocimientos no
son exclusivos sino acumulados.
1 Ası́mismo, es imprescindible que cualquier alumno que desee concurrir a la Convocatoria Extraordinaria de Fin de Carrera
haya superado la práctica satisfactoriamente en el curso inmediatamente anterior al de la fecha del examen
2 Además de la Convocatoria Extraordinaria de Fin de Carrera, si tal fuese el caso
5
Cuestiones preliminares
6
Enunciado de la práctica
Enunciado
2. Enunciado de la práctica
Por favor, lea ATENTAMENTE el siguiente enunciado, ya que aporta los datos esenciales sobre
el diseño que ha de realizar.
Sudoku
Un sudoku es un rompecabezas en el que hay que disponer una serie de sı́mbolos en ciertas posiciones de
manera que cumplan unas propiedades. Se dispone de un tablero de n × n casillas, siendo n un cuadrado
perfecto. El tablero está dividido en filas, columnas y “regiones” (subtableros), todos de n posiciones (es
decir, las filas y columnas
√ ocupan todo el ancho o largo, respectivamente, del tablero y los cuadrados tienen
un lado que ocupa n casillas). Además, se utiliza un alfabeto de n sı́mbolos.Una solución correcta de un
su-doku tiene que cumplir que todos los sı́mbolos deben aparecer en cada:
fila (n posiciones)
columna (n posiciones)
√ √
cuadrado de n × n (n posiciones)
El siguiente es un ejemplo de una solución correcta de un sudoku
2 4 7 3 9 5 8 6 1
6 1 3 8 4 7 2 9 5
9 8 5 1 6 2 3 7 4
5 6 8 7 2 1 9 4 3
4 3 9 5 8 6 1 2 7
7 2 1 9 3 4 6 5 8
1 5 6 2 7 3 4 8 9
8 7 4 6 1 9 5 3 2
3 9 2 4 5 8 7 1 6
Se desea diseñar una función que determine si un tablero cuyas casillas contienen
sı́mbolos de un alfabeto dado constituye una solución correcta de un sudoku.
El diseño de la función que constituye la parte teórica de la práctica debe ser genérico, es decir, debe tratar
todos los factores (por ejemplo, el tablero, su tamaño o el alfabeto, entre otros) como parámetros, sin im-
portar cómo se instancien para resolver el problema (lo que se hará en la implementación de la práctica).
7
Enunciado de la práctica
4. ¿Qué consecuencias se desprenden de las propiedades que caracterizan a una solución de un sudoku?¿De
qué otra forma pueden definirse o comprobarse?
8
Especificación
El primer paso debe ser declarar la función, esto es, darle un nombre y declarar los parámetros que
recibe y el resultado que devuelve, nombrándolos y decidiendo a qué tipos de datos pertenecen.
En nuestro caso, la signatura o perfil‡ de la función será la siguiente (nótese que el nombre de la función
está en cursiva y los tipos predefinidos en negrita).
donde el natural representa la longitud del alfabeto de entrada que coincide con la dimensión del tablero
‡La signatura o perfil de una función consiste en el nombre de la misma y los tipos de datos de sus parámetros (pero
no sus nombres). En la función sudoku, cuya signatura se da más arriba, los parámetros de entrada son un tablero, que
representa el conjunto de casillas en las que se disponen los sı́mbolos para resolver el rompecabezas que nos ocupa, un
alfabeto, que contiene el conjunto de sı́mbolos de entrada (caracteres permisibles de entrada) y un natural, que indica el
tamaño del alfabeto y, por ende, la dimensión del tablero. El parámetro de salida es un bool que indica si la identificación
resulta o no positiva, esto es, si el tablero del primer parámetro representa una solución a un sudoku (o sea, cumple las
condiciones para serlo).
La postcondición expresa el resultado que se desea alcanzar, por lo que éste será el siguiente paso. Se
trata de expresarla de forma precisa.
La precondición define el conjunto de datos de entrada que se consideran válidos para la función
Ténganse en cuenta, al expresar la postcondición, todos los casos posibles, con especial atención a los
rangos vacı́os (si se usan cuantificadores) y a los casos extremos, ya que la sintaxis, usada imprecisa-
mente, puede dar lugar a equı́vocos y a definiciones incorrectas. Recuérdese que la postcondición debe
expresar la relación que debe existir entre las variables de salida y las de entrada.
Una vez decidida la postcondición, la precondición debe restringir los casos potencialmente erróneos,
limitando el dominio de aplicación de los datos de entrada.
En muchos casos, debido a la naturaleza del problema (en otros, se trata tan solo de conveniencia o
sencillez) la función que debemos diseñar no nos permite realizar directamente un diseño recursivo,
por lo cual deberemos especificar otra función que sı́ nos lo permita (es importante convencerse de este
hecho que puede presentarse en multitud de ocasiones. ¿Es éste el caso?)
9
Especificación
10
Especificación
11
Especificación
corrección de una región de la solución y, a continuación, la de nregiones, que comprueba la de todas las
regiones cuadradas del tablero. La declaración de estas funciones debe ser coherente con las de los puntos
anteriores, pero ha de pensarse en una forma de identificar a√la región concreta a la que nos referimos.
Como pista, sugerimos que se considere que hay n regiones de n filas y columnas (son como tableros más
pequeños). Como en los casos anteriores, deben especificarse ambas funciones respecto a las del apartado 3.3.1
(en la página 10) y queda como ejercicio intentarlo de forma aislada (sin contar con dichas especificaciones
previas).
En este punto, ya se deberı́a poder especificar la función sudoku, sin más que combinar el trabajo de los tres
puntos anteriores. Téngase en cuenta la especificación de la función (no se olviden, para ella, las condiciones
que el enunciado dictaba sobre un sudoku). Escrı́base la especificación completa de sudoku en el siguiente
espacio.
12
Diseño recursivo no final
Para realizar este apartado, el alumno ha debido estudiar ya el Tema 3.Diseño de Algoritmos
Recursivos de la Unidad Didáctica II (especialmente, Técnicas de inmersión)
13
Diseño recursivo no final
requiera descomposición recursiva), y para cuáles apoyar la solución en una nueva invocación recursiva de la
propia función. En esta clasificación, el parámetro inmersor que hayamos elegido va a realizar la función de
discriminador.
En cada caso, se trata de obtener una protección (o condición booleana que se debe cumplir para que se
proceda a devolver la parte derecha de dicha expresión) y el resultado si ésta se abre. Ha de tenerse en cuenta,
además, que todos los casos posibles para los datos de entrada estén cubiertos (o sea, que la disyunción de
todas las alternativas debe evaluarse a cierto), para evitar que haya casos sin tratar (véase 4.6.1).
En la práctica que nos ocupa, el caso trivial (el no recursivo) puede tratarse del análisis de un vector vacı́o.
El caso recursivo requerirá la evaluación de un predicado lógico en función de lo obtenido en una llamada
recursiva.
Para realizar este apartado, el alumno ha debido estudiar ya el Tema 3.Diseño de Algorit-
mos Recursivos de la Unidad Didáctica II (especialmente, Especificación, análisis por casos y
composición algorı́tmica)
Para realizar este apartado, el alumno ha debido estudiar ya el Tema 3.Diseño y Verifica-
ción de Algoritmos Recursivos de la Unidad Didáctica II (especialmente, Especificación y
Análisis por casos)
La composición algorı́tmica no es más que la expresión, utilizando una sintaxis algorı́tmica, del trabajo que
hemos realizado hasta el momento, es decir, la especificación formal y el análisis por casos. En ella deben,
pues, incluirse la precondición, la declaración o cabecera de la función, la alternativa de las protecciones con
sus resultados dada por el análisis por casos, y la postcondición. Para ello, utilizaremos la sintaxis descrita en
[Peña93], [Peña97] o [Peña05], con la que el alumno deberı́a estar familiarizado antes de abordar la realización
de este apartado.
La composición algorı́tmica, que estamos a punto de escribir, constituye el código de la función.
En el espacio siguiente transcrı́base la composición algorı́tmica de la función isimln:
14
Diseño recursivo no final
Una vez obtenido el código de la función isimln, hemos de verificar, formalmente, su corrección. Para
simplificar las explicaciones reproducimos, a continuación, la forma general de una función recursiva lineal,
tal como se describe en [Peña93, Figura 3.2, pag(s) 53] o [Peña97, Figura 3.2, pag(s) 61]:
{Q(x̄)}
fun f (x̄ : T1 ) dev (ȳ : T2 ) ≡
caso Bt (x̄) → triv(x̄)
dc Bnt (x̄) → c(f (s(x̄)), x̄)
fcaso
ffun
{R(x̄, ȳ)}
15
Diseño recursivo no final
La función ha de invocarse siempre en estados que satisfagan su precondición. Esto es, la propiedad que hay
que demostrar se escribe formalmente como Q(x̄) ∧ Bnt (x̄) ⇒ Q(s(x̄)). Hágase en el siguiente espacio:
Ha de demostrarse la satisfacción de la postcondición para los casos triviales, o sea, Q(x̄) ∧ Bt (x̄) ⇒
R(x̄, triv(x̄)).
La importancia de este punto radica en que sin la base de una inducción ésta no supondrı́a una demostración.
El o los casos triviales son aquellos en que ya no se necesita más descomposición recursiva. Por tanto, se
tienen que apoyar en propiedades o cálculos básicos, que aparecerán reflejados en esta demostración.
En el espacio siguiente, demuéstrese que se alcanza la postcondición mediante los casos triviales:
16
Diseño recursivo no final
4.6.5. Elección de una estructura de preorden bien fundado (trabajo del alumno).
Hay que encontrar t : DT1 −→ ZZ tal que Q(x̄) ⇒ t(x̄) ≥ 0
Se trata de establecer una aplicación entre el tipo de datos de la entrada y los enteros (los naturales, de
hecho, las más de las veces) de manera que se pueda demostrar que es un preorden bien fundado, es decir,
que no existen cadenas decrecientes infinitas.
En el espacio siguiente, propóngase una estructura de preorden bien fundado a partir de los datos de las
llamadas recursivas:
Actividad 4.6.5.Elección de un p.b.f.: decrecimiento de los datos en las llamadas recursivas a isimln
17
Diseño recursivo no final
un caso trivial (puede haber varios) o, en términos prácticos y dada la estructura elegida sobre los datos de
las llamadas recursivas, la función terminará.
En el espacio siguiente, demuéstrese que los datos de cada llamada recursiva decrecen en el preorden bien
fundado elegido en 4.6.5:
Actividad 4.6.6.Demostración de que los datos decrecen en el pbf elegido (punto 4.6.5) para isimln
Para realizar este apartado, el alumno ha debido estudiar ya el Tema 1. La eficiencia de los
algoritmos de la Unidad Didáctica I (especialmente, Medidas asintóticas, Órdenes de compleji-
dad y Resolución de recurrencias)
Una vez que hemos demostrado que el algoritmo es correcto y termina queremos determinar la cantidad de
recursos que consume para su funcionamiento. De hecho, nos interesa realizar un estudio comparativo, esto
es, averiguar cuánto crece el consumo de recursos en relación con el crecimiento del tamaño de los datos de
entrada. Como se va a estudiar el crecimiento, nos conviene utilizar medidas asintóticas, cuya naturaleza nos
permite establecer un nivel de abstracción adecuado a la comparación que se plantea. Por último, el estudio
se basará en el reconocimiento del caso peor, esto es, tratamos de calcular una cota superior al crecimiento del
coste. Para ello, y dado que se trata de un algoritmo recursivo, hay que plantear una recurrencia a partir del
tamaño del problema y la forma de decrecimiento de éste en el p.b.f., identificar los parámetros y resolverla.
En el espacio siguiente, debe calcularse el coste de la función isimln mediante la recurrencia adecuada. Debe
justificarse el valor de cada uno de los parámetros, a, b y k.:
18
Transformación a recursivo final: Desplegado-plegado
4. Como ejercicio, proponemos que realice el estudio por casos para nregiones. Haga una tabla y trate
de estudiar todos los casos posibles, separando los triviales de los recursivos. Tenga en cuenta que
necesitará anidar varias alternativas, por lo que será importante garantizar sus diferentes completitudes
en cada caso, ası́ como la satisfacción de las precondiciones de las respectivas llamadas recursivas
Para realizar este apartado, el alumno ha debido estudiar ya el Tema 3.Diseño y verificación
de algoritmos recursivos de la Unidad Didáctica II (especialmente, Técnica de desplegado y
plegado)
En el siguiente espacio, dibújese el árbol sintáctico de la llamada recursiva interior de la función no final
isimln (rama del caso no trivial).
19
Transformación a recursivo final: Desplegado-plegado
20
Transformación a recursivo final: Desplegado-plegado
2. ¿Qué quiere decir realizar la transformación con postcondición constante?(¿Respecto a qué parámetros
es constante la postcondición?).¿Qué ventajas tiene?
21
Diseño iterativo
6. Diseño iterativo
Para realizar este apartado, el alumno ha debido estudiar ya el Tema 4. Diseño iterativo de
la Unidad Didáctica II (especialmente, Derivación formal de algoritmos iterativos y Normas para
la verificación de bucles)
22
Diseño iterativo
por tanto, se define el invariante. Ha de utilizarse la regla de la asignación como herramienta para obtener
esos valores.
Derı́vese, a continuación, la inicialización del bucle y explı́quense los argumentos pertinentes para comprobar
la invarianza al inicio del mismo.
23
Diseño iterativo
derivación de bucles a partir de invariantes, pag(s) 132] y [Balc93, derivación directa de bucles, pag(s) 227
y ss.]).
Derı́vese aquı́ la instrucción restablecer, indicando los argumentos necesarios por los que restablece la inva-
rianza.
Actividad 6.5.Instrucción para restablecer la invarianza a cada vuelta del bucle en unafila−it
24
Diseño iterativo
Para realizar este apartado, el alumno ha debido estudiar ya el Tema 4. Diseño iterativo de
la Unidad Didáctica II (especialmente, Análisis de la eficiencia de programas iterativos)
25
Implementación en Modula-2
Módulo Cadena que contendrá, además de otras posibles funciones necesarias, la definición del tipo
de datos cadena
Módulo Entrada: Módulo de Entrada de datos, que deberá importar las definiciones y funciones del
módulo Cadena, cuyas funciones serán las encargadas de realizar todas las operaciones de captura de
datos del programa.
Módulo Salida: Módulo de Salida de datos, que deberá importar las definiciones y funciones del
módulo Cadena, cuyas funciones serán las encargadas de realizar todas las operaciones de escritura de
datos de salida del programa.
26
Implementación en Modula-2
Módulo sudoku:
En el que estarán la función (sudoku), que invoca a las funciones auxiliares que permiten determinar
la validez de la solución (nfilas, ncolumnas y nregiones) según se explica en este cuadernillo y en el
enunciado (Apartado 2 en la páginas 7), es decir:
• función nfilas, que codifique la comprobación por filas ncolumnas, que comprueba las columnas
de la solución y nregiones, que comprueba las regiones del tablero. Estas funciones deben progra-
marse realizando iterativamente llamadas a las respectivas funciones iunafila, iunacolumna e
iunaregion, que se han diseñado en la parte que se refiere a recursividad (cada una de ellas debe
seguir el algoritmo recursivo no final que se ha diseñado previamente para ella gestionando
las llamadas apropiadas a la misma)
• función simln−it, que codifique el algoritmo iterativo para la función simln
• Las funciones auxiliares ncolumnas y nregiones
Modulo principal:
• El módulo principal importará las definiciones de las funciones del resto de módulos y realizará las
actividades siguientes:
◦ Llamar a las funciones del módulo Entrada que leen datos del fichero de entrada.
◦ Llamar a las funciones del módulo Salida que escriben los resultados adecuados en un fichero
de salida.
◦ Invocar a las funciones del módulo sudoku que realizan los cálculos o comprobaciones objeto
del problema que constituye la Práctica.
◦ Validación de datos de entrada, esto es, comprobación de la corrección de los datos que se
suministran al programa a partir del fichero de entrada.
◦ Estudio empı́rico del coste, para lo que deberá invocar consecutivamente a cada una de las
funciones que autentifican la contraseña entrada. Esta invocación se realizará para cada fun-
ción dentro de un bucle con un número significativo de iteraciones a fin de que pueda medirse
el tiempo que emplean en resolver el problema4 . Se leerá por tanto el reloj del sistema antes
y después de cada uno de los 3 bucles.
27
Implementación en Modula-2
Pruebas es condición necesaria para obtener calificación en la Práctica (y, como consecuencia, en
la Prueba Presencial de la Asignatura). Además, existirá un Juego de Pruebas Privado, (que, por tanto,
no le será proporcionado al alumno) contra el que también se ejecutarán los programas de los alumnos, que
deberán, asimismo, superarlo, por lo que recomendamos que se prueben exhaustivamente dichos programas
antes de su entrega. Por último, está disponible para los alumnos, a través de los cursos virtuales, un pro-
grama que facilita la creación de casos de prueba positivos mediante la encriptación de contraseñas por el
método descrito en el enunciado de esta práctica.
28
Documentación que hay que entregar
Documentación
8. Documentación que hay que entregar
A modo de resumen, listamos a continuación la documentación que se debe entregar al tutor, antes de la
fecha que éste disponga, para que la práctica se considere completa:
1. Hoja de lectura óptica con todos los datos personales cumplimentados
Se ruega a los alumnos extremen la atención al cumplimentar sus datos, y pongan
especial cuidado en lo referente al plan de estudios (nuevo o antiguo) al que pertenezcan
Las HLO las repartirán los Tutores en la primera sesión obligatoria de asistencia a las Prácticas. Los
alumnos deben rellanarlas y devolvérsealas al Tutor durante la misma sesión. En ellas, hay que rellenar,
de forma reconocible por la lectora óptica, los siguientes campos:
D.N.I.
Código de carrera:
• Plan Antiguo: I.T.Gestión: 41; I.T.Sistemas: 40.
• Plan Nuevo: I.T.Gestión: 54; I.T.Sistemas: 53.
Código de Asignatura: 108.
Convocatoria: Junio. Semana:Primera.
Tipo de Examen: A.
Todos los alumnos deberán cumplimentar los campos Convocatoria, Semana y tipo de examen
con los datos citados, independientemente de cuándo decidan examinarse.
La práctica no se considerará completa, y, por tanto, el examen alumno se calificará como
suspenso (0) si todos los datos consignados en la hoja de lectura óptica de la práctica no son
correctos. Del mismo modo, todos los alumnos deberán apuntarse al grupo de prácticas
de su Tutor a través de los cursos virtuales. De no hacerlo ası́, puede retrasarse la obten-
ción de la nota de prácticas del alumno, que podrá ser consultada a tı́tulo informativo a través de
los cursos virtuales.
2. Cuadernillo del alumno cumplimentado con el diseño. Las cuestiones adicionales, para las que
no hay espacio reservado en este cuadernillo, son voluntarias y pueden contestarse en tantas hojas
añadidas como sea necesario
3. Implementación:
El programa se codificará en Módula 2 y constará de 5 módulos, de los que el alumno deberá pro-
gramar dos (como se explica en la sección 7.3). En todos los casos, el código en Modula-2 ha de
estar lo mejor comentado
29
Documentación que hay que entregar
30
REFERENCIAS REFERENCIAS
Referencias
[Balc93] J.L. Balcázar. Programación Metódica. McGraw-Hill, 1993.
[CCM+ 93] J. Castro, F. Cucker, X. Messeguer, A. Rubio, L. Solano y B. Valles. Curso de Programación.
McGraw-Hill, 1993.
[Cerr93] J.A. Cerrada y M. Collado. Programación I. UNED, 1993.
[CCEG2K] J.A. Cerrada, M. Collado, J.F. Estı́variz y R. Gómez. Fundamentos de Programación con Modula
2. CEURA, 2000.
[Col2K5] J.I. Mayorga Toledano , M. Rodrı́guez Artacho y F. López Ostenero. Colección de problemas
de Programación II. Edición interna del Equipo Docente, 2005.
[Peña93] R. Peña. Diseño de Programas: formalismo y abstracción. Prentice Hall, 1993.
[Peña97] R. Peña. Diseño de Programas: formalismo y abstracción, 2a Edición . Prentice Hall, 1997.
[Peña05] R. Peña. Diseño de Programas: formalismo y abstracción, 3a Edición . Pearson-Prentice Hall,
2005.
31