Está en la página 1de 4

#

#
#
#
#

include
include
include
include
include

<stdio.h>
<stdlib.h>
<math.h>
<string.h>
<omp.h>

# define H 2 //num hilos


# define MAX 30 // largo maximo de una palabra
//guardar elemento
typedef struct {
char p[MAX];
}elemento;
//guardar archivo
typedef struct {
char archivo[MAX];
elemento *elementos;
int n;
}archivo;
//guardar indice
typedef struct {
char palabra[MAX];
elemento *elementos;
int n;
}invertido;
void funcion1(int i, int j, int k, int largo, int cantidad_archivos, elemento *
p1, invertido* indice_i);
void funcion2(int i, int j, int k, int cantidad_consultas, int largo, invertido
* indice_i, int contador, elemento * cons);
int main(int argc, char *argv[]){
omp_set_num_threads(H); //cantidad de hilos
int aux,tam;
int cantidad_archivos, archivo_len,cantidad_consultas,n;
char nombre_archivo[MAX], p[MAX],p2[MAX];
archivo *archivos;
elemento *aux1, *aux2,*cons, *p1;
elemento *sin_repetir ,*sin_repetir2;
p1 = (elemento *) malloc(sizeof(elemento));
scanf("%d",&cantidad_archivos);
archivos = (archivo *) malloc(sizeof(archivo)*cantidad_archivos);
sin_repetir = (elemento *) malloc(sizeof(elemento));
sin_repetir2 = (elemento *) malloc(sizeof(elemento));
invertido *indice_i;
int i,j;
for(i=0 ; i<cantidad_archivos; i++){

//se lee el nombre del archivo


scanf("%s",nombre_archivo);
strcpy(archivos[i].archivo,nombre_archivo);
scanf("%d",&archivo_len);
archivos[i].n=archivo_len;
aux1 = malloc(sizeof(elemento)*archivo_len);
archivos[i].elementos=aux1;
for(j=0;j<archivo_len;j++){
scanf("%s",p);
strcpy(archivos[i].elementos[j].p,p);
}
}
//leer consultas y almacenarlas
scanf("%d",&cantidad_consultas);
cons = (elemento *) malloc(cantidad_consultas*sizeof(elemento));
for(i=0;i<cantidad_consultas;i++){
scanf("%s",p2);
strcpy(cons[i].p,p2);
}
int largo=0;
int contador=0;
int k=0;
//eliminar las repeticiones
for(i=0;i< cantidad_archivos;i++){
for(j=0;j<archivos[i].n;j++){
contador=0;
if(largo>0){
for(k=0;k<largo;k++){
if(strcmp(sin_repetir[k].p,archivos[i].e
lementos[j].p)==0){
//ya se encuentra
break;
}
else{
//si no lo encuentra aumenta el
contador
contador++;
}
}
if(contador==largo){//si el contador == largo e
s porque recorrio todo y no lo encontro
largo++;
sin_repetir2 = (elemento *) realloc(sin_
repetir,sizeof(elemento)*largo);
sin_repetir=sin_repetir2;
strcpy(sin_repetir[largo-1].p,archivos[i
].elementos[j].p);
}
}
else{
//no contiene palabras el sin_repetir[]
largo++;
sin_repetir2=(elemento *) realloc(sin_repetir,s
izeof(elemento)*largo);
sin_repetir=sin_repetir2;
strcpy(sin_repetir[largo-1].p,archivos[i].eleme

ntos[j].p);
}
}
}

indice_i = (invertido *) malloc(largo*sizeof(invertido));


//sin_repetir contiene las palabras sin repeticion
for(i=0;i<largo;i++) {
strcpy(indice_i[i].palabra,sin_repetir[i].p);
}
funcion1(i,j,k,largo,cantidad_archivos,p1,indice_i);
//consultas
funcion2(i,j,k,cantidad_consultas,largo,indice_i,contador,cons);
int aumenta=0;

}
void funcion1(int i, int j, int k, int largo, int cantidad_archivos, elemento *
p1, invertido* indice_i)
{
#pragma omp parallel firstprivate(i,j,k)
{
int tid = omp_get_thread_num();
int a;
for(i=tid ; i<largo ; i+=H){
for(j=0;j< cantidad_archivos;j++){
for(k=0; k < archivos[j].n;k++){
if(strcmp(archivos[j].elementos[k].p,ind
ice_i[i].palabra)==0){
//se encontro la palabra en el a
rchivo
indice_i[i].n+=1;
a = indice_i[i].n;
p1 =(elemento *) realloc(indice
_i[i].elementos,a*sizeof(elemento));
indice_i[i].elementos=p1;
strcpy(indice_i[i].elementos[a1].p, archivos[j].archivo);
//romper for
break;
}
}
}
}
}
}
void funcion2(int i, int j, int k, int cantidad_consultas, int largo, invertido
* indice_i, int contador, elemento * cons)
{
for(i=0;i<cantidad_consultas;i++){
for(j=0;j<largo;j++){

if( strcmp(indice_i[j].palabra,cons[i].p)!=0){
//no es la palabra
contador++;
}
else{
printf("resultado para %s = ",cons[i].p);
for( k=0; k<indice_i[j].n; k++){
printf("%s ",indice_i[j].elementos[k].p
);
}
printf("\n");
break;
}
}
if( contador == largo ){
printf("resultado para %s = no existe\n",cons[i].p );
contador=0;
}
else{
contador=0;
}
}
}

También podría gustarte