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 el proyecto con el cual se va

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.GetTempPath();             DataSet dt = new DataSet();             dt = (DataSet)Session["ListData"