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;
}



Entradas populares de este blog

BUSQUEDA BINARIA EN C++

holas aqui les dejo el codigo de un ejemplo de busqueda binaria en un vector; esto esta hecho en dev c++.
recordemos que para hacer la busqueda binaria hay un requisito y es que el vector donde se va a buscar debe estar ordenado.
todos los creditos a alejandro ;)

HACER UN LOGIN CON VISUAL BASIC .NET

En este tutorial veremos como crear un formulario para hacer un login de manera fácil y sencilla, la herramienta con la cual se trabajara es visual studio 2010. Para comenzar crearemos un proyecto aplicación de Windows forms visual Basic.

damos un nombre al proyecto y clic en aceptar.  El proyecto se creara con  un formulario por defecto.

ahora vamos a agregar el formulario para hacer el login; para esto damos clic en proyecto agregar Windows form, formulario de inicio de sesión.


le damos un nombre al formulario y clic en aceptar. Aparecerá la siguiente ventana


en esta ventana ya podemos configurar todas las propiedades que necesitemos desde cambio de colores imagen etc.
El siguiente paso es hacer el código para la autentificación El formulario ya tiene un código predefinido el cual vamos a cambiar por un código personalizado.
Para comenzar aremos doble clic sobre el botón que  Aceptar  para que nos muestre el código El eveto del botón tiene el siguiente código
Me.close()
Esa l…

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 existe si no se crea uno nuevo Truncate: abrir un fichero existente y trunca…