Ir al contenido principal

ARCHIVOS Y ARBOLES BINARIOS EN C++

este es un ejercicio hecho en c++ utilizando arboles binarios y archivos simulando una base de datos de contactos.
espero que les sea de gran ayuda

// Mi_Data_Base.cpp: archivo de proyecto principal.
#include "stdafx.h"
#include
#include
#include
using namespace std;
/*ESTRUCTURAS DE DATOS*/
struct REGISTRO
{
int posicion;
int identificacion;
char nombre[64];
char celular[10];
char correo[64];
};
struct INDICE
{
int posicion; //posicion dentro del archivo de indices
long identificacion; //llave del registro
int posicion_datos; //posicion dentro del archivo de datos
int posicion_indice_izq; //posicion del registro izquierdo (nodo izquierdo del arbol) dentro del archivo de indices
int posicion_indice_der; //posicion del registro derecho (nodo derecho del arbol) dentro del archivo de indices
};
/*Prototipo de funciones*/
void Mostrar_Menu();
void Opcion_Ingresar_Registro();
void Opcion_Buscar_Registro();
void Opcion_Actualizar_Registro();
void Opcion_Resetear_Base_Datos();
void Opcion_Mostrar_Archivo_Datos();
void Opcion_Mostrar_Archivo_Indices();
int Ingresar_Registro(REGISTRO);
int Ingresar_Indice(INDICE);
int Buscar_Registro(int, REGISTRO*);
int Buscar_Indice(long, INDICE*);
void Actualizar_Registro(REGISTRO);
void Actualizar_Indice(INDICE);
/*Variables Globales*/
char * nombre_archivo_maestro = "maestro.txt";
char * nombre_archivo_datos = "datos.txt";
/*Punto de inicio del programa*/
int main(char *arg[])
{
Mostrar_Menu();
return 0;
}
/*Definicion del procedimiento Mostrar_Menu*/
void Mostrar_Menu()
{
int opcion;
do{
system("CLS"); //limpiamos pantalla
//printf("\n\n\n");
printf("********** MI BASE DE DATOS DE CONTACTOS **********\n\n");
printf("Opciones disponibles: \n");
printf(" 1. Ingresar registro \n");
printf(" 2. Buscar registro \n");
printf(" 3. Actualizar registro \n");
printf(" 4. Mostrar Archivo de Datos \n");
printf(" 5. Mostrar Archivo de Indices \n");
printf(" 6. Resetear la base de datos \n");
printf("\n");
printf(" 0. Salir \n\n");
printf("Digite la opcion a realizar: ");
cin>>opcion;
printf("\n\n");
switch( opcion )
{
case 0:
printf("Hasta luego...\n\n");
break;
case 1:
Opcion_Ingresar_Registro();
break;
case 2:
Opcion_Buscar_Registro();
break;
case 3:
Opcion_Actualizar_Registro();
break;
case 4:
Opcion_Mostrar_Archivo_Datos();
break;
case 5:
Opcion_Mostrar_Archivo_Indices();
break;
case 6:
Opcion_Resetear_Base_Datos();
break;
default:
printf("Opcion No valida\n");
break;
}
printf("\n\n");
system("PAUSE");
}
while(opcion != 0);
}
/*Procedimiento para mostrar la opcion de ingresar un registro a la base de datos*/
void Opcion_Ingresar_Registro()
{
REGISTRO registro;
INDICE indice;
printf("\n");
printf("::: Ingresar Registro :::\n");
printf("\n");
printf("Ingrese el numero de identificacion: ");
cin>>registro.identificacion;
printf("Ingrese el nombre: ");
cin.ignore();
cin.getline(registro.nombre, 64);
printf("Ingrese el celular: ");
cin.getline(registro.celular, 10);
printf("Ingrese el correo: ");
cin.getline(registro.correo, 64);
printf("\n");
//buscamos si el registro se encuentra en el sistema
INDICE indice_resultado;
int resultado = Buscar_Indice(registro.identificacion, &indice_resultado);
if(resultado == -3){
printf("ERRRO: El archivo de indices se encuentra corrupto.\n");
}
else if (resultado == -2){
printf("ERRRO: No se pudo abrir el archivo de indices.\n");
}
else if (resultado == -1){
//guardamos el registro en el archivo de datos
int posicion_datos = Ingresar_Registro(registro);
//establecemos los valores
indice.identificacion = registro.identificacion;
indice.posicion_datos = posicion_datos;
indice.posicion_indice_izq = 0;
indice.posicion_indice_der = 0;
//ingresamos el indice
int posicion = Ingresar_Indice(indice);
//actualizamos la referencia segun corresponda
if(indice.identificacion < indice_resultado.identificacion){
//lo relacionamos con el nodo izquierdo
indice_resultado.posicion_indice_izq = posicion;
}
else{
//lo relacionamos con el nodo derecho
indice_resultado.posicion_indice_der = posicion;
}
//actualizamos el registro padre en el archivo
Actualizar_Indice(indice_resultado);
printf("Registro ingresado a la base de datos \n");
}
else if (resultado == 0){
//guardamos el registro en el archivo de datos
int posicion_datos = Ingresar_Registro(registro);
//establecemos el indice
indice.identificacion = registro.identificacion;
indice.posicion_datos = posicion_datos;
indice.posicion_indice_izq = 0;
indice.posicion_indice_der = 0;
//ingresamos el indice
Ingresar_Indice(indice);
printf("Registro ingresado a la base de datos \n");
}
else if (resultado == 1){
printf("Ya existe un registro en la base de datos con la misma identificacion.\n");
}
}
/*Procedimiento para mostrar la opcion de ingresar un registro a la base de datos*/
void Opcion_Buscar_Registro()
{
long identificacion;
REGISTRO registro;
INDICE indice;
printf("\n");
printf("::: Buscar Registro :::\n");
printf("\n");
printf("Ingrese el numero de identificacion: ");
cin>>identificacion;
printf("\n");
printf("Resultado de la busqueda: \n");
printf("-----------------------------\n\n");
int resultado = Buscar_Indice(identificacion, &indice);
if(resultado == -3){
printf("ERROR: El archivo de indices se encuentra corrupto.\n");
}
else if (resultado == -2){
printf("ERROR: No se pudo abrir el archivo de indices.\n");
}
else if (resultado == -1){
printf("El registro especificado no se encuentra en la base de datos.\n");
}
else if (resultado == 0){
printf("La base de dato se encuentra sin registros.\n");
}
else if (resultado == 1){
//buscamos el registro correspondiente en el archivo de datos
resultado = Buscar_Registro(indice.posicion_datos, &registro);
//si no se obtuvo resultado
if(resultado == -1){
printf("ERROR: No se pudo abrir el archivo de datos.\n");
}
else if(resultado == 0){
printf("ERRRO: El archivo de datos se encuentra corrupto.\n");
}
else{
//si el valor identificacion del registro no corresponde al especificado en la buscado
if(registro.identificacion != identificacion){
printf("ERRRO: La base de datos se encuetra corrupta.\n");
}
else{
printf("Posicion: %d \n", registro.posicion);
printf("Identificacion: %d \n", registro.identificacion);
printf("Nombre : %s \n", registro.nombre);
printf("Celular: %s \n", registro.celular);
printf("Correo: %s \n", registro.correo);
}
}
}
}
/*Procedimiento para mostrar la opcion de actualizar un registro a la base de datos*/
void Opcion_Actualizar_Registro()
{
long identificacion;
REGISTRO registro;
INDICE indice;
printf("\n");
printf("::: Actualizar Registro :::\n");
printf("\n");
printf("Ingrese el numero de identificacion del registro a actualizar: ");
cin>>identificacion;
printf("\n");
printf("Resultado de la busqueda: \n");
printf("-----------------------------\n\n");
int resultado = Buscar_Indice(identificacion, &indice);
if(resultado == -3){
printf("ERROR: El archivo de indices se encuentra corrupto.\n");
return;
}
if (resultado == -2){
printf("ERROR: No se pudo abrir el archivo de indices.\n");
return;
}
if (resultado == -1){
printf("El registro especificado no se encuentra en la base de datos.\n");
return;
}
if (resultado == 0){
printf("La base de dato se encuentra sin registros.\n");
return;
}
//buscamos el registro correspondiente en el archivo de datos
resultado = Buscar_Registro(indice.posicion_datos, &registro);
//si no se obtuvo resultado
if(resultado == -1){
printf("ERROR: No se pudo abrir el archivo de datos.\n");
return;
}
if(resultado == 0){
printf("ERRRO: El archivo de datos se encuentra corrupto.\n");
return;
}
//si el valor identificacion del registro no corresponde al especificado en la buscado
if(registro.identificacion != identificacion){
printf("ERRRO: La base de datos se encuetra corrupta.\n");
return;
}
printf("Nombre Actual: %s \n", registro.nombre);
printf("Nuevo Nombre: ");
cin.ignore();
cin.getline(registro.nombre, 64);
printf("\n");
printf("Celular Actual: %s \n", registro.celular);
printf("Nuevo Celular: ");
cin.getline(registro.nombre, 10);
printf("\n");
printf("Correo Actual: %s \n", registro.correo);
printf("Nuevo Correo: ");
cin.getline(registro.nombre, 64);
//actualizamos el registro
Actualizar_Registro(registro);
printf("\n");
printf("Registro actualizado\n");
}
/*Procedimiento para borrar la base de datos*/
void Opcion_Resetear_Base_Datos()
{
fclose ( fopen(nombre_archivo_maestro, "w") );
fclose( fopen(nombre_archivo_datos, "w") );
printf("Base de datos reseteada \n");
}
/*Procedimiento para mostrar el archivo de datos*/
void Opcion_Mostrar_Archivo_Datos()
{
REGISTRO registro;
FILE *archivo_datos = fopen(nombre_archivo_datos, "r");
printf("\n");
printf("::: Archivo de Datos :::\n");
printf("\n");
//si genero error al abrir/crear el archivo
if( archivo_datos == NULL ){
printf("No se abrio el archivo de datos.\n");
}
while( fread(&registro, sizeof(REGISTRO), 1, archivo_datos) > 0){
printf("\n");
printf("Posicion: %d \n", registro.posicion);
printf("Identificacion: %d \n", registro.identificacion);
printf("Nombre: %s \n", registro.nombre);
printf("Celular: %s \n", registro.celular);
printf("Correo: %s \n", registro.correo);
}
//cerramos el archivo_datos
fclose(archivo_datos);
}
/*Procedimiento para mostrar el archivo de indices*/
void Opcion_Mostrar_Archivo_Indices()
{
INDICE indice;
FILE *archivo_indice = fopen(nombre_archivo_maestro, "r");
printf("\n");
printf("::: Archivo de Indices :::\n");
printf("\n");
//si genero error al abrir/crear el archivo
if( archivo_indice == NULL ){
printf("No se abrio el archivo de indices.\n");
}
while( fread(&indice, sizeof(INDICE), 1, archivo_indice) > 0){
printf("\n");
printf("Posicion: %10d \n", indice.posicion);
printf("Identificacion: %10ld \n", indice.identificacion);
printf("Posicion en Datos: %10d \n", indice.posicion_datos);
printf("Izquierdo: %10d \n", indice.posicion_indice_izq);
printf("Derecho: %10d \n", indice.posicion_indice_der);
}
//cerramos el archivo
fclose(archivo_indice);
}
/*Procedimiento que agrega un registro al final del archivo de datos*/
int Ingresar_Registro(REGISTRO registro)
{
FILE *archivo_datos = fopen(nombre_archivo_datos, "a");
//nos ubicamos al final del archivo
fseek(archivo_datos, 0, SEEK_END);
//calculamos la posicion
registro.posicion = ftell(archivo_datos) / sizeof(REGISTRO) + 1;
//gravamos el registro
fwrite(&registro, sizeof(REGISTRO), 1, archivo_datos);
//cerramos el archivo
fclose(archivo_datos);
//devolvemos la posicion en la que quedo guardada
return registro.posicion;
}
/*Procedimiento que agrega un indice al final del archivo de datos*/
int Ingresar_Indice(INDICE indice)
{
FILE *archivo_indice = fopen(nombre_archivo_maestro, "a");
//nos ubicamos al final del archivo
fseek(archivo_indice, 0, SEEK_END);
//calculamos la posicion
indice.posicion = ftell(archivo_indice) / sizeof(INDICE) + 1;
//gravamos el indice
fwrite(&indice, sizeof(INDICE), 1, archivo_indice);
//cerramos el archivo
fclose(archivo_indice);
return indice.posicion;
}
/*Procedimiento que actualiza el registro indice en el archivo de indices*/
void Actualizar_Registro(REGISTRO registro)
{
FILE *archivo_datos = fopen(nombre_archivo_datos, "r+");
if(registro.posicion > 1){
fseek(archivo_datos, (registro.posicion-1)*sizeof(REGISTRO)+1, SEEK_SET);
}
fwrite(&registro, sizeof(REGISTRO), 1, archivo_datos);
fclose(archivo_datos);
}
/*Procedimiento que actualiza el registro indice en el archivo de indices*/
void Actualizar_Indice(INDICE indice)
{
FILE *archivo_indice = fopen(nombre_archivo_maestro, "r+");
if(indice.posicion > 1){
fseek(archivo_indice, (indice.posicion-1)*sizeof(INDICE)+1, SEEK_SET);
}
fwrite(&indice, sizeof(INDICE), 1, archivo_indice);
fclose(archivo_indice);
}
/*Funcion para buscar el registro de indice en el archivo
retorna el resultado de la busqueda
*/
int Buscar_Indice(long identificacion, INDICE*indice)
{
int resultado = 0;
FILE *archivo_indice = fopen(nombre_archivo_maestro, "r");
//si genero error al abrir/crear el archivo
if( archivo_indice == NULL ){
return -2;
}
indice->posicion = 0;
while( fread(indice, sizeof(INDICE), 1, archivo_indice) > 0 ){
//si el registro encontrado corresponde al buscado...
if( indice->identificacion == identificacion){
resultado = 1;
//finalizamos la busqueda
break;
}
//si la identificacion a buscar es menor a la identificacion del indice actual...
else if( identificacion < indice->identificacion ){
//si existe una posicion valida en el nodo izquierdo...
if( indice->posicion_indice_izq > 0){
//ubicamos el descritor del archivo a la posicion dad
fseek(archivo_indice, (indice->posicion_indice_izq-1)*sizeof(INDICE)+1, SEEK_SET);
}
//caso contrario terminamos la busqueda
else{
resultado = -1;
break;
}
}
//la identificacion a buscar es mayor a la identificacion del indice actual...
else{
//si existe una posicion valida en el nodo derecho...
if( indice->posicion_indice_der > 0){
//ubicamos el descritor del archivo a la posicion dada
fseek(archivo_indice, (indice->posicion_indice_der-1)*sizeof(INDICE)+1, SEEK_SET);
}
//caso contrario terminamos la busqueda
else{
resultado = -1;
break;
}
}
}
//cerramos el archivo
fclose(archivo_indice);
if(resultado == 0 && indice->posicion > 0){
//el archivo de indices esta mal contruido
return -3;
}
return resultado;
}
/*
Funcion para buscar el registro especificado en la posicion dada
dentro del archivo de datos
*/
int Buscar_Registro(int posicion, REGISTRO* registro)
{
int resultado = 0;
FILE *archivo_datos = fopen(nombre_archivo_datos, "r");
//si genero error al abrir/crear el archivo
if( archivo_datos == NULL ){
return -1;
}
if(posicion > 1){
//nos ubicamos en el registro respectivo
fseek(archivo_datos, (posicion-1)*sizeof(REGISTRO)+1, SEEK_SET);
}
//si podemos leer el registro...
if( fread(registro, sizeof(REGISTRO), 1, archivo_datos) > 0){
resultado = 1;
}
else{
resultado = 0;
}
fclose(archivo_datos);
return resultado;
}



