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

[SOLUCIONADO] Contar Palabras de una frase? string

Estas en el tema de Contar Palabras de una frase? string en el foro de C/C++ en Foros del Web. Hola, Estaba haciendo un metodo que contara las palabras de una frase... Buscando vi unos pero tomaban la frase en un vector de char, yo ...
  #1 (permalink)  
Antiguo 17/05/2014, 15:31
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 9 meses
Puntos: 0
Contar Palabras de una frase? string

Hola,
Estaba haciendo un metodo que contara las palabras de una frase...
Buscando vi unos pero tomaban la frase en un vector de char, yo lo ocupo en uno de string...

El ejercicio es asi:

Escribir un metodo que teniendo como atributo una frase (acabada en punto), cuente las palabras que contiene.

class Contenedor{
private:
string palabras[10];
int longitud;
.
.
.
.
};


yo lo estaba haciendo asi:

void cuentaPalabras(string frase){
cont=1;
palabras[1]=frase;
while(palabras[1] != "." && palabras[1]==" ")
cont++;
cout<<cont<<endl;
}
}

Definitivamente esta mal xD, pero nose como se hace, y hasta ahora practico con arrays de string :S

Última edición por newb; 17/05/2014 a las 16:35
  #2 (permalink)  
Antiguo 17/05/2014, 17:31
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Contar Palabras de una frase? string

Hola, aquí te dejo un método (el que yo uso siempre) que sirve exactamente para que lo necesitás.
Funciona perfectamente!!

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <windows.h>
  4.  
  5. using namespace std;
  6.  
  7. void CuentaPalabras(string Frase) {
  8.     int NumPos = -1;
  9.     int TotalPalabras = 0;
  10.     while(1) {
  11.         NumPos = Frase.find(". ", NumPos + 1);
  12.         if (NumPos == -1) break;
  13.         TotalPalabras++;
  14.     }
  15.     cout << "La variable Frase contine " << TotalPalabras << " palabras." << endl; // devuelve "La variable Frase contine 6 palabras."
  16. }
  17.  
  18. int main () {
  19.     string Frase = "Hola. bienvenido. al. futuro. de. la. programacion.";
  20.     CuentaPalabras(Frase);
  21. }

Buena suerte!!

PD: Muchas personas se complican la vida haciendo códigos complejos cuando se puede hacer algo más simple e igual de efectivo y funcional.
  #3 (permalink)  
Antiguo 17/05/2014, 19:24
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 2 meses
Puntos: 10
Respuesta: Contar Palabras de una frase? string

Hola Principe_Azul:

Supongo que el código que has puesto cuenta los espacios, luego para obtener las palabras hay que añadir una unidad al resultado final. Por otro lado, la frase ha de acabar en punto, pero no las palabras que componen la frase.

Hace algunos meses vosk(creo) realizó un método muy completo en el que se consideraban casos como palabras que se separan por un punto( "El perro.El gato"), palabras separadas por más de un espacio y cosas así, que se pueden dar en la práctica.


Lo más sencillo desde luego es considerar que la separación entre palabras siempre implica un sólo espacio.
Mi aportación:
Código C++:
Ver original
  1. #include <iostream>
  2.     #include <string.h>
  3.  
  4.     using namespace std;
  5.  
  6.     int main () {
  7.         string Frase = "Hola bienvenido al futuro de la programacion.";
  8.         int i=0, contador=0;
  9.         while (i<Frase.length())//si la condición es que la frase acaba en ".", tambien se puede hacer while (Frase[i]!='.')
  10.         {
  11.             if (Frase[i]==' ')
  12.                 {
  13.                     contador++;
  14.                 }
  15.             i++;
  16.         }
  17.         cout<<"La frase tiene: "<<contador+1<<" palabras."<<endl;
  18.     }
  #4 (permalink)  
Antiguo 17/05/2014, 20:28
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 10 meses
Puntos: 5
Respuesta: Contar Palabras de una frase? string

hola amigo no entendi muy bien lo que quieres.
pero por lo que entidi yo hice esto espero que te sirva.

