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.




 

18/2/10

Código Primer Laboratorio

El código corregido del primer Laboratorio se puede descargar en: http://sites.google.com/site/progorientadao/190210

LABORATORIO 1 “REPASANDO C++; ABSTRACCIONES, CONSTRUCTORES Y DESTRUCTORES.”




INTEGRANTES:

  • Andrés Gerardo Bernal Arias. Cód.:258029
  • Joanna Dulima Ochoa Mancipe. Cód.:258050
  • Pedro Alejandro Valderrama Tapias. Cód.:258031
Primera Parte: Repasando C.



Una pila es un concepto que permite el manejo de los datos mediante operaciones de inclusión (push) y expulsión (pop) de modo que el orden de los datos es del tipo LIFO (Last In - First Out). En la primera sección del archivo Anexos_Lab1.pdf se observa una implementación de una pila en C++, obtenida parcialmente del libro Practical C++ Programming por Steve Oualline. Observe el código, y responda las siguientes preguntas:


 

  1. ¿A que se refieren con el modificador _inline_ en el momento de declarar las funciones?


    La función inline indica al compilador que cada llamado a ésta deberá ser reemplazado por el cuerpo de esta función, en otras palabras es como si el programador escribiera el código de la función cada vez que esta fuera invocada.




  2. Intente correr el programa. Observe el código fuente. ¿Qué expresiones hacen falta y en qué lugares?


    Se tuvieron varios errores sintácticos y de expresiones lógicas que se explicarán en la exposición.




  3. Complete el código fuente y corra el programa. Teniendo en cuenta su salida, modifíquelo para que solicite un conjunto de datos definido por usuario para introducir a la pila, y una expulsión gradual posterior (que pregunte al usuario si desea seguir expulsando datos o no). Incluya como anexos al laboratorio algunas pruebas de escritorio de su programa.


    Vér código corregido en: www.sites.google.com/site/progorientadao/190210



Segunda Parte: Abstracción, Constructores y Destructores.


 

  1. Investigue sobre diagramas de clases. Comience por la referencia en las primeras diapositivas de la clase. Trate de abstraer una clase para la versión del programa que construyó en el numeral 3, con sus atributos, métodos, constructores y destructores a partir del código fuente ejemplo, y represente su abstracción como un diagrama de clases.


    Un diagrama de clases es tipo de modelo que describe la vista estática de un sistema en términos de clases y relaciones entre ellas. Ésta tiene tres compartimentos o bandas en una tabla vertical, que son: banda de nombre, banda de atributos y banda de operaciones, la sintáxis de la tabla puede ser diferente a la del lenguaje de programación, pero es recomendable usar la misma.

    Banda de nombre: la parte superior del rectángulo que representa a la clase contiene el nombre de la misma; se escribe centrado y en letra negrita. Es conveniente que el nombre se deduzca del dominio del problema y sea lo menos ambiguo posible, tampoco debe tener prefijo o sufijo.

    Banda de atributos: las clases tiene atributos que describen las características de los objetos. La figura muestra el ejemplo de la clase Avión con sus atributos. Los atributos correctos capturan la información que describe e identifica una instancia específica de la clase, sin embargo, deben incluirse los atributos que sean importantes en el moldeamiento del sistema, también influye utilizar el propósito del sistema.



Avión
número de matrícula

marca

velocidad

número de pasajeros

 
Un atributo tiene un tipo, que indica la clase de atributo. Los tipos ususales de atributos son los primitivos (boolean, entero, numeración…). Pueden ser específicos para ciertos lenguajes de programación, sin embargo se puede utilizar cualquier tipo, incluido otra clase.
Los atributos pueden ser de diferente visibilidad. Ésta describe si el atributo es visible y puede ser referenciado por otras clases distintas de aquella en que se ha definido. Se puede clasificar así:

 
Públicos Se pueden utilizar y visualizar fuera de la clase (se representa con un signo + delante del nombre.)
Privados              No se puede acceder al mismo desde otras clases (se representa con un signo - delante del nombre.)
Protegidos     Se utiliza en notaciones de generalización y especialización para representar atributos protegidos relacionados con clases derivadas.

 
Banda de operaciones: las operaciones de una clase se utilizan para manipular los atributos (modificar el estado de la clase) o realizar alguna otra acción; son funciones a las que se llama o invoca, son interiores a la clase y se pueden aplicar a objetos de esa clase. Las operaciones describen lo que puede hacer la clase, es decir, sus servicios; tienen análoga visibilidad a la de los atrributos. La sintáxis formal de una operación es:

 
visibilidad nombre (lista-parámetros): tipo-expresión-retorno (cadena-propiedad)

 
Donde lista-parámetros es una lista de parámetros formales separados por coma, especificados cada uno con la siguiente sintaxis:
nombre: tipo-expresión=valor por omisión

 
Ejemplo de diagrama de clases

 
Figura
diámetro: Longitud
pos: Posición
+dibujar ()
+escalaFigura(x:Integer=50, y:Integer=10)
+devolverPosición():Posición

 
JOYANES AGUILAR, Luis. Programación Orientada a Objetos. 2ed. Ed Alfaomega.

  1. Escriba en C++ el constructor que tendría la clase que conceptualizó en el tercer punto de la primera parte de este laboratorio.


    stack(){cout<<"\n\tCONSTRUYENDO...";};




  2. ¿Es posible hacer que un programa bajo objetos en C++ corra sin necesidad de tener un constructor en el sentido estricto de la palabra?


    Si es posible, puesto que si el constructor no es declarado por el programador, el compilador crea uno para poder inicializar objetos de la clase(s) utilizada(s) en el programa, y reservar espacio de memoria para el objeto a crear, o bien se pueden realizar las siguientes operaciones para crear un objeto: declarando un objeto global, declarando un objeto local u objeto temporal o invocando al operador en vez de llamar explícitamente al constructor en cuestión.




  3. Escriba en C++ el destructor que tendría la clase que conceptualizó en el tercer punto de la primera parte de este laboratorio.


    ~stack(){cout<<"\n\tDESTRUYENDO...";};




  4. ¿Es posible hacer un programa bajo objetos en C++ que corra sin necesidad de tener un destructor en el sentido estricto de la palabra?


    También es posible, pues es un caso parecido al de los constructores, pues el compilador declararía uno con una estructura como ~nombreclase (); o en el caso de los objetos creados dinámicamente por el operador new, tienen que ser destruidos utilizando el operador delete, de lo contrario el sistema destruiría la variable puntero pero no liberaría el espacio de memoria referenciado por ella.

16/2/10

Preinforme Laboratorio “Repaso en C++ y Diagramas de Clases”

Integrantes:
-Andrés G. Bernal A. Cód.:258029
-Pedro A. Valderrama T. Còd.:258031
-Joanna D. Ochoa M. Còd.:258050


Descripción del Problema:
El problema que nos plantea el laboratorio consiste en encontrar los errores sintácticos del código que nos proporcionan, además de corregirlo se debe complementar con otros procedimientos para que realice algunas funciones extra.
Luego de realizar lo anteriormente mencionado, se nos pide crear un diagrama de clases basado en el programa anterior con el código ya corregido y modificado, y también debíamos investigar sobre los diagramas de clases.
****************************
Diagrama de Clases
****************************
Atributos
****************************
Ingreso de datos
Salida de datos
Modificación de datos
Almacenaje de datos
Comparación de datos
Inicializador de registros
****************************
Destructores
Destructor de registros
Destructor de archivos
****************************
Constructores
Creador de registros
Creador de archivos
****************************