コード例 #1
0
/**
 * Recebe a palavra a ser procurada
 * Consulta o "palavras.dat", que é uma lista, procurando pela
 * palavra pedida
 * Retorna a lista de índices que possuem a palavra pedida
 */
ListaDupla<int> man_pages_positions(char* palavra) {
    FILE* palavrasDat;
    palavrasDat = fopen("..\\palavras.dat", "rb");

    //Lê a quantidade de palavras dos 4 bytes e guarda em "tamanho"
    char tamanhoC[4];
    for(int i = 0; i < 4; i++) {
        tamanhoC[i] = fgetc(palavrasDat);
    }

    int tamanho = *((int*)&tamanhoC[0]);
    int pos = 0;
    bool achou = false;
    char palavraAtual[100];
    while (!achou && pos < tamanho) {
        //Posiciona o leitor no inicio do registro da palavra
        fseek(palavrasDat, 4+(pos*size_max_word), SEEK_SET);
        //Pega palavra do registro
        fgets(palavraAtual, 100, palavrasDat);

        int cmpResult = strcmp(palavra, palavraAtual);
        //Buscando maior que encontrado, pega o ramo da esquerda
        if(cmpResult < 0) {
            pos++;
            pos = (2*pos)-1;
        //Buscando menor que encontrado, pega o ramo da direita
        } else if(cmpResult > 0) {
            pos++;
            pos = (2*pos);
        //Encontrado
        } else {
            achou = true;
        }
    }

    ListaDupla<int> indices;
    if(achou) {
        pos = *((int*)&palavraAtual[92]);
        int qtd = *((int*)&palavraAtual[96]);
        fseek(palavrasDat, 4+(tamanho*size_max_word)+pos*4, SEEK_SET);
        for(int i = 0; i < qtd; i++) {
            char indiceC[4];
            for(int j = 0; j < 4; ++j){
                indiceC[j] = fgetc(palavrasDat);
            }
            int indice = *((int*)&indiceC[0]);
            indices.adicionaDuplo(indice);
        }
    } else {
        printf("Nenhum arquivo encontrado com a palavra '%s'\n", palavra);
    }

    fclose(palavrasDat);

    return indices;
}
コード例 #2
0
/**
 * Pede as duas palavras, e obtem os indices de modo semelhante a
 * search_by_one_word, realiza as intersecção entre as listas de índices
 * Traduz os índices para o nome das manpages consultando "manpages.dat"
 */
void search_by_two_words() {
    //Pede a primeira palavra
    char palavra1[100];
    scanf("%s", palavra1);
    //Pega a lista de índices que possuem a primeira palavra
    ListaDupla<int> indices1 = man_pages_positions(palavra1);
    //Pede a segunda palavra
    char palavra2[100];
    scanf("%s", palavra2);
    //Pega índices da segunda palavra
    ListaDupla<int> indices2 = man_pages_positions(palavra2);

    //Intersecção de indices1 e indices2
    ListaDupla<int> indices;
    while (!indices2.listaVazia()) {
        int atual = indices2.primeiro();
        bool achou = false;
        for(int i = 0; i < indices1.verUltimo() && !achou; i++) {
            if(indices1.mostra(i) == atual) achou = true;
        }
        if(achou) indices.adicionaDuplo(atual);
        indices2.retiraDoInicioDuplo();
    }

    FILE* manPagesDat;
    manPagesDat = fopen("..\\manpages.dat", "rb");
    printf("\n\n");

    while (!indices.listaVazia()) {
        fseek(manPagesDat, indices.primeiro()*(size_max_command+size_max_content), SEEK_SET);
        char comando[100];
        fgets(comando, 100, manPagesDat);
        printf("%d - %s\n", indices.primeiro(), comando);
        indices.retiraDoInicioDuplo();
    }

    fclose(manPagesDat);
}