Advertisement
Guest User

Código C Eri

a guest
Oct 22nd, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.15 KB | None | 0 0
  1. /*
  2.     Rodolfo Poloni Andrietta - 205474 - MC102 Z
  3.     Descrição:
  4. */
  5.  
  6. /* @@@@@@@@@@ Não posso retornar mais de uma coisa por função @@@@@@@@@@@@ */
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10. //#include "lab07.h"
  11.  
  12. #define MARCADORES {"ontem", "hoje", "amanha", "agora", "logo", "cedo", "tarde", "breve", "nunca", "sempre", "jamais"}
  13. #define TAM_MARCADORES 7 /*Define tamanho máximo de um marcador temporal*/
  14. #define N_MARCADORES 11 /*Define o número de marcadores temporais*/
  15.  
  16. #define TAMANHO_FRASE 251
  17.  
  18.  
  19. void minusculas(char s[]){
  20.     int i, j;
  21.     for (i = 0, j = 0; s[i] != '\0'; i++) {
  22.         if (s[i] >= 'A' && s[i] <= 'Z') s[j++] = s[i]-'A'+'a';
  23.         else if ((s[i] >= 'a' && s[i] <= 'z') || s[i] == ' ') s[j++] = s[i];
  24.     }
  25.     s[j] = '\0';
  26. }
  27.  
  28. /* Objetivo: função que extrai a proxima palavra da frase de entrada a partir do índice início.
  29.  *
  30.  * Entrada: - a string frase que será analisada
  31.  *          - a string palavra onde vai ser copiada a palavra encontrada
  32.  *          - um inteiro que representa o índice do início da palavra na frase
  33.  * Saida:   devolve -1 se a string s chegou ao fim, caso contrário, devolve o índice de início da próxima palavra
  34.  */
  35. int proxima_palavra(char linhaDaFrase[], char palavra[], int inicio){
  36.    
  37.     int i;
  38.     int j;
  39.     int varReturn=0;
  40.  
  41.     for(i=inicio,j=0;i<TAMANHO_FRASE && linhaDaFrase[i]!=' ' && linhaDaFrase[i]!= '\0';i++,j++){
  42.        
  43.         palavra[j]=linhaDaFrase[i];
  44.        
  45.     }
  46.     palavra[j]='\0';
  47.     if(i<TAMANHO_FRASE || linhaDaFrase[i]=='\0')
  48.         varReturn = -1;
  49.     else
  50.         varReturn = i+1;
  51.  
  52. return varReturn;
  53. }
  54.  
  55.  
  56. /* Objetivo: verifica se palavra de entrada é um marcador temporal.
  57.  *
  58.  * Entrada: - recebe a matriz de marcadores temporais marcVetor;
  59.  *          - e a palavra a ser analisada palavra.
  60.  * Saida:   Se a palavra for um marcador, devolve o índice correspondente em marcVetor, senão devolve -1
  61.  */
  62. int verifica_marcador(char marcVetor[][TAM_MARCADORES], char palavra[]){
  63.  
  64.    
  65.     int i=0;
  66.     int varReturn=0;
  67.    
  68.     for(i=0;i<=10;i++){
  69.        
  70.         if(strcmp(palavra, marcVetor[i]) == 0){ /* Se for um marcador temporal, retorno a posição (i) dela */
  71.             varReturn = i;
  72.         } else {
  73.             varReturn = -1;
  74.         }
  75.     }
  76. return varReturn;
  77. }
  78.  
  79.  
  80. /* Função que eu estou criando. @@@@ Preciso colocar as variáveis certas ainda @@@@
  81.  * Objetivo: fazer todo o cálculo de ocorrência da palavra de busca.
  82.  *
  83.  * Saída: nada, função void, ela vai calcular e imprimir o valor.
  84.  */
  85. /*
  86. void calculoOcorrencia(char palavra[], char marcVetor[][TAM_MARCADORES], int contadoraSimultanea, int contadoraOcorrencia){
  87.    
  88.     int i, porcentagem = 0;
  89.    
  90.     porcentagem = (int)(contadoraSimultanea*100)/contadoraOcorrencia;
  91.  
  92.    
  93.     printf("%s se relaciona com %s em %d %% das ocorrencias", palavra, marcVetor[i], porcentagem);
  94. }
  95. */
  96.  
  97. /* Função que eu estou criando
  98.  *
  99.  *
  100.  *
  101. */
  102.                             //palavra,frase,nFrases,palavraBusca,x)
  103. int contadoraOcorrencia(char palavra[], char frase[][251], int nFrases, char palavraBusca[], int i){
  104.    
  105.     int x=0,y=0;
  106.     char linhaFrase[251];
  107.     int jaSomei, inicio;
  108.    
  109.     for(y=0;y<=nFrases;y++){
  110.         while(frase[y][x]!='\n'){
  111.             strcpy(linhaFrase,frase[y]);
  112.             x++;
  113.         }
  114.         minusculas(linhaFrase);
  115.        
  116.         int totalOcorrencia=0;
  117.        
  118.         inicio = 0;
  119.         jaSomei=0;
  120.         while(proxima_palavra(linhaFrase,palavra,inicio) != -1){ /* inicio começa em zero */
  121.             inicio = proxima_palavra(linhaFrase,palavra,inicio);
  122.             if(strcmp(palavra,palavraBusca)==0){
  123.                 if(jaSomei=0){
  124.                     totalOcorrencia++;
  125.                     jaSomei = 1;
  126.                 }
  127.             }
  128.         }
  129.         return totalOcorrencia;
  130.         //Preciso inicialmente encontrar quantas vezes uma palavra de busca aparece no texto inteiro
  131.         /*
  132.         for(i=0; i <= tamF - tamP; i++){ //Para cada possível posição de início
  133.             j=0;
  134.             while(j<tamP && palavra[j] == linhaFrase[i+j]) //Testa se palavra ocorre
  135.                 j++;
  136.             if(j==tamP) //Se verdadeiro a palavra ocorre na pos. i
  137.                 contadoraOcorrencia++;
  138.         }
  139.         */
  140.     }
  141. //return totalOcorrencia;
  142. }
  143.  
  144.  
  145. /* Função que eu estou criando
  146.  *
  147.  *
  148.  *
  149. */
  150.                                
  151. void contadoraSimultanea(char palavra[], char frase[][251], int nFrases, int inicio, char marcVetor[][TAM_MARCADORES], int contadoraOcorrencia){
  152.    
  153.     int a=0, b=0, n=0;
  154.     char linhaDaFrase[251];
  155.     char marcadorAchado[100][20];
  156.     //int flagM[N_MARCADORES];
  157.     int i, porcentagem = 0;
  158.     int v = 0;
  159.     int matrizOcorrencia[N_MARCADORES];
  160.     int j, h=0;
  161.     int contadoraSimultanea=0;
  162.     int inicio2 = 0;
  163.     int k=0;
  164.  
  165.  
  166.     for(h=0;h<N_MARCADORES;h++){
  167.         matrizOcorrencia[h]=0;
  168.     }
  169.    
  170.     linhaDaFrase[0]='\0';
  171.    
  172.     //Preciso colocar dentro desse FOR pra ele ir pegando cada linha
  173.     for(a=0;a<=nFrases;a++){
  174.         for(b=0;b<=251;b++){
  175.             while(frase[a][b]!='\n' || frase[a][b]!='\0'){ //Isso vai funcionar pra última linha da frase?
  176.                 strcpy(linhaDaFrase,frase[a]); //Estou copiando a linha toda ou só uma posição?
  177.             }
  178.            
  179.             minusculas(linhaDaFrase);
  180.            
  181.             int tamF = strlen(linhaDaFrase) - 1; /* O -1  ´e pelo ’\n’ */
  182.             int tamP = strlen(palavra);
  183.            
  184.            
  185.             //Preciso inicialmente encontrar quando uma palavra de busca aparece no texto
  186.             for(i=0; i <= tamF - tamP; i++){ //Para cada possível posição de início
  187.                 j=0;
  188.                 while(j<tamP && palavra[j] == linhaDaFrase[i+j]) //Testa se palavra ocorre
  189.                     j++;
  190.                 if(j==tamP){ //Se verdadeiro a palavra ocorre na pos. i
  191.                     //Agora preciso ver se na mesma linha (linha a), se tenho um marcador temporal
  192.                     inicio2 = 0;
  193.                     while(proxima_palavra(linhaDaFrase,palavra,inicio2) != -1){
  194.                         inicio2 = proxima_palavra(linhaDaFrase,palavra,inicio2);
  195.                        
  196.                         if(verifica_marcador(marcVetor,palavra)==0 ){
  197.                             /* Então a palavra é um marcador temporal */
  198.                             k = verifica_marcador(marcVetor,palavra);
  199.                             matrizOcorrencia[k]++; /* Aqui somo mais um no valor que já se encontra na matriz*/
  200.                         }
  201.                     }
  202.                 }
  203.             }
  204.         }
  205.     }
  206.  
  207.  
  208.    
  209.    
  210.  
  211.     for(v=0;v<N_MARCADORES;v++){
  212.         contadoraSimultanea = matrizOcorrencia[v];
  213.         if(contadoraSimultanea!=0){
  214.             porcentagem = (int)((contadoraSimultanea*100)/contadoraOcorrencia);
  215.             printf("%s se relaciona com %s em %d %% das ocorrencias", palavra, matrizOcorrencia[v], porcentagem);
  216.         } else {
  217.             printf("%s nao se nao se relacionou com nenhum marcador temporal", palavra);
  218.         }
  219.     }
  220. }
  221.  
  222.  
  223.  
  224.  
  225.                     /* -------------------------------------------------------- */
  226.  
  227.  
  228.  
  229.  
  230. int main(){
  231.    
  232.     //entrada do programa: nº de frases, as frases (uma em cada linha), nº de palavras de busca, as palavras-de-busca (uma em cada linha)
  233.     char frase[50][251];
  234.     char palavraBusca[100][100];
  235.     char marcVetor[N_MARCADORES][TAM_MARCADORES] = MARCADORES;
  236.     int nFrases, nPalavrasBusca;
  237.     int x=0, y=0, z=0, g=0;
  238.     char palavra[100];
  239.     int tamanhoFrase = 0;
  240.     char linhaDaFrase[251];
  241.     char palavraNaFrase[100];
  242.     int inicio = 0;
  243.     int i = 0;
  244.     int contOcorrencia = 0, contSimultanea = 0;
  245.    
  246. /* Coletando e imprimindo os dados digitados para testar */
  247.     scanf("%d ", &nFrases);
  248.     //getchar(); /* pra tirar o \n que acaba pegando */
  249.     for(x=0;x<nFrases;x++){
  250.         fgets(frase[x], 251, stdin);
  251.     }
  252.     scanf("%d", &nPalavrasBusca);
  253.     getchar(); /* pra tirar o \n que acaba pegando */
  254.     for(x=0;x<nPalavrasBusca;x++){
  255.         fgets(palavraBusca[x], 100, stdin);
  256.     }
  257.     /* Impressao */
  258.     printf("%d\n", nFrases);
  259.     for(x=0;x<nFrases;x++){
  260.         printf("\nCarregou ...: %s", frase[x]);
  261.     }
  262.     printf("%d\n", nPalavrasBusca);
  263.     for(x=0;x<nPalavrasBusca;x++){
  264.         printf("\nCarregou ...: %s", palavraBusca[x]);
  265.     }
  266.    
  267.    
  268. /* Relacional */
  269.    
  270.     for(y=0; y<nFrases; y++){
  271.  
  272.         printf("\n processando a frase: %s", frase[y]);
  273.  
  274.         /*Esse for abaixo, está certo pra guardar uma linha da frase inserida? */
  275. //        for(g=0;frase[y][g]!='\n' || frase[y][g]!= '\0';g++){ //Esse OR vai funcionar pra última linha?
  276. //           // strncpy(linhaDaFrase,frase[y],251); //Posso fazer sem strcpy neste caso? Posso --- botar strncpy
  277. //            strcpy(linhaDaFrase,frase[y]);
  278. //        }
  279.         strcpy(linhaDaFrase,frase[y]);
  280.  
  281.         //linhaDaFrase[g]='\0'; /* Indicação do fim da char */
  282.  
  283.         minusculas(linhaDaFrase);
  284.        
  285.         printf("\nLinha da frase: %s", linhaDaFrase);
  286.      
  287.         /* Quando eu chamo a função outras vezes, esse inicio tá sendo passado corretamente? */
  288.         inicio = 0;
  289.         while(proxima_palavra(linhaDaFrase,palavra,inicio) != -1){ /* inicio começa em zero */
  290.             inicio = proxima_palavra(linhaDaFrase,palavra,inicio);
  291.         printf("\npalavra: %s", palavra);
  292.         printf("\ninicio: %s", inicio);
  293.             /* Na variável "palavra" tenho a palavra */
  294.             for(x=0;x<nPalavrasBusca;x++){
  295.                 if(strcmp(palavra,palavraBusca[x])==0){ /* Se igual a 0, tenho palavra = palavraBusca */
  296.         printf("\nfoi processar contadoraOcorrencia");
  297.                    contOcorrencia = contadoraOcorrencia(palavra,frase,nFrases,palavraBusca[x],x);
  298.         printf("\nfoi processar contadoraSimultanea");
  299.                    contadoraSimultanea(palavra,frase,nFrases,inicio,marcVetor,contOcorrencia);
  300.                    //calculoOcorrencia(palavra,marcVetor,contSimultanea,contOcorrencia);
  301.                 }
  302.             }
  303.         }
  304.     }  
  305.    
  306.        
  307. /* Vetor de ocorrências */
  308.    
  309.     return 0;
  310.  
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement