{"id":107,"date":"2015-05-29T15:09:52","date_gmt":"2015-05-29T18:09:52","guid":{"rendered":"http:\/\/just.pro.br\/blog\/?p=107"},"modified":"2015-11-28T11:15:05","modified_gmt":"2015-11-28T14:15:05","slug":"arvore-de-prefixos-para-corretor-ortografico","status":"publish","type":"post","link":"https:\/\/just.pro.br\/blog\/2015\/05\/29\/arvore-de-prefixos-para-corretor-ortografico\/","title":{"rendered":"\u00c1rvore de prefixos para corretor ortogr\u00e1fico"},"content":{"rendered":"<p>Ol\u00e1, pessoal.<\/p>\n<p>Abaixo est\u00e1 o c\u00f3digo de \u00e1rvore de prefixos que voc\u00eas fizeram em sala de aula. Corrigi os problemas com UNICODE e a fun\u00e7\u00e3o de impress\u00e3o. Na pr\u00f3xima aula vou dar uma explica\u00e7\u00e3o sobre UNICODE pra que entendam de vez todas as fun\u00e7\u00f5es utilizadas.<\/p>\n<p>Agora, basta modificar o c\u00f3digo para abrir um outro arquivo e imprimir as palavras incorretas com o n\u00famero da linha de cada uma.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;stdio.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;string.h&gt;\r\n#include &lt;locale.h&gt;\r\n#include &lt;wchar.h&gt;\r\n\r\n#define ORDEM 77\r\n\r\nusing namespace std;\r\n\r\n\/* Estrutura de um n\u00f3 *\/\r\nstruct no\r\n{\r\n    wchar_t letra;\r\n    struct no *p;\r\n    struct no *f&#x5B;ORDEM];\r\n    bool fim;\r\n};\r\n\r\n\/* Cria um novo n\u00f3 *\/\r\nstruct no *criar(wchar_t letra = 0)\r\n{\r\n    struct no *novo = (struct no *)malloc(sizeof(struct no));\r\n    novo-&gt;letra = letra;\r\n    novo-&gt;p = NULL;\r\n    novo-&gt;fim = false;\r\n    \r\n    for (int i = 0; i &lt; ORDEM; i++)\r\n        novo-&gt;f&#x5B;i] = NULL;\r\n    \r\n    return novo;\r\n}\r\n\r\n\/* Remove \\n no final da string *\/\r\nwchar_t *remove_enter(wchar_t *str)\r\n{\r\n    int p = wcslen(str);\r\n    str&#x5B;p] = 0;\r\n    str&#x5B;p - 1] = 0;\r\n    return str;\r\n}\r\n\r\n\/* Calcula a posi\u00e7\u00e3o no vetor de filhos *\/\r\nint posicao(wchar_t letra)\r\n{\r\n    if  ((letra &gt;= L'a') &amp;&amp; (letra &lt;= L'z'))\r\n        return (int) letra - L'a';\r\n\r\n    if  ((letra &gt;= L'A') &amp;&amp; (letra &lt;= L'Z'))\r\n        return (int) letra - L'A';\r\n\r\n    switch (letra)\r\n    {\r\n        case L'\u00c7':\r\n            return 52;\r\n            break;\r\n        case L'\u00e1':\r\n            return 53;\r\n            break;\r\n        case L'\u00e0':\r\n            return 54;\r\n            break;\r\n        case L'\u00e2':\r\n            return 55;\r\n            break;            \r\n        case L'\u00e3':\r\n            return 56;\r\n            break;\r\n        case L'\u00e9':\r\n            return 57;\r\n            break;            \r\n        case L'\u00ea':\r\n            return 58;\r\n            break;\r\n        case L'\u00ed':\r\n            return 59;\r\n            break;   \r\n        case L'\u00f3':\r\n            return 60;\r\n            break;\r\n        case L'\u00f4':\r\n            return 61;\r\n            break;   \r\n        case L'\u00f5':\r\n            return 62;\r\n            break;   \r\n        case L'\u00fa':\r\n            return 63;\r\n            break;   \r\n        case L'\u00e7':\r\n            return 64;\r\n            break;\r\n        case L'\u00c1':\r\n            return 65;\r\n            break;                      \r\n        case L'\u00c0':\r\n            return 66;\r\n            break;     \r\n        case L'\u00c2':\r\n            return 67;\r\n            break;   \r\n        case L'\u00c3':\r\n            return 68;\r\n            break;\r\n        case L'\u00c9':\r\n            return 69;\r\n            break;   \r\n        case L'\u00cd':\r\n            return 70;\r\n            break;\r\n        case L'\u00d3':\r\n            return 71;\r\n            break;  \r\n        case L'\u00d4':\r\n            return 72;\r\n            break;\r\n        case L'\u00d5':\r\n            return 73;\r\n            break;\r\n        case L'\u00da':\r\n            return 74;\r\n            break;\r\n        case L'\u00dc':\r\n            return 75;\r\n            break;\r\n        case L'\u00fc':\r\n            return 76;\r\n            break;\r\n        default:\r\n            wprintf(L&quot;Caractere n\u00e3o reconhecido: %lc (%d)\\n&quot;, letra, letra);\r\n            return -1;\r\n    }\r\n}\r\n\r\n\/* Adiciona elemento na \u00e1rvore *\/\r\nvoid adicionar(struct no *raiz, wchar_t nome&#x5B;256])\r\n{\r\n    if (nome&#x5B;0] == 0)\r\n    {\r\n        raiz-&gt;fim = true;\r\n        return;\r\n    }\r\n    \r\n    int p = posicao(nome&#x5B;0]);\r\n    if (p == -1)\r\n        return;\r\n    \r\n    if (raiz-&gt;f&#x5B;p] == NULL)\r\n    {\r\n        raiz-&gt;f&#x5B;p] = criar(nome&#x5B;0]);\r\n        raiz-&gt;f&#x5B;p]-&gt;p = raiz;\r\n    }\r\n    \r\n    adicionar(raiz-&gt;f&#x5B;p], &amp;nome&#x5B;1]);\r\n}\r\n\r\n\/* Adiciona palavras do dicion\u00e1rio *\/\r\nvoid adicionar_lista(struct no *raiz, char caminho&#x5B;256])\r\n{\r\n    wchar_t verbete&#x5B;256];\r\n    FILE* arquivo;\r\n\r\n    arquivo = fopen(caminho, &quot;r&quot;);\r\n\r\n    if(arquivo == NULL)\r\n        return;\r\n\r\n    while(!feof(arquivo))\r\n    {\r\n        wmemset(verbete, 0, 256);\r\n        fgetws(verbete, 255, arquivo);\r\n        remove_enter(verbete);\r\n        adicionar(raiz, verbete);\r\n    }\r\n    \r\n    fclose(arquivo);\r\n}\r\n\r\n\/* Imprime o conte\u00fado da \u00e1rvore *\/\r\nvoid imprimir(struct no *raiz)\r\n{\r\n    if(raiz == NULL)\r\n        return;\r\n        \r\n    for(int i = 0; i &lt; ORDEM; i++)\r\n    {\r\n        if(raiz-&gt;f&#x5B;i] != NULL)\r\n        {\r\n            if(raiz-&gt;f&#x5B;i]-&gt;fim == true)\r\n            {\r\n                struct no *atual = raiz-&gt;f&#x5B;i];\r\n                wchar_t palavra&#x5B;256] = {0};\r\n                wcsncpy(palavra, &amp;atual-&gt;letra, 1);\r\n                \r\n                while (atual-&gt;p != NULL)\r\n                {\r\n                    atual = atual-&gt;p;\r\n                    wchar_t c&#x5B;256] = {0};\r\n                    wcsncpy(c, &amp;atual-&gt;letra, 1);\r\n                    wcscpy(palavra, wcscat(c, palavra));\r\n                }\r\n                \r\n                wprintf(L&quot;%ls\\n&quot;, palavra);\r\n            }\r\n            \r\n            imprimir(raiz-&gt;f&#x5B;i]);\r\n        }  \r\n    }  \r\n}\r\n\r\n\/* Fun\u00e7\u00e3o principal *\/\r\nint main(void)\r\n{\r\n    setlocale(LC_ALL, &quot;&quot;);\r\n\r\n    struct no *arvore = (struct no *)malloc(sizeof(struct no));\r\n    arvore-&gt;letra = ' ';\r\n\r\n    int opt;\r\n    wchar_t palavra&#x5B;256];\r\n    char caminho&#x5B;256];\r\n\r\n    do\r\n    {\r\n        wprintf(L&quot;Escolha uma op\u00e7\u00e3o:\\n\\n&quot;);\r\n        wprintf(L&quot;1 - Adicionar\\n&quot;);\r\n        wprintf(L&quot;2 - Listar\\n&quot;);\r\n        wprintf(L&quot;3 - Remover\\n&quot;);\r\n        wprintf(L&quot;4 - Abrir dicion\u00e1rio\\n&quot;);\r\n        wprintf(L&quot;0 - Sair\\n\\n&quot;);\r\n        wprintf(L&quot;Op\u00e7\u00e3o: &quot;);\r\n        scanf(&quot;%d&quot;, &amp;opt);\r\n\r\n        switch(opt)\r\n        {\r\n        case 1:\r\n            wprintf(L&quot;\\n\\nDigite uma palavra: &quot;);\r\n            scanf(&quot;%ls&quot;, palavra);\r\n            adicionar(arvore, palavra);\r\n            break;\r\n\r\n        case 2:\r\n            wprintf(L&quot;\\n\\nConte\u00fado da \u00e1rvore:\\n&quot;);\r\n            imprimir(arvore);\r\n            break;\r\n\r\n        case 3:\r\n            wprintf(L&quot;\\n\\nN\u00e3o implementado!\\n&quot;);\r\n            break;\r\n\r\n        case 4:\r\n            wprintf(L&quot;\\n\\nDigite o nome do arquivo: &quot;);\r\n            scanf(&quot;%s&quot;, caminho);\r\n            adicionar_lista(arvore, caminho);\r\n            break;\r\n\r\n        case 0:\r\n            return 0;\r\n\r\n        default:\r\n            wprintf(L&quot;Op\u00e7\u00e3o inv\u00e1lida!\\n\\n&quot;);\r\n        }\r\n        \r\n        wprintf(L&quot;\\n\\n&quot;);\r\n    }\r\n    while(1);\r\n\r\n    return 0;\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1, pessoal. Abaixo est\u00e1 o c\u00f3digo de \u00e1rvore de prefixos que voc\u00eas fizeram em sala de aula. Corrigi os problemas com UNICODE e a fun\u00e7\u00e3o de impress\u00e3o. Na pr\u00f3xima aula vou dar uma explica\u00e7\u00e3o sobre UNICODE pra que entendam de &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"more-link\" href=\"https:\/\/just.pro.br\/blog\/2015\/05\/29\/arvore-de-prefixos-para-corretor-ortografico\/\"> <span class=\"screen-reader-text\">\u00c1rvore de prefixos para corretor ortogr\u00e1fico<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,2],"tags":[],"class_list":["post-107","post","type-post","status-publish","format-standard","hentry","category-estrutura-de-dados-2","category-unifacs"],"_links":{"self":[{"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/posts\/107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/comments?post=107"}],"version-history":[{"count":2,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/posts\/107\/revisions"}],"predecessor-version":[{"id":109,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/posts\/107\/revisions\/109"}],"wp:attachment":[{"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/media?parent=107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/categories?post=107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/tags?post=107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}