Código C++:
Ver original
  1. #include <iostream>
  2.         #include <string.h>
  3.      
  4.         using namespace std;
  5.      
  6.         int main () {
  7.             string Frase = "Hola....bienvenido.     amigo.";
  8.             int i=0, contador=0, num;
  9.             num = Frase.length();
  10.            for (i = 0; i < num; i++)//si la condición es que la frase acaba en ".", tambien se puede hacer while (Frase[i]!='.')
  11.             {
  12.                 if (((Frase[i]==' ') && (Frase[i+1]!=' ') && (Frase[i+1]!='.') )|| ((Frase[i]=='.') && (Frase[i+1]!='.') && (Frase[i+1]!=' ') ))
  13.                     {
  14.                         contador++;
  15.                     }
  16.             }
  17.             cout<<"La frase tiene: "<<Frase[15]<<" palabras."<<endl;
  18.             cout<<"La frase tiene: "<<contador<<" palabras."<<endl;
  19.         }

saludos.
Drewermerc.
  #5 (permalink)  
Antiguo 17/05/2014, 22:38
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Contar Palabras de una frase? string

Hola dehm!
Yo había entendido que cada palabra debería llevar un espacio y punto al final de ella, por eso lo hice así al código.
Si cláro que sirve para contar los espacios de las palabras, lo bueno del código es que puede servir para contar la cantidad de caracteres dentro de una cadena, por ejemplo con _, tan solo hay que modificar aquí:

NumPos = Frase.find("_", NumPos + 1);

y listo!
Desde hace un tiempo he creado un par de funciones split() y contar(), la verdad te ayuda muchísimo esas funciones, no hay más que hacer que pasarle los parámetros para que funcionen!!!

También quiero hacer el multi() para que repita caracteres o palabras tantas veces como se indique en el parámetro de la función multi().

Pero por ahora a seguir aprendiendo!!!

Un saludo!
  #6 (permalink)  
Antiguo 18/05/2014, 04:27
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Contar Palabras de una frase? string

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.      char oracion[100];
  8.      int i, contPalabras = 1;
  9.  
  10.      printf("Ingrese una oracion: ");
  11.      fgets(oracion, 100, stdin);
  12.  
  13.      for(i = 0; i < strlen(oracion); i++)
  14.           if(oracion[i] == ' ' && i > 0 && oracion[i - 1] != ' ')
  15.                contPalabras++;
  16.  
  17.      printf("Cantidad de palabras: %d\n", contPalabras);
  18.  
  19.      system("pause");
  20.      return 0;
  21. }

;)
  #7 (permalink)  
Antiguo 18/05/2014, 06:26
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 6 meses
Puntos: 61
Respuesta: Contar Palabras de una frase? string

El problema de contar es un clásico y está lleno de casos especiales.
Los programas ofrecidos pueden tener problemas para algunos casos especiales, de modo que sugiero revisarlos con cuidado.

Ejemplo de caso especial:
¿Como se comporta si el string ingresado son solo espacios en blanco? (el resultado deberia ser 0)
¿Que ocurre si hay espacio en blanco al inicio? ¿Al final? (no deberia haber diferencia respecto al mismo caso sin espacios al inicio o final)
etc.

Una alternativa de solución, que también puede tener problemas pero me parece mas sencilla es esta:

Código C++:
Ver original
  1. int cuenta( string s ) {
  2.     istringstream is(s);
  3.     string token;
  4.     int cuenta = 0;
  5.  
  6.     while( is >> token ) { ++cuenta; }
  7.  
  8.     return cuenta;
  9. }
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 18/05/2014 a las 06:45
  #8 (permalink)  
Antiguo 19/05/2014, 09:05
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 2 meses
Puntos: 10
Respuesta: Contar Palabras de una frase? string

Este era el post del que hablaba en el otro mensaje:

http://www.forosdelweb.com/f96/conta...adena-1082761/

Principe_Azul, saludos para ti también.

Última edición por dehm; 19/05/2014 a las 09:43
  #9 (permalink)  
