19/2/10

INFORME LABORATORIO 1 REPASANDO C++ Y ABSTRACCIÓN, CONSTRUCTORES Y DESTRUCTORES.






INFORME LABORATORIO 1 REPASANDO C++ Y ABSTRACCIÓN, CONSTRUCTORES Y DESTRUCTORES.

 INTEGRANTES:
ANDRÉS GERARDO BERNAL ARIAS 258029
JOANNA DULIMA OCHOA MANCIPE 258050
PEDRO ALEJANDRO VALDERRAMA TAPIAS 258031

RESUMEN EJECUTIVO:
La implementación que se llevó a cabo consistió en revisar el código ejemplo brindado, detectar los errores que contenía, corregirlos y analizar que procedimientos hacían falta en éste para que desarrollara el objetivo específico deseado. Los principales problemas fueron la interpretación del código y la detección del error que contenía el programa, ya que no estábamos familiarizados con la función inline y la función assert; para solucionar este inconveniente averiguamos en paginas recomendadas en clase el semestre pasado y, cuando entendimos el funcionamiento de las funciones, entendimos de una manera más simple y concreta el objetivo del programa; además de hallar los errores sintácticos que impedían su funcionamiento.
Ya al haber corregido y modificado el código fuente, se nos pide abstraer una clase para éste y crear el constructor y destructor correspondiente, explicarlo por medio de un diagrama de clases; cuando intentamos solucionar estos puntos se nos presentaron varios problemas, el principal fue saber de qué manera conceptualizar la clase para el programa y su diagrama de clases, al no tener el concepto de "clase" bien definido, nos costó realizar esta parte, pero luego de documentarnos lo suficiente, y de tener en cuenta las definiciones y conceptos suministrados en la clase, logramos efectuar esta parte del laboratorio, y tener bases para realizar la parte de constructores y destructores.
Cuando intentamos hacer la sección de constructores y destructores, en la cual se nos pedía escribir en C++ el constructor y el destructor de la clase que conceptualizamos, nos topamos con un gran problema, no sabíamos cómo hacer el código de un constructor, conocíamos como se declaraba dentro de la clase y su objetivo, pero no sabíamos que debía hacer el código dentro del constructor o dentro del destructor, lo que hicimos fue declarar el constructor por defecto de una clase y darle una instrucción para verificar que el programa estaba realizando las acciones solicitadas.
En síntesis, podemos ver que el desarrollo del trabajo tuvo los siguientes aspectos, sus problemas y soluciones:
  • Comprensión del código: inicialmente no se desarrollaba este aspecto por falta de familiaridad con el código, excepto por la estructura, y no comprendíamos por qué habiendo visto en semestre inmediatamente anterior un programa de estos con un registro o estructura, y observando la declaración struct, el compilador la conceptualizaba como clase, y como no se mencionaba desde un comienzo el objetivo del programa sino solamente el papel de cada función inline y cada variable, tuvimos que descubrirlo por nuestra propia cuenta, en lo que tuvimos que tener mucha habilidad interpretativa.
  • Corrección del código: habiendo superado la dificultad anterior, como era la familiarización con el programa, identificación de su objetivo y comprensión de las funciones inline y main y sus interrelaciones, se corrigio el código respecto a lo que habíamos omprendido como objetivo, que era presentar los datos "esperados".
  • Documentación sobre diagramas de clases, clases, constructores, destructores y abstracción: consultando la página web dada y consultando bibliografía complemetaria se desarrollo una diagrama con ciertas dificultades que se derivaban de nuevo de la comprensión del código, pero fueron superadas con la misma documentación, en la parte de la abstracción de la clase se nos dificultó porque tratábamos de comprender al programa en su totalidad como una clase y no la mencionada estrcutura o registro con sus dos atributos y sus funciones miembro inline; y las constructores y destructores, tuvimos suficiente información bibliográfica, pero aún se manifestaban dudas sobre las procedimientos internos que debían desarrollar cada uno de estos, lo cual se solucionó como se mencionaba en los párrafos anteriores.
  • Desarrollo de informe y laboratorio: abordados estos problemas se pudieron realizar estos documentos.
