Página principal Lista alfabética Lista de componentes Lista de archivos Miembros de las clases Archivos de los miembros Páginas relacionadas
Programación en C++ (Practicas de Est. Datos)
En estas páginas se encuentra la documentación de los fuentes así como los puntos que deberá resolver.
Esta página describe la sesión de practicas a realizar por el alumno sobre el ordenador en un tiempo aproximado de una hora. Para realizarla correctamente, deberá seguir el orden que se indica en las siguientes secciones.
Después de esta práctica, el alumno deberá estar familiarizado con la compilación de programas, el uso de punteros y algunas herramientas básicas para el resto de la asignatura.
Los ficheros fuente se deberán descargar desde
Para llevarla a cabo, debe estudiar y resolver distintos puntos que se encuentran especificados en los archivos fuente. El orden es:
- comenzamos.cpp
- assert.cpp
- salimos_vector.cpp
- encadenar.cpp
Después de esta práctica, el alumno deberá estar familiarizado con la compilación y el diseño de funciones.
Los ficheros fuente se deberán descargar desde
Para llevarla a cabo, debe estudiar y resolver distintos puntos que se encuentran especificados en los archivos fuente. El orden es:
- global_static.cpp
- cuasi_primitiva.cpp
- devolver_referencia.cpp
- punteros_referencias.cpp
Después de esta práctica, el alumno deberá estar familiarizado con la idea de que un tipo de dato puede tener múltiples implementaciones, y que la solución de problemas en base a este tipo de dato debería de realizarse de forma independientemente a ellas.
El problema consiste en desarrollar un programa para trabajar con matrices bidimensionales. El programa debe
- Leer dos matrices (a,b) desde cin
- Escribir en cout los siguientes cálculos
donde la t denota la matriz traspuesta y las sumas y productos se entienden con el sentido habitual en algebra matricial.
Además, se deberá de resolver usando cuatro representaciones distintas:
- Representación en base a un vector. Las filas de la matriz se almacenan, por filas, en un único vector.
- Representación en base a un vector de punteros a vectores. Se mantiene un vector con tantos punteros como filas. Cada puntero apunta a un vector con tantos elementos como columnas.
- Representación en base a un vector de punteros a un vector. Se mantiene un vector con tantos punteros como filas. Cada puntero apunta a la posición de su fila correspondiente, dentro de un vector que almacena las filas de forma consecutiva.
- Representación en base a celdas enlazadas, con punteros a vectores. Se mantienen tantas celdas enlazadas como filas. Cada una almacena un puntero que apunta a un vector con tantos elementos como columnas.
Los objetivos de la práctica son
- Que el alumno se familiarice con el uso de los operadores de gestión de memoria dinámica.
- Que se utilicen herramientas básicas de estructuras de datos que se necesitan después en la asignatura.
- Descubrir la importancia de un buen diseño. La práctica será más larga y difícil cuanto peor sea el diseño.
- Darse cuenta de la importancia de la abstracción para hacer los programas más mantenibles.
Cada grupo de trabajo debe resolver
- Debe estudiar detenidamente las distintas formas de implementación. De esa forma, plantear un buen diseño antes de comenzar a escribir código.
- Debe implementar los 4 programas.
- Debe testearlos con varios ejemplos para comprobar que obtienen el mismo resultado.
- Se debe entregar en papel el listado de todos los fuentes, precedido por una pequeña introducción que explique el diseño de la solución. Opcionalmente se puede entregar la implementación por correo electrónico al profesor con el "asunto" del mensaje como "Código Sesión 3(nombre alumno)" donde el nombre del alumno es un nombre de cualquiera de los componentes del grupo.
El formato de entrega de la práctica consiste en utilizar un sobre tamaño folio e introducir la práctica en su interior. En el sobre se deberá de escribir los nombres de los alumnos, el grupo, el nombre de la práctica y las direcciones de correo de los alumnos.
Es importante tener en cuenta que este formato es con la intención de tener que evitar el gasto económico de las encuadernaciones y el gasto ecológico de los plasticos y demás que se producen. Por tanto, incluir la práctica en este sobre se refiere a incluir los folios, incluso sueltos. Por supuesto, no incluir la práctica encuadernada.
La fecha de entrega límite para esta práctica es el día 7 de abril de 2003.
Después de esta práctica, el alumno deberá estar familiarizado con la abstracción y el encapsulamiento de los tipos de datos abstractos, así como las ventajas de un buen diseño para el mantenimiento del software.
Los ficheros fuente se deberán descargar desde
http://decsai.ugr.es/~agarrido/ed2003/practicas/codigos/polinomio.zip
El alumno debe descargar los archivos que implementan el TDA polinomio que se ha visto en las clases de teoría. La implementación es una matriz de flotantes que almacena en la posición i-ésima el coeficiente de grado i-ésimo. Se incluyen varios programas basados en ese TDA.
El supuesto es que esa biblioteca se pasó a los usuarios para que se empezara a explotar. Algunos de sus programas se incluyen en los fuentes (son los programas ejemplo). Se desea realizar una actualización de la biblioteca para resolver los problemas de espacio que se generan, ya que los polinomios con un grado muy alto requieren demasiado espacio. Se decide, por tanto, una nueva representación que debe ser incluida en la nueva versión. Lógicamente, los programas de los usuarios deben seguir siendo válidos, es decir, nuestra nueva versión debe ser compatible con el software que ya existe.
Los objetivos de la práctica son
- Darse cuenta de la importancia de la abstracción y del encapsulamiento. Aunque el tamaño del problema es pequeño, resulta ilustrativo para mostrar que un alto grado de encapsulamiento nos permite mantener el software de una forma muy eficaz.
- Entender la importancia del uso de los TDAs. Es aconsejable que el alumno medite en la dificultad de la práctica en caso de no usar un TDA, de forma que todo el código dependiera de la implementación actual. Esta modificación implicaría muchos más cambios. Además, si los programas se hubieran hecho accediendo a la representación, la modificación podría llegar a ser mucho más complicada.
- Practicar en el uso de vectores dinámicos y su redimensionamiento. Esta estructura de datos aparecerá en posteriores implementaciones.
El alumno debe resolver
- Estudiar detenidamente el código.
- Modificar la implementación del TDA. En la nueva implementación, se almacenarán parejas (grado,coeficiente) en lugar de los coeficientes. Así, la nueva implementación podrá almacenar polinomios de grado muy alto en menos espacio.
- Debe compilar los programas ejemplo, que no han sido modificados, con su nuevo TDA de forma que los resultados sean los mismos.
- Se debe entregar en papel la nueva implementación, junto con la nueva documentación interna (función de abstracción e invariante de la representación). Opcionalmente se puede entregar un disco con la implementación o mandarla por correo electrónico al profesor con el asunto del correo "Codigo Sesión 4 (nombre alumno)".
Nótese que la especificación del TDA no se debe entregar porque es la misma que la anterior. El único detalle que se debe tener en cuenta en la especificación del TDA es que la función de creación mantiene un parámetro únicamente por compatibilidad.
El formato de entrega de la práctica consiste en utilizar un sobre tamaño folio e introducir la práctica en su interior. En el sobre se deberá de escribir los nombres de los alumnos, el grupo, el nombre de la práctica y las direcciones de correo de los alumnos.
Es importante tener en cuenta que este formato es con la intención de tener que evitar el gasto económico de las encuadernaciones y el gasto ecológico de los plasticos y demás que se producen. Por tanto, incluir la práctica en este sobre se refiere a incluir los folios, incluso sueltos. Por supuesto, no incluir la práctica encuadernada.
La fecha de entrega límite para esta práctica es el día 23 de abril de 2003.
Después de esta práctica el alumno debe estar familiarizado con el desarrollo de TDAs a través de clases en C++.
Los objetivos de la práctica son
- Escribir clases C++ de forma completa, incluyendo constructores, destructor sobrecarga de asignación, sobrecarga de algunos operadores (suma,resta) y sobrecarga de operadores de entrada/salida
- Que entienda la diferencia entre un TDA sin clases y con clases, notando la comodidad y ventajas que añade su uso.
- Insistir en la asimilación del concepto de tipo de dato abstracto, y la ventaja de la abstracción.
- Que el alumno realice la compilación y depurado de las clases C++ que, lógicamente, incluye nuevos tipos de errores.
- Usar clases en ejemplos de aplicación.
El alumno debe resolver:
- Crear una nueva clase Racional que, entre otras, incluya las operaciones
- Sobrecarga de la suma, resta, producto, división y operador '-' unario.
- Sobrecarga de los operadores de entrada/salida. Supondremos que un racional se escribe como n/d donde n,d son dos enteros que corresponden al numerador y denominador respectivamente.
- Crear una nueva clase Matriz que,entre otras, incluya las operaciones
- Sobrecarga de la suma y la resta
- Sobrecarga de los operadores de entrada/salida. Supondremos que el formato de una matriz viene determinado como 2 enteros (filas y columnas) seguidos de filas por columnas valores reales que corresponden a los elementos de la matriz (recorridos arriba-abajo, izquierda-derecha)
- Crear una nueva clase Polinomio que incluya todas las operaciones de la práctica anterior, incluyendo
- Operaciones básicas de asignación y consulta de coeficiente.
- Operación de consulta de grado
- Sobrecarga de la suma y la resta.
- Sobrecarga de los operadores de entrada/salida. Supondremos que el formato es el mismo que el usado en la práctica anterior.
- Compilar y depurar los módulos.
- Documentar los TDAs. Más adelante, el lector puede pinchar en los fuentes del tipo Vector_Disperso donde encontrar un ejemplo de documentación con doxygen. Note que esta documentación incluye
- Crear la especificación del TDA, es decir, el documento para su uso.
- Crear la documentación privada, es decir, la F.A. y el Inv. de la representación.
- Programar 3 ejemplos para probar los módulos que se han desarrollado. Los tres ejemplos resolverán
- Solución de una ecuación de primer grado sobre los números racionales. El usuario debe introducir en cin dos valores racionales a,b que corresponden a una ecuación ax+b=0. Después de comprobar que el primero no es nulo, deberá escribir la solución en pantalla.
- Suma, resta y multiplicación de dos matrices. El usuario introduce dos matrices a,b desde cin, y el programa calcula y escribe en pantalla los resultados de las expresiones (a+b), (a-b),
. - Derivada de un polinomio. El usuario introduce un polinomio en cin y el programa calcula su derivada y la escribe en pantalla.
Las restricciones a tener en cuenta para el desarrollo de la práctica son:
- La implementación del TDA Matriz se realizará en base a un vector de punteros a un único vector.
- La implementación del TDA Polinomio, debe usar el tipo Vector_Disperso. Nótese que un polinomio se puede representar en un vector disperso donde el valor por defecto sea el 0.0. De forma que sólo es necesario mantener las parejas de los monomios con coeficiente no nulo. Para ello, se pueden obtener los fuentes del TDA Vector_Disperso desde
- Los TDA se implementarán en archivos independientes, se forma que existirán 3 ficheros cabecera (uno para cada tipo) que se usarán en los ejemplos a desarrollar. Por otro lado, se deberá crear un fichero de biblioteca, denominado libmatematicas.a, de forma que la compilación de los ejemplos se realice con el enlazado de esta biblioteca.
Finalmente, como ayuda a algunos alumnos que no han usado el doxygen y me habéis preguntado la forma de utilizarlo, podéis descargar un fichero de configuración desde
La forma de utilizarlo es la siguiente:
- Situar ese fichero en el directorio de donde van a "colgar" el proyecto que váis a desarrollar. Por ejemplo, podemos suponer que está en un directorio, donde existen dos directorios
- fuentes: donde están todos los fuentes de la práctica
- documentacion: donde se obtendrá la salida de doxygen.
- Cambiar el valor de OUTPUT_DIRECTORY del fichero Doxyfile para indicar que la salida se obtendrá en el directorio documentacion. El el fichero que os he pasado, tiene el valor ./salida_doxygen.
- Cambiar el valor de INPUT del fichero Doxyfile para indicar donde están los fuentes a procesar. En el fichero que os paso están en ./sources. Para nuestro ejemplo, debéis poner fuentes. Notad que en la línea anterior, del fichero ejemplo, he puesto un ejemplo comentado donde se especifican dos directorios donde buscar fuentes.
- Otro directorio que puede resultar de interés puede ser EXAMPLE_PATH, que se usa en el caso de que indiquéis en formato doxyfile que incluís algún ejemplo (comando ejemplo). Si no lo usáis no es necesario.
- Ejecutar doxygen en el directorio actual, donde está en fichero Doxyfile. Despues de ejecutarse, encontraréis un directorio html en el de salida donde podéis ver el resultado de la documentación en html.
Por último, indicar que en la configuración que os he pasado está activada la generación de html. Pero está desactivada la generación de otros formatos (man, latex, rtf). Esto puede ser tentador para generar otro tipo de documentación, incluso obtener en papel una cantidad muy grande de páginas que documentan nuestros programas. Obviamente, yo no quiero que me entreguéis todo esto . Si me entregáis los fuentes, donde se incluyen los comentarios doxygen, no es necesario que volvais a entregar los mismos comentarios con otro formato.
Concretamente, se debe entregar
- En papel, la implementación, junto con la documentación (tanto la pública, es decir, la especificación, como la interna, es decir, función de abstracción e invariante de la representación).
- Un disco con todos los fuentes o mandarlos por correo electrónico al profesor con el "asunto" del correo "Codigo Sesión 5 (nombre alumno)". En los fuentes se debe incluir un fichero makefile para compilar los programas con la simple escritura de make
El formato de entrega de la práctica consiste en utilizar un sobre tamaño folio e introducir la práctica en su interior. En el sobre se deberá de escribir los nombres de los alumnos, el grupo, el nombre de la práctica y las direcciones de correo de los alumnos.
Es importante tener en cuenta que este formato es con la intención de tener que evitar el gasto económico de las encuadernaciones y el gasto ecológico de los plasticos y demás que se producen. Por tanto, incluir la práctica en este sobre se refiere a incluir los folios, incluso sueltos. Por supuesto, no incluir la práctica encuadernada.
La fecha de entrega límite para esta práctica es el día 12 de Mayo de 2003.
Después de esta práctica el alumno debe conocer la abstracción de una posición en un tipo, el concepto de iterar sobre los elementos de un contenedor y las estructuras lineales fundamentales.
Los objetivos de la práctica son
- Conocer la abstracción de posición, creando una clase que la represente y que permita recorrer los elementos de una clase contenedora.
- Insistir en la importancia del concepto de abstracción. En este caso para encapsular las variabilidad en la implementación de una posición.
- Que el alumno trabaje con la representación de celdas enlazadas.
- Asimilar el uso de clases sobre las que se itera en algoritmos de aplicación.
El alumno debe resolver:
- Decargar los archivos que implementan el tipo Conjunto_Reales desde
- Crear una nueva clase Posicion que implemente el concepto de una posición en un conjunto. En un conjunto de tamaño n podrá tener n+1 valores, desde el primer elemento hasta el siguiente al último. Deberá disponer de funciones miembro para
- Adelantar o retroceder una posición (operadores ++ y --)
- Comprobar si dos posiciones son iguales o no (operadores == != )
- Modificar la clase Conjunto_Reales
- Cambiando el nombre a Conjunto
- Usando typedef para parametrizar el tipo de dato que almacena el conjunto.
- Añadiendo dos funciones begin y end, para devolver la posición del primer elemento del conjunto y la posición del siguiente al último.
- Modificando la función elemento, para que utilice un objeto de posición en lugar de un entero.
- Realizar un programa que realice
- Lea un conjunto A de valores int hasta que se introduzca el cero.
- Lea un conjunto B de valores int hasta que se introduzca el cero.
- Calcule la unión, intersección y diferencia de los dos conjuntos.
- Liste los tres conjuntos resultantes.
- Modificar la implementación del tipo Conjunto para que utilice una representación basada en un celdas doblemente enlazadas con cabecera.
- Comprobar que el programa que se realizó sigue siendo válido.
Concretamente, se debe entregar
- La implementación, que incluye
- Archivos .h y .cpp con los fuentes resultado de modificar Conjunto_Reales para trabajar con posiciones (El tipo Conjunto que se ha implementado con posiciones).
- Archivos .h y .cpp con los fuentes resultado de modificar Conjunto_Reales para trabajar con una representación de celdas(El tipo Conjunto que se ha implementado con posiciones).
- Archivo .cpp con el programa de prueba.
- Un disco con todos los fuentes o mandarlos por correo electrónico al profesor con el "asunto" del correo "Codigo Sesión 6 (nombre alumno)".
El formato de entrega de la práctica consiste en utilizar un sobre tamaño folio e introducir la práctica en su interior. En el sobre se deberá de escribir los nombres de los alumnos, el grupo, el nombre de la práctica y las direcciones de correo de los alumnos.
Es importante tener en cuenta que este formato es con la intención de tener que evitar el gasto económico de las encuadernaciones y el gasto ecológico de los plasticos y demás que se producen. Por tanto, incluir la práctica en este sobre se refiere a incluir los folios, incluso sueltos. Por supuesto, no incluir la práctica encuadernada.
La fecha de entrega límite para esta práctica es el día 2 de Junio de 2003.
Programación en C++. Desarrollado por Antonio Garrido,
© 2003