Introducción
La segunda tarea programada consiste en el diseño e implementación de
una clase vector. Debido a que en C++ no se pueden usar vectores y matrices de
tamaño variable, es preciso utilizar la sobrecarga de operadores para poder
simular el vector en una lista.
La mayor parte del código fuente del la clase vector es facilitado por
el profesor, pero necesita de ciertos ajustes para funcionar de manera correcta.
Cuando dichas correcciones finalicen, el programa será capaz de realizar las
operaciones básicas de un vector, como lo son agregar y borrar datos, tanto al
final como al inicio del vector. Además
el vector podrá ordenarse, para lo cual el profesor nos dio el procedimiento
“quick sort”, el cual se
encarga de revisar el vector y ordenar sus elementos.
Como otro punto importante, se puede notar la ausencia de la invariante
en la clase provista por el profesor, por lo cual, será de gran importancia la
declaración de esta por parte de los estudiantes.
El código fuente y la documentación interna y externa se puede
encontrar en la dirección www.geocities.com/
La implementación de una clase ya diseñada por el profesor es el primer
paso para poder diseñar e implementar nuestras propias clases en un futuro, por
lo cual la realización adecuada del presente trabajo es de notable importancia
en el desarrollo apropiado del curso.
Descripción
del problema a resolver
Problema:
El problema consiste en la implementación de una clase del tipo vector,
tomando como base una que fue previamente diseñada por el profesor. Dada la
carencia de listas dinámicas en C++, se hace preciso la utilización de la
sobrecarga de operadores por lo que se utilizaran procedimientos que no sabemos
exactamente como funcionan. Además
es necesario la corrección de ciertos problemas, y es necesario agregar el código
fuente necesario para que pueda borrar y copiar elementos al inicio del vector.
La invariante de la clase tampoco ha sido definida, por lo cual corresponde al
estudiante definirla e implementarla. Resumiendo el problema se puede dividir en
4 puntos:
·
Implementar la clase vector, la cual fue previamente diseñada
por el profesor.
·
Utilizar procedimientos
de los cuales se conoce su utilidad, más no su arquitectura.
·
Definir e implementar la invariante de la clase vector.
·
Crear el código fuente necesario para que el vector pueda
borrar y copiar elementos al inicio del vector.
·
Solución:
Utilizar una
sobrecarga de operadores, en la clase vector. La sobrecarga se realizará
mediante los métodos implementados, y el uso de archivos *.cpp como ADH_list y
Use_list y archivos *.h Tdef y ADH_list como.
Objetivos:
·
Obtener las nociones básicas para implementar una clase.
·
Lograr trabajar con métodos cuyo funcionamiento es
desconocido.
·
Implementar la clase vector.
·
Crear una invariante adecuada para la clase vector.
·
Lograr que el vector realice operaciones básicas, como
borrar y agregar, tanto al principio como al final.
·
Lograr que el programa genere secuencias aleatorias en un
rango determinado para ordenarlas mediante la función qsort( ).
Requerimientos:
·
Un compilador de C++. En nuestro caso utilizaremos el
compilador, incluido en Visual C++ versión 6.
·
Los *.cpp, ADH_list
y Use_list
·
Los *.h Tdef y ADH_list
Abstracción
Especificación
de la clase:
La clase
vector será capaz de realizar una sobrecarga de operadores, para que el vector
implementado sea de tamaño variable, y tenga la apariencia de una lista a la
vista del usuario del programa. Además, permitirá operaciones como agregar y
borrar elementos y ordenar los elementos en orden.
Operaciones
y métodos[i]
:
A continuación
se presentaran los métodos y operaciones de la clase Vector:
Vector:
Contiene el constructor y el destructor de la clase
~ADH_list:
Elimina todos los nodos de la lista
begin: Señala
el primer nodo del vector
end: Señala
el ultimo nodo del vector
empty: Dice
si el vector esta vacío
Kslice:
Traslada al principio de la lista sus últimos k valores,pero sin copiarlos,
mediante cirugía de punteros.
Last: obtiene
una copia del último valor de la lista
Last: retorna
el puntero del último nodo de la lista
Move:
traslada en valor de LO a This
pop_back:
Elimina el valor del final de la lista
pop_front:
Elimina el valor del principio de la lista
push_back:
Agrega una copia del valor "v" al final de la lista "*this"
push_front:
Agrega una copia del valor "v" al principio de la lista "*this"
Remove:
Elimina cada uno de los valores iguales a "v"
Swap:
intercambia *this <==> L
Eficiencia:
La eficiencia del programa es buena, ya que a pesar de que existen métodos
implementados de una manera más bien grande, no afectan el rendimiento
del programa ya que la diferencia es mínima y que están pensados de esa manera
para que en el futuro los programadores que utilicen esta clase la comprenda de
una manera más rápida. Algo que
si puede llegar a afectar la eficiencia es que la interacción con el programa
solo se puede dar modificando los datos del código fuente, esto afecta a la
hora de hacer las pruebas ya que sería mucho más rápido poder hacerlo en
tiempo de ejecución.
Especificación
del programa:
El programa vector, cuenta con la clase llamada vector que es capaz de
borrar elementos y agregar elementos, tanto al final como al principio de la
lista, además de crear la lista nueva. El
punto de entrada del programa se encuentra en USE_list.cpp, ya que es aquí
donde se interactúa con el programa, dicha interacción no es directa ya que se
tiene que hacer desde el código fuente y no en tiempo de ejecución
Arquitectura del programa:
El programa
está construido en una clase, llamada vector. Además, se hace uso del método
qsort(). El punto de entrada del programa es el archivo USE_list.cpp, que
permite el uso de los métodos de modificación y eliminación de nodos.
Implementación
Estructura
del programa:
Modelo
de la clase (dibujo)
Clase
Vector |
vector(size_t
n); ~vector();
|
+Vector::InOut +InOut() +Operator
*() +Operator
++() +Operator
= +Vector::Iterator +Iterator() +Operator
*() +Operator
++() +Operator
= +Vector::Nodo +ADH_list() +~ADH_list() +begind() +empty() +end() +first() +K_slice(int) +last() +last_node() +move() +pop_back() +pop_front() +push_back() +push_front() +swap() +operator
!= +operator
<< +operator
== +operator
>> +print_list |
Invariante
de la clase:
Los números
introducidos en el vector, deben ser números enteros. No podrán objetos de
otra clase(como caracteres).
Arquitectura
interna del programa:
El programa
esta constituido por la clase vector, implementada para funcionar con sobrecarga
de operadores, e incluye a la función “qsort( )” proporcionada por el
profesor.
Además esta
constituida por los archivos ADH_list y Use_list y los *.h Tdef y ADH_list, que
son parte importante de la implementación del programa.
Compilador
usado:
Para el
programa, se utilizó el compilador incluido en la versión 6 de Visual C++.
¿Cómo
compilar el programa?
Para compilar
el programa, solo es necesario cargar la versión de C++ que se este utilizando,
y buscar la opción “compilar”. En la versión 6.0, la compilación puede
realizarse de tres maneras diferentes. La primera accediendo al botón compilar
en la mini barra de construcción. La segunda, en la barra de menú, en la opción
Build, en el menú que se despliega, se escoge Compile. Y la tercera manera de
compilar es apretando simultáneamente las teclas Control + F7.
Guía
de uso del programa
El programa
puede ejecutarse tiene un inconveniente para ejecutarse, y es que solo pueden
modificarse los datos desde el código fuente, es decir, el programa puede
ejecutarse normalmente, pero para elegir que rango de números va a utilizar el
vector, o para elegir que método utilizar, se debe entrar al código fuente, y
modificar directamente la operación.
Esto
significa, que solo usuarios conocedores de C++ pueden utilizar este programa,
pues, un usuario inexperto no tendría la habilidad necesaria para realizar
cambios.
Datos
de prueba del programa
Formato
de los datos de prueba:
Los datos de
prueba son números enteros generados aleatoriamente mediante el método rand()
en un rango determinado por el programador.
Si se desea
cambiar el rango, es necesario introducirse directamente en el código fuente y
cambiarlo.
Entradas
vs. Salidas esperadas:
Las entradas
serán números enteros, generados por el mismo
programa, por lo que el usuario no deberá introducir ningún valor. La
salida será un vector ordenado de mayor a menor, con los números enteros
primero introducidos, mostrados en la pantalla.
[i] Las especificaciones de los métodos fueron tomadas de la documentación interna de ADH_list.cpp, Use_list.cpp, USE_list.h, creada por Adolfo di Mare