Antiguo 19/05/2014, 15:16
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 6 meses
Puntos: 49
Respuesta: Contar Palabras de una frase? string

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
El problema de contar es un clásico y está lleno de casos especiales.
Los programas ofrecidos pueden tener problemas para algunos casos especiales, de modo que sugiero revisarlos con cuidado.

Ejemplo de caso especial:
¿Como se comporta si el string ingresado son solo espacios en blanco? (el resultado deberia ser 0)
¿Que ocurre si hay espacio en blanco al inicio? ¿Al final? (no deberia haber diferencia respecto al mismo caso sin espacios al inicio o final)
etc.
No creo que haya mayor problema. En la línea de lo que propone vangodp y completada para si el caracter final no es un espacio:

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.   char frase[100];
  5.   int i, cont = 0, lon;
  6.   puts("Ingrese una oracion:");
  7.   scanf("%[^\n]s",frase);
  8.   for(lon = 0; frase[lon] ; lon++);
  9.   for(i = 1; frase[i] ; i++)
  10.     if( (frase[i] == ' '  && frase[i-1] != ' '))
  11.       cont++;
  12.   if (frase[lon-1]!= ' ')
  13.     cont++;
  14.   printf("\nNumero de palabras: %d\n", cont);
  15.   return 0;
  16. }

¡¡¡Saluditos!!!

  #10 (permalink)  
Antiguo 19/05/2014, 20:32
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 6 meses
Puntos: 61
Respuesta: Contar Palabras de una frase? string

Cuando se consideran los casos especiales, el código sencillo original se hace más complejo. Creo que esto queda en evidencia en el codigo que presentas.

En mi opinión la versión con istringstream que ofrezco es sencilla (no usa índices, por ejemplo) y no requiere considerar tantos casos especiales.

A próposito de casos especiales, olvidé mencionar uno: El string vacío. Se debería retornar 0.

Por último, la versión con istringstream igual tiene al menos 1 problema, pero creo que permitiré que alguien más encuentre éste en vez de auto-inmolarme .
__________________
Visita mi perfil en LinkedIn
  #11 (permalink)  
Antiguo 19/05/2014, 22:36
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Contar Palabras de una frase? string

Cita:
Por último, la versión con istringstream igual tiene al menos 1 problema, pero creo que permitiré que alguien más encuentre éste en vez de auto-inmolarme .
No todos podemos encontrar el problema, creo que sería bueno que nos informes así no perdemos tiempo en hacerlo algo que puede dar algún problema.
Si conocieramos el problema, no haríamos un código o una parte de él que use ese método o lo que fuese para tener problemas
Gracias!
  #12 (permalink)  
Antiguo 20/05/2014, 05:11
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 6 meses
Puntos: 61
Respuesta: Contar Palabras de una frase? string

Sugiero probar los distintos casos.

Esto deberia hacerse siempre en realidad, en particular con este problema en que las soluciones tienden a ser sencillas (y a la vez erróneas).
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 20/05/2014 a las 05:16
  #13 (permalink)  
Antiguo 21/05/2014, 03:16
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 2 meses
Puntos: 10
Respuesta: Contar Palabras de una frase? string

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
Por último, la versión con istringstream igual tiene al menos 1 problema, pero creo que permitiré que alguien más encuentre éste en vez de auto-inmolarme .
Bueno, pues llevo un rato dándole vueltas, y no sé en qué casos pueda fallar la versión con streams. La verdad es que es la forma más sencilla y clara.

Por aportar algo, añado a tu código la posibilidad de evitar el error cuando dos palabras están separadas por un punto y sin espacio:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. int cuenta( string s )
  8. {
  9.     istringstream is(s);
  10.     string token;
  11.     int cuenta = 0;
  12.     while(is >> token)
  13.         {
  14.             size_t found= token.find('.');
  15.             if (found!=string::npos)
  16.             {
  17.                 ++cuenta;
  18.             }
  19.             cout<<token<<endl;//quitar
  20.             ++cuenta;
  21.         }
  22.     return cuenta;
  23. }
  24.  
  25. int main()
  26. {
  27.     string frase="Contar palabras.Se me da bien";
  28.     cout<<"La frase '"<<frase<<"' tiene "<<cuenta(frase)<<" palabras."<<endl;
  29.     return 0;
  30.  
  31. }

