Longitud media de palabra para una oración

Quiero calcular la longitud de palabra promedio para una oración.

Por ejemplo, dada la entrada abc def ghi , la longitud promedio de la palabra sería 3.0 .

El progtwig funciona pero quiero ignorar los espacios adicionales entre las palabras. Entonces, dada la siguiente frase:

 abc def 

(dos espacios entre las palabras), la longitud promedio de la palabra se calcula en 2.0 lugar de 3.0 .

¿Cómo puedo tener en cuenta los espacios extras entre palabras? Se deben ignorar, lo que daría una longitud de palabra promedio de 3.0 en el ejemplo anterior, en lugar del 2.0 calculado erróneamente.

 #include  #include  int main() { char ch,temp; float avg; int space = 1,alphbt = 0,k = 0; printf("Enter a sentence: "); while((ch = getchar()) != '\n') { temp = ch; if( ch != ' ') { alphbt++; k++; // To ignore spaces before first word!!! } else if(ch == ' ' && k != 0) space++; } if (temp == ' ') //To ignore spaces after last word!!! printf("Average word lenth: %.1f",avg = (float) alphbt/(space-1)); else printf("Average word lenth: %.1f",avg = (float) alphbt/space); getch(); } 

La lógica de conteo está mal. Este código parece funcionar correctamente con espacios en blanco iniciales y finales, y espacios en blanco múltiples entre palabras, etc. Tenga en cuenta el uso de int ch; de modo que el código pueda verificar EOF con precisión ( getchar() devuelve un int ).

 #include  #include  int main(void) { int ch; int numWords = 0; int numLetters = 0; bool prevWasASpace = true; //spaces at beginning are ignored printf("Enter a sentence: "); while ((ch = getchar()) != EOF && ch != '\n') { if (ch == ' ') prevWasASpace = true; else { if (prevWasASpace) numWords++; prevWasASpace = false; numLetters++; } } if (numWords > 0) { double avg = numLetters / (float)(numWords); printf("Average word length: %.1f (C = %d, N = %d)\n", avg, numLetters, numWords); } else printf("You didn't enter any words\n"); return 0; } 

Se ejecutan varios ejemplos, utilizando # para indicar dónde se golpeó la devolución .

 Enter a sentence: A human in Algiers# Average word length: 3.8 (C = 15, N = 4) Enter a sentence: A human in Algiers # Average word length: 3.8 (C = 15, N = 4) Enter a sentence: A human in Algiers # Average word length: 3.8 (C = 15, N = 4) Enter a sentence: # You didn't enter any words Enter a sentence: A human in AlgiersAverage word length: 3.8 (C = 15, N = 4) Enter a sentence: You didn't enter any words 

En el último, pero uno de los ejemplos, escribí Control-D dos veces (el primero en vaciar el progtwig ‘Un humano en Argel’, el segundo en dar EOF), y una vez en el último ejemplo. Tenga en cuenta que este código cuenta las tabs como “no espacio”; necesitaría #include y if (isspace(ch)) (o if (isblank(ch)) ) en lugar de if (ch == ' ') para manejar mejor las tabs.


getchar() devuelve un int

Estoy confundido por qué has usado int ch y EOF !

Hay varias partes en esta respuesta.

  1. La primera razón para usar int ch es que la función getchar() devuelve un int . Puede devolver cualquier carácter válido más un valor separado EOF; por lo tanto, su valor de retorno no puede ser un char de ningún tipo porque tiene que devolver más valores de los que caben en un char . En realidad devuelve un int .

  2. ¿Por qué eso importa? Supongamos que el valor de getchar() se asigna a char ch . Ahora, para la mayoría de los personajes, la mayoría de las veces, funciona bien. Sin embargo, una de dos cosas sucederá. Si plain char es un tipo firmado, un carácter válido (a menudo ÿ, y-umlaut, 0xFF, formalmente Unicode U + 00FF, LATIN SMALL LETTER Y WITH DIAERESIS) se reconoce erróneamente como EOF. Alternativamente, si plain char es un tipo sin firma, nunca detectará EOF.

  3. ¿Por qué es importante la detección de EOF? Porque tu código de entrada puede obtener EOF cuando no lo esperas. Si tu bucle es:

     int ch; while ((ch = getchar()) != '\n') ... 

    y la entrada llega a EOF, el progtwig pasará mucho tiempo sin hacer nada útil. La función getchar() devolverá repetidamente EOF, y EOF no es '\n' , por lo que el bucle intentará nuevamente. Siempre verifique las condiciones de error en las funciones de entrada, si la función es getchar() , scanf() , fread() , read() o cualquiera de sus innumerables parientes.

Obviamente, contar caracteres sin espacio es fácil, su problema es contar palabras. ¿Por qué contar palabras como espacios mientras estás haciendo? O más importante, ¿qué define una palabra?

En mi opinión, una palabra se define como la transición del carácter de espacio al carácter sin espacio. Entonces, si puede detectar eso, puede saber cuántas palabras tiene y se solucionó su problema.

Tengo una implementación, hay muchas formas posibles de implementarla, no creo que tenga problemas para encontrar una. Puedo publicar mi implementación más tarde como una edición.

* Edición: mi implementación

 #include  int main() { char ch; float avg; int words = 0; int letters = 0; int in_word = 0; printf("Enter a sentence: "); while((ch = getchar()) != '\n') { if(ch != ' ') { if (!in_word) { words++; in_word = 1; } letters++; } else { in_word = 0; } } printf("Average word lenth: %.1f",avg = (float) letters/words); } 

Considere la siguiente entrada: (los guiones representan espacios)

 --Hello---World-- 

Actualmente ignora los espacios iniciales y los espacios finales, pero cuenta cada uno de los espacios intermedios, aunque estén uno al lado del otro. Con un ligero cambio en su progtwig, en particular con ‘k’, podemos tratar este caso.

 #include  #include  #include  int main() { char ch; float avg; int numWords = 0; int numLetters = 0; bool prevWasASpace = true; //spaces at beginning are ignored printf("Enter a sentence: "); while((ch = getchar()) != '\n') { if( ch != ' ') { prevWasASpace = false; numLetters++; } else if(ch == ' ' && !prevWasASpace) { numWords++; prevWasASpace = true; //EDITED this line until after the if. } } avg = numLetters / (float)(numWords); printf("Average word lenth: %.1f",avg); getch(); } 

Es posible que deba modificar un poco el anterior (no lo haya probado).

Sin embargo, contar palabras en una oración basándose solo en espacios entre palabras, puede que no sea todo lo que desea. Considera las siguientes oraciones:

Juan dijo: “Toma el teléfono … ¡Ahora!”

El locutor de televisión acaba de ofrecer una oferta de compra-1-obtener-1 gratis mientras dice que está abierto las 24 horas, los 7 días de la semana.

No les costaría más de $ 100.99 / mes (3,25 euros).

Estoy llamando al (555) 555-5555 inmediatamente en su teléfono.

A (n) = A (n-1) + A (n-2) – en otras palabras, la secuencia: 0,1,1,2,3,5,. . .

Deberá decidir qué constituye una palabra, y esa no es una pregunta fácil (por cierto, todos ustedes, ninguno de los ejemplos incluyó todas las variedades de inglés). Contar espacios es una estimación bastante buena en inglés, pero no te ayudará en absoluto.

Echa un vistazo a la página de Wikipedia sobre la segmentación de texto . El artículo usa la frase “no trivial” cuatro veces.