|
|
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 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:
- 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.
- 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 y
abstractas.
CONTENIDOS
- Generalidades
- 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.
- Comparación de los tipos de memoria disponibles
en el lenguaje de programación que se usará en
el curso.
- Descripción de la estructura de proyecto en los
ambientes de programación que se usarán en el
curso.
- Descripción del depurador disponible en al menos
uno de los ambientes de programación que se
usará en el curso.
- 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.
- Definición de métodos de instancia y
métodos de clase en el lenguaje de programación
que se usará en el curso.
- Especificación
- Pautas para la especificación de clases concretas
y clases abstractas.
- Discusión de las pautas para la
especificación de clases parametrizadas.
- Herencia y polimorfismo
- Definición de clases abstractas.
- Definición de clases que derivan de otras, ya sea
abstractas o concretas.
- Definición de tipos polimórficos.
- Definición de métodos (y operadores, si el
lenguaje lo permite) polimórficos.
- Parametrización de clases
- 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.
- 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.
- Arboles
- Algoritmos de inserción, búsqueda,
eliminación y el recorrido en orden para
árboles binarios ordenados no balanceados.
- Validación de entrada de datos y manejo de excepciones
- Definción de clases de excepciones.
- Descripción del levantamiento de
excepciones.
- Descripción de la captura y tratamiento de
excepciones.
- Manejo de archivos planos
- Por medio de flujos de datos.
- Por medio de acceso aleatorio.
- Pruebas de programas
- Pruebas de constructores y destructores.
- Pruebas de métodos modificadores.
- Pruebas de métodos observadores.
- 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
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.
OTROS TEMAS RELEVANTES
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.
-
Construir programas que utilicen programación por eventos.
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:
Matriz Chirrisquitica Tajadeada
-
# 3:
Generador de Tajadeadores
-
# 4:
Buscador de matrices de Hadamard
-
# 5:
Iterador
Tree_BFs.h
para el Arbol
-
# 6:
Palabras diferentes de un archivo
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
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).
C++: FAQ's e Hiperenlaces
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
- "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://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.
Adolfo Di Mare <adolfo@di-mare.com>
Copyright © 2011
Derechos de autor reservados © 2011