Comentarios

  1. no se entiende nada deberia estar comentado paso a paso lo que se esta haciendo

    ResponderEliminar
  2. bueno me refiero siendo mas especifico!!!

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Tablas y gráficas estadísticas dinámicas con JavaScript, highcharts, HTML y JSON

Después de tener mucho tiempo sin entradas, quiero retomar  el blog  con un poco más de desarrollo códigos ejemplos y más cosas interesantes que he podido realizar en mi día a día. En esta ocasión quiero realizar un ejemplo para el cual pueda  graficar tablas, gráficas estadísticas  utilizando la librería de highcharts ( https://www.highcharts.com/ ), esta librería tiene muchas aplicaciones se puede  usar en diferentes campos y es realmente interesante para realizar todo tipo de tratamiento de data. Este ejemplo se va a trabajar sobre un proyecto realizado en visual studio 2015, pero se debe tener en cuenta que se puede aplicar a cualquier tipo de proyecto en el cual se use javascript y objetos JSON. La idea con este código es poder generar la cantidad de objetos JSON que sean necesarios desde  el code behind usado y este sea procesado para que se genere a nivel del cliente todas las gráficas requeridas. Ejemplo: 1- Se debe crear e...

Exportar Archivos en C# con NPOI

Siempre que se tiene que exportar un archivo, se tienen varias opciones; se puede pensar en usar reporting services, se puede usar librerías que se encuentran en la red, se pueden usar librerías especificas de .NET, pero hoy vamos a ver como usar la librería NPOI. La librería NPOI es una librería de código abierto que se usa para parsear data en archivos de excel, en este caso vamos a usar  un data set  para realizar toda la operación. Se va a crear un libro de excel con extensión xlsx, en el cual se va a crear la plantilla que se requiere para poder visualizar la data y la gráfica correspondiente. se crea el método dentro del cual se tendrá la lógica         public void ejemplonpoi()           { } Se crean la variables necesarias para realizar la conversión del archivo             var extension = "xlsx";             string result = Path.Get...

CREAR ARCHIVOS TXT EN VISUAL BASIC 2010

Buenas hoy veremos un ejemplo para crear un archivo .txt en visual basic .NET  utilizando la herramienta visual studio 2010. el manual de referencia lo podemos encontrar en el libro  VISUAL BASIC .NET lenguaje y aplicaciones 3ra edicion  Fco. Javier Ceballos el tipo de acceso mas simple a un fichero de datos es el secuencial, un fichero abierto  para acceso secuencial es un fichero que puede almacenar registros de cualquier longitud. Este tipo de acceso generalmente se utiliza con ficheros de texto en los que se escribe toda la información desde el principio hasta el final y se lee de la misma forma. las acciones mas comunes que se manejan a la hora de trabajar con archivos son: CreateNew: crea un nuevo fichero. Si el fichero existe se lanzara una excepción del tipo IOException Create: Crear un nuevo fichero. Si el fichero existe sera sobrescrito  Open: abrir el fichero existente OpenOrCreate: abrir un fichero si e...