Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2014
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.76 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<ctype.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. #include<unistd.h>
  6.  
  7. //TP1 - AEDSII 2014 - Professor Adriano - Alunos: Luís Pedro Drummond e Paulo Felipe Tupina
  8.  
  9. typedef struct celula *apontador;
  10.  
  11. typedef struct lista_palavras {
  12.     apontador primeiro, ultimo;
  13. }lista_palavras;
  14.  
  15. struct palavra{ //essa é uma cédula da lista de palavras. ela contém as informações sobre a palavra e, caso a palavra se repita, ela contém uma struct contendo as demais informações sobre ocorrência da palavra
  16.   char palavra[20]; //aqui vem a palavra
  17.   int indice[20]; //salva o indice da palavra para depois achar a menor ocorrencia.
  18.   int ocorrencia; //aqui vem sua ocorrencia no texto inteiro
  19.   int paragrafo; //salva o paragrafo da palavra para depois achar a menor ocorrencia.
  20.   int linhas[100]; //aqui vem as linhas onde há ocorrencia
  21.   int distancia;
  22.   int sw;
  23. }palavra;
  24.  
  25. typedef struct celula {
  26.   struct palavra word;
  27.   apontador prox;
  28. }celula;
  29.  
  30. void crialista(lista_palavras *Lista){
  31.   Lista->primeiro = (apontador) malloc(sizeof(celula));
  32.   Lista->ultimo = Lista->primeiro;
  33.   Lista->primeiro->prox = NULL;
  34. }
  35.  
  36. void *inserir_final(struct palavra x, lista_palavras *Lista){
  37.   Lista->ultimo->prox = (apontador) malloc(sizeof(celula));
  38.   Lista->ultimo = Lista->ultimo->prox;
  39.   Lista->ultimo->word = x;
  40.   Lista->ultimo->prox = NULL;
  41.  }
  42.  
  43. void minuscula(char palavra[],int maxi){ //converte palavras para minuscula e retira os acentos
  44. int i=0,j=0,k=0;
  45. for(i=0;i<maxi;i++){
  46.     palavra[i]=tolower(palavra[i]);
  47.     }
  48. for(j=0;j<maxi;j++){
  49.   //printf("%c = %d\n",palavra[j],palavra[j]);
  50.   //if(palavra[j]==-61 && palavra[j+1]==-95||palavra[j+1]==-127||palavra[j+1]==-96||palavra[j+1]==-94||palavra[j+1]==-126||palavra[j+1]==-128||palavra[j+1]==-93||palavra[j+1]==-125||palavra[j+1]==-92||palavra[j+1]==-124){
  51.   if((palavra[j]==-95)||(palavra[j]==-96)||(palavra[j]==-128)||(palavra[j]==-127)){
  52.     palavra[j-1]='a';
  53.     k=j;
  54.     while(k<=strlen(palavra)){
  55.       palavra[k]=palavra[k+1];
  56.       k++;
  57.     }
  58.     palavra[k] = '\0';
  59.   }
  60.  
  61.   //if(palavra[j]==-61 && palavra[j+1]==-87||palavra[j+1]==-119||palavra[j+1]==-88||palavra[j+1]==-68||palavra[j+1]==-120||palavra[j+1]==-85||palavra[j+1]==-117||palavra[j+1]==-86||palavra[j+1]==-118||palavra[j+1]==-124){
  62.   if((palavra[j]==-87)||(palavra[j]==-88)||(palavra[j]==-119)||(palavra[j]==-120)){
  63.     palavra[j-1]='e';
  64.     k=j;
  65.     while(k<=strlen(palavra)){
  66.       palavra[k]=palavra[k+1];
  67.       k++;
  68.       }
  69.       palavra[k] = '\0';
  70.   }
  71.  
  72.   //if(palavra[j]==-61 && palavra[j+1]==-83||palavra[j+1]==-115||palavra[j+1]==-84||palavra[j+1]==-116||palavra[j+1]==-81||palavra[j+1]==-113||palavra[j+1]==-82||palavra[j+1]==-114){
  73.   if((palavra[j]==-83)||(palavra[j]==-84)||(palavra[j]==-115)||(palavra[j]==-116)){
  74.     palavra[j-1]='i';
  75.     k=j;
  76.     while(k<=strlen(palavra)){
  77.       palavra[k]=palavra[k+1];
  78.       k++;
  79.     }
  80.     palavra[k] = '\0';
  81.  
  82.   }
  83.  
  84.   //if(palavra[j]==-61 && palavra[j+1]==-77||palavra[j+1]==-109||palavra[j+1]==-78||palavra[j+1]==-110||palavra[j+1]==-74||palavra[j+1]==-106||palavra[j+1]==-108||palavra[j+1]==-76){
  85.   if((palavra[j]==-77)||(palavra[j]==-78)||(palavra[j]==-109)||(palavra[j]==-110)){
  86.     palavra[j-1]='o';
  87.     k=j;
  88.     while(k<=strlen(palavra)){
  89.       palavra[k]=palavra[k+1];
  90.       k++;
  91.       }
  92.     palavra[k] = '\0';
  93.  
  94.   }
  95.  
  96.   //if(palavra[j]==-61 && palavra[j+1]==-102||palavra[j+1]==-70||palavra[j+1]==-78||palavra[j+1]==-71||palavra[j+1]==-103||palavra[j+1]==-100||palavra[j+1]==-69){
  97.   if((palavra[j]==-70)||(palavra[j]==-71)||(palavra[j]==-102)||(palavra[j]==-103)){
  98.     palavra[j-1]='u';
  99.     k=j;
  100.     while(k<=strlen(palavra)){
  101.         palavra[k]=palavra[k+1];
  102.          k++;
  103.     }
  104.      palavra[k] = '\0';
  105.    }
  106.   }
  107. }
  108.  
  109.  
  110. void remove_ret(char palavra[],int maxi){ //converte palavras para minuscula
  111. int i=0,j=0;
  112. for(i=0;i<maxi;i++){
  113.   if(palavra[i]==46&&palavra[i+1]==46){ // Verifica se existem dois pontos seguidos
  114.     for (j=i+1;j<maxi;j++){
  115.      palavra[j]=palavra[j+1];
  116.       i=0;
  117.       }
  118.     }
  119.   }
  120. }
  121.  
  122.  
  123. void Ordena(lista_palavras *lista){
  124. apontador aux,aux2;
  125. struct palavra k;
  126.   for(aux=lista->primeiro->prox;aux!=NULL;aux=aux->prox){
  127.     for(aux2=aux->prox;aux2!=NULL;aux2=aux2->prox){
  128.       if(strcmp(aux->word.palavra,aux2->word.palavra)==1){
  129.         k=aux->word;
  130.         aux->word=aux2->word;
  131.         aux2->word=k;
  132.         }
  133.       }
  134.    }
  135. }
  136.  
  137.  
  138. void imprime_lista(lista_palavras Lista, FILE *saida){
  139. int i;
  140. apontador Aux;
  141. Aux = Lista.primeiro->prox;
  142. while(Aux != NULL){
  143.   fprintf(saida,"Palavra: %s\nOcorrencias:%d \nLinhas:", Aux->word.palavra,Aux->word.ocorrencia);
  144.     for(i=0;Aux->word.linhas[i]!='\0';i++){
  145.         fprintf(saida,"%d, ", Aux->word.linhas[i]);
  146.     }
  147.     fprintf(saida,"\n\n");
  148. Aux = Aux->prox;
  149. }
  150. }
  151.  
  152. void remove_repetido(apontador primeiro){
  153. apontador atual = primeiro;  //ponteiro que vai atravessar a lista
  154. apontador prox_prox; //ponteiro para armazenar o apontador do proximo a ser deletado
  155. int i=1;
  156. if(atual == NULL)
  157.      return;
  158. while(atual->prox != NULL){
  159.   if(strcmp(atual->word.palavra,atual->prox->word.palavra)==0){
  160.     atual->word.ocorrencia++;
  161.     atual->word.indice[i] = atual->prox->word.indice[0];
  162.     atual->word.linhas[i] = atual->prox->word.linhas[0];
  163.     atual->word.linhas[i+1] = '\0';
  164.     i++;
  165.     prox_prox = atual->prox->prox;
  166.     free(atual->prox);
  167.     atual->prox = prox_prox;
  168.     //atual->word.distancia = (calcula_distancia(atual->word.indice));
  169.   }
  170.   else{
  171.     atual = atual->prox;
  172.     i=1;
  173.     }
  174.   }
  175. }
  176.  
  177. /*int calcula_distancia(int * numeros){
  178. int i=0,j=0,n=0,c=0,d=0,t=0,zero=0,comp=1;
  179. int resultado[100]={0};
  180. while(numeros[comp]!=NULL) comp++;  //calcula o comprimento do vetor
  181. for(i=0;i<comp;i++){
  182.     for(j=i+1;j<comp;j++){ //cria todas as possíveis distâncias entre os elementos do vetor
  183.         if(numeros[i]>numeros[j]) resultado[n]=numeros[i]-numeros[j];
  184.         if(numeros[i]<numeros[j]) resultado[n]=numeros[j]-numeros[i];
  185.         n++;
  186.     }
  187. }
  188. for(c=0;c<(n);c++){ //faz um bubble sort na lista de distancias
  189.     for(d=0;d<n-c-1;d++){
  190.         if(resultado[d]>resultado[d+1]){
  191.         t=resultado[d];
  192.         resultado[d]=resultado[d+1];
  193.         resultado[d+1]=t;
  194.       }
  195.     }
  196.   }
  197. while(resultado[zero]==0) zero++; //se a menor distancia valer 0, descarta
  198. return resultado[zero];
  199. }*/
  200.  
  201. int stopword(char palavra[]){
  202. char sws[10][5]={"a","as","o","os","um","umas","uns","uma","ou","e"};
  203. int i;
  204. for (i=0;i<10;i++){
  205.   if (strcmp(palavra,sws[i])==0)
  206.     return 1;
  207.   }
  208.    return(0);
  209. }
  210.  
  211. int main(int argc, char **argv){
  212. char *entrada_getopt = NULL;
  213. char *saida_getopt = NULL;
  214. int i=0, linhas=0, paragrafos=0, frases=0, tamanho=0, indice=0, indice_geral=0, palavras=0, sw=0, cont=0, nostop=0, k=0;
  215. struct lista_palavras LISTA;
  216. char linha[800]={'\0'};
  217. char str[800]={'\0'};
  218. char * pch;
  219. char linhac[800]={'\0'};
  220. char palavra[800]={'\0'};
  221. int index;
  222. int opcao;
  223. FILE *texto;
  224. FILE *saida;
  225. opterr = 0;
  226. while ((opcao = getopt (argc, argv, "i: o:")) != -1)
  227.   switch (opcao){
  228.  
  229.     case 'i':
  230.     entrada_getopt = optarg;
  231.     break;
  232.  
  233.     case 'o':
  234.       saida_getopt = optarg;
  235.       if(strcmp(entrada_getopt,saida_getopt)==0){
  236.         printf("Os arquivos de entrada/saida nao podem ter o mesmo nome!\n");
  237.         return 0;
  238.         }
  239.     break;
  240.  
  241.     case '?':
  242.       if (optopt == 'c')
  243.         fprintf (stderr, "Opcao -%c requer um argumento\n", optopt);
  244.       else if (isprint (optopt))
  245.         fprintf (stderr, "Opcao desconhecida `-%c'.\n", optopt);
  246.       else
  247.         fprintf (stderr,"Caractere desconhecido `\\x%x'.\n",optopt);
  248.       return 1;
  249.  
  250.       default:
  251.         abort ();
  252.     return 0;
  253. }
  254.  
  255. texto = fopen(entrada_getopt,"r"); //define arquivo de entrada
  256. saida = fopen(saida_getopt,"w"); //define arquivo de saida
  257.  
  258. if(texto == NULL){
  259.   printf("O arquivo nao existe!\n");
  260.   system("pause");
  261.   return(0);
  262. }
  263.  
  264. crialista(&LISTA);
  265.  
  266. while(1){
  267.   fgets(linha,999,texto); //pega a linha inteira
  268.   if(strlen(linha)==1 && linha[0]=='\n'){
  269.     frases=0;
  270.     indice=0;
  271.     palavras=0;
  272.     sw=0;
  273.     paragrafos++; //conta o número de parágrafos
  274.   }
  275.  
  276.       if(strlen(linha)!=1){
  277.         tamanho=strlen(linha); //calcula o tamanho da linha
  278.         minuscula(linha,tamanho); //converte a linha para minuscula e remove os acentos
  279.         remove_ret(linha,tamanho);
  280.         strcpy(str,linha);
  281.         //printf("%s",linha); //exibe linha convertida. SERVE APENAS PARA VERIFICAR QUE FOI CONVERTIDA
  282.         if(feof(texto)) break; //sai fora quando o texto terminar
  283.  
  284.         while(linha[i]!='\0'){
  285.           if(linha[i]=='.' || linha[i]=='!' || linha[i]=='?'){
  286.             //printf("\nFrase %d: %d palavras e %d stop words",frases+1,palavras,sw);
  287.             frases++; //conta frases
  288.           }
  289.           i++;
  290.         }
  291.  
  292.         i=0;
  293.         struct palavra temp; //struct de palavra que vai ser usada temporariamente pra armazenar a informação
  294.         pch=strtok(str," ,.-!"); //pega a palavra e joga na string
  295.  
  296.         while(pch!=NULL){//se a função strtok achar um caracter que separa palavras, ela volta nulo, parando o loop
  297.           stopword(pch);
  298.           if(stopword(pch)==1){ //Verifica as stopwords
  299.             sw++;
  300.           }
  301.           else{
  302.             //printf("palavra %d: %s. Palavras: %d e Stop words: %d\n",indice+1,pch,palavras,sw);
  303.             strcpy(temp.palavra,pch); //pega a palavra temporariamente
  304.             temp.linhas[0]=linhas;//pega as linhas temporariamente
  305.             temp.linhas[1]='\0';
  306.             temp.indice[0]=indice;
  307.             temp.paragrafo=paragrafos;//pega o paragrafo temporariamente
  308.             temp.ocorrencia=1;
  309.             temp.distancia=0;
  310.             inserir_final(temp,&LISTA);//passa a struct temporaria pra função que vai adicionar ela no ultimo lugar da lista.
  311.  
  312.             strcpy(temp.palavra,"\0"); //limpa o campo palavra da struct
  313.             }
  314.           pch=NULL;
  315.           pch=strtok(NULL," ,.-!\n"); //armazena proxima palavra
  316.           indice++;
  317.         }
  318.       }
  319.  
  320.     linhas++; //conta o numero de linhas
  321.  
  322.     if(frases!=0){
  323.       printf("\n\nParagrafo %d \nInicio na linha: %d, Frases: %d",paragrafos+1,linhas,frases);
  324.       //printf("\nFrase %d: %d palavras e %d stop words\n",frases+1,palavras,sw);
  325.       cont=frases;
  326.       for(cont=0;cont<frases;cont++){
  327.         nostop = (indice-sw);
  328.         printf("\nFrase %d: palavras (considerando stop words):%d palavras (ignorando stop words):%d\n",cont+1,indice,nostop);
  329.       }
  330.     }
  331.    }
  332.  
  333. printf("\n");
  334. Ordena(&LISTA);
  335. remove_repetido(LISTA.primeiro);
  336. fprintf(saida,"\n** INFORMACOES SOBRE AS PALAVRAS **\n\n");
  337. imprime_lista(LISTA,saida);
  338.    //printf("\n\nTexto tem %d linhas e %d paragrafos e %d palavras\n", linhas, paragrafos, indice); /*TEM QUE FAZER FUNÇAO PARA CONTAR FRASES*/
  339. fclose(texto);
  340. fclose(saida);
  341. system("pause");
  342. return(0);
  343. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement