elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con contador de palabras en C para principiantes
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con contador de palabras en C para principiantes  (Leído 2,515 veces)
al2000

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Duda con contador de palabras en C para principiantes
« en: 22 Octubre 2018, 09:57 am »

Hola! Soy nuevo en programación en C y hay un ejercicio que me pide que cuente las palabras de una frase acabada en '.', además de tener en cuenta los espacios en medio y sin utilizar strings ni vectores.

Mi problema es que he visto muchos tipos de códigos que lo resolvían con strings y eso aún no sé como aplicarlos.

Quizás deberia de cambiarlo por un while? O un do-while?
El codigo que de momento tengo es:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int cont;
  6.    char frase;
  7.  
  8.    printf("Introduzca una frase acabada en punto: ");
  9.    scanf("%c", &frase);
  10.  
  11.  
  12.    if(frase != ' ' && frase != '.' )
  13.    {
  14.        cont++;
  15.    }
  16.  
  17.  
  18.    printf("\nNumero de palabras: %d\n", cont);
  19.  
  20. }


« Última modificación: 22 Octubre 2018, 18:35 pm por al2000 » En línea

Dresden

Desconectado Desconectado

Mensajes: 5


First solve the problem, then write the code.


Ver Perfil
Re: Duda con contador de palabras en C para principiantes
« Respuesta #1 en: 22 Octubre 2018, 22:52 pm »

Código
  1. #include <stdio.h>
  2. #include <ctype.h>  // isalpha()
  3.  
  4. int main(void) {
  5.    int nPalabras = 0;
  6.    int existeLetra = 0;
  7.    char caracter = '\0';
  8.  
  9.    while (caracter != '.') {
  10.        scanf("%c", &caracter);
  11.  
  12.        if (!existeLetra) {
  13.            existeLetra = isalpha(caracter);
  14.        }
  15.  
  16.        if (existeLetra) {
  17.            if (caracter == ' ') {
  18.                ++nPalabras;
  19.                existeLetra = 0;
  20.            }
  21.  
  22.            if (caracter == '.') {
  23.                ++nPalabras;
  24.            }
  25.        }
  26.    }
  27.  
  28.    printf("Total palabras: %i\n", nPalabras);
  29.  
  30.    return 0;
  31. }


En línea

PROGRAMMER
noun. [pro-gram-mer]
Someone who solves a problem
you didn't know you had, in a way
that you don't understand.

See also wizard, magician.
dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Duda con contador de palabras en C para principiantes
« Respuesta #2 en: 23 Octubre 2018, 18:35 pm »

La solución anterior es incorrecta: en el momento en que haya más de un espacio entre palabras, o mismamente cuando no haya palabras, el cálculo es errónea.

Propongo esta.

No tengo un compilador a mano para probarlo...
Pero si metes una frase, sin punto al final, no hace falta, debe funcionar.... No metas más que 'a', 'z' y ' '

