Está en la página 1de 22

i

UNIVERSIDAD MARIANO GÁLVEZ DE GUATEMALA

PROGRAMACIÓN III

INGENIERÍA EN SISTEMAS DE INFORMACION

“MANUAL DEL PROYECTO”

5990-07-2807 Luis Fernando Lucas Suy

5990-12-4397 Abelardo Tecú Ruíz

5990-16-12014 Jeyson Geovanni Chinchilla Sical

5990-17-24124 Jorge Alejandro Oregel Albir

5990-19-1831 Carlos Alejandro Jerez Cute

5990-19-1832 Pablo Josué Rodríguez Herrera


ii

TABLA DE CONTENIDO
Proyecto Árbol Avl ..........................................................................................................................1

Descripción Del Problema …… ......................................................................................................1


Descripción De La Solución ...........................................................................................................1
Autores ..............................................................................................................................................
Detalles Técnicos ............................................................................................................................2
Diagrama de Flujo General ..............................................................................................................4
Código Fuente ..................................................................................................................................5
Limitaciones De La Aplicación ......................................................................................................5
Terminar...........................................................................................................................................5
1

PROYECTO ARBOL AVL

QUE ES UN ÁRBOL AVL:

Los árboles AVL son árboles BB donde todo nodo cumple la propiedad de equilibrado AVL:

La altura del subárbol izquierdo y del derecho no se diferencian en más de uno.

Se define factor de equilibrio de un nodo como:

Fe(nodo) = altura(derecho) – altura(izquierdo)

En un árbol AVL el factor de equilibrio de todo nodo es -1, 0 ó +1.

Tras la inserción o borrado de un elemento, sólo los ascendientes del nodo pueden sufrir un

cambio en su factor de equilibrio, y en todo caso sólo en una unidad.

Se añade una etapa donde se recorren los ascendientes. Si alguno está desequilibrado (+2 o -2)

se vuelve a equilibrar mediante operaciones denominadas rotaciones.

DESCRIPCIÓN DEL PROBLEMA:

El problema que se desea resolver corresponde a la lectura de un archivo en formato *.csv que

contiene los registros NIT, FECHA y MONTO, estos registros deben alimentar un árbol

equilibrado (AVL).

DESCRIPCIÓN DE LA SOLUCIÓN:

Se realiza un desarrollo de un programa en C++ que leerá el archivo *.csv que se especifique,

leerá cada registro con la estructura NIT, FECHA, MONTO y se insertará el registro dentro de

un Árbol AVL equilibrado; también tendrá la funcionalidad de buscar un NIT y mostrará cada

uno de los registros existentes con esa referencia, así como la función de finalizar el programa.
2

AUTORES:

5990-07-2807 Luis Fernando Lucas Suy

5990-12-4397 Abelardo Tecú Ruíz

5990-16-12014 Jeyson Geovanni Chinchilla Sical

5990-17-24124 Jorge Alejandro Oregel Albir

5990-19-1831 Carlos Alejandro Jerez Cute

5990-19-1832 Pablo Josué Rodríguez Herrera

DETALLES TÉCNICOS:

Lenguaje utilizado: C++

Versión: 20.03

Entorno de desarrollo IDE: CODE::BLOCKS

Metodología: Metodología Ágil

Tipo de Metodología Ágil Metodología XP

Caracteristicas XP Desarrollo Incremental,

Implementadas: Pruebas Unitarias,

Trabajo en Equipo,

Corrección de Errores,

Reestructuración del código,

El Código es de Todos,

Código Simple

Nombre del Patrón: Module

Clasificación del Patrón: Patrón Estructural


3

Intención: Lectura de archivo CSV y Estructura de árbol AVL

Conocido como: Patrón Modular

Motivación: Se desea leer un archivo CSV y crear un arbol

equilibrado, adicional un parámetro de busqueda del

registro principal

Aplicabilidad: Leer un archivo csv cualquiera que contenga 3

registros base (NIT, FECHA, MONTO) y realizar una

