Advertisement
ceacpb

Quebra de texto em índices de códigos de palavras, em C

Apr 24th, 2012
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.95 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. /*
  5.  Demonstração, em C, de estruturas de dados simples para referência a strings
  6.  por palavras, gerando resultados para pós-processamento mais rápido
  7.  
  8.  
  9.  2012 - CEAC
  10. */
  11.  
  12.  
  13. using namespace std;
  14.  
  15. // preenche o buffer "destino" com a proxima palavra em uma frase (origem)
  16.  
  17. int proximaPalavra(int indiceInicial,
  18.                    char * origem, int tamOrigem, char * destino,
  19.                    int tamMaxDestino,
  20.                    bool * fimFrase) {
  21.    
  22.     // checa condições e retorna erro se :    
  23.     if ((destino == NULL)  // destino for nulo
  24.     || (origem == NULL)    // origem for nula
  25.     || (indiceInicial < 0) // indiceInicial for menor que zero
  26.     || (indiceInicial >= tamOrigem))
  27.    
  28.     return -1;
  29.    
  30.     int indice = indiceInicial;
  31.     int contador = 0;
  32.     int caractere = 0;
  33.     int charEspaco = ' ';
  34.     int charPonto = '.';
  35.    
  36.     bool fimDeFrase = false;
  37.    
  38.     // repete até o fim da frase ou da palavra (espaço)
  39.     do {
  40.        
  41.         caractere = origem[indice]; // o contador/indice é usado aqui
  42.        
  43.         fimDeFrase = caractere == charPonto;
  44.        
  45.         destino[contador] = caractere; // copia
  46.        
  47.         indice++; // incrementa o índice
  48.         contador++; // incremanta o contador (esse contador registra as cópias)
  49.        
  50.     }while ((caractere!= 0)
  51.               && (caractere!= charEspaco)
  52.               && (!fimDeFrase)
  53.               && (contador < tamMaxDestino));
  54.              
  55.    
  56.     // define o fim da palavra como sendo o fim da string
  57.     // assim, strlen vai retornar o tamanho correto da palavra e não da
  58.     // quantidade de memória alocada no array para onde essa string aponta
  59.     // (corta o indicador de fim para o fim da palavra copiada)
  60.     // a próxima condição também modifica esse índice
  61.     destino[contador] = 0;
  62.    
  63.     // define o ponteiro para onde há uma variável booleana
  64.     // (se existir) como a mesma condição que a variável local
  65.     // fimDeFrase (o fim da palavra foi com um ponto)
  66.     if (fimFrase!=NULL) {
  67.        * fimFrase = fimDeFrase;
  68.        // se termina com um ponto, a palavra não deverá conter esse ponto:
  69.        // a próxima linha exclui o último caractere (o ponto) do string
  70.        if (contador > 0)
  71.        destino[contador-1] = 0;
  72.     }
  73.    
  74.     // retorna o índice que corresponde ao final da palavra na frase
  75.     // (o fim de "destino" - cópia -  na origem)
  76.    
  77.     return indice;    
  78. }
  79.  
  80.  
  81. // retorna um código único para cada palavra e também pode tornar a palavra
  82. // maiúscula ou minúscula enquanto faz o cálculo
  83. // o código usado é resultado = resultado + (caractere * indiceCaractere);
  84.  
  85. int codigoPalavra (char * palavra, bool caixaAlta,
  86.     bool caixaBaixa, bool semConversao) {
  87.    
  88.     if (palavra) { // comparar com NULL é o mesmo que checar se o ponteiro é zero
  89.                
  90.         int tamPalavra = strlen(palavra);
  91.        
  92.         int resultado = 0;
  93.        
  94.         for (int i = 0; i < tamPalavra; i++) {
  95.            
  96.             char caractere = palavra[i];
  97.            
  98.             // deixando a primeira checagem como sendo semConversão
  99.             // evita que as outras condições sejam sempre verificadas
  100.             // maiusculas/minusculas
  101.            
  102.             if (semConversao) {
  103.                              
  104.             }
  105.             else                  
  106.             if (caixaAlta) { // maiúsculas
  107.                if (caractere > 'A')
  108.                
  109.                // o compilador vai transformar 'a' e 'A' em números constantes
  110.                // (97 e 65) e essa expressão irá se transformar em:
  111.                // caractere = caractere +/- 32;
  112.                // no código compilado
  113.                
  114.                caractere = caractere - ('a' - 'A');  
  115.             }
  116.             else
  117.             if (caixaBaixa) {
  118.                if (caractere < 'a')
  119.                caractere = caractere + ('a' - 'A');          
  120.             }
  121.            
  122.             // aqui o caractere já está convertido
  123.             // e o próximo código é o cálculo que define o resultado
  124.             resultado = resultado + (caractere * i);
  125.         }
  126.                  
  127.         return resultado;        
  128.     }
  129.    
  130.     return 0; // retorna zero se palavra == null
  131. }
  132.  
  133. int main(int argc, char *argv[])
  134. {
  135.     // * argv[] é alocado/desalocado pelo sistema operacional
  136.    
  137.     if (argc < 2)
  138.     return -1;
  139.    
  140.     // obtém os ponteiros para os dois parâmetros
  141.     // o parametro argv[0] é a linha de comando (ex.: c:/pasta/programa.exe)
  142.     // o parametro argv[1] pode ter várias palavras desde que seja separado por
  143.     // aspas duplas "p1 p2 p3"
  144.     // argv[1] = texto
  145.     // argv[2] = palavra
  146.    
  147.     char * texto = argv[1];
  148.     char * palavra = argv[2];
  149.    
  150.     // usa a função strlen para contar os caracteres de cada
  151.     // string (essa função faz um "for" e pára quando encontra um zero/null,
  152.     // retornando o contador como sendo a quantidade de caracteres, já que
  153.     // as strings no C são um array de caracteres que terminam com zero
  154.     int tf = strlen(texto);
  155.     int tp = strlen(palavra);
  156.    
  157.     int maximoPalavras = 100;
  158.     int codigosPalavrasEncontradas[100];
  159.    
  160.     int quantidadePalavrasEncontradas = 0;
  161.    
  162.     char palavraTemporaria[256];
  163.     int indiceProximaPalavra = 0;
  164.        
  165.     char bufferSaida[256];
  166.    
  167.     int indiceFimUltimaFrase = 0;
  168.    
  169.     do {
  170.         bool fimFrase = false;
  171.        
  172.         indiceProximaPalavra = proximaPalavra(indiceProximaPalavra,
  173.         texto,tf,palavraTemporaria,255,&fimFrase);
  174.        
  175.         int codPalavra = codigoPalavra(palavraTemporaria,false,false,true);
  176.        
  177.         sprintf(bufferSaida,"novaPalavra(%d):%s\n",
  178.         codPalavra,palavraTemporaria);
  179.        
  180.         printf(bufferSaida);
  181.        
  182.         codigosPalavrasEncontradas[quantidadePalavrasEncontradas] = codPalavra;
  183.         quantidadePalavrasEncontradas++;
  184.        
  185.         if (fimFrase){
  186.            printf("nova frase");
  187.            printf("\n");
  188.            indiceProximaPalavra++;
  189.            indiceFimUltimaFrase = indiceProximaPalavra;
  190.         }
  191.     }
  192.     while ((indiceProximaPalavra > 0)
  193.     && (indiceProximaPalavra < tf)
  194.     && (quantidadePalavrasEncontradas < maximoPalavras));
  195.    
  196.    
  197.    
  198.     // nesse ponto, o texto pode ser analisado de uma maneira mais rápida
  199.     // utilizando só os metadados (as estruturas de dados) que mantém as referências
  200.     // às palavras e talvez com o acréscimo de mais dados que mantenham informações
  201.     // sobre parágrafos em vez de somente sobre palavras, aprimorando os dados gereados
  202.     // e facilitando as análises seguintes
  203.     // no estado em que está, esses metadados já permitem que seja feita uma
  204.     // análise mais rápida da recorrência de uma palavra
  205.     // sem que seja necessário reprocessar os dados
  206.    
  207.     system("PAUSE");
  208.     return EXIT_SUCCESS;
  209. }
  210. /**/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement