Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*------------------------------------------------------------------------------------HEADER-PROYECTO INF2240--------------------------------------------------------------------------------*/
- /********************************************************************************************************************************************************************************************
- Documento: Libreria propia de la aplicacion.
- Nombre de archivo: "header.h"
- Desarrolladores: - Felipe Concha Almeida
- - Hector Gutierrez Moya
- - David Rojas Sanchez
- - Byron Guerrero Fuel
- - Roberto Rojas Barraza
- *********************************************************************************************************************************************************************************************/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Librerias
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*---------------Libreria standard de ANSI C-------------------*/
- #include <stdlib.h>
- /*--------------Libreria standard para manejo de E/S-----------*/
- #include <stdio.h>
- /*---------Libreria para manejo de funciones de windows--------*/
- #include <windows.h>
- /*-----------Libreria para manejo de directorios---------------*/
- #include <direct.h>
- /*----------Libreria para manejo de memoria y cadenas----------*/
- #include <string.h>
- /*--------------Libreria para manejo de tipografia-------------*/
- #include <ctype.h>
- /*-----------Libreria para manejo de fecha y hora--------------*/
- #include <time.h>
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Macros
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- #define ENTER '\n'
- /*----Color: Rojo----*/
- #define C31 "\x1b[31m"
- /*----Color: Verde---*/
- #define C32 "\x1b[32m"
- /*--Color: Amarillo--*/
- #define C33 "\x1b[33m"
- /*----Color: Azul----*/
- #define C34 "\x1b[94m"
- /*---Color: Blanco---*/
- #define C00 "\x1b[0m"
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Registros
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- struct Auto
- {
- char *patente;
- char *rutPropietario;
- char *nombreComuna;
- };
- struct NodoAuto
- {
- long id;
- struct Auto *datos;
- struct NodoAuto *izq;
- struct NodoAuto *der;
- };
- struct Comuna
- {
- char nombre[100];
- struct NodoAuto *arbolRobados;
- int totalRobados;
- struct NodoAuto *arbolRecuperados;
- int totalRecuperados;
- };
- struct Provincia
- {
- char nombre[100];
- struct Comuna **listaComunas;
- int totalComunas;
- };
- struct Region
- {
- char nombre[100];
- struct Provincia **listaProvincias;
- int totalProvincias;
- };
- struct Pais
- {
- struct Region **listaRegiones;
- int totalRegiones;
- struct NodoAuto *arbolRobadosEnPais;
- int totalRobadosEnPais;
- struct NodoAuto *arbolRecuperadosEnPais;
- int totalRecuperadosEnPais;
- };
- struct Pila
- {
- struct NodoAuto *nodo;
- struct Pila *sig;
- };
- /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Prototipos de Funciones
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*----------------------------------Funciones sobre el sistema----------------------------------*/
- void link( char *url );
- /*----------------------------------------------------------------------------------------------*/
- /*----------------------------------Funciones de Fecha y Hora-----------------------------------*/
- char *mostrarFechaActual( void );
- char *mostrarFechaActualHoraActual( void );
- /*----------------------------------------------------------------------------------------------*/
- /*---------------------------Funciones de Carga de Datos del Sistema----------------------------*/
- void inicializarPais( struct Pais *pais, int totalRegiones );
- void reservarMemoriaRegiones( struct Pais *pais );
- void contarProvinciasPorRegion( struct Pais *pais, FILE *file );
- void reservarMemoriaProvincias( struct Pais *pais );
- void contarComunasPorProvincia( struct Pais *pais, FILE *file );
- void reservarMemoriaComunas( struct Pais *pais );
- void reservarMemoriaDatosDelSistema( struct Pais *pais, FILE *fileRegiones, FILE *fileProvincias);
- void cargarDatosDelSistema( struct Pais *pais, FILE *archivo );
- /*----------------------------------------------------------------------------------------------*/
- /*----------------------------------Funciones sobre archivos------------------------------------*/
- short exportarCsv( struct Pais pais, short exportarRobados, char *comuna, int *posComuna, int *posProvincia, int *posRegion, char ubicacion );
- int cuentaFilasDiferentes( FILE *file );
- short estaArchivoVacio( FILE* file );
- short copiarArchivo( FILE *destino, FILE *archivo );
- long totalFilas( FILE *file );
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------------------Funciones sobre base de datos---------------------------------*/
- FILE *existeDataBase( void );
- void cargarDataBase( struct Pais *pais );
- void crearArchivoPropiedades( void );
- FILE *crearDataBase( void );
- void imprimeEnCsv( struct NodoAuto *arbol, int cont, FILE *file );
- void salvarCambios( struct Pais pais );
- /*----------------------------------------------------------------------------------------------*/
- /*------------------------------------Funciones sobre Arboles-----------------------------------*/
- short tieneHijos( struct NodoAuto *elem );
- struct NodoAuto *estaEnArbol( struct NodoAuto *arbol, long id );
- void insertarNodoAuto( struct NodoAuto **arbol, struct NodoAuto *nuevo );
- void podarNodoAuto( struct NodoAuto **arbol, long id );
- void mostrarArbolRecursivo( struct NodoAuto *arbol, int cont );
- void mostrarArbolIterativo( struct NodoAuto *arbol );
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------------------------Funciones sobre Nodos--------------------------------------*/
- struct NodoAuto *crearNodoAuto( char *rut, char *patente, char *comuna );
- void intercambiarDatosNodoAuto( struct NodoAuto **elem1, struct NodoAuto **elem2 );
- void liberarNodoAuto( struct NodoAuto **elem );
- void apilarNodo( struct Pila **cumbrePila, struct NodoAuto *nuevo );
- struct NodoAuto *desapilarNodo( struct Pila **cumbrePila );
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------------------------Funciones de comparacion-----------------------------------*/
- int cmpComunas( struct Comuna **elem1, struct Comuna **elem2 );
- int cmpProvincias( struct Provincia **elem1, struct Provincia **elem2 );
- int cmpRegiones( struct Region **elem1, struct Region **elem2 );
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------------------------Funciones sobre Arreglos-----------------------------------*/
- int buscarComuna( struct Pais pais, char *nombreComuna, int *posRegion, int *posProvincia, int *posComuna );
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------------------------Funciones de Validacion------------------------------------*/
- int esPatenteValida( char *patente );
- int esRutValido( char *rut );
- int esPalabra( char *str );
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------------------------Funciones sobre Cadenas------------------------------------*/
- char *capitalizar( char *frase );
- char *strupr( char *str );
- char *leerHastaEnter( void );
- void suprimePuntosGuiones( char *rut );
- char *formatearRut( char *rut );
- long idPatente( char *patente );
- long parteEnteraRut( char *rut );
- char *suprimeEspacios( char *cadena );
- char *reiniciarCadena( char *str );
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Funciones sobre el sistema
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-----------------------Incia una pagina web en el navegador por defecto-----------------------*/
- void link( char *url )
- {
- size_t bytes = sizeof( "start " ) + strlen( url ) + 1;
- char *comando = ( char * ) malloc( bytes );
- _snprintf( comando, bytes, "%s%s", "start ", url );
- system( comando );
- free( comando );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Funciones de Fecha y Hora
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*------------------------------------Retorna la fecha actual-----------------------------------*/
- char *mostrarFechaActual( void )
- {
- time_t tiempo;
- struct tm *ptrFecha;
- char *fecha;
- const size_t bytes = 200;
- char *buffer = ( char * ) malloc( bytes );
- tiempo = time( 0 );
- ptrFecha = localtime( &tiempo );
- strftime( buffer, bytes, "%d %b %Y", ptrFecha );
- fecha = ( char * ) malloc( strlen( buffer ));
- strcpy( fecha, buffer );
- return fecha;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*---------------------------------Retorna la fecha y hora actual-------------------------------*/
- char *mostrarFechaActualHoraActual( void )
- {
- time_t tiempo;
- struct tm *ptrFechaHora;
- char *fechaHora;
- const size_t bytes = 200;
- char *buffer = ( char * ) malloc( bytes );
- tiempo = time( 0 );
- ptrFechaHora = localtime( &tiempo );
- strftime( buffer, bytes, "%a %b %d %X %Y", ptrFechaHora );
- fechaHora = ( char * ) malloc( strlen( buffer ));
- strcpy( fechaHora, buffer );
- return fechaHora;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Funciones para Carga de datos del sistema
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*--------------Incializa los arreglos dinamicos y los arboles en la estructura pais------------*/
- void inicializarPais( struct Pais *pais, int totalRegiones )
- {
- pais->totalRegiones = totalRegiones;
- pais->listaRegiones = NULL;
- pais->arbolRobadosEnPais = NULL;
- pais->arbolRecuperadosEnPais = NULL;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------Reserva memoria para las regiones------------------------------*/
- void reservarMemoriaRegiones( struct Pais *pais )
- {
- int i;
- pais->listaRegiones = ( struct Region ** ) malloc( 15 * sizeof( struct Region * ));
- for( i = 0; i < 15; i++ )
- {
- pais->listaRegiones[i] = ( struct Region * ) malloc( sizeof( struct Region ));
- }
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------Cuenta el total de provincias de cada region-------------------------*/
- void contarProvinciasPorRegion( struct Pais *pais, FILE *file )
- {
- char *region = (char*) malloc(50), *buffer = (char*) malloc(50);
- int i = 0, j = 1;
- fscanf( file,"%[^\n]\n", region );
- strcpy( buffer, region );
- while( strcmp( region, "EOF" ) && fscanf( file, "%[^\n]\n", region ))
- {
- if( strcmp( region, buffer ))
- {
- pais->listaRegiones[i]->totalProvincias = j;
- strcpy( buffer, region );
- j = 1;
- i++;
- }
- else j++;
- }
- fclose( file );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*------------------------------Reserva memoria para las provincias-----------------------------*/
- void reservarMemoriaProvincias( struct Pais *pais )
- {
- int i, j, bytesListaProvincia = pais->listaRegiones[i]->totalProvincias * sizeof( struct Provincia * );
- for( i = 0; i < pais->totalRegiones; i++ )
- {
- pais->listaRegiones[i]->listaProvincias = ( struct Provincia ** ) malloc( bytesListaProvincia );
- for( j = 0; j < pais->listaRegiones[i]->totalProvincias; j++ )
- {
- pais->listaRegiones[i]->listaProvincias[j] = ( struct Provincia * ) malloc( sizeof( struct Provincia ));
- }
- }
- }
- /*----------------------------------------------------------------------------------------------*/
- /*----------------------Cuenta el total de comunas que tiene cada provincia---------------------*/
- void contarComunasPorProvincia( struct Pais *pais, FILE *file )
- {
- char *provincia = (char*) malloc(50), *buffer = (char*) malloc(50);
- int i = 0, j = 1;
- int region = 0;
- fscanf( file,"%[^\n]\n", provincia );
- strcpy( buffer, provincia );
- while( strcmp( provincia, "EOF" ) && fscanf( file, "%[^\n]\n", provincia ))
- {
- if( strcmp( provincia, buffer ))
- {
- pais->listaRegiones[ region ]->listaProvincias[i]->totalComunas = j;
- strcpy( buffer, provincia );
- j = 1;
- if( i+1 == pais->listaRegiones[ region ]->totalProvincias )
- {
- region++;
- i = 0;
- }
- else i++;
- }
- else j++;
- }
- fclose( file );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------Reserva memorias para las comunas------------------------------*/
- void reservarMemoriaComunas( struct Pais *pais )
- {
- int i, j, k, bytesListaComunas = pais->listaRegiones[i]->listaProvincias[j]->totalComunas * sizeof( struct Comuna * );
- for( i = 0; i < pais->totalRegiones; i++ )
- {
- for( j = 0; j < pais->listaRegiones[i]->totalProvincias; j++ )
- {
- pais->listaRegiones[i]->listaProvincias[j]->listaComunas = ( struct Comuna ** ) malloc( bytesListaComunas );
- for( k = 0; k < pais->listaRegiones[i]->listaProvincias[j]->totalComunas; k++ )
- {
- pais->listaRegiones[i]->listaProvincias[j]->listaComunas[k] = ( struct Comuna* ) malloc( sizeof( struct Comuna ));
- pais->listaRegiones[i]->listaProvincias[j]->listaComunas[k]->arbolRobados = NULL;
- pais->listaRegiones[i]->listaProvincias[j]->listaComunas[k]->arbolRecuperados = NULL;
- }
- }
- }
- }
- /*----------------------------------------------------------------------------------------------*/
- /*------------Cuenta las regiones, provincias y comunas y reserva memorias para ellas-----------*/
- void reservarMemoriaDatosDelSistema( struct Pais *pais, FILE *fileRegiones, FILE *fileProvincias)
- {
- reservarMemoriaRegiones( pais );
- contarProvinciasPorRegion( pais, fileRegiones );
- reservarMemoriaProvincias( pais );
- contarComunasPorProvincia( pais, fileProvincias );
- reservarMemoriaComunas( pais );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------------------Compara * a comunas por nombre--------------------------------*/
- int cmpComunas( struct Comuna **elem1, struct Comuna **elem2 )
- {
- return strcmp(( *elem1 )->nombre, ( *elem2 )->nombre );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------------------Compara * a provincias por nombre-----------------------------*/
- int cmpProvincias( struct Provincia **elem1, struct Provincia **elem2 )
- {
- return strcmp(( *elem1 )->nombre, ( *elem2 )->nombre );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------------------Compara * a regiones por nombre-------------------------------*/
- int cmpRegiones( struct Region **elem1, struct Region **elem2 )
- {
- return strcmp(( *elem1 )->nombre, ( *elem2 )->nombre );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------Conversion a tipo int------------------------------------*/
- typedef int( *cast )( const void*, const void* );
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------Lee los datos en los archivos y los almacena en los registros----------------*/
- void cargarDatosDelSistema( struct Pais *pais, FILE *archivo )
- {
- char nombreRegion[100], nombreProvincia[100], nombreComuna[100];
- int region = 0, provincia = 0, comuna = 0, totalComunas, totalProvincias, bytesComunas, bytesProvincias;
- while( fscanf( archivo, "%[^;];", nombreRegion ) && strcmp( nombreRegion, "EOF" ))
- {
- fscanf( archivo, "%[^;];%[^\n]\n",nombreProvincia, nombreComuna );
- strcpy( pais->listaRegiones[region]->listaProvincias[provincia]->listaComunas[comuna]->nombre, nombreComuna );
- comuna++;
- if( comuna == pais->listaRegiones[region]->listaProvincias[provincia]->totalComunas )
- {
- totalComunas = pais->listaRegiones[region]->listaProvincias[provincia]->totalComunas;
- qsort( pais->listaRegiones[region]->listaProvincias[provincia]->listaComunas, totalComunas,
- sizeof( struct Comuna * ), (cast)cmpComunas );
- strcpy(pais->listaRegiones[region]->listaProvincias[provincia]->nombre,nombreProvincia);
- provincia++;
- comuna = 0;
- }
- if( provincia == pais->listaRegiones[region]->totalProvincias )
- {
- qsort( pais->listaRegiones[region]->listaProvincias, pais->listaRegiones[region]->totalProvincias,
- sizeof( struct Provincia * ), (cast)cmpProvincias );
- strcpy(pais->listaRegiones[region]->nombre,nombreRegion);
- region++;
- provincia = 0;
- comuna = 0;
- }
- }
- qsort( pais->listaRegiones, pais->totalRegiones, sizeof( struct Region * ), (cast)cmpRegiones );
- fclose( archivo );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Funciones sobre archivos
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*----------------------Cuenta el total de filas diferentes en un archivo-----------------------*/
- int cuentaFilasDiferentes( FILE *file )
- {
- char cadena[100], buffer[100];
- int contador = 1;
- fscanf( file, "%[^\n]\n", cadena );
- strcpy( buffer, cadena );
- while( fscanf( file, "%[^\n]\n", cadena ) && strcmp( cadena, "EOF" ))
- {
- if( strcmp( cadena, buffer ))
- {
- contador++;
- strcpy( buffer, cadena );
- }
- }
- rewind( file );
- return contador;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------Verifica si un archivo esta vacio------------------------------*/
- short estaArchivoVacio( FILE* file )
- {
- fseek( file, 0, SEEK_END );
- if( ftell( file )) return 1;
- rewind( file );
- return 0;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*---------------------------Copia el contenido de un archivo en otro---------------------------*/
- short copiarArchivo( FILE *destino, FILE *archivo )
- {
- char caracter;
- rewind( archivo );
- if( destino != NULL )
- {
- while( fscanf( archivo, "%c", &caracter ) != EOF )
- {
- fprintf( destino, "%c", caracter );
- }
- return 1;
- }
- return 0;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------------Retorna la cantidad de filas de un archivo--------------------------*/
- long totalFilas( FILE *file )
- {
- char car;
- long contador = 0;
- while( fscanf( file, "%c", &car ) && !feof( file ))
- {
- if( car == '\n' ) contador++;
- }
- return contador;
- rewind( file );
- fclose( file );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*------------Crear un archivo CSV con los vehiculos robados en el pais o por comuna------------*/
- short exportarCsv( struct Pais pais, short exportarRobados, char *comuna, int *posComuna, int *posProvincia, int *posRegion, char ubicacion )
- {
- enum AccesosRapidos{ Documentos = '1', Escritorio = '2', Descargas = '3', DiscoLocalC = '4' };
- char *rutaDeExportacion = ( char * ) malloc( 500 ), *nombreUsuario = getenv( "USERPROFILE" );
- FILE *exportar;
- /*-----------------------------------Se crea la ruta en funcion de la ubicacion seleccionada por el usuario----------------------------------*/
- switch( ubicacion )
- {
- case Documentos:
- if( exportarRobados )
- {
- _snprintf( rutaDeExportacion, 500, "%s\\Documents\\vehiculos_robados.csv", nombreUsuario )
- }
- else _snprintf( rutaDeExportacion, 500, "%s\\Documents\\vehiculos_recuperados.csv", nombreUsuario );
- break;
- case Escritorio:
- if( exportarRobados )
- {
- _snprintf( rutaDeExportacion, 500, "%s\\Desktop\\vehiculos_robados.csv", nombreUsuario )
- }
- else _snprintf( rutaDeExportacion, 500, "%s\\Desktop\\vehiculos_recuperados.csv", nombreUsuario );
- break;
- case Descargas:
- if( exportarRobados )
- {
- _snprintf( rutaDeExportacion, 500, "%s\\Downloads\\vehiculos_robados.csv", nombreUsuario )
- }
- else _snprintf( rutaDeExportacion, 500, "%s\\Downloads\\vehiculos_recuperados.csv", nombreUsuario );
- break;
- case DiscoLocalC:
- strcpy( rutaDeExportacion, "C:\\" );
- break;
- }
- exportar = fopen( rutaDeExportacion, "w" );
- if( exportar == NULL ) return 0;
- fprintf( exportar, "%s%c%s%c%s\n", "R.U.T", ';', "PATENTE", ';', "COMUNA" );
- /*-------------------------------------Si la posicion es invalada entonces se debe exportar la tabla completa------------------------------------*/
- if( *posComuna == -1 )
- {
- exportarRobados ? imprimeEnCsv( pais.arbolRobadosEnPais, 0, exportar ) : imprimeEnCsv( pais.arbolRecuperadosEnPais, 0, exportar );
- }
- else
- {
- exportarRobados ? imprimeEnCsv( pais.arbolRobadosEnPais, 0, exportar ) : imprimeEnCsv( pais.arbolRecuperadosEnPais, 0, exportar );
- }
- return 1;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Funciones sobre base de datos (Tablas CSV).
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------------Verifica la existencia de una base de datos--------------------------*/
- FILE *existeDataBase( void )
- {
- FILE * verificador = fopen( "data-base/create=true", "r" );
- return verificador;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------Carga la base de datos en la estructura pais-------------------------*/
- void cargarDataBase( struct Pais *pais )
- {
- char patente[7], rut[12], comuna[30];
- int posRegion, posProvincia, posComuna;
- FILE *tablaRobados = fopen( "data-base/tablas/tabla_robados.csv", "r+" );
- FILE *tablaRecuperados = fopen( "data-base/tablas/tabla_recuperados.csv", "r+" );
- if( tablaRobados != NULL )
- {
- /*-----------------------------Se carga la tabla de vehiculos robados-----------------------------*/
- while( fscanf( tablaRobados, "%[^;];%[^;];%[^\n]\n", rut, patente, comuna ) != EOF )
- {
- if( buscarComuna(( *pais ), comuna, &posRegion, &posProvincia, &posComuna ))
- {
- insertarNodoAuto( &pais->arbolRobadosEnPais , crearNodoAuto( rut, patente, comuna ));
- insertarNodoAuto( &pais->listaRegiones[ posRegion ]->listaProvincias[ posProvincia ]->listaComunas[ posComuna ]->arbolRobados,
- crearNodoAuto( rut, patente, comuna ));
- }
- }
- fclose( tablaRobados );
- }
- if( tablaRecuperados != NULL )
- {
- /*---------------------------Se carga la tabla de vehiculos recuperados---------------------------*/
- while( fscanf( tablaRecuperados, "%[^;];%[^;];%[^\n]\n", rut, patente, comuna ) != EOF )
- {
- if( buscarComuna(( *pais ), comuna, &posRegion, &posProvincia, &posComuna ))
- {
- insertarNodoAuto( &pais->arbolRecuperadosEnPais, crearNodoAuto( rut, patente, comuna ));
- insertarNodoAuto( &pais->listaRegiones[ posRegion ]->listaProvincias[ posProvincia ]->listaComunas[ posComuna ]->arbolRecuperados,
- crearNodoAuto( rut, patente, comuna ));
- }
- }
- fclose( tablaRecuperados );
- }
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------Crear un archivo con las propiedades de la base de datos-------------------*/
- void crearArchivoPropiedades( void )
- {
- FILE *filePropiedades = fopen( "data-base/propiedades.properties", "w" );
- const size_t bytes = 500;
- char *directorioDeTrabajo = ( char * ) malloc( bytes );
- getcwd( directorioDeTrabajo, bytes );
- fprintf( filePropiedades, "%s%s%s\n", "# ", directorioDeTrabajo,"/data-base" );
- fprintf( filePropiedades, "%s\n", "# ********************************************************************" );
- fprintf( filePropiedades, "%s\n", "# *** Por favor NO editar este archivo. ***" );
- fprintf( filePropiedades, "%s\n", "# *** CAMBIAR EL CONTENIDO PUEDE CAUSAR CORuUPCION EN LOS DATOS. ***" );
- fprintf( filePropiedades, "%s\n", "# ********************************************************************" );
- fprintf( filePropiedades, "%s%s\n", "# ",mostrarFechaActualHoraActual());
- fclose( filePropiedades );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*---------------------------------Crea una nueva base de datos---------------------------------*/
- FILE *crearDataBase( void )
- {
- FILE *logError, *verificador, *aviso, *avisoCopia, *tablaRobados, *tablaRecuperados;
- if( mkdir( "data-base" ) != -1 )
- {
- aviso = fopen( "data-base/LEEME_NO_TOCAR_ESTOS_ARCHIVOS.txt", "w" );
- fprintf( aviso, "%s", "************ NO TOCAR LOS ARCHIVOS DE ESTE DIRECTORIO! ************ " );
- crearArchivoPropiedades();
- logError = fopen( "data-base/reporte_errores.dat", "w" );
- if( mkdir( "data-base/tablas" ) != -1 )
- {
- tablaRobados = fopen( "data-base/tablas/tabla_robados.csv", "a" );
- tablaRecuperados = fopen( "data-base/tablas/tabla_recuperados.csv", "a" );
- if( tablaRobados && tablaRecuperados )
- {
- verificador = fopen( "data-base/create=true", "w" );
- avisoCopia = fopen( "data-base/tablas/LEEME_NO_TOCAR_ESTOS_ARCHIVOS.txt", "w" );
- copiarArchivo( avisoCopia, aviso );
- fclose( aviso );
- fclose( logError );
- fclose( tablaRobados );
- fclose( tablaRecuperados );
- return verificador;
- }
- else return NULL;
- }
- else return NULL;
- }
- else return NULL;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------------Imprime el contenido de un arbol en un archivo CSV---------------------*/
- void imprimeEnCsv( struct NodoAuto *arbol, int cont, FILE *file )
- {
- if ( arbol != NULL )
- {
- imprimeEnCsv( arbol->izq, cont+1, file );
- fprintf( file, "%s%c%s%c%s\n", arbol->datos->rutPropietario, ';', arbol->datos->patente, ';', arbol->datos->nombreComuna );
- imprimeEnCsv( arbol->der, cont+1, file );
- }
- else return;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------Guarda el contenido de los arboles en la base de datos--------------------*/
- void salvarCambios( struct Pais pais )
- {
- FILE *tablaRobados = fopen( "data-base/tablas/tabla_robados.csv", "w" );
- FILE *tablaRecuperados = fopen( "data-base/tablas/tabla_recuperados.csv", "w" );
- imprimeEnCsv( pais.arbolRobadosEnPais, 0, tablaRobados );
- imprimeEnCsv( pais.arbolRecuperadosEnPais, 0, tablaRecuperados );
- fclose( tablaRobados );
- fclose( tablaRecuperados );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Funciones sobre arreglos
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*--------------------Busca una comuna en un arreglo y guarda las posiciones--------------------*/
- int buscarComuna( struct Pais pais, char *nombreComuna, int *posRegion, int *posProvincia, int *posComuna )
- {
- int i, j, k;
- for( i = 0; i < pais.totalRegiones; i++ )
- {
- for( j = 0; j < pais.listaRegiones[i]->totalProvincias; j++ )
- {
- for( k = 0; k < pais.listaRegiones[i]->listaProvincias[j]->totalComunas; k++ )
- {
- if( !strcmp( pais.listaRegiones[i]->listaProvincias[j]->listaComunas[k]->nombre, strupr( nombreComuna )))
- {
- *posRegion = i;
- *posProvincia = j;
- *posComuna = k;
- return 1;
- }
- }
- }
- }
- return 0;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Funciones sobre Nodos
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*------------------------------------Crea un nuevo nodo auto-----------------------------------*/
- struct NodoAuto *crearNodoAuto( char *rut, char *patente, char *comuna )
- {
- struct NodoAuto *nuevo = ( struct NodoAuto * ) malloc( sizeof( struct NodoAuto ));
- nuevo->datos = ( struct Auto * ) malloc( sizeof( struct Auto ));
- nuevo->id = idPatente( patente );
- nuevo->datos->rutPropietario = ( char * ) malloc( 12 );
- strcpy( nuevo->datos->rutPropietario, rut );
- nuevo->datos->patente = ( char * ) malloc( 7 );
- strcpy( nuevo->datos->patente, patente );
- nuevo->datos->nombreComuna = ( char * ) malloc( 30 );
- strcpy( nuevo->datos->nombreComuna, comuna );
- nuevo->izq = NULL;
- nuevo->der = NULL;
- return nuevo;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------------Intercambia el contenido de dos nodos auto--------------------------*/
- void intercambiarDatosNodoAuto( struct NodoAuto **elem1, struct NodoAuto **elem2 )
- {
- struct Auto *datos;
- long id;
- datos = ( *elem1 )->datos;
- id = ( *elem1 )->id;
- ( *elem1 )->datos = ( *elem2 )->datos;
- ( *elem1 )->id = ( *elem2 )->id;
- ( *elem2 )->datos = datos;
- ( *elem2 )->id = id;
- *elem1 = *elem2;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*----------------------Libera la memoria de un nodo auto y lo inicializa-----------------------*/
- void liberarNodoAuto( struct NodoAuto **elem )
- {
- free( *elem );
- *elem = NULL;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------Inserta un nodo auto en una pila-------------------------------*/
- void apilarNodo( struct Pila **cumbrePila, struct NodoAuto *nuevo )
- {
- struct Pila *pila = ( struct Pila * ) malloc( sizeof( struct Pila ));
- pila->nodo = nuevo;
- pila->sig = *cumbrePila;
- *cumbrePila = pila;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*---------------------------Retorna el nodo auto cumbre de una pila----------------------------*/
- struct NodoAuto *desapilarNodo( struct Pila **cumbrePila )
- {
- struct Pila *pila = NULL;
- struct NodoAuto *nodo = NULL;
- pila = *cumbrePila;
- nodo = pila->nodo;
- *cumbrePila = pila->sig;
- free( pila );
- return nodo;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------------------Modifica el rut en un nodo auto-------------------------------*/
- short modificarRut( struct NodoAuto **arbol, long id, char *nuevoRut )
- {
- struct NodoAuto *nodoModificar = estaEnArbol((*arbol),id);
- if (nodoModificar != NULL)
- {
- strcpy( nodoModificar->datos->rutPropietario, nuevoRut );
- return 1;
- }
- return 0;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------Modica la patente de un nodo auto------------------------------*/
- short modificarPatente (struct NodoAuto **arbol, long id, char *nuevaPatente) {
- struct NodoAuto *nodoModificar = estaEnArbol(( *arbol ), id );
- if( nodoModificar != NULL )
- {
- strcpy( nodoModificar->datos->patente, nuevaPatente );
- nodoModificar->id = idPatente( nuevaPatente );
- return 1;
- }
- return 0;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*------------------------Modifica la nombre de la comuna en un nodo auto-----------------------*/
- short modificarComuna (struct NodoAuto **arbol, long id, char *nuevaComuna)
- {
- struct NodoAuto *nodoModificar = estaEnArbol(( *arbol ), id );
- if( nodoModificar != NULL )
- {
- strcpy( nodoModificar->datos->nombreComuna, nuevaComuna );
- return 1;
- }
- return 0;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Funciones sobre Arboles
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-----------------------Verifica si un nodo de un arbol tiene nodos hijos----------------------*/
- short tieneHijos( struct NodoAuto *elem )
- {
- if( elem->izq != NULL || elem->der != NULL ) return 1;
- else return 0;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------Retorna un nodo buscado en un arbol o NULL en caso contrario-----------------*/
- struct NodoAuto *estaEnArbol( struct NodoAuto *arbol, long id )
- {
- struct NodoAuto *actual = arbol;
- while( actual != NULL )
- {
- if( id != actual->id )
- {
- if( id < actual->id )
- {
- actual = actual->izq;
- }
- else actual = actual->der;
- }
- else return actual;
- }
- return NULL;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------------------------Inserta un nodo ordenado-----------------------------------*/
- void insertarNodoAuto( struct NodoAuto **arbol, struct NodoAuto *nuevo )
- {
- struct NodoAuto *anterior = NULL, *actual = *arbol;
- if( *arbol != NULL )
- {
- do
- {
- anterior = actual;
- if( nuevo->id < actual->id )
- {
- actual = actual->izq;
- }
- else actual = actual->der;
- }
- while( actual != NULL );
- actual = nuevo;
- if( nuevo->id < anterior->id )
- {
- anterior->izq = actual;
- }
- else anterior->der = actual;
- }
- else *arbol = nuevo;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*----------------------------------Suprime un nodo de un arbol---------------------------------*/
- void podarNodoAuto( struct NodoAuto **arbol, long id )
- {
- struct NodoAuto *nodoPadre = NULL, *nodoTemporal = NULL, *nodoActual = *arbol;
- if( !tieneHijos( *arbol ) && ( *arbol )->id == id )
- {
- *arbol = NULL;
- return;
- }
- while( nodoActual != NULL )
- {
- if( id != nodoActual->id )
- {
- nodoPadre = nodoActual;
- if( id < nodoActual->id )
- {
- nodoActual = nodoActual->izq;
- }
- else nodoActual = nodoActual->der;
- }
- else
- {
- if( !tieneHijos( nodoActual ))
- {
- if( nodoPadre != NULL )
- {
- if( nodoPadre->izq == nodoActual )
- {
- nodoPadre->izq = NULL;
- }
- else nodoPadre->der = NULL;
- }
- liberarNodoAuto( &nodoActual );
- return;
- }
- else
- {
- nodoPadre = nodoActual;
- if( nodoActual->der != NULL )
- {
- for( nodoTemporal = nodoActual->der; nodoTemporal->izq != NULL; nodoPadre = nodoTemporal, nodoTemporal = nodoTemporal->izq );
- }
- else for( nodoTemporal = nodoActual->izq; nodoTemporal->der != NULL; nodoPadre = nodoTemporal, nodoTemporal = nodoTemporal->der );
- intercambiarDatosNodoAuto( &nodoActual, &nodoTemporal );
- }
- }
- }
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-----------Busca una patente especifa guardando el valor de verdad en estaEncargado-----------*/
- void consultarPatente( struct NodoAuto *arbol, char *patente, short *estaEncargado )
- {
- if ( arbol != NULL )
- {
- if( !strcmp( patente, arbol->datos->patente ))
- {
- *estaEncargado = 1;
- return;
- }
- consultarPatente( arbol->der, patente, estaEncargado );
- consultarPatente( arbol->izq, patente, estaEncargado );
- }
- else return;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*---------------------Imprime de forma recursiva el contenido de un arbol----------------------*/
- void mostrarArbolRecursivo( struct NodoAuto *arbol, int cont )
- {
- if ( arbol != NULL )
- {
- mostrarArbolRecursivo( arbol->izq, cont+1 );
- printf( "\t%s\n", "| | | |" );
- printf( "\t%s%-11s%s", "| ", arbol->datos->rutPropietario, "| " );
- printf( "%-8s%s%-21s%s\n", strupr( arbol->datos->patente ), "| ", capitalizar( arbol->datos->nombreComuna ), "|");
- printf( "\t%s\n", "|____________|_________|______________________|" );
- mostrarArbolRecursivo( arbol->der, cont+1 );
- }
- else return;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------Muestra el contenido de un arbol, en formato de tabla---------------------*/
- void muestraConFormato( struct NodoAuto *arbol, char *encabezado )
- {
- printf( "\n\t"C33"%s\n"C00, encabezado );
- printf( "\t%s\n", " _____________________________________________" );
- printf( "\t%s\n", "| | | |" );
- printf( "\t%s\n", "| RUT | PATENTE | COMUNA |" );
- printf( "\t%s\n", "|____________|_________|______________________|" );
- mostrarArbolRecursivo( arbol, 0 );
- printf( "\n\t"C34 );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------Funcion iterativa para recorrer y mostrar el contenido de un arbol--------------*/
- void mostrarArbolIterativo( struct NodoAuto *arbol )
- {
- struct Pila *pila = NULL;
- apilarNodo( &pila, NULL );
- while( pila )
- {
- while( arbol )
- {
- apilarNodo( &pila, arbol );
- arbol = arbol->izq;
- }
- if( pila )
- {
- arbol = desapilarNodo( &pila );
- if( pila )
- {
- printf( "%ld\n", arbol->id );
- }
- }
- arbol = arbol->der;
- }
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Funciones de Validación
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*-------------------Valida que la cadena recibida, corresponda a una patente-------------------*/
- int esPatenteValida( char *patente )
- {
- int i;
- int flag = 0, letras = 0,numeros = 0;
- char *abecedarioValido = ( char * ) "ABCDEFGHJKLPRSTVWXYZ";
- if( strlen( patente ) == 6 )
- {
- for( i = 0; i < 6; i++ )
- {
- if( isalpha( patente[i] ) && strchr( abecedarioValido, toupper( patente[i] )))
- {
- letras++;
- if(( letras == 2 || letras == 4 ) && numeros == 0 )
- {
- flag = 1;
- }
- else flag = 0;
- }
- if( isdigit( patente[i] )) numeros++;
- }
- if(( numeros == 2 || numeros == 4 ) && flag ) return 1;
- return 0;
- }
- else return 0;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*---------------------Valida que la cadena recibida, corresponda a un RUT----------------------*/
- int esRutValido( char *rut )
- {
- if( strlen( rut ) < 8 || strlen( rut ) > 9 )
- return 0;
- else return 1;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*------------------Funcion booleana que permite verificar si un rut es valido------------------*/
- short validarDigitoVerificadorRut( char *rut )
- {
- int i, j, mod, sumatoria = 0, largo = strlen( rut );
- char verificador;
- for( i = largo - 2, j = 2; i >= 0; i--, j++ )
- {
- sumatoria += ( rut[i] - 48 ) * j;
- if( j == 7 )
- j = 1;
- }
- mod = sumatoria % 11;
- sumatoria = 11 - mod;
- if( sumatoria == 11 )
- {
- verificador = '0';
- }
- else
- {
- if( sumatoria == 10 )
- {
- verificador = 'k';
- }
- else verificador = sumatoria + 48;
- }
- if( verificador == rut[ largo-1 ] )
- {
- return 1;
- }
- else return 0;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Funciones sobre Cadenas
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
- /*---------------------------Suprime espacios sobrantes en una cadena---------------------------*/
- char *suprimeEspacios( char *cadena )
- {
- size_t bytes = sizeof( strlen( cadena ));
- char *buffer = ( char * ) malloc( bytes );
- int i = 0, j = 0, k = 0;
- while( isspace( cadena[j] ))
- j++;
- for( i = j, j = 0; cadena[i] != '\0'; i++ )
- {
- if( isspace( cadena[i] ))
- {
- buffer[k] = cadena[i];
- k++;
- j = 0;
- }
- else j++;
- if( j == 1 )
- {
- buffer[k] = cadena[i];
- k++;
- }
- }
- buffer[k] = '\0';
- return buffer;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*------------------------Deja en Mayus la primera letra de cada palabra------------------------*/
- char *capitalizar( char *frase )
- {
- int i;
- frase[0] = toupper( frase[0] );
- for( i = 1; frase[i] != '\0'; i++ )
- {
- if( isspace( frase[i-1] ))
- {
- frase[i] = toupper( frase[i] );
- }
- else frase[i] = tolower( frase[i] );
- }
- return frase;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------------------Genera un Id unico para cada patente-----------------------------*/
- long idPatente( char *patente )
- {
- int i;
- long acumulador = 0, prod = 1;
- for( i = 0; patente[i] != '\0'; i++ )
- {
- acumulador += toupper( patente[i] ) * prod;
- prod *= 10;
- }
- return acumulador;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------Lee caracter a caracter hasta encontrar un enter '\n'---------------------*/
- char *leerHastaEnter( void )
- {
- int i;
- char caracter;
- char *cadena, *buffer = ( char * ) malloc( 200 ); ;
- scanf( "%c", &caracter );
- for( i = 0; caracter != ENTER; i++ )
- {
- buffer[i] = caracter;
- scanf( "%c", &caracter );
- }
- buffer[i] = '\0';
- cadena = ( char * ) malloc( i );
- strcpy( cadena, buffer );
- free( buffer );
- return cadena;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*----------------------------Suprime los puntos y guiones en un rut----------------------------*/
- void suprimePuntosGuiones( char *rut )
- {
- char *buffer = ( char * ) malloc( strlen( rut ));
- char *digitos = "1234567890Kk";
- int i, j;
- for( i = 0, j = 0; rut[i] != '\0'; i++ )
- {
- if( strchr( digitos, rut[i] ) != NULL )
- {
- buffer[j] = rut[i];
- j++;
- }
- }
- buffer[j] = '\0';
- strcpy( rut, buffer );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*------------------------------Inserta los puntos y guion en el rut----------------------------*/
- char *formatearRut( char *rut )
- {
- int i, j, largo = strlen( rut );
- char *buffer = ( char * ) malloc( strlen( rut ) + 3 );
- if( largo == 8 )
- {
- for( i = 0, j = 0; j < strlen( rut ); i++ )
- {
- if( i != 1 && i != 5 && i != 9 )
- {
- buffer[i] = rut[j];
- j++;
- }
- }
- buffer[1] = '.';
- buffer[5] = '.';
- buffer[9] = '-';
- buffer[11] = '\0';
- return buffer;
- }
- else
- {
- if( largo == 9 )
- {
- for( i = 0, j = 0; j < strlen( rut ); i++ )
- {
- if( i != 2 && i != 6 && i != 10 )
- {
- buffer[i] = rut[j];
- j++;
- }
- }
- buffer[2] = '.';
- buffer[6] = '.';
- buffer[10] = '-';
- buffer[12] = '\0';
- return buffer;
- }
- }
- return rut;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*------------------------------Retorna la parte entera de un RUT-S/Dv--------------------------*/
- long parteEnteraRut( char *rut )
- {
- int i;
- long sumatoria = 0, prod = 1;
- for( i = strlen( rut ) - 2; i >= 0; i-- )
- {
- sumatoria += ( rut[i] - '0' ) * prod;
- prod *= 10;
- }
- return sumatoria;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-------------------------------Convierte una cadena a mayuscula-------------------------------*/
- char *strupr( char *str )
- {
- int i;
- for( i = 0; str[i] != '\0'; i++ )
- {
- if( isalpha( str[i] ))
- str[i] = toupper( str[i] );
- }
- str[i] = '\0';
- return str;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*-----------------Determina si una cadena contiene solo caracteres alfabeticos-----------------*/
- int esPalabra( char *str )
- {
- int i;
- for( i = 0; str[i] != '\0'; i++ )
- {
- if( !isalpha( str[i] ) && !isspace( str[i] )) return 0;
- }
- return 1;
- }
- /*----------------------------------------------------------------------------------------------*/
- /*----------------------------------------Vacia la cadena---------------------------------------*/
- char *reiniciarCadena( char *str )
- {
- strcpy( str, "" );
- }
- /*----------------------------------------------------------------------------------------------*/
- /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
Add Comment
Please, Sign In to add comment