CS50 可读性 pset2 中的错误

Bug in CS50 Readability pset2

提问人:Dheetilekha Nath 提问时间:8/26/2020 最后编辑:Dheetilekha Nath 更新时间:8/28/2020 访问量:753

问:

我的代码编译正确,我通过了除一个测试用例之外的所有测试用例。 错误发生在句子中 - “在我更年轻和更脆弱的岁月里,我父亲给了我一些建议,从那以后我一直在脑海中翻阅”,这期望 7 级,但我的代码输出 8 级。

以下是部署 check50 时的输出:

处理包含多个单词的单个句子

应为“7 年级\n”,而不是“8 年级\n”

在打印出字母 ( 96) 、单词 (23) 句子 (1) 、索引 (7.548) 和 round(index) 的数量后,对于这种特殊情况,很明显,我看到所有数字都是正确的。 但我不明白 7.548 怎么能四舍五入到 7。

请帮助我调试代码,并让我知道我缺少什么。 谢谢!

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

int count_letters(int length , char arr[]);

int count_words(int length , char arr[]);

int count_sentences(int n, char arr[]);

int main (void)
{
    // Getting Input from user
    string text = get_string("Text: ");

    // Counting letters
    int  n = strlen(text);

    int letter = count_letters(n, text);
    int word = count_words(n, text);
    int sentence = count_sentences(n, text);
    
    float L = (letter*100)/word;
    float S = (sentence*100)/word;

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

    if (index < 1)
    {
        printf("Before Grade 1\n");
    }
    else if (index > 16)
    {
        printf("Grade 16+\n");
    }
    else
    {
        printf("Grade %i\n", index);
    }

}

int count_letters(int length , char arr[])
{
    int letters = 0;
    for ( int i = 0 ; i < length ;  i++)
    {

        if (tolower(arr[i]) >= 'a' && tolower(arr[i]) <= 'z' )
        {
            letters++ ;
        }

    }

    return letters;
}

int count_words(int length , char arr[])
{
    int words = 1 ;
    for (int i =0 ; i < length ; i++)
    {
        if (arr[i]== ' ')
        {
            words++;
        }
    }
    return words;
}

int count_sentences(int length, char arr[])
{
    int sentence = 0;
    for (int i = 0 ; i <length ; i++)
    {
        if (arr[i] == '.')
        {
           sentence ++;
        }
        else if (arr[i] == '?')
        {
            sentence ++;
        }
        else if ( arr[i] == '!')
        {
            sentence++;
        }
    }
    return sentence;
}`
C 调试舍入 CS50 浮动精度

评论

2赞 Retired Ninja 8/26/2020
float L = (letter*100.0)/word;与下一行相同。即使您将值赋给浮点数,数学运算也是使用所有整数完成的,因此它会截断。
1赞 Jonathan Leffler 8/26/2020
不要发布(链接到)文本输出的图片 - 在问题中显示文本输出。
0赞 Gerhardh 8/26/2020
-1 用于发布文本图片。您认为我们如何复制并粘贴您的第一个屏幕截图中的链接,其中提供了真正有用的信息。
0赞 Dheetilekha Nath 8/27/2020
谢谢你@RetiredNinja我理解了这个问题。
0赞 Dheetilekha Nath 8/27/2020
@JonathanLeffler下次会努力记住的。这是我第一次尝试提出问题,因此有链接。我以为我在提供信息:') 很抱歉给您带来不便。

答:

1赞 Eduardo-Puentes 8/26/2020 #1

试试这个(改变它)

float L = (letter / (float) word) * 100;
float S = (sentence / (float) word) * 100;

变量 “word” 需要指定为浮点数。 我有同样的问题。

0赞 Dheetilekha Nath 8/28/2020 #2
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int count_letters(int length, char arr[]);
int count_words(int length, char arr[]);
int count_sentences(int n, char arr[]);

int main(void)
{
    // Getting Input from user
    string text = get_string("Text: ");

    // Length of text
    int  n = strlen(text);
    
    //Calculating Coleman-Liau index 
    float L = ((float)count_letters(n, text) / (float)count_words(n, text)) * 100;
    float S = ((float)count_sentences(n, text) / (float)count_words(n, text)) * 100;
    
    int index = round((0.0588 * L) - (0.296 * S) - 15.8);
    
    // Print Grades
    if (index < 1)
    {
        printf("Before Grade 1\n");
    }
    else if (index > 16)
    {
        printf("Grade 16+\n");
    }
    else
    {
        printf("Grade %i\n", index);
    }

}

int count_letters(int length, char arr[])
{
    int letters = 0; // Letter counter 
    for (int i = 0 ; i < length ;  i++)
    {

        if (tolower(arr[i]) >= 'a' && tolower(arr[i]) <= 'z')
        {
            letters++ ;
        }

    }

    return letters;
}

int count_words(int length, char arr[])
{
    int words = 1 ; // word counter
    for (int i = 0 ; i < length ; i++)
    {
        if (arr[i] == ' ')
        {
            words++;
        }
    }
    return words;
}

int count_sentences(int length, char arr[])
{
    int sentence = 0; // sentence counter
    for (int i = 0 ; i < length ; i++)
    {
        if (arr[i] == '.' || arr[i] == '?' || arr[i] == '!')
        {
            sentence ++;
        }
    }
    
    return sentence;
}

评论

0赞 Dheetilekha Nath 8/28/2020
当 int 除以 C 中的 int 时,结果也是一个 int,任何余数都被丢弃。换句话说,结果将被截断。在计算 L 和 S 时,您可能希望在执行除法之前将一个或多个值转换为浮点数!