[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