P.D. A finales de semana, si nadie logra dar con el problema de tu método, nos lo dices!


Edito porque esta condición:
Código C++:
Ver original
  1. if (found!=string::npos)
considera que una palabra acabada en punto en todos los casos son 2 palabras, y sólo ha de ser cuando después del punto hay otra palabra sin espacio
Mejor poner así:
Código C++:
Ver original
  1. if (found!=string::npos & found!=token.length()-1)

Pienso que lo ideal sería sustituir todos los '.' por espacios y luego crear el stream, pero eso no es eficaz porque hay que recorrer la cadena 2 veces.
Otra forma sería que cuando el stream crease un string con un caracter punto, eliminarlo y proceder a crear de nuevo un stream y volver a tokenizarlo en strings. No es muy eficaz pero así contemplaría todos los casos en los que un caracter punto se viera involucrado.

¿Otras alternativas?

Última edición por dehm; 21/05/2014 a las 03:43
  #14 (permalink)  
Antiguo 21/05/2014, 04:00
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 2 meses
Puntos: 10
Respuesta: Contar Palabras de una frase? string

Bueno, ya no le doy más vueltas al asunto.
De esta forma parece que interpreta de forma correcta todas las formas de encontrarse un '.'.
Código C++:
Ver original
  1. palabra.palabra
  2. palabra. palabra
  3. palabra .palabra
  4. palabra . palabra

Lo he hecho con recursividad. La idea es que si el token contiene un caracter punto, se sustituye por un espacio y se llama a la función de forma recursiva.
Algo así:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. int cuenta( string s )
  8. {
  9.     istringstream is(s);
  10.     string token;
  11.     int total = 0;
  12.     while(is >> token)
  13.         {
  14.             size_t pos= token.find('.');
  15.             if (pos!=string::npos)
  16.             {
  17.                 token.replace (pos,1,1,' ');
  18.                 total+= cuenta(token);
  19.             }
  20.             else
  21.             {
  22.                 ++total;
  23.             }
  24.         }
  25.     return total;
  26. }
  27.  
  28. int main()
  29. {
  30.     string frase="Contar palabras.Se me da bien";
  31.     cout<<"La frase '"<<frase<<"' tiene "<<cuenta(frase)<<" palabras."<<endl;
  32.     return 0;
  33.  
  34. }
  #15 (permalink)  
Antiguo 21/05/2014, 08:18
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 6 meses
Puntos: 61
Respuesta: Contar Palabras de una frase? string

El reemplazar el punto por el espacio en blanco me parece lo mas sencillo, es fácil de realizar y de comprender, en mi opinión.

El usar find() para encontrar "." y hacer reparaciones en ese caso recorre el string también (en la implementacion interna), de modo que hacerlo al inicio explícitamente para reemplazar no tiene un costo superior. Lo malo, en mi opinion, que tiene usar find() e índices es que esa solucion al usarlos puede tener errores o condiciones de bordes que considerar. Me parece mejor, en este caso, usar la funcionalidad ya implementada por el tokenizador.

El nuevo código de cuenta() que reemplaza el punto por espacio en blanco y luego usa el comportamiento normal de tokenizacion del istringstream podria entonces ser escrito asi:

Código C++:
Ver original
  1. int cuenta( string s ) {
  2.     std::replace( s.begin(), s.end(), '.', ' ' );  // <-- reemplazo aqui
  3.  
  4.     istringstream is(s);
  5.     string token;
  6.     int cuenta = 0;
  7.  
  8.     while( is >> token ) { ++cuenta; }
  9.  
  10.     return cuenta;
  11. }

Básicamente similar al anterior, pero considera los problemas relacionados con el punto en medio o al final que se ha identificado.

std::replace() está en algorithm, hay que #incluir <algorithm> para usarlo.
__________________
Visita mi perfil en LinkedIn
  #16 (permalink)  
Antiguo 21/05/2014, 09:43
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Contar Palabras de una frase? string

gracias por los aportes compañeros.

Etiquetas: frase, int, palabras, string
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 04:18.