| 
    
     | 
    
       
        
          
            Universidad de Costa Rica  
            Escuela de Ciencias de la  
            Computación e Informática
          
        
     | 
  
  CI-1201 Programación II
 REQUISITOS 
DESCRIPCIÓN
     
Introducir los fundamentos teóricos de programación 
para entrenar a cada estudiante en las técnicas 
básicas de construcción de programas, en especial en 
la
especificación e
implementación de
módulos y artefactos de programación
reutilizables, con el fin que pueda usar herramientas de 
programación y participar en cualquier equipo dedicado a 
construir programas de mediana complejidad.
OBJETIVOS ESPECÍFICOS
     
Al finalizar el curso cualquier estudiante será capaz de:
-  Comprender los siguientes conceptos: memoria estática, 
     memoria dinámica, enlace estático, enlace 
     dinámico, flujos de entrada-salida, recursividad, 
     clases concretas, clases abstractas, clases parametrizadas o 
     programación genérica, clases contenedoras e 
     iteradores. 
 
-  Elaborar especificaciones de clases completas, correctas, 
     precisas y sin ambigüedades, utilizando una herramienta 
     automatizada para generación de documentación. 
     
 
-  Construir clases abstractas y clases que las derivan usando 
     herencia y polimorfismo. 
 
-  Usar clases parametrizadas pertenecientes a una biblioteca de 
     uso difundido o estandarizado. 
 
-  Construir programas basados en los algoritmos de 
     inserción, eliminación y búsqueda sobre 
     árboles binarios de búsqueda. 
 
-  Usar excepciones al construir clases y programas para mejorar 
     su robustez incorporando validación de entrada de 
     datos y manejo de errores. 
 
-  Aplicar casos de prueba para depurar clases concretas, 
     abstractas y (opcionalmente) parametrizadas. 
 
-  (Opcionalmente) Construir programas basados en los algoritmos 
     de inserción, eliminación y búsqueda 
     sobre al menos un tipo de árbol balanceado de 
     búsqueda. 
 
-  (Opcionalmente) Construir clases parametrizadas siguiendo 
     lineamientos de diseño de una biblioteca de clases 
     parametrizadas de uso difundido o estandarizado. 
 
-  (Opcionalmente) Construir programas basados en el 
     patrón Modelo-Vista-Controlador. 
 
-  (Opcionalmente) Construir programas que utilicen 
     programación por eventos. 
 
CONTENIDOS
-  Generalidades. 
 
-  Especificación. 
 
-  Herencia y polimorfismo. 
 
-  Parametrización. 
 
-  Arboles. 
 
-  Validación de entrada de datos y manejo de excepciones. 
 
-  Pruebas de programas. 
 
-  Búsqueda (opcionalmente). 
 
-  Bibliotecas (opcionalmente). 
 
-  Patrón Modelo-Vista-Controlador. 
 
-  Programación por eventos. 
 
METODOLOGÍA DE TRABAJO
     
El curso se compone de 16 semanas durante las cuales el docente 
presentará los conceptos y las técnicas de 
programación principales.
     
Al lo largo del ciclo lectivo el estudiante llevará a cabo 
proyectos de programación con el fin de poner en 
práctica y aplicar los conceptos y las técnicas del 
curso.
LIBRO DE TEXTO
- Stroustrup, Bjarne
 
-  "The C++ Programming Language"; 3rd edition;
Addison-Wesley; 1998.
  
     
  http://www.research.att.com/~bs/3rd.html
 
- Deitel, H.M.; Deitel, P.J.
 
- "C++ How to Program, Fourth Edition",
ISBN-0-13-038474-7, Prentice-Hall, 2002.
     
http://www.deitel.com/
     
http://www.deitel.com/books/cppHTP4/cppHTP4_examples.zip
 
BIBLIOGRAFIA
- Liskov, Barbara & Guttag, 
John
 
-  "Abstraction and Specification in Program Development"; 
McGraw-Hill; 1986. 
 
- Myers, Glenford
 
