Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Rodolfo Poloni Andrietta - 205474 - MC102 Z
- Descrição:
- */
- /* @@@@@@@@@@ Não posso retornar mais de uma coisa por função @@@@@@@@@@@@ */
- #include <stdio.h>
- #include <string.h>
- //#include "lab07.h"
- #define MARCADORES {"ontem", "hoje", "amanha", "agora", "logo", "cedo", "tarde", "breve", "nunca", "sempre", "jamais"}
- #define TAM_MARCADORES 7 /*Define tamanho máximo de um marcador temporal*/
- #define N_MARCADORES 11 /*Define o número de marcadores temporais*/
- #define TAMANHO_FRASE 251
- void minusculas(char s[]){
- int i, j;
- for (i = 0, j = 0; s[i] != '\0'; i++) {
- if (s[i] >= 'A' && s[i] <= 'Z') s[j++] = s[i]-'A'+'a';
- else if ((s[i] >= 'a' && s[i] <= 'z') || s[i] == ' ') s[j++] = s[i];
- }
- s[j] = '\0';
- }
- /* Objetivo: função que extrai a proxima palavra da frase de entrada a partir do índice início.
- *
- * Entrada: - a string frase que será analisada
- * - a string palavra onde vai ser copiada a palavra encontrada
- * - um inteiro que representa o índice do início da palavra na frase
- * Saida: devolve -1 se a string s chegou ao fim, caso contrário, devolve o Ãndice de inÃcio da próxima palavra
- */
- int proxima_palavra(char linhaDaFrase[], char palavra[], int inicio){
- int i;
- int j;
- int varReturn=0;
- for(i=inicio,j=0;i<TAMANHO_FRASE && linhaDaFrase[i]!=' ' && linhaDaFrase[i]!= '\0';i++,j++){
- palavra[j]=linhaDaFrase[i];
- }
- palavra[j]='\0';
- if(i<TAMANHO_FRASE || linhaDaFrase[i]=='\0')
- varReturn = -1;
- else
- varReturn = i+1;
- return varReturn;
- }
- /* Objetivo: verifica se palavra de entrada é um marcador temporal.
- *
- * Entrada: - recebe a matriz de marcadores temporais marcVetor;
- * - e a palavra a ser analisada palavra.
- * Saida: Se a palavra for um marcador, devolve o índice correspondente em marcVetor, senão devolve -1
- */
- int verifica_marcador(char marcVetor[][TAM_MARCADORES], char palavra[]){
- int i=0;
- int varReturn=0;
- for(i=0;i<=10;i++){
- if(strcmp(palavra, marcVetor[i]) == 0){ /* Se for um marcador temporal, retorno a posição (i) dela */
- varReturn = i;
- } else {
- varReturn = -1;
- }
- }
- return varReturn;
- }
- /* Função que eu estou criando. @@@@ Preciso colocar as variáveis certas ainda @@@@
- * Objetivo: fazer todo o cálculo de ocorrência da palavra de busca.
- *
- * Saída: nada, função void, ela vai calcular e imprimir o valor.
- */
- /*
- void calculoOcorrencia(char palavra[], char marcVetor[][TAM_MARCADORES], int contadoraSimultanea, int contadoraOcorrencia){
- int i, porcentagem = 0;
- porcentagem = (int)(contadoraSimultanea*100)/contadoraOcorrencia;
- printf("%s se relaciona com %s em %d %% das ocorrencias", palavra, marcVetor[i], porcentagem);
- }
- */
- /* Função que eu estou criando
- *
- *
- *
- */
- //palavra,frase,nFrases,palavraBusca,x)
- int contadoraOcorrencia(char palavra[], char frase[][251], int nFrases, char palavraBusca[], int i){
- int x=0,y=0;
- char linhaFrase[251];
- int jaSomei, inicio;
- for(y=0;y<=nFrases;y++){
- while(frase[y][x]!='\n'){
- strcpy(linhaFrase,frase[y]);
- x++;
- }
- minusculas(linhaFrase);
- int totalOcorrencia=0;
- inicio = 0;
- jaSomei=0;
- while(proxima_palavra(linhaFrase,palavra,inicio) != -1){ /* inicio começa em zero */
- inicio = proxima_palavra(linhaFrase,palavra,inicio);
- if(strcmp(palavra,palavraBusca)==0){
- if(jaSomei=0){
- totalOcorrencia++;
- jaSomei = 1;
- }
- }
- }
- return totalOcorrencia;
- //Preciso inicialmente encontrar quantas vezes uma palavra de busca aparece no texto inteiro
- /*
- for(i=0; i <= tamF - tamP; i++){ //Para cada possível posição de início
- j=0;
- while(j<tamP && palavra[j] == linhaFrase[i+j]) //Testa se palavra ocorre
- j++;
- if(j==tamP) //Se verdadeiro a palavra ocorre na pos. i
- contadoraOcorrencia++;
- }
- */
- }
- //return totalOcorrencia;
- }
- /* Função que eu estou criando
- *
- *
- *
- */
- void contadoraSimultanea(char palavra[], char frase[][251], int nFrases, int inicio, char marcVetor[][TAM_MARCADORES], int contadoraOcorrencia){
- int a=0, b=0, n=0;
- char linhaDaFrase[251];
- char marcadorAchado[100][20];
- //int flagM[N_MARCADORES];
- int i, porcentagem = 0;
- int v = 0;
- int matrizOcorrencia[N_MARCADORES];
- int j, h=0;
- int contadoraSimultanea=0;
- int inicio2 = 0;
- int k=0;
- for(h=0;h<N_MARCADORES;h++){
- matrizOcorrencia[h]=0;
- }
- linhaDaFrase[0]='\0';
- //Preciso colocar dentro desse FOR pra ele ir pegando cada linha
- for(a=0;a<=nFrases;a++){
- for(b=0;b<=251;b++){
- while(frase[a][b]!='\n' || frase[a][b]!='\0'){ //Isso vai funcionar pra última linha da frase?
- strcpy(linhaDaFrase,frase[a]); //Estou copiando a linha toda ou só uma posição?
- }
- minusculas(linhaDaFrase);
- int tamF = strlen(linhaDaFrase) - 1; /* O -1 ´e pelo ’\n’ */
- int tamP = strlen(palavra);
- //Preciso inicialmente encontrar quando uma palavra de busca aparece no texto
- for(i=0; i <= tamF - tamP; i++){ //Para cada possível posição de início
- j=0;
- while(j<tamP && palavra[j] == linhaDaFrase[i+j]) //Testa se palavra ocorre
- j++;
- if(j==tamP){ //Se verdadeiro a palavra ocorre na pos. i
- //Agora preciso ver se na mesma linha (linha a), se tenho um marcador temporal
- inicio2 = 0;
- while(proxima_palavra(linhaDaFrase,palavra,inicio2) != -1){
- inicio2 = proxima_palavra(linhaDaFrase,palavra,inicio2);
- if(verifica_marcador(marcVetor,palavra)==0 ){
- /* Então a palavra é um marcador temporal */
- k = verifica_marcador(marcVetor,palavra);
- matrizOcorrencia[k]++; /* Aqui somo mais um no valor que já se encontra na matriz*/
- }
- }
- }
- }
- }
- }
- for(v=0;v<N_MARCADORES;v++){
- contadoraSimultanea = matrizOcorrencia[v];
- if(contadoraSimultanea!=0){
- porcentagem = (int)((contadoraSimultanea*100)/contadoraOcorrencia);
- printf("%s se relaciona com %s em %d %% das ocorrencias", palavra, matrizOcorrencia[v], porcentagem);
- } else {
- printf("%s nao se nao se relacionou com nenhum marcador temporal", palavra);
- }
- }
- }
- /* -------------------------------------------------------- */
- int main(){
- //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)
- char frase[50][251];
- char palavraBusca[100][100];
- char marcVetor[N_MARCADORES][TAM_MARCADORES] = MARCADORES;
- int nFrases, nPalavrasBusca;
- int x=0, y=0, z=0, g=0;
- char palavra[100];
- int tamanhoFrase = 0;
- char linhaDaFrase[251];
- char palavraNaFrase[100];
- int inicio = 0;
- int i = 0;
- int contOcorrencia = 0, contSimultanea = 0;
- /* Coletando e imprimindo os dados digitados para testar */
- scanf("%d ", &nFrases);
- //getchar(); /* pra tirar o \n que acaba pegando */
- for(x=0;x<nFrases;x++){
- fgets(frase[x], 251, stdin);
- }
- scanf("%d", &nPalavrasBusca);
- getchar(); /* pra tirar o \n que acaba pegando */
- for(x=0;x<nPalavrasBusca;x++){
- fgets(palavraBusca[x], 100, stdin);
- }
- /* Impressao */
- printf("%d\n", nFrases);
- for(x=0;x<nFrases;x++){
- printf("\nCarregou ...: %s", frase[x]);
- }
- printf("%d\n", nPalavrasBusca);
- for(x=0;x<nPalavrasBusca;x++){
- printf("\nCarregou ...: %s", palavraBusca[x]);
- }
- /* Relacional */
- for(y=0; y<nFrases; y++){
- printf("\n processando a frase: %s", frase[y]);
- /*Esse for abaixo, está certo pra guardar uma linha da frase inserida? */
- // for(g=0;frase[y][g]!='\n' || frase[y][g]!= '\0';g++){ //Esse OR vai funcionar pra última linha?
- // // strncpy(linhaDaFrase,frase[y],251); //Posso fazer sem strcpy neste caso? Posso --- botar strncpy
- // strcpy(linhaDaFrase,frase[y]);
- // }
- strcpy(linhaDaFrase,frase[y]);
- //linhaDaFrase[g]='\0'; /* Indicação do fim da char */
- minusculas(linhaDaFrase);
- printf("\nLinha da frase: %s", linhaDaFrase);
- /* Quando eu chamo a função outras vezes, esse inicio tá sendo passado corretamente? */
- inicio = 0;
- while(proxima_palavra(linhaDaFrase,palavra,inicio) != -1){ /* inicio começa em zero */
- inicio = proxima_palavra(linhaDaFrase,palavra,inicio);
- printf("\npalavra: %s", palavra);
- printf("\ninicio: %s", inicio);
- /* Na variável "palavra" tenho a palavra */
- for(x=0;x<nPalavrasBusca;x++){
- if(strcmp(palavra,palavraBusca[x])==0){ /* Se igual a 0, tenho palavra = palavraBusca */
- printf("\nfoi processar contadoraOcorrencia");
- contOcorrencia = contadoraOcorrencia(palavra,frase,nFrases,palavraBusca[x],x);
- printf("\nfoi processar contadoraSimultanea");
- contadoraSimultanea(palavra,frase,nFrases,inicio,marcVetor,contOcorrencia);
- //calculoOcorrencia(palavra,marcVetor,contSimultanea,contOcorrencia);
- }
- }
- }
- }
- /* Vetor de ocorrências */
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement