Site hosted by Angelfire.com: Build your free website today!

Volver a Principal

 

Introducción

 

La presente tarea tiene como objetivo especifico el implementar dos métodos pertenecientes a la clase ADH_list, que, como su nombre lo dice, es una clase que nos permite usar una lista, con la ventaja de que el usuario cliente puede usar únicamente iteradores. Los métodos que hay que implantar son los métodos insert (insertar) y remove (remover).

La especificación de la tarea puede ser encontrada en la siguiente dirección http://www.di-mare.com/adolfo/cursos/2005-2/p2-ta-4.htm

Documentación

La documentación externa será creada con el programa Doxygen, además este archivo de documentación en formato virtual y el código completo del programa pueden ser encontrados en la dirección http://www.costarricense.cr/pagina/ea45510.

 

Descripción del problema a resolver

Planteo

El objetivo es especificar e implementar una clase completa, a clase ADH_list debe ser capas de realizar las operaciones básicas que una lista debe tener, como lo son insertar al frente y al final, borrar al frente y al final, intercambiar dos listas, borrar un valor específico de la lista, borrar toda la lista, insertar en un lugar específico dentro de la lista, determinar si la lista esta vacía, entre otros. Cabe recalcar que la clase ADH_list utiliza dos clases más, la clase iterador que permite al usuario cliente moverse por la lista y la clase nodo.

 

Objetivos

Los objetivos de esta tarea son:

·        Familiarizarse con la correcta creación de software según se establece en la ingeniería de software y el análisis de sistemas, en los cuales para alcanzar un resultado óptimo se sigue un orden de Análisis, Diseño y Programación.

·        Desarrollar habilidades específicas en torno al análisis y diseño de soluciones en el ámbito del DOO (Diseño Orientado a Objetos).

·        Aprender más a profundidad el empleo del lenguaje de programación C++, sintaxis, utilización de librerías y fomento de la reutilización de código.

·        Mostrar la importancia del ocultamiento de datos y la portabilidad.

 

Abstracción

 

Especificación de las clases

 

Clase List:

La clase List lo que tiene en realidad es un puntero al primer nodo de la lista, tiene una clase nodo y una clase iterador. Además de esto se encarga de la construcción, copia, destrucción de la lista. Aparte de los demás métodos de manejo de la lista lo cual incluye: el insertar y borrar al inicio y al final, control de iteradores para denotar el primer o último valor de la lista, mueve, intercambia, remueve, traslada.

 

Clase Nodo:

El propósito de dicha clase es contener los datos de los nodos específicos de una lista como atributos privados, estos dos campos son: el valor y la dirección que apunta al nodo siguiente en la lista o a 0. Tiene además 2 clases amigas las cuales son la List e iterator.

 

Clase Iterator:

            La clase iterator que tiene de amiga a la clase lista se encarga del desplazamiento sencillo dentro de la lista y de sus respectivos nodos mediante el análisis de los punteros de los nodos. Tiene un atributo privado de tipo nodo el cual tiene un puntero a ese nodo.

 

 

Operaciones/métodos

 

Clase List:

·        list() { m_first = 0; } è Constructor

·        list(const list& LO) : m_first(0) { *this = LO; } è Constructor de copia

·        ~list()  è Destructor

·        void push_front( const T& v )  è Inserta al inicio

·        void push_back(  const T& v )  è Inserta al final

·        void clear()  è Elimina los valores del contenedor y lo deja vacío

·        void pop_front()  è Elimina al inicio

·        void pop_back()  è Elimina al final

·        bool empty() const  è Confirma si la lista está vacía

·        iterator first()  è Devuelve un puntero al primer elemento de la lista

·        iterator last()  è Devuelve un puntero al último elemento de la lista

·        iterator begin() const  è Devuelve un puntero al primer elemento de la lista

·        iterator end  () const  è Denota el valor que ya está fuera del contenedor

·        list& operator =(const list& LO)  è Hace L igual a LO

·        void move(list& L) 

·        void swap(list& L)  è Intercambia *this con L

·        void insert(iterator position, const T& v)  è Inserta “v” antes de position

·        void remove(const T& v)  è Elimina cada uno de los valores iguales a "v"

·        friend std::ostream& operator<< (std::ostream &, const list& )  è Graba el valor de L en el flujo  COUT

·        friend std::istream& operator>> (std::istream &, list& )  è Lee del flujo de texto CIN el valor de "r"

 

Clase Nodo:

 

Clase Iterator:

·        T* operator->() { return &(m_p -> m_val); }è Operador ->

 

 

Arquitectura del programa

 

 

 

 

Implementación

 

Modelo de la clase

 

La clase ADH_list tiene un puntero al primer nodo de la lista, cada nodo tiene dos campos, el primer campo contiene el valor del nodo y el segundo tiene la dirección al siguiente nodo, el último nodo de la lista apunta a cero.

Invariante de la clase

 

 

Para que una lista sea considerada correcta debe cumplir las siguientes premisas:

 

Compilador usado

Para compilar el código y generar el ejecutable, se utilizó el compilador incluido en el IDE (Integrated Development Environment) Visual C++ 6.0 de Microsoft.

 

¿Cómo compilar el programa?

Si se cuenta con el archivo Tarea4.dsp, basta con darle doble clic a este, luego entre en “Build” (Alt-b) y escoja “Rebuild All” y enseguida presione Ctrl-F5.

Si no cuenta con el archivo Tarea2.dsp, entre en “File > New”, en la ventana New escoja “Projects > Win32 Console Aplication”, además digite el nombre y dirección que desea, presione OK. En la ventana Win32 Console Aplication escoja “An Empty Project” y presione Finish y en la siguiente ventana OK.

Teniendo listo el proyecto, se debe proceder a incluir todos los archivos C++ respectivos, en este caso son 5:

·        USE_list.cpp

·        ADH_list.h

·        ADH_list.cpp

·        ADH_port.h

·        Tdef.h

 

Para lograrlo, se accesa la opción “Project > Add to Project > Files”. Se guardan los respectivos archivos en el medio deseado para así asegurar su pertenencia al proyecto (Opción “File > Save all”). Luego se compila el código presionando F7 en el teclado o bajo el menú “Build > Build All”.

 

 

Guía de uso

 

 

Este programa no tiene una guía de uso específica ya que es una clase, que puede ser usada por otro programa que necesite una lista. En este caso el usuario lo único que debe hacer es compilar el programa.

 

 

 

Casos y datos de prueba

 

Casos de prueba

 

No va a haber un tipo de caso de prueba específico, lo que se va a hacer es insertar y remover valores en la lista aleatoriamente, y se va a verificar si el resultado es el correcto.

 

Datos de prueba

 

Para probar el método insert implemente otro método llamado anterior (LO, T), que tiene dos parámetros, el primero es la lista y el segundo es un valor de tipo T (tipo de objetos de la lista), lo que hace es buscar por la lista el valor mandado por parámetro y retorna el iterador del nodo anterior al que contiene ese parámetro, así la instrucción LO.insert(LO.anterior(LO, 4), 8) insertará en la lista un nuevo nodo con m_val igual a 8, antes del primer nodo que tenga m_val igual a 4. El método anterior( ) no esta en el programa mandado por correo.

 

Lista antes

Instrucción

Lista después

( )

LO.insert( LO.begin(), 4 )

(4)

(4)

LO.insert( LO.begin(), 5 )

(5, 4)

(5, 4)

LO.insert( LO.begin(), 4 )

(4, 5, 4)

(4, 5, 4)

LO.insert( LO.last(), 6)

(4, 5, 6, 4)

(4, 5, 6, 4)

LO.remove( 4 )

(5, 6)

(5, 6)

LO.remove( 7)

(5, 6)

(5, 6)

LO.insert(LO.anterior(LO, 5), 8)

(8, 5, 6)

(8, 5, 6)

LO.insert( LO.end(), 5)

(8, 5, 6, 5)

(8, 5, 6, 5)

LO.insert(LO.anterior(LO, 6), 1)

(8, 5, 1 , 6, 5)

(8, 5, 1 , 6, 5)

LO.insert(LO.anterior(LO, 8), 5)

(5, 8, 5, 1 , 6, 5)

(5, 8, 5, 1 , 6, 5)

LO.remove( 1);

(5, 8, 5, 6, 5)

(5, 8, 5, 6, 5)

LO.remove( 6);

(5, 8, 5, 5)

(5, 8, 5, 5)

LO.remove( 8 );

(5, 5, 5)

(5, 5, 5)

LO.remove( 5);

( )

 

 

Bibliografía

 

 

 

 

Volver a Principal