Advertisement
CaduUnb

ComparaArquivo.c

Mar 30th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.65 KB | None | 0 0
  1. /*
  2. Produto interno sem ordenar: 505
  3. Produto interno ordenando:   520
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #include <math.h>
  10.  
  11. #define PI 3.141592653
  12. typedef char string[30];
  13. typedef struct celula
  14. {
  15.     int frequencia;
  16.     string palavra;
  17.     struct celula* prox;
  18. }celula;
  19. //Functions Declaration
  20. FILE    *abreArquivo(int num_arquivo);
  21. void    criaResultado(celula* ptrLista1, celula* ptrLista2);
  22. celula  *iniciaLista();
  23. void    insert(celula *list, string newWord);
  24. void    findsWord(celula *ptrLista, string WordFromFile);
  25. void    liberaLista(celula *list);
  26. double  moduloVetorial(celula* ptrLista);
  27. celula* OrdenaDecrescente(celula* ptrLista);
  28. int     produtoEscalar(celula *ptrLista1, celula *ptrLista2);
  29. int     tamanhoLista(celula* ptrLista);
  30.  
  31. // float compPlagio(){} //Vai ser a funcao de acos;
  32.  
  33. int main()
  34. {
  35.     string pal_arquivo;
  36.     FILE *arq1, *arq2;
  37.     celula *ptrLista1, *ptrLista2;
  38.     arq1 = abreArquivo(1);
  39.     if (arq1==NULL)
  40.     {
  41.         printf("Nao foi possivel abrir o arquivo\n");
  42.         return EXIT_FAILURE;
  43.     }
  44.     ptrLista1 = iniciaLista();
  45.     while((fscanf(arq1, "%s", pal_arquivo))!= EOF)
  46.         findsWord(ptrLista1, pal_arquivo);
  47.    
  48.     fclose (arq1);
  49.     int tamanho;
  50.     tamanho = tamanhoLista(ptrLista1);
  51.     printf("Tamanho da lista criada para o arquivo 1:   %d\n", tamanho);
  52.  
  53.     arq2 = abreArquivo(2);
  54.     if (arq2==NULL)
  55.     {
  56.         printf("Nao foi possivel abrir o arquivo\n");
  57.         return EXIT_FAILURE;
  58.     }
  59.     ptrLista2 = iniciaLista();
  60.     while((fscanf(arq2, "%s", pal_arquivo))!= EOF)
  61.         findsWord(ptrLista2, pal_arquivo);
  62.     fclose (arq2);
  63.     tamanho = tamanhoLista(ptrLista2);
  64.     printf("Tamanho da lista criada para o arquivo 2:   %d\n", tamanho);
  65.     sleep(1);
  66.  
  67.     //Ordena as listas por frequencia
  68.     ptrLista1 = OrdenaDecrescente(ptrLista1);
  69.     ptrLista2 = OrdenaDecrescente(ptrLista2);
  70.     printf("Listas ordenadas.\n");
  71.     sleep(1);
  72.  
  73.     //Calcula o angulo entre os vetores-lista
  74.     criaResultado(ptrLista1, ptrLista2);
  75.     liberaLista(ptrLista1);
  76.     liberaLista(ptrLista2);
  77.     return 0;
  78. }
  79.  
  80. //lib.
  81. FILE* abreArquivo (int num_arquivo)
  82. {
  83.     string nome;
  84.     FILE *fp;
  85.     printf("Digite o nome do arquivo %d:\n", num_arquivo);
  86.     scanf("%s", nome);
  87.     fp = fopen(nome, "r");
  88.     if (fp==NULL)
  89.         return NULL;
  90.     return fp;
  91. }
  92. void criaResultado(celula* ptrLista1, celula* ptrLista2)
  93. {
  94.     FILE* fp;
  95.     char arquivo[] = "compararDoc.txt";
  96.     fp = fopen(arquivo, "w+");
  97.     double angulo, modulo, razao;
  98.     int produto;
  99.     produto = produtoEscalar(ptrLista1, ptrLista2);
  100.     modulo = (moduloVetorial(ptrLista1))*(moduloVetorial(ptrLista2));
  101.     razao = produto/modulo;
  102.     angulo = acos(razao);
  103.     fprintf(fp, "Tamanho das listas criadas:\n1)%d palavras;\n",tamanhoLista(ptrLista1));
  104.     fprintf(fp, "2)%d palavras\n", tamanhoLista(ptrLista2));
  105.     fprintf(fp, "Produto interno das listas:    %d\n", produto);
  106.     fprintf(fp, "Produto dos modulos: %.5lf\n", modulo);
  107.     fprintf(fp, "Produto/Modulo:    %lf\nAngulo entre vetores:  %.3lf radianos\n", razao, angulo);
  108.     //Mostra resultado no terminal.
  109.     if(angulo <= PI/4)
  110.         printf("Alerta: os arquivos sao extremamente semelhantes, configurando plagio.\n");
  111.     else
  112.         printf("Os arquivos sao diferentes. Yay! :)\n");
  113.    
  114.     fprintf(fp, "\nLista de palavras com suas respectivas frequencias.\n--Lista 1 ordenada.\nFrequencia     ||  Palavras\n");
  115.     while(ptrLista1!=NULL)
  116.     {
  117.         if(strcmp(ptrLista1->palavra, "CabecaDaLista")==0)
  118.         {
  119.             ptrLista1=ptrLista1->prox;
  120.             continue;
  121.         }
  122.         fprintf(fp, "%d                 %s\n", ptrLista1->frequencia, ptrLista1->palavra);
  123.         ptrLista1=ptrLista1->prox;
  124.     }
  125.     fprintf(fp, "--Lista 2 ordenada.\nFrequencia    ||  Palavras\n");
  126.     while(ptrLista2!=NULL)
  127.     {
  128.         if(strcmp(ptrLista2->palavra, "CabecaDaLista")==0)
  129.         {
  130.             ptrLista2=ptrLista2->prox;
  131.             continue;
  132.         }
  133.         fprintf(fp, "%d                 %s\n", ptrLista2->frequencia, ptrLista2->palavra);
  134.         ptrLista2=ptrLista2->prox;
  135.     }
  136.     fclose(fp);
  137. }
  138. celula* iniciaLista()
  139. {
  140.     celula* ptrLista;
  141.     ptrLista = (celula*) malloc(sizeof(celula));
  142.     ptrLista->frequencia = 0;
  143.     strcpy(ptrLista->palavra, "CabecaDaLista");
  144.     ptrLista->prox = NULL; //fim da lista
  145.     return ptrLista;
  146. }
  147. void insert(celula* ptrLista, string novaPalavra)
  148. {  
  149.     celula* novoElemento;
  150.     novoElemento = (celula*) malloc(sizeof(celula));
  151.     novoElemento->frequencia = 1;
  152.     strcpy(novoElemento->palavra, novaPalavra);
  153.     novoElemento->prox = ptrLista->prox;
  154.     ptrLista->prox = novoElemento; 
  155. }
  156. void findsWord(celula *ptrLista, string WordFromFile)
  157. {
  158.     celula* finder;
  159.     finder = ptrLista;
  160.     while(finder != NULL && strcmp(WordFromFile, finder->palavra))
  161.     {
  162.         finder = finder->prox;
  163.     }
  164.     if(finder == NULL){
  165.         insert(ptrLista, WordFromFile);
  166.     }
  167.     else
  168.         finder->frequencia++;
  169. }
  170. void liberaLista(celula* list)
  171. {
  172.     if (list!=NULL)
  173.     {
  174.         liberaLista(list->prox);
  175.         free(list);
  176.     }
  177. }
  178. double moduloVetorial(celula *ptrLista)
  179. {
  180.     double modulo=0;
  181.     while(ptrLista!=NULL){
  182.         modulo += pow(ptrLista->frequencia, 2);
  183.         ptrLista = ptrLista->prox;
  184.     }
  185.     return sqrt(modulo);
  186. }
  187. celula* OrdenaDecrescente(celula* ptrLista)
  188. {
  189.     if(ptrLista == NULL || ptrLista == NULL)
  190.         return ptrLista; // the list is sorted.
  191.     //1- find largest node.
  192.     celula *curr, *largest, *largestPrev, *prev;
  193.     curr = ptrLista;
  194.     largest = ptrLista;
  195.     prev = ptrLista;
  196.     largestPrev = ptrLista;
  197.     while(curr != NULL) {
  198.         if(curr->frequencia > largest->frequencia) {
  199.             largestPrev = prev;
  200.             largest = curr;
  201.         }
  202.         prev = curr;
  203.         curr = curr->prox;
  204.     }
  205.     //2- switching firt node and largest node :
  206.     celula* tmp;
  207.     if(largest != ptrLista)
  208.     {
  209.         largestPrev->prox = ptrLista;
  210.         tmp = ptrLista->prox;
  211.         ptrLista->prox = largest->prox;
  212.         largest->prox = tmp;
  213.     }
  214.  
  215.     // now largest is the first node of the list.
  216.  
  217.     // calling the function again with the sub list;
  218.     //            list minus its first node.
  219.     largest->prox = OrdenaDecrescente(largest->prox);
  220.  
  221.  
  222.     return largest;
  223. }
  224. int produtoEscalar(celula *ptrLista1, celula *ptrLista2)
  225. {
  226.     int D1escalarD2 = 0;
  227.     celula *comp = ptrLista2;
  228.     //comparar as palavras da lista
  229.     while(ptrLista1->prox != NULL)//percorre a primeira lista, elemento por elemento
  230.     {
  231.         while(comp->prox!=NULL && (strcmp(ptrLista1->palavra, comp->palavra)!=0))
  232.             comp = comp->prox;
  233.         if (comp->prox == NULL)//Se não tem a palavra igual, o produto dessas componentes vale zero
  234.                 D1escalarD2 += 0;
  235.         else //Achou as palavras iguais, multiplica as frequencias
  236.                 D1escalarD2 += ptrLista1->frequencia*comp->frequencia;
  237.         ptrLista1 = ptrLista1->prox;
  238.         comp = ptrLista2;
  239.     }
  240.     return D1escalarD2;
  241. }
  242. int tamanhoLista(celula* ptrLista)
  243. {
  244.     int contador=0;
  245.     while(ptrLista!=NULL){
  246.         contador++;
  247.         ptrLista = ptrLista->prox;
  248.     }
  249.     return contador;
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement