解释代码结构背后的逻辑,需要考虑额外的空格,以便计算正确的平均单词长度

  • 本文关键字:计算 空格 单词长 背后 结构 代码 解释 c
  • 更新时间 :
  • 英文 :


这是我作业中的问题:编写一个程序,提示用户输入一个句子(假设一个句子最多可以有50个字符)。然后,它计算其中的元音和辅音。它还计算输入句子的平均单词长度。单词长度是句子中字母字符的总数除以其中的单词总数。单词由一个或多个空格分隔。所有结果都显示在最后。

到目前为止,我已经能够完成问题的各个方面,但我遇到了一个逻辑错误。当用户输入的空格超过正常数量时,就会混淆平均单词长度的答案。

这是我计算平均单词长度的代码:

for(i = 1; sent[i] != ''; i++){
if( sent[i] == ' '){
++spaceCount;
}
else if((sent[i] != ' ') && (sent[i] != 'n')){
++charCount;
}
}
avgWordLength = (charCount / (spaceCount+1)) ;

有人能帮助解释代码结构背后的逻辑吗?为了计算正确的平均单词长度,需要考虑额外的空格

这里有一个链接,指向之前已经回答过的问题:句子的平均单词长度

但我的学校还没有教过"getchar"函数,除非我也教过,否则我不想使用它。更清楚地说,是否可以在不使用"getchar"函数的情况下完成问题?

以下是编译和运行时的问题示例

// Everything works good when
string: Thursday is ok 
Average word length: 4.00 characters
// this is where my code fall apart 
string:     Thursday is ok
Average word length: 1.86 characters

好吧,如果你仔细想想,你想做的就是将任何不间断的空白字符序列视为一个字符,以计算字数。您可以包含ctype.h并使用isspace函数来测试所有可能的空白字符,或者如果您应该手动测试,那么至少检查spacetab字符(例如,您可能有一个空格和制表符的混合序列,这些字符仍应算作一个(例如" t t ")

要处理多个空白字符并将序列计数为一个,只需设置标志(例如,ws表示空白),当遇到第一个空白时只递增spaceCount,如果遇到另一个非空白字符,则重置该标志。

把这些部分放在一起,你可以做如下的事情:

int ws = 0;     /* flag to treat multiple whitespace as 1 */
for(i = 0; sent[i]; i++){
if (sent[i] == ' ' || sent[i] == 't') {
if (!ws) {
spaceCount++;
ws = 1;
}
}
else {
charCount++;  /* non-whitespace character count */
ws = 0;
}
}

(注意:sent空字符串的情况下,从i = 0开始检查以防止未定义行为。)

(注意2:您可以在设置第一个spaceCount之前检查charCount,在离开循环后检查ws以处理前导尾随空白,并根据需要调整spaceCount。这只是一个练习)

仔细看看,如果你还有什么问题,请告诉我。

为了计算正确的平均单词长度,有人能帮助解释代码结构背后的逻辑吗

您可以使用状态机。您有两种状态:

1) 寻找一个单词的结尾。

2) 寻找太空序列的结尾。

看句子中的第一个字符。它要么是单词的开头,要么是空格。这告诉你是处于状态1还是状态2。

如果处于状态1,则查找空格或句子末尾。如果找到空间,请将您的状态设置为2。

如果处于状态2,则查找非空格或句子末尾。如果找到非空格,请将您的状态设置为1。

计算其中的元音和辅音。它还计算输入句子的平均单词长度。

有人能帮助解释解释解释额外空间所需的代码结构背后的逻辑吗

确实没有必要计算空格。相反,只需要计算一个字母以一个单词开头的次数——它跟在一个非字母后面——或者是第一个字符。

// pseudo code
sentence_stats(const char *s) {
vowels = 0; 
consonants = 0; 
word_count = 0;

previous = 0;
while (*s) {
if (isletter(*s)) {  // OP to make isletter(), isvowel()
if (!isletter(previous)) {
word_count++; // start of word
}
if (isvowel(*s)) vowels++;
else consonants++;
} else if (*s == ' ') {
; // nothing to do
} else  {
TBD_CODE_Handle_non_letter_non_space();
}
previous = *s;
s++;
}
average = (vowels + consonants)/word_count
}

最新更新