Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Contador de palabras repetidas en un fichero necesito sAyuda

Estas en el tema de Contador de palabras repetidas en un fichero necesito sAyuda en el foro de C/C++ en Foros del Web. Hola necesito hacer un programa que me cuente las veces que se repite una palabra en un texto leido desde un fichero, lo que se ...
  #1 (permalink)  
Antiguo 02/09/2015, 18:19
 
Fecha de Ingreso: septiembre-2015
Mensajes: 5
Antigüedad: 8 años, 7 meses
Puntos: 0
Pregunta Contador de palabras repetidas en un fichero necesito sAyuda

Hola necesito hacer un programa que me cuente las veces que se repite una palabra en un texto leido desde un fichero, lo que se me ocurre es ir guardando cada palabra en un espacio de un arreglo bidimensional, pero como hago esto? he intentado mil manera y no doy, les proporciono mi codigo, espero me puedan ayudar, saludos.


#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>

char lectura[1000],lectura2[1000][50],espacios[100],c;
int longi,i;

main()
{
FILE *enlace = fopen("archivo.txt", "r");
if(enlace==NULL)
{
perror("El archivo no se abrio!";
}
fscanf(enlace, " %[^n]", &lectura);
printf("%s", lectura);
fclose(enlace);

int palabras=1, cont=0;
while(cont<strlen(lectura))
{

if(c=getc(enlace)!=' ')

palabras++;
cont++;

}
printf("nnCantidad de caracteres %d", cont);
printf("nnCantidad de palabras %dn", palabras);

getch();
}
  #2 (permalink)  
Antiguo 03/09/2015, 00:54
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Contador de palabras repetidas en un fichero necesito sAyuda

Para resolver tu problema tienes que tener en cuenta ciertas consideraciones:
  • una palabra empieza SIEMPRE por un carácter alfabético [a-z].
  • una palabra termina cuando te encuentras un carácter no alfabético (no tengas en cuenta de momento las palabras separadas con guiones).
Con esta información en mente ya puedes calcular el número de palabras que contiene el texto. Te comento esto porque, en tu código, si el texto de entrada es, por ejemplo, "dos,o.mas;palabras", la salida dirá que tienes únicamente una palabra y si pones "dos palabras" te dirá que hay tres (nota que hay dos espacios seguidos)

Además, hacer fgetc sobre un fichero que has cerrado previamente no es buena idea... si has volcado el contenido en "lectura" deberías plantearte usar esta variable para realizar las búsquedas.

En cuanto a buscar una palabra en concreto lo que puedes hacer es usar un puntero a char que apunte al inicio del texto. Entonces, mientras ese puntero no apunte a '\0', llamas a la strncmp (no confundir con strcmp) para que compare ese puntero con la palabra buscada.


Un saludo
  #3 (permalink)  
Antiguo 03/09/2015, 10:46
 
Fecha de Ingreso: septiembre-2015
Mensajes: 5
Antigüedad: 8 años, 7 meses
Puntos: 0
Pregunta Respuesta: Contador de palabras repetidas en un fichero necesito sAyuda

Cita:
Iniciado por eferion Ver Mensaje
Para resolver tu problema tienes que tener en cuenta ciertas consideraciones:
  • una palabra empieza SIEMPRE por un carácter alfabético [a-z].
  • una palabra termina cuando te encuentras un carácter no alfabético (no tengas en cuenta de momento las palabras separadas con guiones).
Con esta información en mente ya puedes calcular el número de palabras que contiene el texto. Te comento esto porque, en tu código, si el texto de entrada es, por ejemplo, "dos,o.mas;palabras", la salida dirá que tienes únicamente una palabra y si pones "dos palabras" te dirá que hay tres (nota que hay dos espacios seguidos)

Además, hacer fgetc sobre un fichero que has cerrado previamente no es buena idea... si has volcado el contenido en "lectura" deberías plantearte usar esta variable para realizar las búsquedas.

En cuanto a buscar una palabra en concreto lo que puedes hacer es usar un puntero a char que apunte al inicio del texto. Entonces, mientras ese puntero no apunte a '\0', llamas a la strncmp (no confundir con strcmp) para que compare ese puntero con la palabra buscada.


Un saludo

Gracias por tu ayuda, ya he intentado hacer lo que me mencionas, pero no me da, ya que del texto que es el siguiente:

La fina arena de la playa. La rubicunda arena que cubre esa franja costera. Esos infinitos granos que se escurren por entre los dedos sin dejarse atrapar. La arena apelmazada que lame el agua, y la otra, suelta y ligera, sobre la que el viento dibuja cordilleras y valles cuya configuracion trastoca por completo una rafaga mas impetuosa. Efimeras orografias. Cambiantes mapas de arena. Doradas particulas que se agolpan en esa banda fronteriza y se codean dia a dia, hora a hora, segundo a segundo, con el rugiente mar. Pero ellas no le oponen resistencia.

Me tendria que mostrar las veces que se repite cada palabra, por ejemplo:

arena = 3
playa = 4

y asi con cada una de las palabras del texto, ¿como podria ir leyendo palabra por palabra e ir comprando cuantas veces se repite?

Saludos.
  #4 (permalink)  
Antiguo 03/09/2015, 16:19
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Contador de palabras repetidas en un fichero necesito sAyuda

Lee carácter por carácter hasta encontrar un carácter de fin de palabra y añades esa palabra al array y vuelves a hacer lo mismo desde la siguiente posición y buscas la nueva palabra en el array con strcmp y si hay coincidencia incrementar su contador y si no la hay añades la nueva palabra al final del array. Lo ideal seria usar memoria dinámica. También puedes contabilizar el número de comas, puntos, espacios, o lo que sea.
Tienes que controlar que el primer carácter no sea un carácter de fin de palabra y si es así avanzas un carácter.

EDITO:
Aqui te pongo un codigo de cuando yo empecé donde hice algo muy similar pero yo tambien almacenaba los numeros y simbolos:

Código C:
Ver original
  1. //---------------------------------------------------------------------------
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #define SIZESTRING 25
  7.  
  8. typedef struct{
  9.    char palabra[SIZESTRING];
  10.    int contador;
  11. }Lista;
  12.  
  13. Lista *AddToList(Lista *pLista, int *pos, int largoPalabra, char *palabra);
  14.  
  15. int main(int argc, char* argv[])
  16. {
  17.    FILE *archivo;
  18.    char palabra[SIZESTRING], caracter;
  19.    int largoPalabra=0, largoNumero=0, posListaPalabras=0, posListaNumeros=0, posListaSimbolos=0, i, encontrada;
  20.  
  21.    //Creamos 3 listas: una para palabras, otra para numeros y otra para simbolos
  22.    Lista *pListaPalabras=NULL, *pListaNumeros=NULL, *pListaSimbolos=NULL;
  23.  
  24.    //Abrimos el archivo a analizar
  25.    archivo = fopen("texto.txt","r");
  26.  
  27.    if(archivo != NULL){
  28.       printf("Archivo abierto satisfactoriamente.\n");
  29.  
  30.       do{ //Leemos el archivo caracter a caracter hasta el final
  31.          caracter = fgetc(archivo);
  32.          if((caracter >= 'A' && caracter <= 'Z') || (caracter >= 'a' && caracter <= 'z')){
  33.             //Si es alfabetico será una palabra asi que si ya teniamos un numero lo almacenamos en la lista de numeros
  34.             //Indicamos que ya no hay numero colocando su largo a 0
  35.             if(largoNumero > 0){
  36.                pListaNumeros = AddToList(pListaNumeros,&posListaNumeros,largoNumero,palabra);
  37.                largoNumero=0;
  38.                memset(palabra,0,SIZESTRING);
  39.             }
  40.             //Y guardamos el caracter de la palabra incrementando el largo para saber que contiene una palabra
  41.             palabra[largoPalabra] = caracter;
  42.             largoPalabra++;
  43.          }else if(caracter >='0' && caracter <= '9'){
  44.             //Si por el contrario es numerico será un numero asi que si ya teniamos una palabra la almacenamos en la lista de palabras
  45.             //Indicamos que ya no hay palabra colocando su largo a 0
  46.             if(largoPalabra > 0){
  47.                pListaPalabras = AddToList(pListaPalabras,&posListaPalabras,largoPalabra,palabra);
  48.                largoPalabra=0;
  49.                memset(palabra,0,SIZESTRING);
  50.             }
  51.             //Y guardamos el caracter del numero incrementando el largo para saber que contiene un numero
  52.             palabra[largoNumero] = caracter;
  53.             largoNumero++;
  54.          }else{
  55.             //Y si no es ninguno de los anteriores, es un simbolo
  56.             //Comprobamos si habia una palabra en el array y si es asi la almacenamos en la lista de palabras
  57.             if(largoPalabra > 0){
  58.                pListaPalabras = AddToList(pListaPalabras,&posListaPalabras,largoPalabra,palabra);
  59.  
  60.                //Y guardamos el simbolo en la lista de simbolos
  61.                if(!feof(archivo)){
  62.                   palabra[0]=caracter;
  63.                   palabra[1]='\0';
  64.                   pListaSimbolos = AddToList(pListaSimbolos,&posListaSimbolos,1,palabra);
  65.                }
  66.             //Comprobamos si habia un numero en el array y si es asi lo almacenamos en la lista de numeros
  67.             }else if(largoNumero > 0){
  68.  
  69.                pListaNumeros = AddToList(pListaNumeros,&posListaNumeros,largoNumero,palabra);
  70.                //Y guardamos el simbolo en la lista de simbolos
  71.                if(!feof(archivo)){
  72.                   palabra[0]=caracter;
  73.                   palabra[1]='\0';
  74.                   pListaSimbolos = AddToList(pListaSimbolos,&posListaSimbolos,1,palabra);
  75.                }
  76.             }else{
  77.                //Si no habia ni palabra ni numero en el array llegamos aqui y guardamos el simbolo en la lista de simbolos
  78.                if(!feof(archivo)){
  79.                   palabra[0]= caracter;
  80.                   palabra[1]= '\0';
  81.                   pListaSimbolos = AddToList(pListaSimbolos,&posListaSimbolos,1,palabra);
  82.                }
  83.             }
  84.             largoPalabra=0;
  85.             largoNumero=0;
  86.             memset(palabra,0,SIZESTRING);
  87.          }
  88.       }while(!feof(archivo));
  89.       if(posListaPalabras > 0){
  90.          printf("\nLista de palabras encontradas\n");
  91.          printf("-----------------------------\n");
  92.          for(i=0;i<posListaPalabras;i++){
  93.             printf("%s: %d veces\n",pListaPalabras[i].palabra,pListaPalabras[i].contador);
  94.          }
  95.  
  96.          if(pListaPalabras != NULL)
  97.             free(pListaPalabras);
  98.       }else{
  99.          printf("No se encontraron palabras en el archivo.");
  100.       }
  101.  
  102.       if(posListaNumeros > 0){
  103.          printf("\nLista de numeros encontrados\n");
  104.          printf("-------------------------------\n");
  105.          for(i=0;i<posListaNumeros;i++){
  106.             printf("%s: %d veces\n",pListaNumeros[i].palabra,pListaNumeros[i].contador);
  107.          }
  108.  
  109.          if(pListaNumeros != NULL)
  110.             free(pListaNumeros);
  111.       }else{
  112.          printf("No se encontraron numeros en el archivo.");
  113.       }
  114.  
  115.       if(posListaSimbolos > 0){
  116.          printf("\nLista de simbolos encontrados\n");
  117.          printf("-------------------------------\n");
  118.          for(i=0;i<posListaSimbolos;i++){
  119.             printf("%s: %d veces\n",pListaSimbolos[i].palabra,pListaSimbolos[i].contador);
  120.          }
  121.  
  122.          if(pListaSimbolos != NULL)
  123.             free(pListaSimbolos);
  124.       }else{
  125.          printf("No se encontraron simbolos en el archivo.");
  126.       }
  127.    }else{
  128.       printf("No se pudo abrir el archivo.");
  129.    }
  130.    printf("\n\nPulse INTRO para salir.");
  131.    getchar();
  132.    return 0;
  133. }
  134. //---------------------------------------------------------------------------
  135.  
  136. //Funcion encargada de almacenar la estructura en la lista
  137. Lista *AddToList(Lista *pLista, int *pos, int largoPalabra, char *palabra)
  138. {
  139.    int encontrada=0, i;
  140.  
  141.    for(i=0;i<*pos;i++){
  142.       if(strcmp(pLista[i].palabra, palabra)==0){
  143.          pLista[i].contador++;
  144.          encontrada=1;
  145.          break;
  146.       }
  147.    }
  148.    if(encontrada == 0){
  149.       if(pLista == NULL){
  150.          pLista = malloc(sizeof(Lista));
  151.       }else{
  152.          pLista = realloc(pLista,sizeof(Lista)*(*pos+1));
  153.       }
  154.       memset(pLista[*pos].palabra,0,SIZESTRING);
  155.       strncpy(pLista[*pos].palabra,palabra,largoPalabra);
  156.       pLista[*pos].contador++;
  157.       *pos+=1;
  158.    }
  159.    return pLista;
  160. }

Última edición por aguml; 09/09/2015 a las 10:03 Razón: Aportar mas imformacion:

Etiquetas: char, contador, int, palabras, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:02.