解决了CS50可读性问题,但我不知道为什么需要在count_words中将num初始化为1(第63行)

iqih9akk  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(79)

我通过将num初始化为1来解决这个问题,因为这是我所知道的获得实际单词计数的唯一方法。但我不明白这背后的逻辑,在不了解发生了什么的情况下修复它不是一个好的做法。还有,我怎么发代码,它一直告诉我“看起来你的帖子大部分都是代码;请多加一些细节。”但是我没有别的要写了…

#include <cs50.h>
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <string.h>

int count_letters(string text);
int count_words(string text);
int count_sentences(string text);

int main(void)
{
    string input; // get input, making sure it does not start with space
    do
    {
        input = get_string("Text: ");
    }
    while (input[0] == ' ');

    // CALCULATION
    int letters = count_letters(input);
    int words = count_words(input);
    int sentences = count_sentences(input);

    float L =
        ((float) letters / words) * 100; // need float or it will truncate removing the remainder as it is two int getting divided
    float S = ((float) sentences / words) * 100;

    int index = round(0.0588 * L - 0.296 * S - 15.8);

    if (index > 16)
    {
        printf("Grade 16+\n");
    }

    else if (index < 1)
    {
        printf("Before Grade 1\n");
    }

    else
    {
        printf("Grade %i\n", index);
    }
}

int count_letters(string text)
{
    int num = 0;

    for (int i = 0, l = strlen(text); i < l; i++)
    {
        if (isalpha(text[i]))
        {
            num++;
        }
    }
    return num;
}

int count_words(string text)
{
    int num = 1; // number should start from 1 for our purpose????? maybe the

    for (int i = 0, l = strlen(text); i < l; i++)
    {
        if (isspace(text[i]))
        {
            num++;
            if (isspace(text[i + 1])) // eliminating double spaces in between sentences
            {
                num--;
            }
        }
    }
    return num;
}

int count_sentences(string text)
{
    int num = 0;

    for (int i = 0, l = strlen(text); i < l; i++)
    {

        if (text[i] == '?')
        {
            num++;
        }
        if (text[i] == '!')
        {
            num++;
        }
        if (text[i] == '.')
        {
            num++;
        }
    }
    return num;
}
uxh89sit

uxh89sit1#

在几个小时前的评论中,我指出了在计算单词时令人困惑的int num = 1;的原因。就目前而言,这还不错,但还是有点问题。
在字符串""或像"....."这样的包含5个句子的字符串中,单词的数量是多少?
不仅1 word是错误的,而且对0的任何过于简单的修正都会导致 * 除以零 *。
我没有,也无法测试CS50函数get_string(),但是您的代码建议您拒绝前导空格的字符串,并且,该函数可能会修剪尾随空格。难说.
下面是一个函数的修改版本,它在任何单词的start处递增计数器(包括字符串中单个单词的情况)。

int count_words(string text)
{
    int num = 0;
    int inWord = 0; // a 'flag' set to 1 at the start and interior of any word

    for (int i = 0, l = strlen(text); i < l; i++)
    {
        if (isalpha(text[i])
        {
            if( inWord == 0 ) // have not been in a word
                num++; // count this word
            inWord = 1; // in a word now. No consequence of setting of flag repeatedly
        }
        else
            inWord = 0; // not alpha? out of any word
    }
    return num;
}

这也解决了 * 多个连续空格 * 的问题。一个字的开头才算数;而不是单词之间的空白。
main()中进行计算之前,我将让您添加代码来测试是否至少有一个“字”。
你可能还需要考虑“R2D2”或“C3 PO”是否应该算作一个单词...乔治卢卡斯想知道.
奖金信息:
根据定义,C字符串将以NUL字符('\0')结束。您可以利用这一点,并保存自己测量字符串之前,循环通过每个字符:

for (int i = 0; text[ i ] != '\0'; i++) // terminate loop at end of string

如果知道最后一个字节的 * 零值 * 等于false,这可以变得更简单。

for (int i = 0; text[ i ]; i++) // terminate loop at end of string

C语言是一门很棒的语言,你不觉得吗?

3pmvbmvn

3pmvbmvn2#

为了尽可能简洁,需要将“num”整数变量初始化为初始值“1”,这是因为文本字符串中最后一个单词的空格测试不会触发该变量的任何增量,因为for循环将在文本字符串长度的末尾结束。下面是“count_words”的代码片段,其中有一些代码和注解调整。

int count_words(string text)
{
    int num = 1;                // Account for the fact that incrementing this variable will not occur when the last word is being processed.
    int l = strlen(text);       // Clarifies what will be happening in the following for loop.

    for (int i = 0; i < l; i++) // Clarified/simpler for loop.
    {
        if (isspace(text[i]))
        {
            num++;
            if (isspace(text[i + 1])) // Eliminating double spaces in between sentences
            {
                num--;
            }
        }
    }
    return num;
}

除了将“l”整数变量的初始化移动到函数块的开头之外,我保留了代码的完整性,只是为了让后续分析代码的人更清楚。我添加了修改后的注解,希望澄清变量初始化的必要性。
继续查看这些调整,看看它是否有助于您进一步学习代码。

相关问题