• Viernes 19 de Abril de 2024, 19:50

Autor Tema:  contar palabras de una cadena de caracteres  (Leído 38103 veces)

crixxus

  • Nuevo Miembro
  • *
  • Mensajes: 19
  • Nacionalidad: co
    • Ver Perfil
contar palabras de una cadena de caracteres
« en: Miércoles 23 de Febrero de 2011, 01:49 »
0
Hola gente, hoy pido su ayuda ya que me mandaron hacer un programa que lea una cadena de caracteres y muestre en pantalla la cantidad de palabras que hay.
Les agradezco de antemano su ayuda y su tiempo.

Shut

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #1 en: Miércoles 23 de Febrero de 2011, 14:41 »
0
Hola, bueno una idea que se me ocurre es que si tienes todo almacenado en un vector como, char frase[200];
lo que habria que hacer es recorrer esa cadena comprobando los espacios en blanco, con la funcion isspace() y cada vez que encuentres uno incrementas el contador.El numero de palabras supongo que sera ese contador +1.
Si quieres pon el codigo cuando lo tengas algo adelantado y ya miramos entre todos (:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: contar palabras de una cadena de caracteres
« Respuesta #2 en: Miércoles 23 de Febrero de 2011, 15:23 »
0
¿C o C++?

herzdark

  • Miembro activo
  • **
  • Mensajes: 38
  • Nacionalidad: ar
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #3 en: Jueves 24 de Febrero de 2011, 16:31 »
0
yo lo haría con artimetica de punteros (si ya lo has visto), así te podría andar tanto en C como en C++, en tu caso particular mientras no sea fin de cadena y también q no sea un espacio en blanco voy contando la palabras q aparecen

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: contar palabras de una cadena de caracteres
« Respuesta #4 en: Jueves 24 de Febrero de 2011, 17:00 »
0
Cita de: "herzdark"
yo lo haría con artimetica de punteros (si ya lo has visto), así te podría andar tanto en C como en C++
No. Las cadenas podrían ser de la clase estándar string de C++.

Aparte ¿la cadena en qué formato es? ASCII, Unicode, etc...

herzdark

  • Miembro activo
  • **
  • Mensajes: 38
  • Nacionalidad: ar
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #5 en: Jueves 24 de Febrero de 2011, 19:23 »
0
Cita de: "m0skit0"
Cita de: "herzdark"
yo lo haría con artimetica de punteros (si ya lo has visto), así te podría andar tanto en C como en C++
No. Las cadenas podrían ser de la clase estándar string de C++.

Aparte ¿la cadena en qué formato es? ASCII, Unicode, etc...

tenes razón pero como yo vengo de C a C++ no utilizo la clase estándar string, prefiría crear un char* y después trabajar con new y delete son gustos de programación y cual sería la diferencia si es ASCII o Unicode?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: contar palabras de una cadena de caracteres
« Respuesta #6 en: Jueves 24 de Febrero de 2011, 19:38 »
0
Cita de: "herzdark"
tenes razón pero como yo vengo de C a C++ no utilizo la clase estándar string
Yo vengo de C también, eso no es una razón. Si es en C++ lo que quiere hacer, es muchísimo mejor utilizar la clase string. Si es C, entonces no habrá más remedio que char*.

Cita de: "herzdark"
son gustos de programación
No estoy de acuerdo. Una cosa son gustos, y otra paradigmas de programación. Si vas a usar C++ y POO, entonces hazlo todo con clases y siguiendo el paradigma de POO (encapsulación, etc...). Si no, mejor usa C a secas.

Cita de: "herzdark"
cual sería la diferencia si es ASCII o Unicode?
ASCII es un byte mientras que Unicode son 2.

crixxus

  • Nuevo Miembro
  • *
  • Mensajes: 19
  • Nacionalidad: co
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #7 en: Viernes 25 de Febrero de 2011, 01:24 »
0
Ok chicos una de las formas en que lo hice fue de la siguiente
Código: C++
  1. #include<iostream.h>
  2. #include<string.h>
  3.  
  4. long palab(char *c);
  5.  
  6. int main(){
  7.    
  8.     char frase [200];
  9.    
  10.     cout<<"Digite la una oracion: ";
  11.     gets(frase);
  12.     cout<<"El numero de palabras que tiene la oracion: "<<frase<<" es: "<<palab(frase);
  13.    
  14.     cout<<"n";
  15.     system("pause");
  16. }
  17.  
  18. long palab(char *c){
  19.      
  20.      int cont=0;
  21.      
  22.      for(int i=0;i<200;i++){
  23.              if(c[i]==' '||c[i]==''){
  24.                         cont ++;
  25.                         }
  26.              if(c[i]==''){
  27.                             i=200;
  28.                             }
  29.              }
  30.      return cont;
  31. }
  32.  

Peo el problema con esta forma es que te cuenta los doble espacios y la idea es que cuente las palabras

herzdark

  • Miembro activo
  • **
  • Mensajes: 38
  • Nacionalidad: ar
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #8 en: Viernes 25 de Febrero de 2011, 03:59 »
0
Cita de: "crixxus"

Código: C++
  1.  
  2. long palab(char *c)
  3. {int cont=0;
  4.  for(int i=0;i<200;i++)
  5.   {if(c[i]==' '||c[i]=='')
  6.      cont ++;
  7.    if(c[i]=='')
  8.     i=200;
  9.   }
  10.   return cont;
  11. }
  12.  

primero ante q todo gracias moskito x la respuesta es q a mi en la fac me hacían hacer clases pero con char *  y no con string y bueno volviendo a los q nos compete viendo el codigo el problema es q contas los espacios entonces tu condicion sería q c!=' ' y yo cambiaria el for por un while porque vos estas recorriendo las 200 posiciones del array cuando tu frase tenga por ejemplo 30 caracteres, entonces quedaría así
Código: C++
  1. while (c[i]!='')
  2.  
con lo que puse recien, vos contarias hasta encontrar el fin de cadena  y no las 200 de la cadena y lo otro t lo podes rebuscar pensando q cuando hay estacios en blanco lo saltas y cuando termina la palabra lo contas, haber si te sirvio así

crixxus

  • Nuevo Miembro
  • *
  • Mensajes: 19
  • Nacionalidad: co
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #9 en: Viernes 25 de Febrero de 2011, 04:11 »
0
Lo voy a intentar mañana te comento

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: contar palabras de una cadena de caracteres
« Respuesta #10 en: Viernes 25 de Febrero de 2011, 08:42 »
0
Pfff C++ con char*, la gente es cabezota... Bueno vosotros veréis... También ten en cuenta que tal y como lo has hecho, no puedes introducir una frase de más de 199 caracteres. Eso deberías controlarlo so pena de violación de segmento.

Igualmente, te dejo un ejemplo de cómo sería con C++:

Código: C++
  1. #include <string>
  2.  
  3. class ManipuladorFrases
  4. {
  5. public:
  6.     static unsigned int cuenta_palabras(string frase);
  7. }
  8.  
  9. unsigned int ManipuladorFrases::cuenta_palabras(string frase)
  10. {
  11.     unsigned int i = 0, contador = 0;
  12.     while(i <= frase.length)
  13.     {
  14.         if (frase[i] == ' ')
  15.         {
  16.             contador++;
  17.         }
  18.         i++;
  19.     }
  20.    
  21.     return ++contador;
  22. }
  23.  
  24. int main()
  25. {
  26.     string frase;
  27.     frase << cin;
  28.     cout << "Su frase contiene ", ManipuladorStrings::cuenta_palabras(frase), " palabras";
  29.     return 0;
  30. }
  31.  
Saludos

crixxus

  • Nuevo Miembro
  • *
  • Mensajes: 19
  • Nacionalidad: co
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #11 en: Domingo 27 de Febrero de 2011, 20:45 »
0
hey chicos gracias por su ayuda. Les dejo el problema resuelto por mi profesor.
Código: C++
  1. #include<iostream.h>
  2. #include<string.h>
  3. #include<conio.h>
  4.  
  5. int cuenta(char *a);
  6.  
  7. int main()
  8. {
  9.     char cad[50];
  10.     cout << "Digite una Cadena: ";
  11.     gets(cad);
  12.     cout << "n# de Palabras: " << cuenta(cad);
  13.     getch();
  14.     return 0;
  15. }
  16.  
  17. int cuenta(char *a)
  18. {
  19.     int i = 0,c = 0;
  20.    
  21.     if(a[i]==' ')
  22.        while(a[i]==' ')
  23.           i++;
  24.     while(a[i] != '')
  25.     {
  26.           if(a[i] == ' ')
  27.           {   c++;
  28.               while(a[i]==' ')
  29.                   i++;
  30.           }
  31.           if(a[i] != '')
  32.              i++;
  33.              
  34.     }
  35.     if(a[i-1]==' ')
  36.        c--;
  37.     return c+1;
  38. }
  39.  
  40.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: contar palabras de una cadena de caracteres
« Respuesta #12 en: Domingo 27 de Febrero de 2011, 23:05 »
0
Retiro lo dicho.

herzdark

  • Miembro activo
  • **
  • Mensajes: 38
  • Nacionalidad: ar
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #13 en: Domingo 27 de Febrero de 2011, 23:28 »
0
Cita de: "m0skit0"
Retiro lo dicho.
que paso moskito???, lo estuve pensando mucho y la clase estandar string es en verdad un char * encubierto
la clase String sería así segun como lo veo yo
Código: C++
  1.  
  2. Class String
  3.  {char *cad;
  4.   public:
  5.     String ();
  6.     String (const String &);
  7.     String & operator = (const String &);
  8.     String & operator + (const String &);
  9.     int Length ();
  10.     ...;
  11.  }
  12.  
  13.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: contar palabras de una cadena de caracteres
« Respuesta #14 en: Lunes 28 de Febrero de 2011, 09:03 »
0
Cita de: "herzdark"
que paso moskito???
Nada, en realidad borré lo que había escrito en ese post, no me refiero a lo anterior. Sigo manteniendo mi opinión de que string es mucho mejor que char*.

Cita de: "herzdark"
lo estuve pensando mucho y la clase estandar string es en verdad un char * encubierto
Parecido, pero mucho más avanzado de lo que crees. Con char* tienes que reservar el espacio tú mismo, cuando la clase string se encarga de todo eso por ti. Prueba en el ejemplo de tu profesor a introducir una cadena de 100 caracteres, a ver qué pasa. Si se ha creado la clase string en C++, es por algo. Y desde luego el ejemplo de tu profesor es una mezcla absurda entre C y C++. Y no es el único que hace semejantes desvaríos. Es algo típico de la gente que programa en C++ viniendo de C.

Saludos

JrcsDev

  • Miembro MUY activo
  • ***
  • Mensajes: 245
  • Nacionalidad: ve
    • Ver Perfil
    • http://codigo7.wordpress.com/
Re: contar palabras de una cadena de caracteres
« Respuesta #15 en: Lunes 28 de Febrero de 2011, 17:13 »
0
Eso pasa en todos lados. En mi universidad supuestamente enseñaban C++, y cuando entré a solocodigo descubrí que no sabía nada, y que conio.h no era standar... Me di tremendo estrellón creyendo que con gotoxy y clrscr lo eran todo jeje... Pero en fín, estoy tratando de limpiar mi código hasta tener solo C++. Es incorrecto hacer una mezcla de ambos, si vas a programar en C++, usa los objetos que tanto trabajo te ahorran. En cuanto al problema de los espacios en blanco, tal vez no sea la mejor opción pero habría que verificar si el caracter anterior es diferente a otro "espacio en blanco" para incrementar.
Sígueme en Twitter]
Donar comida a los chicos necesitados!
Todo lo puedo en Cristo que me fortalece...

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #16 en: Lunes 28 de Febrero de 2011, 20:11 »
0
Citar
Sigo manteniendo mi opinión de que string es mucho mejor que char*.