Código
  1.  
  2.  
  3. /*
  4.  
  5.  
  6.   P : V[0..N) , N>= 0  
  7.   Q : (c = # i, j: 0 <= i < j <= N : word(V, i, j))
  8.  
  9.       where
  10. word(V,n,m) : allesnb(n, m) and (n>0 - > V[n-1]=' ') and  (m<N- > V[m]=' ')
  11.  
  12.  
  13. Snapshot invariant:
  14. -------------------
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.    I : Q[N/n]
  22.        and 0 <= n <= N
  23.      
  24.  
  25.    B : n<N
  26.  
  27.  
  28.    C(n) = N - n  >= 0
  29.  
  30.    Init:
  31.    -----
  32.      n,c = 0,0
  33.  
  34.    Step:
  35.    ------
  36.      n= n + 1 (Clearly, quota decreases)
  37.  
  38.  
  39.    Restore:
  40.    --------
  41.       c = c +\chi (V[n]! =' ' && (n=0 ||   V[n-1]==' '))
  42.  
  43.  
  44.    Pseudo-code:
  45.    ------------
  46.  
  47.    n,c= 0,0
  48.    while  n < N
  49.        c = c +\chi (V[n]! =' ' && (n=0 ||   V[n-1]==' '))
  50.       n= n +1
  51.    end
  52.    return c
  53.  
  54.    
  55. O(N) since while;s body is in O(1) and f_iter in O(N)
  56.        
  57. */
  58.  
  59. #include <iostream>
  60. #include <algorithm> // max,min
  61. #include <string> // to string, to use
  62.  
  63.  
  64. using namespace std;
  65. #define MAX 100000
  66.  
  67.  
  68. /* See full development and derivation above*/
  69. int solve(const char V[], const int N)
  70. {
  71.  int c,n;
  72.  for(n=c=0;n<N;n++)
  73.       c +=(V[n]!=' ' && (!n ||   V[n-1]==' '));
  74.  return c;
  75. }
  76.  
  77.  
  78. int main(int argc, char *arg[])
  79. {
  80.  int n,N;
  81.  string V;
  82.  for(;getline(cin, V) ;)
  83.      cout << solve(V. c_str() ,V.length() ) << endl;
  84.  return 0;
  85. }
  86.  
  87.  
« Última modificación: 25 Octubre 2018, 16:05 pm por dijsktra » En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Dresden

Desconectado Desconectado

Mensajes: 5


First solve the problem, then write the code.


Ver Perfil
Re: Duda con contador de palabras en C para principiantes
« Respuesta #3 en: 24 Octubre 2018, 06:57 am »

...un ejercicio que me pide que cuente las palabras de una frase acabada en '.'...

El título del tema nos dice que se trata de un ejercicio para principiantes, por esto, al leer la parte de la pregunta que cité anteriormente, deduje que la entrada del programa siempre sería una frase terminada con un punto (utilizado para señalar el final de la entrada). Lo que es habitual en este tipo de ejercicios, donde se suelen asumir entradas ideales.

Estos son algunos de los casos de prueba que utilicé, y las salidas que obtuve con mi código:

Código
  1. .
  2. 0
  3.  
  4.       .
  5. 0
  6.  
  7. ,;.
  8. 0
  9.  
  10. ,  ;    .
  11. 0
  12.  
  13. Hola.
  14. 1
  15.  
  16. Hola      .
  17. 1
  18.  
  19.        Hola   .
  20. 1
  21.  
  22. En un lugar de la Mancha, de cuyo nombre no quiero acordarme...
  23. 12
  24.  
  25. En    lugar             , de cuyo nombre no quiero          .
  26. 7
  27.  
  28. En un lugar.
  29. 3

Como se puede ver, cuando no existen palabras o cuando hay más de un espacio entre las palabras el cálculo es correcto.

No tomé en cuenta, intencionalmente, el conteo de números dentro de la frase, porque al2000 no lo planteó como parte del problema:

Código
  1. Ahora vienen 7 espacios:       , con estos otros suman 12:     .
  2. 7

En todo caso, no me parece que sea una solución incorrecta para un ejercicio de nivel básico.
En línea

PROGRAMMER
noun. [pro-gram-mer]
Someone who solves a problem
you didn't know you had, in a way
that you don't understand.

See also wizard, magician.
dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Duda con contador de palabras en C para principiantes
« Respuesta #4 en: 24 Octubre 2018, 10:55 am »

Hola dresden, gracias por responder. Así aprenderé algo también.

Mi razonamiento al estudiar tu código, sin ejecutarlo, fue el siguiente :

  • creo (no estoy seguro), que scanf no procesa el espacio ' ' como carácter, por lo que nunca evaluará espacios en la cadena.. Suponiendo que si, entonces
  • o  bien isalpha(' ') es true, en cuyo caso existeLetra es true, y es evaluado por la parte positiva del primer condicional... En ese caso, la traza '    .' (5 espacios y un punto) da al menos 5 palabras, pues incrementa nPalabras 5 veces. Es esto correcto?
  • o bien isalpha(' ') es false,en cuyo caso  nunca es evaluado por la condición del if, nPalabras no se incrementa. 'hola'  daría 0 palabras.
  • ocurre que efectivamente, 'hola.' se incrementará en 1. Esto implica  que isalpha('.') es true.

 Y según el manual

