首页 > 解决方案 > 字符串计数问题、浮点整数、基于字母、单词和句子数量的评分公式,在 C 中

问题描述

我正在编写一个程序来生成字母、单词和句子的数量,提供输入文本。
使用这些值,我想根据一个公式生成一个数字(评估“可读性”),其中字母、单词和句子中的数字作为变量。

请参阅此代码的最后一部分(对于等级公式)。

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

int main(void)
{
    char str[1000];
    int i=0, chr=0, st=1, sn=0;

    printf("Text: ");
    fgets(str, sizeof(str), stdin);

    for( i = 0; str[i] != '\0' ; i++)
    {
        chr = chr + 1;
    }

    printf("%d letters\n", chr);

    for (i = 0; i <= chr - 1; i++)
    {
        if (str[i] == ' ')
        {
            st = st + 1;
        }
    }

    printf("%d words\n", st);

    for (i = 0; i <= chr - 1; i++)
    {
        if (str[i] == '.' || str[i] == '!' || str[i] == '?')
        {
            sn = sn + 1;
        }
    }

    printf("%d sentences\n", sn);

    double L = (100.0 * chr / st);
    double S = (100.0 * sn / st);
    double grade = 0.0588 * L - 0.296 * S - 15.8;

    if (grade <= 1)
    {
        printf("Before Grade 1\n");
    }
    else if (grade < 16)
    {
        printf("Grade %f\n", round(grade));
    }
    else
    {
        printf("Grade 16+\n");
    }
}

我不知道为什么等级公式会产生奇怪的结果。

例如,

样本输入:

There are more things in Heaven and Earth, Horatio, than are dreamt of in your philosophy. 

样本输出:

92 letters 
17 words 
1 sentences
Grade 14 

字母、单词和句子并不奇怪——它们是意料之中的。14 级很奇怪,因为我期待 9 级。我无法识别模式,只是特征的奇怪可以描述为 Grade 的输出总是大于预期值,对于预期高于 1 级的值。

to continue, 
-Expected Grade 10 shows output Grade 16
-Expected Grade 8 shows output Grade 15
-Expected Grade 7 shows output Grade 14
-Expected Grade 5 shows output Grade 11
-Expected Grade 3 shows output Grade 10
-Expected Grade 2 shows output Grade 9

预期在 1 年级之前的文本会产生预期的输出。

等级公式:

指数 = 0.0588 * L - 0.296 * S - 15.8

其中 L 是文本中每 100 个单词的平均字母数,S 是文本中每 100 个单词的平均句子数

总的来说,我不知道为什么成绩公式没有产生预期的输出。

标签: ccs50

解决方案


我想,你对信的看法是错误的。在你input有一些空格字符,逗号字符等。所以你需要准确计算这句话中的字母(a,b,c,d,e,f等)的数量。

您可以使用该函数isalpha来计算字母的数量:

    for( i = 0; str[i] != '\0' ; i++)
    {
        if(isalpha(str[i]))
            chr = chr + 1;
    }

然后其他for循环计算单词和句子的数量,使用strlen(str)代替chr - 1

    for (i = 0; i < strlen(str); i++)
    {
        if (str[i] == ' ')
        {
            st = st + 1;
        }
    }

    printf("%d words\n", st);

    for (i = 0; i < strlen(str); i++)
    {
        if (str[i] == '.' || str[i] == '!' || str[i] == '?')
        {
            sn = sn + 1;
        }
    }

当我测试时,我得到了结果:

Text: There are more things in Heaven and Earth, Horatio, than are dreamt of in your philosophy.
72 letters
16 words
1 sentences
Grade 9.000000

推荐阅读