Muy cierto, sin embargo una cosa es administración de memoria y otra es simplemente leer esa memoria en un algoritmo.
En otras palabras es mejor dejar que la clase string se encargue de reservar y liberar la memoria de la cadena. Y, sólo cuando no hay a mano una función a medida de lo que necesitamos, usar c_str().

Código: C++
  1.  
  2. #include <iostream>
  3. #include <string>
  4.  
  5. static int cuenta(const char *a);
  6.  
  7. int main()
  8. {
  9.     std::string cad;
  10.     std::cout << "Digite una Cadena:" << std::endl;
  11.     getline(std::cin, cad);
  12.     std::cout << "Palabras: " << cuenta(cad.c_str()) << std::endl;
  13.     getline(std::cin, cad);
  14.     return 0;
  15. }
  16.  
  17. static int cuenta(const char *a)
  18. {
  19.     int c = 0;
  20.     while (*a)
  21.     {
  22.         while (isspace(*a)) a++;
  23.         c++;
  24.         while (*a && !isspace(*a)) a++;
  25.     }
  26.     return c;
  27. }
  28.  
  29.  
« última modificación: Viernes 23 de Septiembre de 2011, 22:17 por Amilius »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: contar palabras de una cadena de caracteres
« Respuesta #17 en: Martes 1 de Marzo de 2011, 16:00 »
0
Sigo sin entender para qué quieres pasarlo a la función como char* usando c_str() si con string te vale igual. Es marear la perdiz por no querer aprender la clase estándar string, simple y llanamente.