-  "The Art of Software Testing"; John Wiley & Sons; 1978. 
 
CONTENIDOS ESPECÍFICOS
     
En especial se hará énfasis para que cualquier 
estudiante sea capaz de:
- 
Comprender y usar técnicas de programación 
tradicionales como la programación modular y
estructurada, la programación orientada a los objetos
(OOP), la programación por eventos, la
recursividad, el uso de los señaladores (punteros) y 
de la
memoria dinámica y el uso y aplicación de
convenciones de programación, necesarias para trabajar 
en equipos de programación.
 
- 
Comprender y aplicar la teoría de
abstracción y especificación en 
programación, para utilizar abstracción de datos, 
abstracción de
iteración y abstracción de
procedimientos para el diseño y construcción de
artefactos de programación, en el contexto de
bibliotecas de clases
preconstruidas.
 
- 
Comprender y aplicar la teoría de abstracción por
parametrización y de la abstracción por
herencia y
polimorfismo para obtener y comparar diseños 
alternativos en la construcción de piezas de 
programación.
 
- 
Comprender y aplicar la teoría del manejo de
excepciones para mejorar la robustez de módulos y 
programas.
 
- 
Comprender y usar técnicas de prueba y depuración de 
programas, incluyendo inspecciones o revisiones de módulos 
y programas, diseño de casos de prueba, depuración 
simbólica y el uso de otras técnicas o
herramientas.
 
- 
Comprender y aplicar los siguientes conceptos:
variables
e
instancias,
clases y su
invariante,
operaciones y
métodos,
verificación de
tipos,
precondición y
poscondición,
encapsulamiento y
ocultamiento de datos,
parametrización y
plantillas, enlace dinámico, enlace estático, 
sobrecarga de
operadores y de funciones,
polimorfismo, polimorfismo de
contenedores,
herencia simple, composición de clases, clases abstractas y clases concretas.
 
- 
Comprender y usar los conceptos generales de programación 
como la declaración y manejo básico de archivos, el 
manejo de entrada/salida en sistemas interactivos. También 
conocer y aplicar los conceptos básicos de estructuras de 
datos: vector y
matriz, lista, pila, cola,
árbol, árbol balanceado, conjunto, dicionario, 
métodos de ordenamiento simples.
 
- 
Describir y conversar sobre el uso de
generadores de aplicaciones, la construcción de
interfaces de programas de aplicación (sean estas 
gráficas o de texto), usabilidad, interfaz con bases de 
datos,
patrones como el
modelo vista controlador,
recolección de basura,
concurrencia,
programación 3D, etc.
 
DETALLES RELEVANTES
     
Este curso le permite aprender a cualquier estudiante cómo 
diseñar,
implementar y usar
módulos, con énfasis especial en su
reutilización, para lo que es imprescindible
especificarlos. La teoría de programación 
generalmente es fácil de asimilar pero lo que más 
cuesta es pasar de lo
"abstracto" a lo "concreto". Por eso cada estudiante debe 
invertir horas de trabajo para poner en práctica los 
conceptos del curso en las tareas programadas, que es el contexto 
en donde debe tomar iniciativa propia para solucionar los 
problemas propuestos y así adquirir el dominio de la 
teoría y la capacidad de resolver de problemas.
     
El curso integra la teoría y la práctica.  La 
teoría es relativamente fácil de digerir, y 
está bien explicada en los
libros de texto. La parte práctica es más 
difícil de dominar, pues requiere de una exposición 
en carne viva a problemas reales.
     
Como complemento a las prácticas, durante el curso se 
hará especial incapié en aplicar el concepto de
abstracción, según está definido en
[LG-1986]. El curso consta de varios 
ingredientas altamente relacionados.  Primero se exponen los 
conceptos de abstracción y
especificación
en el marco del lenguaje
C++, y se discuten en el contexto de 
la programación por objetos.  También se revisan 
algunas técnicas generales para depuración de 
programas.  Durante todo el curso se estudian algunos 
tópicos básicos de estructuras de datos.
     
