句子的平均单词长度

时间:2013-06-15 23:03:35

标签: c

我想计算句子的平均字长。

例如,给定输入abc def ghi,平均字长为3.0

该程序有效,但我想忽略单词之间的额外空格。所以,给出以下句子:

abc  def

(单词之间有两个空格),平均字长计算为2.0而不是3.0

如何考虑单词之间的额外空格?这些将被忽略,这将在上面的示例中给出3.0的平均字长,而不是错误计算的2.0

#include <stdio.h>
#include <conio.h>

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();
}               

3 个答案:

答案 0 :(得分:4)

计数逻辑错误。此代码似乎可以正确处理前导和尾随空白,以及单词之间的多个空白等。请注意int ch;的使用,以便代码可以准确地检查EOF(getchar()返回{{1 }})。

int

运行各种示例,使用#include <stdio.h> #include <stdbool.h> 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; } 指示 Return 被击中的位置。

#

在最后一个例子中,我输入了 Control-D 两次(第一个将'阿尔及尔的A人'冲洗到程序中,第二个用EOF冲洗),一次进入最后的例子。请注意,此代码将标签计为“非空格”;您需要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 #include <ctype.h>(或if (isspace(ch)))代替if (isblank(ch))来更好地处理标签。


if (ch == ' ')返回getchar()

  

我很困惑为什么你使用了intint ch

这个答案有几个部分。

  1. 使用EOF的第一个原因是int ch函数返回getchar()。它可以返回任何有效字符加上单独的值EOF;因此,它的返回值不能是任何类型的int,因为它必须返回的值多于char中的值。它实际上返回char

  2. 为什么重要?假设int的值已分配给getchar()。现在,对于大多数角色来说,大部分时间都可以。但是,有两件事情会发生。如果普通char ch是有符号类型,则有效字符(通常为ÿ,y-umlaut,0xFF,正式为Unicode U + 00FF,带有DIAERESIS的LATIN SMALL LET)被误识别为EOF。或者,如果普通char是无符号类型,那么您将永远不会检测到EOF。

  3. 为什么检测EOF很重要?因为您的输入代码可以在您不期望它时获得EOF。如果您的循环是:

    char

    并且输入达到EOF,程序将花费很长时间没有任何用处。 int ch; while ((ch = getchar()) != '\n') ... 函数将重复返回EOF,而EOF不是getchar(),因此循环将再次尝试。始终检查输入函数中的错误条件,无论函数是'\n'getchar()scanf()fread()还是他们的无数亲戚。

答案 1 :(得分:2)

显然,计算非空格字符很容易,你的问题就是数字。为什么要把单词算作空格呢?或者更重要的是,什么定义了一个词?

IMO一个词被定义为从空间角色到非空间角色的过渡。因此,如果您能够检测到这一点,您就可以知道您拥有多少单词并解决了您的问题。

我有一个实现,有很多可能的方法来实现它,我认为你不会遇到麻烦。我可以稍后将其实施发布为编辑。

*编辑:我的实施

#include <stdio.h>

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);
}

答案 2 :(得分:2)

考虑以下输入:(连字符代表空格)

--Hello---World--

您当前忽略了初始空格和结束空格,但您计算每个中间空格,即使它们彼此相邻。稍微改变你的程序,尤其是'k',我们可以处理这个案例。

#include <stdio.h>
#include <conio.h>
#include <stdbool.h>
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();
}          

您可能需要稍微修改前面的内容(尚未测试)。

但是,根据单词之间的空格计算句子中的单词可能不是您想要的一切。请考虑以下句子:

  约翰说:“拿起电话......现在!”

     

电视播音员刚刚提供买入1送1的优惠,同时表示他们全天候开放。

     

它们不会花费超过100.99美元/月(3,25欧元)。

     

我马上打电话给他(555)555-5555。

     

A(n)= A(n-1)+ A(n-2) - 换句话说,序列:0,1,1,2,3,5,... 。

你需要决定一个单词的构成,这不是一个简单的问题(顺便说一句,你们都没有包含所有英语版本的例子)。计算空格在英语中是一个非常好的估计,但它不会让你一路走来。

查看Text Segmentation上的维基百科页面。文章四次使用短语“非平凡”。