Citar



isalpha()
checks for an alphabetic character; in the standard "C" locale, it is equivalent to (isupper(c) || islower(c)). In some locales, there may be additional characters for which isalpha() is true-letters which are neither upper case nor lower case.


Es decir, que en el estándar C locale, sería false. Debe ser que tu computador esté configurado a sp (Spanish) y acierta arbitrariamente, marcando isalpha(' ') false y isalpha('.') true  , pero con otra configuración, no está garantizado





... Lo que es habitual en este tipo de ejercicios, donde se suelen asumir entradas ideales.
En mi opinión, las frases "ideales" deben acabar en C,  en un carácter nulo, y no deben incluir símbolos como Comas, acentos y "puntos y Comas". La única razón es ajustarse a la esencia del Problema, que deja de ser portable en otros "locales".... Pero esto es opinable...

En lo que respecta a los casos que mandas, el segundo me llama la atención, puesto que según lo anterior '    .' (5 espacios y un blanco) debería dar 1, y te da 0, que es lo correcto.

Es realmente la salida de tu código?
No Le veo la explicación, pero puede que esté equivocado.
Debería verse



Código
  1. Total palabras: 0
  2.  

Un saludo, amigo... A ver si me sacas de dudas...
Estoy solo con un móvil y no puedo probar tus códigos.

Estos son algunos de los casos de prueba que utilicé, y las salidas que obtuve con mi código:



Código
  1. .
  2. 0
  3.  
  4.       .
  5. 0
  6.  
  7. ,;.
  8. 0
  9.  
  10. ,  ;    .
  11. 0
  12.  
  13. Hola.
  14. 1
  15.  
  16. Hola      .
  17. 1
  18.  
  19.        Hola   .
  20. 1
  21.  
  22. En un lugar de la Mancha, de cuyo nombre no quiero acordarme...
  23. 12
  24.  
  25. En    lugar             , de cuyo nombre no quiero          .
  26. 7
  27.  
  28. En un lugar.
  29. 3

Como se puede ver, cuando no existen palabras o cuando hay más de un espacio entre las palabras el cálculo es correcto.

No tomé en cuenta, intencionalmente, el conteo de números dentro de la frase, porque al2000 no lo planteó como parte del problema:

Código
  1. Ahora vienen 7 espacios:       , con estos otros suman 12:     .
  2. 7

En todo caso, no me parece que sea una solución incorrecta para un ejercicio de nivel básico.
« Última modificación: 24 Octubre 2018, 11:39 am por dijsktra » En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Duda con contador de palabras en C para principiantes
« Respuesta #5 en: 25 Octubre 2018, 16:21 pm »

Estos son algunos de los casos de prueba que utilicé, y las salidas que obtuve con mi código:


....

En todo caso, no me parece que sea una solución incorrecta para un ejercicio de nivel básico.

Mis excusas. He probado ya tus códigos y son como dices. Aunque la estrategia de "existeLetra" como flag de comienzo no la entendía.
En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Python] - Contador de palabras en frases
Scripting
ChicoMaravilla 4 31,387 Último mensaje 18 Enero 2011, 21:17 pm
por Karcrack
[PYTHON] Contador de palabras
Scripting
ChicoMaravilla 2 11,010 Último mensaje 5 Abril 2011, 20:47 pm
por Novlucker
contador de palabras (ayuda con el error)
Programación C/C++
creiko 3 2,478 Último mensaje 3 Septiembre 2016, 00:46 am
por JonaLamper
un contador de palabras
Programación C/C++
g.izmo 6 3,854 Último mensaje 14 Octubre 2017, 17:09 pm
por g.izmo
Contador de palabras
Programación C/C++
Goddamn 1 1,942 Último mensaje 18 Marzo 2018, 19:23 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines