[UCR]
[/\]

Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
[<=] [home] [<>] [\/] [=>

CI-1201 Programación II

II Semestre 2012 Profesor Adolfo Di Mare

REQUISITOS

CI-1101 Programación I Horas: 4

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 de que puedan 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:

  1. Comprender los siguientes conceptos: memoria estática, memoria dinámica, enlace estático, enlace dinámico, flujos de entrada-salida, archivos de acceso aleatorio, recursividad, clases concretas, clases abstractas, clases parametrizadas o programación genérica, clases contenedoras e iteradores.
  2. Elaborar especificaciones de clases completas, correctas, precisas y sin ambigüedades, utilizando una herramienta automatizada para generación de documentación.
  3. Construir clases abstractas y clases que las derivan usando herencia y polimorfismo.
  4. Usar clases parametrizadas pertenecientes a una biblioteca de uso difundido o estandarizado.
  5. Construir programas basados en los algoritmos de inserción, eliminación y búsqueda sobre árboles binarios de búsqueda.
  6. Usar excepciones al construir clases y programas para mejorar su robustez incorporando validación de entrada de datos y manejo de errores.
  7. Aplicar casos de prueba para depurar clases concretas y abstractas.

CONTENIDOS

  1. Generalidades
    1. Descripción del uso de la memoria estática y la memoria dinámica en el lenguaje de programación que se usará en el curso.
    2. Comparación de los tipos de memoria disponibles en el lenguaje de programación que se usará en el curso.
    3. Descripción de la estructura de proyecto en los ambientes de programación que se usarán en el curso.
    4. Descripción del depurador disponible en al menos uno de los ambientes de programación que se usará en el curso.
    5. Descripción de los distintos mecanismos disponibles en el lenguaje de programación que se usará en el curso para pasar a los métodos de una clase datos de tipos preconstruidos y objetos.
    6. Definición de métodos de instancia y métodos de clase en el lenguaje de programación que se usará en el curso.
  2. Especificación
    1. Pautas para la especificación de clases concretas y clases abstractas.
    2. Discusión de las pautas para la especificación de clases parametrizadas.
  3. Herencia y polimorfismo
    1. Definición de clases abstractas.
    2. Definición de clases que derivan de otras, ya sea abstractas o concretas.
    3. Definición de tipos polimórficos.
    4. Definición de métodos (y operadores, si el lenguaje lo permite) polimórficos.
  4. Parametrización de clases
    1. Descripción general de una biblioteca de clases parametrizadas de uso estándarizado en el lenguaje de programación que se usará en el curso.
    2. Descripción del uso de algunas clases parametrizadas de la biblioteca referida anteriormente, de acuerdo con las necesidades de los proyectos de programación y los ejemplos desarrollados en el curso.
  5. Arboles
    1. Algoritmos de inserción, búsqueda, eliminación y el recorrido en orden para árboles binarios ordenados no balanceados.
  6. Validación de entrada de datos y manejo de excepciones
    1. Definción de clases de excepciones.
    2. Descripción del levantamiento de excepciones.
    3. Descripción de la captura y tratamiento de excepciones.
  7. Manejo de archivos planos
    1. Por medio de flujos de datos.
    2. Por medio de acceso aleatorio.
  8. Pruebas de programas
    1. Pruebas de constructores y destructores.
    2. Pruebas de métodos modificadores.
    3. Pruebas de métodos observadores.
    4. Ordenamiento de los tipos de pruebas en un controlador de pruebas.

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
Ceballos, Francisco J.
"Enciclopedia del Lenguaje C++ - 2da. ed.", Alfaomega, Ra-Ma, 2009.
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

ARTICULOS IMPORTANTES

Di Mare, Adolfo
"INDENTACIÓN: Guía de calificación" Reporte Técnico ECCI-2009-05, Escuela de Ciencias de la Computación e Informática, Universidad de Costa Rica, 2009.
      http://www.di-mare.com/adolfo/p/Indentacion.htm
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
Di Mare, Adolfo
Especificación de módulos con ejemplos y casos de prueba, Artículo CAL002 del V Taller de Calidad en las Tecnologías de la Información y las Comunicaciones (TCTIC-2011), realizado del 7 al 11 de febrero de 2011 en el Palacio de Convenciones de la Habana, en la Habana, Cuba.
      http://www.di-mare.com/adolfo/p/BUnitXP.htm

BIBLIOGRAFIA ADICIONAL

Liskov, Barbara & Guttag, John
"Abstraction and Specification in Program Development"; McGraw-Hill; 1986.
Myers, Glenford
"The Art of Software Testing"; John Wiley & Sons; 1978.

 

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 Ceballos o 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).

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 secciones claramente delimitadas y que contenga los siguiente:

  1. Al menos 8 Filminas de estudio.
  2. Número del capítulo o sección del libro de texto en el que se discute el tema.
  3. Número del capítulo o sección del libro de Stroustrup en el que se discute el tema.
  4. Número y página de los ejercicios del libro de texto relevantes al tema discutido en clase.
  5. 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

Exámenes
P1  -  P2
Final
Tareas
#1  -  #2
#3  -  #4  -  #5
Tareas
# 1: Indentación y documentación de la clase Acumulador
# 2: Clase config para archivos de configuración de programas
# 3: Control de archivos para la bitácora de cursos
# 4: Lista de párrafos en documentos HTML
# 5: Mini Google

EVALUACION

      El peso de la evaluación estará en los exámenes, aunque es indispensable que todos los estudiantes realicen los proyectos.
Tareas, proyectos, quices   20%    (Prof. Di Mare)
Examen Parcial #1   20%    viernes 21 de setiembre
Examen Parcial #2   25%    viernes 26 de ocutbre
Examen Final   35%    martes 20 de noviembre
 


OTROS TEMAS RELEVANTES

      En especial se hará énfasis para que cualquier estudiante sea capaz de:

  1. 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.
  2. 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.
  3. 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.
  4. Comprender y aplicar la teoría del manejo de excepciones para mejorar la robustez de módulos y programas.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. Construir programas que utilicen programación por eventos.

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
"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
"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://weblogs.asp.net/lhunt/pages/CSharp-Coding-Standards-document.aspx
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.

 

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>
Copyright © 2012
Derechos de autor reservados © 2012
[home] <> [/\]