[C con Clase] Contando la frecuencia de las palabras

cesar arias sinatra435 en hotmail.com
Jue Nov 22 00:50:11 CET 2012


HOla, trato de tontabilizar la frecuencia de cada palabra de un texto, pero no se porque el programa se detiene...

//cadena de caracteres 29
#include"iostream.h"
#include"stdlib.h"
#include"string.h"
#include"iostream.h"
void frecuencia(char *cad[]);
void ocurrencia(char *cad[]);
void palabras(char *cad[]);

int main()
    {
    char *cad[30], aux[200];
    short nl=0;
    cout<<"ANALIZADOR DE TEXTO\n";
    cout<<"Ingrese las lineas de texto.\n";
    cout<<"Linea nula para terminar\n\n";
    do  {
        gets(aux);
        cad[nl]=(char *)malloc(sizeof(aux)+1);
        strcpy(cad[nl], aux);
        }while(*cad[nl++]);
    
    //frecuencia(cad);
    //ocurrencia(cad);
    palabras(cad);
    
    cin.get();
    return 0;
    }
    







void frecuencia(char *cad[])
    {
    char letra, *ptr;
    static short alf[26];
    for(short x=0; x<26; x++)
        {
        letra=(char)(x+(short)'a');
        for(short n=0; *cad[n]; n++)
            {
            ptr=cad[n];
            while(ptr=strchr(ptr,letra))
                {
                alf[x]++;
                ptr++;
                }
            }
        }
    
    //imprimimos
    cout<<"A)\nAlfabeto\tFrecuencia\n";
    for(short x=0; x<26; x++)
        cout<<(char)(x+(short)'a')<<"\t\t"<<alf[x]<<endl;
    }



void ocurrencia(char *cad[])
    {
    char aux[200], *car=" ,.;:\n\t", *ptr;
    static short lp[15], a;
    
    for(short x=0; *cad[x]; x++)
        {
        strcpy(aux, cad[x]);
        ptr=strtok(aux,car);
        for(a=0; ptr[a]; a++);
        lp[a]++;
        while(ptr=strtok('\0',car))
            {
            for(a=0; ptr[a]; a++);
            lp[a]++;
            }
        }
    
    //imprimimos
    cout<<"B)\nLong. de palabras\tOcurrencia\n";
    for(a=1; a<15;a++)
        cout<<"\t"<<a<<"\t\t    "<<lp[a]<<endl;
    }



void palabras(char *cad[])
    {
    static char aux[2];
    char *sr, *copia;
    char *ptr, *ptraux, car[]=" ,.;:\n\t";
    short fp;
    
    //copiamos todo el texto a *aux (un solo array)
    for(short x=0; *cad[x]; x++)
        {
        strcat(aux,cad[x]);
        strcat(aux," ");
        }
    cout<<aux;
    //ponemos *aux en minusculas
    for(short x=0; aux[x]; x++)
        if(isalpha(aux[x]))
            tolower(aux[x]);
    cout<<"\npuse a aux en minusculas\n";
    
    copia=(char *)malloc(sizeof(aux) + 1);
    strcpy(copia, aux);
    sr=(char *)malloc(sizeof(aux) + 1);
    //sr en cero
    *sr=0;
    
    
    //copiamos las palabras sin repetir a sr fragmentando copia
    ptr=strtok(copia,car);
    if(!strstr(sr,ptr));
        {
        strcat(sr, ptr);
        strcat(sr, " ");
        }
    while(ptr=strtok('\0', car))
        if(!strstr(sr,ptr))
            {
            strcat(sr, ptr);
            strcat(sr, " ");
            }
    
    cout<<"\nC)\nPalabra\t\tFrecuencia\n";
    
    //fragmentamos sr mientras contamos las ocurrencias en aux e imprimimos
    ptr=strtok(sr,car);
    ptraux=aux;
    fp=0;
    while(ptraux=strstr(ptraux, ptr))
        {
        fp++;
        ptraux++;
        }
    cout<<ptr<<"\t\t"<<fp<<endl;
    
    while(ptr=strtok('\0', car))
        {
        ptraux=aux;
        fp=0;
        while(ptraux=strstr(ptraux, ptr))
            {
            fp++;
            ptraux++;
            }
        cout<<ptr<<"\t\t"<<fp<<endl;
        }
    cout<<"FIN";                         //llega hasta en final de la funcion pero se detiene
    }



La ultima funcion es la que me intersa; la funcion palabras, que contabiliza la frecuencia de cada palabra. Como ven en la ultima sentencia muestra el mensaje "FIN", y asi se ejecuta. Es decir, el programa termina de ejecutarse, pero al ultimo se detiene.

Espero que puedan ayudarme. Gracias. 		 	   		  
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20121121/56b41d92/attachment.html>


Más información sobre la lista de distribución Cconclase