herzdark

  • Miembro activo
  • **
  • Mensajes: 38
  • Nacionalidad: ar
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #18 en: Martes 1 de Marzo de 2011, 19:05 »
0
Cita de: "m0skit0"
Sigo sin entender para qué quieres pasarlo a la función como char* usando c_str() si con string te vale igual. Es marear la perdiz por no querer aprender la clase estándar string, simple y llanamente.

no se si estoy diciendo burradas pero al utilizar el puntero a cadenas lo puede entender un recién empezado en C++ digo las personas q todavía no aprendío o vio la clase string, pero si vos le das el ejercicio con la clase string a uno q todavía no estudio esto es como japones no lo va a entender.

crixxus

  • Nuevo Miembro
  • *
  • Mensajes: 19
  • Nacionalidad: co
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #19 en: Martes 1 de Marzo de 2011, 20:51 »
0
Cita de: "herzdark"
no se si estoy diciendo burradas pero al utilizar el puntero a cadenas lo puede entender un recién empezado en C++ digo las personas q todavía no aprendío o vio la clase string, pero si vos le das el ejercicio con la clase string a uno q todavía no estudio esto es como japones no lo va a entender.

Tienes razon xq el ejercicio anterior no entdi nada

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: contar palabras de una cadena de caracteres
« Respuesta #20 en: Miércoles 2 de Marzo de 2011, 00:02 »
0
Eso ya es problema del profesor que no explica C++ sino C.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #21 en: Miércoles 2 de Marzo de 2011, 04:43 »
0
Bueno estas son las ventajas de usar const char* :

1. Es mucho más rápido que usar el operador[] de std::string. (Usando un desensamblador (rodeando el código con instrucciones asm que nunca encontrarías en un programa normal ) es posible ubicar el código generado y tener una buena idea de la diferencia.)
2. No tienes que crear una instancia de std::string para llamar a esa función. Es decir si no tenías un objeto std::string de antemano. Reservar y liberar memoria para una instancia temporal es mucho castigo para la eficiencia de cualquier aplicación.
3. No tienes que incluir <string>, como ya dijeron no es necesario conocer esa clase para poder entender el código.

No es que tenga algo en contra de std::string, todo lo contrario, por que detesto reservar y liberar memoria en C todo el tiempo hasta para una simple cadena. Pero si tengo chance de tomar lo mejor de c++ y c, pues lo hago.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: contar palabras de una cadena de caracteres
« Respuesta #22 en: Miércoles 2 de Marzo de 2011, 12:53 »
0
Cita de: "Amilius"
por que detesto reservar y liberar memoria en C todo el tiempo hasta para una simple cadena
Con char* también estás reservando y liberando memoria.

Cita de: "Amilius"
Pero si tengo chance de tomar lo mejor de c++ y c, pues lo hago.
Mezclar C y C++ para un ejemplo pequeño no hay problema. Mezcla C y C++ en un proyecto grande y luego venid llorando.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: contar palabras de una cadena de caracteres
« Respuesta #23 en: Viernes 4 de Marzo de 2011, 19:43 »
0
Cita de: "m0skit0"
Con char* también estás reservando y liberando memoria.

"char*" es sólo un puntero, no implica reservar ni liberar memoria. El ejemplo que puse tampoco reserva ni libera memoria directamente por que es la clase std::string la que reserva y libera la cantidad de memoria necesaria.

Cita de: "m0skit0"
Mezclar C y C++ para un ejemplo pequeño no hay problema. Mezcla C y C++ en un proyecto grande y luego venid llorando.

Para nada, nunca he tenido ese problema. Lo que si es problema es que los programadores digan que saben C++ cuando no tienen idea de POO, o cuando dicen que saben C y creen que la memoria se libera mágicamente o te llenan el código de posibles "buffer overflow". O cuando no se toman el tiempo suficiente para leer la documentación de las bibliotecas que van a usar y te llenan el código de "leaks". También están los que no pueden vivir sin abusar de los patrones de diseño y para colmo los implementan mal. Etc, etc, etc. Pero mezclar C con C++ nunca ha sido problema.  :mellow:

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: contar palabras de una cadena de caracteres
« Respuesta #24 en: Sábado 5 de Marzo de 2011, 05:58 »
0
Cita de: "Amilius"
Pero mezclar C con C++ nunca ha sido problema.  :mellow:
+1
La imaginación es el límite.
Hardware & Software | Mexchip