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