句子的平均单词长度
我想计算句子的平均单词长度。
例如,给定输入abc def ghi
,平均字长为3.0
。
该程序有效,但我想忽略单词之间的额外空格。 所以,给出以下句子:
abc def
(单词之间有两个空格),平均字长计算为2.0
而不是3.0
。
如何考虑单词之间的额外空格? 这些将被忽略,这将在上面的示例中给出3.0
平均字长,而不是错误计算的2.0
。
#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(); }
计数逻辑是错误的。 这段代码似乎可以正确处理前导和尾随空白,以及单词之间的多个空格等。注意使用int ch;
这样代码就可以准确地检查EOF( getchar()
返回一个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; }
各种示例运行,使用#
来指示返回命中的位置。
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
在最后一个例子中,我两次输入Control-D (第一个将’阿尔及尔的人类’冲洗到程序中,第二个用EOF冲洗),在最后一个例子中输入一次。 请注意,此代码将制表符计为“非空格”; 你需要#include
和if (isspace(ch))
(或if (isblank(ch))
)代替if (ch == ' ')
来更好地处理标签。
getchar()
返回一个int
我很困惑为什么你使用了
int ch
和EOF
!
这个答案有几个部分。
-
使用
int ch
的第一个原因是getchar()
函数返回一个int
。 它可以返回任何有效字符加上单独的值EOF; 因此,它的返回值不能是任何类型的char
,因为它必须返回的值多于char
。 它实际上返回一个int
。 -
为什么这有关系? 假设将
getchar()
值赋给char ch
。 现在,对于大多数角色来说,大部分时间都可以。 但是,有两件事情会发生。 如果plainchar
是带符号的类型,则有效字符(通常为ÿ,y-umlaut,0xFF,正式为Unicode U + 00FF,带有DIAERESIS的LATIN SMALL LET)被误识别为EOF。 或者,如果普通char
是无符号类型,那么您将永远不会检测到EOF。 -
为什么检测EOF很重要? 因为您的输入代码可以在您不期望它时获得EOF。 如果您的循环是:
int ch; while ((ch = getchar()) != '\n') ...
并且输入达到EOF,程序将花费很长时间没有任何用处。
getchar()
函数将重复返回EOF,而EOF不是'\n'
,因此循环将再次尝试。 始终检查输入函数中的错误条件,无论函数是getchar()
,scanf()
,fread()
,read()
还是任何无数的亲戚。
很明显,计算非空格字符很容易,你的问题就是数字。 为什么要像你一样把单词算作空格? 或者更重要的是,什么定义了一个单词?
IMO一词被定义为从空间角色到非空间角色的过渡。 因此,如果您能够检测到这一点,您就可以知道您拥有多少单词并解决了您的问题。
我有一个实现,有很多可能的方法来实现它,我认为你不会遇到麻烦。 我可以稍后将我的实现发布为编辑。
*编辑:我的实施
#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); }
请考虑以下输入:(连字符表示空格)
--Hello---World--
您当前忽略了初始空格和结束空格,但是您计算每个中间空格,即使它们彼此相邻。 稍微改变你的程序,特别是’k’,我们可以处理这个案例。
#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(); }
您可能需要稍微修改前面的内容(尚未测试)。
但是,根据单词之间的空格计算句子中的单词可能不是您想要的一切。 考虑以下句子:
约翰说:“拿起电话……现在!”
电视播音员刚刚提供买入1送1的优惠,同时表示他们全天候开放。
它不会花费超过100.99美元/月(3,25欧元)。
我马上打电话给他(555)555-5555。
A(n)= A(n-1)+ A(n-2) – 换句话说,序列:0,1,1,2,3,5,… 。 。
你需要决定一个单词的构成,这不是一个简单的问题(顺便说一句,你们都没有包含所有英语版本的例子)。 计算空间在英语中是一个非常好的估计,但它不会让你一路走来。
查看有关文本分段的Wikipedia页面。 这篇文章使用了“非平凡”这个短语四次。