Árvore de prefixos para corretor ortográfico
Olá, pessoal.
Abaixo está o código de árvore de prefixos que vocês fizeram em sala de aula. Corrigi os problemas com UNICODE e a função de impressão. Na próxima aula vou dar uma explicação sobre UNICODE pra que entendam de vez todas as funções utilizadas.
Agora, basta modificar o código para abrir um outro arquivo e imprimir as palavras incorretas com o número da linha de cada uma.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> #include <wchar.h> #define ORDEM 77 using namespace std; /* Estrutura de um nó */ struct no { wchar_t letra; struct no *p; struct no *f[ORDEM]; bool fim; }; /* Cria um novo nó */ struct no *criar(wchar_t letra = 0) { struct no *novo = (struct no *)malloc(sizeof(struct no)); novo->letra = letra; novo->p = NULL; novo->fim = false; for (int i = 0; i < ORDEM; i++) novo->f[i] = NULL; return novo; } /* Remove \n no final da string */ wchar_t *remove_enter(wchar_t *str) { int p = wcslen(str); str[p] = 0; str[p - 1] = 0; return str; } /* Calcula a posição no vetor de filhos */ int posicao(wchar_t letra) { if ((letra >= L'a') && (letra <= L'z')) return (int) letra - L'a'; if ((letra >= L'A') && (letra <= L'Z')) return (int) letra - L'A'; switch (letra) { case L'Ç': return 52; break; case L'á': return 53; break; case L'à': return 54; break; case L'â': return 55; break; case L'ã': return 56; break; case L'é': return 57; break; case L'ê': return 58; break; case L'í': return 59; break; case L'ó': return 60; break; case L'ô': return 61; break; case L'õ': return 62; break; case L'ú': return 63; break; case L'ç': return 64; break; case L'Á': return 65; break; case L'À': return 66; break; case L'Â': return 67; break; case L'Ã': return 68; break; case L'É': return 69; break; case L'Í': return 70; break; case L'Ó': return 71; break; case L'Ô': return 72; break; case L'Õ': return 73; break; case L'Ú': return 74; break; case L'Ü': return 75; break; case L'ü': return 76; break; default: wprintf(L"Caractere não reconhecido: %lc (%d)\n", letra, letra); return -1; } } /* Adiciona elemento na árvore */ void adicionar(struct no *raiz, wchar_t nome[256]) { if (nome[0] == 0) { raiz->fim = true; return; } int p = posicao(nome[0]); if (p == -1) return; if (raiz->f[p] == NULL) { raiz->f[p] = criar(nome[0]); raiz->f[p]->p = raiz; } adicionar(raiz->f[p], &nome[1]); } /* Adiciona palavras do dicionário */ void adicionar_lista(struct no *raiz, char caminho[256]) { wchar_t verbete[256]; FILE* arquivo; arquivo = fopen(caminho, "r"); if(arquivo == NULL) return; while(!feof(arquivo)) { wmemset(verbete, 0, 256); fgetws(verbete, 255, arquivo); remove_enter(verbete); adicionar(raiz, verbete); } fclose(arquivo); } /* Imprime o conteúdo da árvore */ void imprimir(struct no *raiz) { if(raiz == NULL) return; for(int i = 0; i < ORDEM; i++) { if(raiz->f[i] != NULL) { if(raiz->f[i]->fim == true) { struct no *atual = raiz->f[i]; wchar_t palavra[256] = {0}; wcsncpy(palavra, &atual->letra, 1); while (atual->p != NULL) { atual = atual->p; wchar_t c[256] = {0}; wcsncpy(c, &atual->letra, 1); wcscpy(palavra, wcscat(c, palavra)); } wprintf(L"%ls\n", palavra); } imprimir(raiz->f[i]); } } } /* Função principal */ int main(void) { setlocale(LC_ALL, ""); struct no *arvore = (struct no *)malloc(sizeof(struct no)); arvore->letra = ' '; int opt; wchar_t palavra[256]; char caminho[256]; do { wprintf(L"Escolha uma opção:\n\n"); wprintf(L"1 - Adicionar\n"); wprintf(L"2 - Listar\n"); wprintf(L"3 - Remover\n"); wprintf(L"4 - Abrir dicionário\n"); wprintf(L"0 - Sair\n\n"); wprintf(L"Opção: "); scanf("%d", &opt); switch(opt) { case 1: wprintf(L"\n\nDigite uma palavra: "); scanf("%ls", palavra); adicionar(arvore, palavra); break; case 2: wprintf(L"\n\nConteúdo da árvore:\n"); imprimir(arvore); break; case 3: wprintf(L"\n\nNão implementado!\n"); break; case 4: wprintf(L"\n\nDigite o nome do arquivo: "); scanf("%s", caminho); adicionar_lista(arvore, caminho); break; case 0: return 0; default: wprintf(L"Opção inválida!\n\n"); } wprintf(L"\n\n"); } while(1); return 0; }
Leave a Reply