Con el fin de introducir muchos de los algoritmos y estructuras de 
datos que serán usados en el curso siguiente (CI-1303 
Estructuras de datos y análisis de algoritmos), en muchos 
casos las tareas cortas incluirán uso de listas, colas, 
pilas y árboles. Para esto en el curso se cubrirá el 
equivalente de los dos primeros capítulos de
[AHU-1984]. Durante el curso el estudiante 
trabajará en diversos proyectos para que logre fluidez en 
conceptos como punteros, uso de archivos, manejo de pantallas y 
ventanas, y recursividad.  El estudiante conocerá las 
herramientas básicas del programador profesional. Se espera 
del estudiante un buen dominio del
C++. Se hará especial 
énfasis en lograr que el estudiante domine los conceptos de 
abstracción y especificación, y se hará un 
extenso uso de herramientas diversas de programación.
     
Las tareas escritas consistirán en "premios", esto es, 
asignaciones cortas que cada estudiante debe cumplir. Antes de que 
termine el lunes de cada semana el estudiante debe instalar en una 
única página Internet al menos 8 filminas en las que 
resuma el material cubierto en la semana anterior. También 
debe enviarle al profesor la dirección Internet en donde 
dejó sus fichas de estudio, las que le servirán 
luego al estudiante y a todos sus compañeros para repasar 
la materia cubierta. Siempre debe usar formato HTML para las 
filiminas.
      
Las filminas son responsabilidad individual de cada estudiante. Si 
al revisarlas se detectan copias, perderá los puntos tanto 
el alumno que copió como el que se dejó copiar.
 | 
     
Al finalizar cada lección el estudiante debe revisar el
libro de texto y también el
libro de Bjarne Stroustrup para determinar los 
capítulos y secciones en donde se discute cada uno de los 
temas cubiertos en la lección. Como resultado de esta 
investigación cada estudiante debe incluir en sus filminas 
un reporte con 5 secciones claramente delimitadas y que contenga 
los siguiente:
-  Al menos 8 Filminas de estudio.
 
-  Número del capítulo o sección del
libro de texto en el que se discute 
el tema.
 
-  Número del capítulo o sección del
libro de Stroustrup en el que se discute el tema.
 
-  Número y página de los ejercicios del
libro de texto relevantes al tema 
discutido en clase.
 
-  Copia de un párrafo pequeño, de 2 o 3 
renglones, tomado de alguno de estos libros.
 
 
 | 
     
Los estudiantes deberán hacer al menos un programa grande 
(de más de 1500 líneas), y durante todo el semestre 
tendrán asignaciones cortas programadas.  Después de 
tomar el curso, cada estudiante sabrá como hacer la 
documentación de un programa.
     
Este curso requerirá de un gran esfuerzo de 
programación. Al terminar el curso, el estudiante 
será capaz de a producir programas de alta calidad.
INDICE DE MATERIALES DEL CURSO
-  Tareas 
 
- 
  # 1:
  Indentación y documentación de la clase 
Acumulador
 
- 
  # 2:
  Implementación y prueba de 
makeMatrix()
 
- 
  # 3:
  Datos de prueba para la Matriz Chirrisquitica
 
- 
  # 4:
  Transformación de una tabla relacional a un documento XML
 
- 
  # 5:
  Transformación de una tabla relacional a un documento XML (sin códigos)
 
- 
  # 6:
  La operación 
list::splice()
 
- 
  # 7:
  Recorrido por niveles de un árbol
 
- 
  # 8:
  Listado de notas en 3 capas
 
EVALUACION
     
El peso de la evaluación estará en los
exámenes, aunque es indispensable que todos los estudiantes
realicen los proyectos.
  |     | 
 
SOBRE LOS LIBROS DE TEXTO
     