búsqueda de parámetros duplicados

Participantes: Entero: Nit

Cadena: ID

Cadena: date

Cadena: monto

Apuntador: Node *next

Estructura: Node

Implementación: Uso de Clases, estructuras, métodos y formulas;

adicional uso de Nodos y apuntadores


4

DIAGRAMA DE FLUJO GENERAL


5

CODIGO FUENTE:

#include<iostream>

#include<cstdio>

#include<sstream>

#include<algorithm>

#include <queue>

#define pow2(n) (1 << (n))

#include <fstream>

#define NOMBRE_ARCHIVO "ArchivoDePruebasProyecto01.csv"

#include <cstdlib>

#include <string>

#include <string.h>

#include <limits>

#include <stdlib.h>

#include <windows.h>

using namespace std;

struct Node {

int Nit;

string id;

string date; // Estructura para la pila que se usara en la opcion 1 y 2 del menu

string monto;

Node *next;

};typedef Node *ptrNode;


6

void addstack( ptrNode *ptrtop, Node i){

ptrNode ptrNew;

ptrNew = new Node;

if ( ptrNew != NULL ) {

ptrNew->Nit = i.Nit;

ptrNew->id = i.id;

ptrNew->date = i.date; //Metodo para Añadir los datos Nit,Fecha, Monto del archivo

csv a nuestra por medio del metodo addstack

ptrNew->monto = i.monto;

ptrNew->next = *ptrtop;

*ptrtop = ptrNew;

cout << "\tPersona con el Nit: [" << i.Nit <<"] encontrada."<<endl; //

void searchdata(ptrNode cursor)

if( cursor == NULL ) {

cout << "\n\t\nLa pila esta vacia \n";

return;

int n;

bool found=false;

cout<<"\n\n Ingrese el Nit a buscar en el arbol AVL: "<<endl;


7

cin>>n;

while( cursor != NULL ) {

if(n==cursor->Nit){

cout<<"============================";

cout<<"\n\tNIT: "<<cursor->Nit<<"\n";

cout<<"\tFECHA: "<<cursor->date<<"\n"; //Metodo que perimite buscar un

numero de Nit y luego muestra la fecha y monto de dicho nit

cout<<"\tMONTO: "<<cursor->monto<<"\n";

cout<<"============================\n";

found = true;

cursor = cursor->next;

if(found==false){

cout << "Nit no encontrado "<<endl; //Mensaje que alerta al usuario el cual indica que

el nit no fue encontrado

struct avl_node

{ int data;

struct avl_node *left; //Estructura para el arbol AVL

struct avl_node *right;

}*root;class avlTree
8

public:

int height(avl_node *);

int diff(avl_node *);

avl_node *rr_rotation(avl_node *);

avl_node *ll_rotation(avl_node *);

avl_node *lr_rotation(avl_node *); //Declaracion de los metodos a utilizar para el

arbol avl y sus rotaciones

avl_node *rl_rotation(avl_node *);

avl_node* balance(avl_node *);

avl_node* insert(avl_node *, int );

//void display(avl_node *, int);

void mostrarArbol ( avl_node *,int ); //Metodo para mostrar el arbol

void leerArchivo(string, string, string, int); // Metodo para la lectura del archivo CSV

avlTree()

root = NULL;

};

//node = nodo, avl_node = avl_nodo, left = izquierdo, rigth = derecho, avlTree = avlArbol

int main()

system("color 0F");
9

int segundos=5;

for(int i=0; i<=10; i++)

cout<<"\n";

cout<<"\t\t\t\t CARGANDO...\n";

cout<<"\n";

for(int i=0; i<=79; i++)

cout<<char(219); //Caracter para simular una barra de carga

Sleep(segundos*1500/600); //Medir el tiempo en que se tarda en generar la barra de

"Cargando"

cout<<"\n\t\t\t\t\t\n\t\t\t PROYECTO FINAL!\n";

cout<<"\n";

cout<<"\n";

cout<<"\n";

cout<<"\n";

cout<<"\n";

system("pause");

system("cls");

//int choice, item, cont=0;

int choice, cont=0, NIT2; //Declaración de variables para el menú y para la opción número 1

string NIT, FECHA, MONTO; //Declaración de variables para leer los datos del archivo

csv para la opción numero 1


10

avlTree avl;

while (1)

cout<<"-----------------------"<<endl;

cout<<"PROYECTO FINAL ARBOL AVL"<<endl;

cout<<"-----------------------"<<endl;

cout<<"1. Leer Archivo"<<endl;

cout<<"2. Buscar NIT"<<endl; //Menú de opciones

cout<<"3. Terminar"<<endl;

cout<<"-----------------------"<<endl;

cout<<"-----------------------\n"<<endl;

cout<<"Ingresa la opcion deseada: \n";

cin>>choice;

switch(choice) // Switch para la ejecucion del menu

case 1:

avl.leerArchivo(NIT, FECHA, MONTO, NIT2); // Al seleccionar la opción uno esta

lee el archivo CSV y los ingrese a al árbol AVL

//root = avl.insert(root, NIT2);

//avl.printLevelOrder(root);
11

cout<<" La lectura de ArchivoDePruebasProyecto01.csv fue realizada

correctamente\n"; //Lectura del archivo correcta

system("pause"); //presionamos una tecla para continuar y limpiamos pantalla para

volver al menú

system("cls");

break;

case 2: //opción 2

Node *stack_ = NULL; // Estructura de la pila

string namefile, line;

cout << "Ingrese el nombre del archivo CSV: " << endl;

cin >> namefile;

ifstream file; //Comando para insertar el nombre del archivo CSV

file.open(namefile.c_str());

if(!file.is_open()) {

cout << "Archivo "<< namefile <<" no encontrado." << endl; // Sentencia que indica si

el archivo no fue encontrado

exit(-1); // Salir

for (Node i;

(file >> i.Nit).ignore(numeric_limits<streamsize>::max(), ',')


12

&& getline(file, i.date, ',') //Obtener lineas Fecha y Monto del archivo CSV accediendo a la

pila anteriromente creada

&& getline(file, i.monto);

cout<<"\nFecha: "<<i.date; //Imprimir Fecha y Monto de todos los nit

cout<<"\nMonto: "<<i.monto;

addstack( &stack_, i);

searchdata(stack_); //Método de búsqueda de nits

system("pause"); //Detiene la acción que se está ejecutando

system("cls"); //Limpia pantalla y regresa al menú principal

file.close(); // cierra el archivo CSV

break; // Dinaliza el bucle

case 4:

if (root == NULL)

cout<<"El Árbol está vacío"<<endl;

continue;

cout<<"Árbol AVL Balanceado:"<<endl; //Muestra la figura del árbol AVl con los

números de NIT
13

avl.mostrarArbol(root, cont);

break;

case 3:

exit(1); //Termina la ejecución del menú

break;

default:

cout<<"Debe ingresar una opción Válida"<<endl;

return 0;

// Altura del arbol AVL

int avlTree::height(avl_node *temp)

int h = 0;

if (temp != NULL)

int l_height = height (temp->left);

int r_height = height (temp->right);

int max_height = max (l_height, r_height);

h = max_height + 1;

return h;
14

// DIferrenica de altura del Arbol AVL

int avlTree::diff(avl_node *temp)

int l_height = height (temp->left);

int r_height = height (temp->right);

int b_factor= l_height - r_height;

return b_factor;

// Rotacion del arbol hacia la derecha derecha

avl_node *avlTree::rr_rotation(avl_node *parent)

//cout << "\nRotacion Derecha-Derecha\n" << endl;

avl_node *temp;

temp = parent->right;

parent->right = temp->left;

temp->left = parent;

return temp;

// rotación izquierda- izquierda del árbol AVL

avl_node *avlTree::ll_rotation(avl_node *parent)

//cout << "\nRotacion Izquierda-Izquierda\n" << endl;


15

avl_node *temp;

temp = parent->left;

parent->left = temp->right;

temp->right = parent;

return temp;

// Rotación izquierda derecha del árbol

avl_node *avlTree::lr_rotation(avl_node *parent)

//cout << "\nRotacion Izquierda-Derecha\n" << endl;

avl_node *temp;

temp = parent->left;

parent->left = rr_rotation (temp);

return ll_rotation (parent);

// Rotacion derecha izquierda

avl_node *avlTree::rl_rotation(avl_node *parent)

//cout << "\nRotacion Derecha-Izquierda\n" << endl;

avl_node *temp;

temp = parent->right;

parent->right = ll_rotation (temp);

return rr_rotation (parent);


16

// Balance del arbol AVL

avl_node *avlTree::balance(avl_node *temp)

int bal_factor = diff (temp);

if (bal_factor > 1)

if (diff (temp->left) > 0)

temp = ll_rotation (temp);

else

temp = lr_rotation (temp);

else if (bal_factor < -1)

if (diff (temp->right) > 0)

temp = rl_rotation (temp);

else

temp = rr_rotation (temp);

return temp;

// Insertar elemento en el arbol Avl

avl_node *avlTree::insert(avl_node *root, int value)


17

if (root == NULL)

//cout << "Insertando: " << value << endl;

root = new avl_node;

root->data = value;

root->left = NULL;

root->right = NULL;

return root;

else if (value < root->data)

root->left = insert(root->left, value);

root = balance (root);

else if (value >= root->data)

root->right = insert(root->right, value);

root = balance (root);

return root;

//Muestra el arbol Avl con los Nits


18

void avlTree::mostrarArbol ( avl_node *arbol ,int cont){

if (arbol ==NULL){

return;

else{

mostrarArbol (arbol->right, cont+1);

for (int i=0; i< cont; i++){

cout<<" ";

cout <<arbol->data<<endl;

mostrarArbol (arbol->left, cont+1);

//Lee el archivo CSV

void avlTree::leerArchivo(string NIT, string FECHA, string MONTO, int NIT2 )

string namefile, line;

cout << "\nIngrese el nombre del archivo CSV: \n" << endl;

cin >> namefile;

ifstream file; //Ingresar el nombre del archivo CSV

file.open(namefile.c_str());

if(!file.is_open()) {
19

cout << "Archivo "<< namefile <<" no encontrado." << endl; //SI el nombre es incorrecto nos

muestra este mensaje

exit(-1);

ifstream archivo(NOMBRE_ARCHIVO);

string linea;

char delimitador = ',';

avlTree avl;

// Leemos todas las líneas

while (getline(archivo, linea))

stringstream stream(linea); // Convertir la cadena a un stream

//string NIT, FECHA, MONTO;

// Extraer todos los valores de esa fila

getline(stream, NIT, delimitador);

NIT2 = atoi(NIT.c_str());

getline(stream, FECHA, delimitador);

getline(stream, MONTO, delimitador);

root = avl.insert(root, NIT2);

// Imprimir

//cout << "==================" << endl;

//cout << "NIT2: " << NIT2 << endl;

//cout << "FECHA: " << FECHA << endl;


20

//cout << "MONTO: " << MONTO << endl;

archivo.close();

LIMITACIONES DE LA APLICACIÓN:

El proyecto tiene limitante en su alcance ya que se puede utilizar únicamente dentro de la

misma carpeta donde se encuentra el archivo a leer para evitar errores de lectura e indicando el

nombre.

Otra limitante conocida corresponde al método de lectura, ya que el archivo a leer debe

contener un formato específico *.csv y contener únicamente los 3 campos reconocidos NIT (sin

guiones, únicamente números), FECHA (en formato DD/MM/AAAA), MONTO (valores

numéricos sin división de miles, es decir comas; y el punto decimal contendrá únicamente dos

decimales).

También podría gustarte