MARCO TEÓRICO
Función inline: indica al compilador que cada llamado a ésta deberá ser reemplazado por el cuerpo de esta función. Además inline tiene la ventaja de acelerar un programa si éste invoca regularmente a la función inline. (1)
Abstracción: es el proceso por el cual las personas gestionan la complejidad de un elemento para comprenderlo, entraña la descomposición de un sistema complejo o complicado en sus partes más fundamentales y describirlas con un lenguaje sencillo y preciso, implica darles un nombre y describir sus funcionalidades. (2, 3)
Constructores: son métodos no estáticos que tienen el mismo nombre de la clase, no devuelven ningún tipo de retorno y se llaman automáticamente cuando se crea una clase. Su función es inicializar un nuevo objeto (sus datos). Son características de éstos: tienen el mismo nombre que la clase a la que pertenecen, no tienen tipo de retorno, y por lo tanto no retornan ningún valor, no pueden ser heredados; deben ser públicos, no tendría ningún sentido declarar un constructor como privado, ya que siempre se usan desde el exterior de la clase, ni tampoco como protegido, ya que no puede ser heredado. (2)
Destructores: Los destructores son funciones miembro especiales que sirven para eliminar un objeto de una determinada clase. El destructor realizará procesos necesarios cuando un objeto termine su ámbito temporal, por ejemplo liberando la memoria dinámica utilizada por dicho objeto o liberando recursos usados, como ficheros, dispositivos, etc. Sus características son: tienen el mismo nombre que la clase a la que pertenecen, pero tienen el símbolo ˜ delante; no tienen tipo de retorno, y por lo tanto no retornan ningún valor; no tienen parámetros; no pueden ser heredados; deben ser públicos, no tendría ningún sentido declarar un destructor como privado, ya que siempre se usan desde el exterior de la clase, ni tampoco como protegido, ya que no puede ser heredado; no pueden ser sobrecargados, lo cual es lógico, puesto que no tienen valor de retorno ni parámetros, no hay posibilidad de sobrecarga. (3)

DIAGRAMA DE CLASES.



MÉTODOS Y ATRIBUTOS
Atributos:
  • +int count – Determina el numero de posiciones a usar en el arreglo stack.data[], y en qué lugar del arreglo se almacenan los datos.
  • +int data[] – Arreglo utilizado para almacenar los datos que se le solicitan al usuario, controlado por la variable stack.count.
Métodos:
  • +void stack_init(); - Inicializador de la variable stack.count.
  • +void stack_push(); - Funcion que se encarga de introducir y organizar los datos dentro del arreglo stack.data[].
  • +void stack_pop(); - Funcion que se encarga de "expulsar" y mostrar en pantalla los datos que están guardados en el arreglo stack.data[].
  • stack(){}; - es el constructor por defecto de la clase, encargado de crear los objetos.
  • ~stack(){}; - es el destructor por defecto de la clase.

CONCLUSIONES
  • La POO nos permitió gestionar la complejidad del programa brindado en el ejemplo, ya que se dividía el problema general de éste a través de los diferentes métodos, para que cada uno resolviera una acción, solucionando modularmente los subproblemas para solucionar la totalidad del problema, como consecuencia de haber realizado las correcciones pertinentes.

  • Vimos que es necesario la declaración de constructores y destructores en una clase, pero que si como programadores omitimos este paso, el entorno de programación los crea, asignándoles el mismo nombre de la clase (lo que los distingue de las demás funciones miembro), pues sus funciones son imprescindibles para el buen funcionamiento del programa que se va a crear, como son crear e inicializar un objeto en el caso de la primera función miembro destacada, y eliminar un objeto de la clase liberando la memoria que ocupaba, caracterizando así a la POO por su herencia, modularidad, abstracción, encapsulamiento y sobrecarga.

  BIBLIOGRAFÍA
  1. JOYANES AGUILAR, Luis. Fundamentos de programación: algoritmos y estructuras de datos. 2ª edición. 1996. Ed. Mc Graw-Hill.
  2. CEBALLOS, Francisco Javier. "Programación orientada a objetos con C++". Segunda edición. Alfaomega grupo editor.