Como lenguaje de programación se usa C++, por lo que conviene que el estudiante adquiera un buen libro de texto para el lenguaje, como por ejemplo el de
Deitel & Deitel, que está escrito en lengua inglesa, aunque la
versión en español 
también se puede usar, pese a que no toma en cuenta todos 
los cambios y detalles que forman parte del C++ estándar. 
Es conveniente que cada estudiante tenga acceso al
libro de Bjarne Stroustrup sobre C++, que es el lenguaje que 
se usará como marco de referencia en todo el curso. Este libro 
tiene un costo de unos $ 45, y se puede conseguir en 
Internet. Algunos estudiantes encontrarán necesario 
consultar el libro de
Musser & Saini sobre la biblioteca
STL de C++, 
aunque puede ser que el libro
Nelson sea más asequible.
Gran parte de la teoría del curso se está descrita 
en el libro de
Liskov & Guttag. 
En los proyectos programados es necesario que los alumnos apliquen 
convenciones de programación, como las de
Adolfo Di Mare
o las de
Sun Microsystems, Inc.
Cada estudiante es responsable de conseguir sus libros. Además, en el sitio Internet del curso habrá material adicional (como los
FAQ's).
     C++: FAQ's e Hiperenlaces
ARTICULOS IMPORTANTES
- Di Mare, Adolfo
 
-  "Convenciones de Programación para Pascal"; Reporte 
técnico ECCI-01-88; ECCI-UCR; 1988.
     
http://www.di-mare.com/adolfo/p/convpas.htm
 
- Di Mare, Adolfo
 
-  "Abstracción de Datos en Pascal" Reporte 
técnico PIBDC-01-89; ECCI-UCR; 1989.
     
http://www.di-mare.com/adolfo/p/adts-91.txt
 
- Di Mare, Adolfo
 
-  Una Clase Matriz Chirrisquitica Escrita en C++,
       Reporte Técnico ECCI-2004-02,
       
       Escuela de Ciencias de la Computación e Informática,
       Universidad de Costa Rica, 2004.
     
http://www.di-mare.com/adolfo/p/Matrix.htm
 
- Di Mare, Adolfo
 
-  "¡No se le meta al Rep!"
       Reporte Técnico ECCI-2007-01,2007.
     
http://www.di-mare.com/adolfo/p/Rep.htm
 
- Di Mare, Adolfo
 
-  Uso de Doxygen para especificar módulos y programas,
I Congreso Internacional de Computación y Matemática,
(CICMA-2008),
celebrado del 21 al 23 de agosto en la Universidad Nacional
(UNA), Costa Rica, 2008.
     
http://www.di-mare.com/adolfo/p/Doxygen.htm
 
- Di Mare, Adolfo
 
-  
BUnit.h: Un módulo simple para aprender prueba unitaria de programas en C++,
     X Simposio Internacional de Informática Educativa
     (SIIE'08)
     realizado del 1 al 3 de octubre 2008, Salamanca, España,
     I.S.B.N.: 978-84-7800-312-9, pp425-430, octubre 2008.
     
http://www.di-mare.com/adolfo/p/BUnit.htm
 
LECTURAS RECOMENDADAS
- 
Albahari, Ben
 
- 
  "A Comparative Overview of C#" (A comparison of C# to C++ and Java),
  2000.
  
     
  http://www.genamics.com/visualj++/csharp_comparative.htm
 
- 
Albahari, Ben &
Drayton, Peter &
Merril, Brad
 
- 
"C# Essentials, 2nd Edition",
O'Reilly,
ISBN 0-596-00315-3,
2002.
 
- Aho, Alfred V.; Hopcroft, John E.; Ullman, Jefrrey 
D.
 
-  "Data Structures and Algorithms"; Addisson Wesley Publishing 
Co.; 1984. 
 
- Ceballos, Francisco J.
 
- 
"Programación Orientada a objetos con C++",
Addison-wesley Iberoamericana,: 1993.
 
- Daconta, Michael C.
 
- "C++ pointers and dynamic memory management",
John Wiley & Sons, EEUU, 1995.
 
- Deitel, H.M.; Deitel, P.J.
 
- "Cómo programar en C/C++, segunda edición",
Prentice-Hall, 1994.
     
ftp://ftp.prenhall.com/pub/deitel/C++_HTP/C++HTP2e/c++htp2e_examples.zip
 
- Deitel, H.M.; Deitel, P.J.
 
- "C++ How to Program, Second Edition",
ISBN-0-13-528910-6, Prentice-Hall, 1997.
     
ftp://ftp.prenhall.com/pub/deitel/C++_HTP/C++HTP2e/c++htp2e_examples.zip
 
- Deitel, H.M.; Deitel, P.J.
 
- "C++ How to Program, Third Edition",
ISBN-0-13-089571-7, Prentice-Hall, 2001.
     
http://www.deitel.com/
     
http://deitelandassociates.com/oldsite/books/2001/cpphtp3/cpphtp3_examples.zip
 
- Deitel, H.M.;
Deitel, P.J.;
Nieto, T.R.;
Strassberger, E.T.
 
- "Getting Started with Microsoft Visual C++ 6 with an Introduction to MFC",
ISBN-0-13-016147-0, Prentice-Hall, 2001.
     
http://deitelandassociates.com/oldsite/books/gsvcpp_mfc/MFC_examples.zip
 
- Di Mare, Adolfo
 
-  "Reutilización de Contenedores Parametrizables
      con Lenguajes de Semántica Limitada",
      Tesis de Doctorado,
      Universidad Autónoma de Centro América,
      1999.
     
http://www.di-mare.com/adolfo/binder/index.htm
 
- Heileman, Gregory
 
- "Estructuras de Datos, Algoritmos y Programación Orientada a Objetos",
Mc-Graw Hill, 1998.
 
- Hommel, Scott et al
 
- "Code Conventions for the Java Programming Laguage",
       Sun Microsystems, Inc.,
       Abril 20, 1999.
       
     
       http://java.sun.com/docs/codeconv/CodeConventions.pdf
 
- Hunt, Lance
 
- "C# Coding Standards for .NET", August 2004.
  
     
  http://home.comcast.net/~lancehunt/CSharp_Coding_Standards.pdf
 
- Kernighan, Brian
 
-  "El lenguaje de programación C"; Prentice Hall; 1986. 
 
- Musser, David R.
 
- "The C++ Standard Template Library" (Internet reference index), 1998.
     
http://www.cs.rpi.edu/~musser/stl-book/ 
- 
Osborne, John:
 
- 
  "Deep Inside C#: An Interview with Microsoft Chief Architect Anders Hejlsberg",
  2000.
  
     
  http://windows.oreilly.com/news/hejlsberg_0800.html
 
- Musser, David R. & Saini, Atul
 
- "STL Tutorial and Reference Guide C++ Programming with the 
Standard Template Library", ISBN 0-201-63398-1, Addison-Wesley 
Professional Computing Series, 1996.
     
http://www.awl.com/cseng/titles/0-201-63398-1 
- Nelson, Mark
 
- "C++ Programmer's Guide to the Standard Template Library",
IDG Books Worldwide, ISBN 1-56884-314-3, 1995.
 
- Stepanov, Alexander & Lee, Meng
 
- "The C++ Standard Template Library",
  Generic Programming Project, Hewlett Packard Research Labs,
  1995.
  
     
  ftp://butler.hpl.hp.com/stl/stl.zip 
- Sedgewick, R.
 
- "Algoritmos en C++",
 Addison-Wesley, 1995.
 
- Sharon, Yonat 
 
- "Smart Pointers - What, Why, Which?"
  
     
  http://ootips.org/yonat/4dev/smart-pointers.html
 
- Stauggard, Andrew Jr.
 
- "Técnicas estructuradas y orientadas a objetos",
Prentice-Hall, 1998.
 
- Sun Microsystems, Inc
 
- "Java Code Conventions", September 12, 1997.
  
     
  http://java.sun.com/docs/codeconv/CodeConventions.pdf
 
- Weis, Mark.
 
- "Algorithms, Data Structures and Problem Solving with C++",
 Addison-Wesley Pub. Comp. CA, 1995.
 
 
  
  
  Adolfo Di Mare <adolfo@di-mare.com>
Copyright © 2009
Derechos de autor reservados © 2009