You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 PSET2 Readability程序仅输出Before Grade 1问题求助

CS50 PSET2 Readability 始终输出'Before Grade 1'问题定位

你的代码核心问题是没调用统计函数就直接计算阅读指数,导致用来计算L和S的变量都是初始值,最终算出的指数必然小于1,所以一直输出Before Grade 1。具体问题拆解:

  • 你在main函数里拿到用户输入的text后,直接用letters、words、sentences计算L和S,但这三个变量根本没经过统计函数赋值——你写了count_letters、count_words、count_sentences三个函数,但从头到尾没调用过它们!
  • 另外你重复定义了全局变量:顶部声明了int letters; int sentences; int words;,又在每个函数外重新定义了带初始值的同名变量,这会导致变量作用域混乱,而且全局变量本身容易引发这类未初始化/未更新的问题,更推荐用局部变量接收函数返回值。

修正后的代码

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

// 函数声明
int count_sentences(string);
int count_words(string);
int count_letters(string);

int main(void)
{
    // 获取用户输入
    string text = get_string("Text: ");

    // 调用统计函数,用局部变量接收结果
    int letters = count_letters(text);
    int words = count_words(text);
    int sentences = count_sentences(text);

    // 计算阅读等级
    float L = 100.0 * letters / words;
    float S = 100.0 * sentences / words;
    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(string text)
{
    int letters = 0; // 用局部变量,避免全局副作用
    for (int i = 0; i < strlen(text); i++)
    {
        if (isalpha(text[i]))
        {
            letters++;
        }
    }
    return letters;
}

// 统计单词数量
int count_words(string text)
{
    int words = 1;
    for (int i = 0; i < strlen(text); i++) // 从0开始循环,避免漏掉开头空格导致的单词统计错误
    {
        if (isspace(text[i]))
        {
            words++;
        }
    }
    return words;
}

// 统计句子数量
int count_sentences(string text)
{
    int sentences = 0;
    for (int i = 0; i < strlen(text); i++)
    {
        if (text[i] == '.' || text[i] == '!' || text[i] == '?')
        {
            sentences++;
        }
    }
    return sentences;
}

额外修正点说明

  1. 去掉了所有全局变量,改用函数内的局部变量统计,避免全局变量带来的未初始化/重复定义问题
  2. count_words函数的循环从i=0开始,避免漏掉文本开头的空格(如果用户输入开头有空格的话,原来的i=1会少统计一个单词)
  3. 计算L和S时用100.0而不是100,确保浮点数运算更准确

内容的提问来源于stack exchange,提问作者Gabriela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:02:25