Version:0.9 StartHTML:0000000105 EndHTML:0000018124 StartFragment:0000000152 EndFragment:0000018090
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/******************************************************/
/****************** Telematica ************************/
/******************** FPII ****************************/
/****************** Practica 7 ************************/
/******************************************************/

#include <iostream.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include "Lista.h"

void Presentacion (void);
ABB CargarArbol(string fichero, bool &error);
char Convertir (char x);
bool EsValido(char x);

int main()
{
    Valor pal;
    ifstream f;
    string nombre, fichero;
    int ocurrencias;
    Lista a;
    bool error,salir;
    error = salir = false;
    ABB arbaux;

    char opt;
    Data aux;

    Presentacion();

    cout << " Nombre del fichero donde esta el listado de documentos a cargar\n";
    cout << "\n Fichero -> ";
    getline (cin,nombre);

    f.open(nombre.c_str());

    if(!f)
    {
        cerr << "Error al leer el fichero" << endl;
        error = true;
    }
    else
    {
        a.IrAInicio();
        getline(f,fichero);

        while(!f.eof())
        {
            aux.n_documento = fichero;
            cout << " Cargando datos del fichero " << fichero << " ... ";

            a.Insertar(aux.n_documento, CargarArbol(aux.n_documento,error));

            getline(f,fichero);
        } //while
    } //  else
    f.close();

    if (error)
        cerr << "\n Se produjeron errores durante la carga de ficheros,se aborta el programa\n";

    while (!salir && !error)
    {
        cout << "\n Dime la palabra que quieres buscar -> ";
        cin >> pal;

        a.IrAInicio();

        while (!a.FinalLista())
        {

            ocurrencias = 0;
            a.Consulta(aux);
            arbaux = aux.arbol.Buscar(pal);
            arbaux.Informacion(pal,ocurrencias);
            if (ocurrencias > 0 )
            {
                cout << "\n En " << aux.n_documento << " aparece " << ocurrencias << " veces\n";
            }
            a.Avanzar();
        } // while
        cin.ignore();
        cout << "\n Quieres seguir buscando mas palabras ?? (S/N)-> ";
        cin >> opt;

        if (opt == 'N' || opt == 'n')
            salir = true;
    } // while

    system("PAUSE");
    return 0;
};

/*****************************************************************************
* Funcion: CargarArbol
* Descripcion: Carga un ABB a partir de un fichero
*
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
* fichero      E          Nombre del fichero que queremos abrir
*
*
*
* Valor devuelto:
*       Devuelve el arbol que hemos creado a partir del fichero
*****************************************************************************/

ABB CargarArbol(string fichero, bool &error)
{
    Valor aux, palabra;
    ABB tree;
    ifstream g;

    g.open(fichero.c_str());

    if (!g)
    {
        cerr << " ERROR !!\n";
        error = true;
    }
    else
    {

        cout << " ok !!\n";
        getline(g, aux);

        while (!(g.eof()) )
        {
            while ( aux.length() > 0)
            {
                if( EsValido(aux[0]) ) // si el caracter es valido convertimos y añadimos al string auxiliar
                {
                    aux[0] = Convertir(aux[0]);
                    palabra = palabra + aux[0];
                    aux.erase(0,1);
                 }
                else  // en caso de no ser valido es  posible que sea un espacio en blanco
                {
                    if ( aux[0] != ' ') // no es un espacio en blanco leeremos la siguiente palabra
                    {
                       // while (aux[0] != ' ' && aux.length()>0) //si hay un caracter no valido en la cadena borramos toda la cadena
                            aux.erase(0,1);
                       // if(aux.length()>0)
                       //     aux.erase(0,1); // Borramos el espacio en blanco
                       // palabra = "";
                    }
                    else   // si es un espacio en blanco entonces habremos terminado de leer la palabra
                    {
                        if ( palabra.length() > 0) // si la palabra tiene algun caracter entonces...
                        {
                            aux.erase(0,1);  // borramos el espacio blanco del string general
                            tree.Insertar(palabra); // insertamos la palabra en el arbol
                            palabra = ""; // e inicializamos la palabra de nuevo
                        }
                        else
                        {
                            if(aux.length()>0)
                                aux.erase(0,1); // si la palabra no tiene elementos sera un espacio doble y lo borramos
                        }
                    } // else
                }//else
            } //while
        getline(g, aux); // cogemos la siguiente linea del fichero
        }// while
    } //else
    g.close();

    return(tree);

};

/*****************************************************************************
* Funcion: EsValido
* Descripcion: Funcion que determina si un caracter es valido para su introduccion
*              en nuestra estructura de datos
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*  x           E          caracter que queremos identificar como valido o no
*
*
*
* Valor devuelto:
*       Devuelve true si el caracter es valido, false en caso contrario
*****************************************************************************/

bool EsValido(char x)
{
    bool valido;
    if ( (x <= 122 && x>=97) || ( x<=90 && x>=65)  )
        valido = true;
    else
    {
        if (x<0)
        {
            if ( x == -63 || x == -55 || x == -51 || x == -45 || x == -38 || x == -31 || x == -23 || x == -19 || x == -13 || x == -6 || x == -15 || x == -47)
                valido = true;
        }
        else
            valido = false;
    }
    return(valido);
};

/*****************************************************************************
* Funcion: Convertir
* Descripcion: Funcion que pasara  un caracter valido a un caracter en minuscula
*              sin acentuar como norma de almacenamiento interno
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*  x           E          caracter que queremos normalizar
*
*
*
* Valor devuelto:
*       Devuelve el caracter normalizado
*****************************************************************************/

char Convertir(char x)
{
    char aux;

    if (int(x) >= 65 && int(x) <= 90)
        aux = char ( int(x) + 32 ); // si  es una letra mayuscula la pasamos a minuscula

    else
    {
        if ( int(x) < 0)
        {

            switch (int(x))
            {
          //  case 160:
            case -63:
            case -31:
                aux = 'a';
                break;
           // case 130:
            case -55:
            case -23:
                aux = 'e';
                break;
          //  case 161:
            case -51:
            case -19:
                aux = 'i';
                break;
          //  case 162:
            case -45:
            case -13:
                aux = 'o';
                break;
          //  case 163:
            case -38:
            case -6:
                aux = 'u';
                break;
            case -15:
            case -47:
                aux = 'n'; // para poder buscar una ñ la sustituimos por una n
                break;
            default:
                break;
            } // switch
        }
        else
            aux = x;
    } // else    */
    return (aux);
};

void Presentacion(void)
{
   char ch;

   cout << "\n\n";
   cout << "Practica 07. Búsqueda de palabras en documentos de texto: \n";
   cout << "             Utilización de árboles binarios de búsqueda\n";
   cout << "\n";
   cout << "Este programa lee palabras de de los ficheros listados en otro fichero\n";
   cout << "y almacenara las palabras en arboles binarios de busqueda.\n";
   cout << "Posteriormente podremos hacer busquedas de una palabra en concreto en \n";
   cout << "todos los ficheros cargados y nos mostrara el numero de veces que aparece\n";
   cout << "dicha palabra en cada documento de texto (si aparece)\n";
   cout << "\n";
   cout << "Programa realizado por:\n";
   cout << "     Isidro Pastor Jorda\n";
   cout << "     Version 1.0 - 05 de Junio de 2003\n";
   cout << "\n";
   cout << "Practicas de Fundamentos de Programacion 2 (2002-2003)\n";
   cout << "\nPulsa una tecla y luego enter\n";
   cin >> ch;
   cin.ignore();
};