CS50 Pset2可读性程序异常:简单文本评级高,复杂文本评级低
问题分析与修复方案
我来帮你排查这个Coleman-Liau指数计算的问题!你遇到的现象——简单文本等级偏高、复杂文本等级偏低——主要是代码里的几个逻辑细节出错了,咱们一步步拆解:
核心问题点
1. 句子计数的逻辑缺陷
你的代码只统计带有.?!的句子,但实际很多日常输入的简单文本(比如hello there)可能没有这些标点符号,导致sentence变量为0。代入公式时,0.296 * S这一项就变成0,少了一个拉低等级的关键项,最终计算出的等级自然虚高。反过来,复杂文本通常有更多句子标点,S值更大,这一项的减法作用更明显,导致等级被意外拉低。
2. 单词计数的边界错误
你把word的初始值设为1,这在文本开头没有空格时是没问题的,但如果输入文本以空格开头(比如 hello world),代码会把开头的空格误判为单词分隔,导致word多计数1个,进而影响L和S的计算精度。
3. 全局变量的潜在风险
letter、word、sentence被定义为全局变量,虽然单次运行程序时初始值正确,但如果在测试环境中多次运行程序(比如IDE里反复执行),全局变量不会自动重置,会导致后续计算使用之前的残留值,结果彻底混乱。
修复后的代码
#include <stdio.h> #include <cs50.h> #include <string.h> #include <math.h> int main(void) { // 把变量改为局部变量,每次运行都会重新初始化 float letter = 0; float word = 0; float sentence = 0; string text = get_string("Text: "); int len = strlen(text); for (int i = 0; i < len; i++) { // 统计字母 if ((text[i] >= 'a' && text[i] <= 'z') || (text[i] >= 'A' && text[i] <= 'Z')) { letter++; } // 统计单词:遇到空格且前一个字符不是空格时计数(避免开头/连续空格的问题) else if (text[i] == ' ') { if (i > 0 && text[i-1] != ' ') { word++; } } // 统计句子 else if (text[i] == '.' || text[i] == '!' || text[i] == '?') { sentence++; } } // 最后要给单词数加1(因为循环里只统计了空格分隔的次数,单词数=空格数+1) if (len > 0) { word++; } // 避免除以0的情况(空输入) if (word == 0) { printf("Please enter valid text.\n"); return 1; } printf("Letter:%f, Word:%f, Sentence:%f\n", letter, word, sentence); float L = (letter / word) * 100; float S = (sentence / word) * 100; float x = (0.0588 * L) - (0.296 * S) - 15.8; if (x >= 16) { printf("Grade Level: 16+\n"); } else if (x >= 1) { printf("Grade Level: %i\n", (int) round(x)); } else { printf("Before Grade 1\n"); } return 0; }
关键修改说明
- 局部变量替代全局变量:把
letter、word、sentence移到main函数内,确保每次运行程序都会重新初始化,避免残留值干扰。 - 优化单词计数逻辑:循环里只在遇到空格且前一个字符不是空格时计数,避免开头空格和连续空格导致的错误。最后再给
word加1(因为单词数=空格分隔次数+1)。 - 增加边界处理:加入空输入的判断,避免除以0的错误;调整等级输出的条件顺序,逻辑更清晰。
- 测试验证:
- 输入
hello there.(带句号):letter=10,word=2,sentence=1,计算得x≈-1.2,输出Before Grade 1,符合预期。 - 输入一段复杂文本(比如
Hello! This is a longer sentence with multiple words and punctuation. How do you think this should grade?):会得到合理的中高等级。
- 输入
内容的提问来源于stack exchange,提问作者Charah Wheeler
相关产品推荐
相关产品推荐

