代码可编译但输出-nan,可读性计算功能异常求助
问题解决:代码输出-nan的原因及修复方案
为什么会出现-nan?
NaN(Not a Number)是无效数值计算的结果,你的代码里出现*-nan*,核心原因是使用未初始化的变量做除法运算,或运算过程中出现除以0的情况。
你的代码存在的问题
- 全局变量未初始化:你定义的
words、letters、sentences都是全局变量,默认会被赋予随机垃圾值,且这些变量未被计算函数赋值就直接参与compute_Readability里的除法运算。 - 函数调用顺序错误:你在
main里先调用了compute_Readability,但此时计算字母、单词、句子的函数还没执行,导致参与运算的变量都是垃圾值。 - 全局变量滥用:全局变量容易引发这类未初始化问题,也不利于代码逻辑的清晰性。
修复后的代码
#include <cs50.h> #include <stdio.h> #include <ctype.h> #include <string.h> #include <math.h> int compute_Letters(string Text); int compute_words(string Text); int compute_sentences(string Text); float compute_Readability(int letters, int words, int sentences); int main(void) { string Text = get_string("Text: "); // 先计算文本的字母、单词、句子数量 int letters = compute_Letters(Text); int words = compute_words(Text); int sentences = compute_sentences(Text); // 基于计算出的数值得到阅读等级 float Grade = compute_Readability(letters, words, sentences); // 按规则输出结果 if (Grade < 1) { printf("Before Grade 1\n"); } else if (Grade > 16) { printf("Grade 16+\n"); } else { printf("Grade: %.0f\n", round(Grade)); } } int compute_Letters(string Text) { int count = 0; for (int i = 0, len = strlen(Text); i < len; i++) { if (isalpha(Text[i])) { count++; } } return count; } int compute_words(string Text) { int count = 1; // 文本至少包含一个单词 for (int i = 0, len = strlen(Text); i < len; i++) { if (isblank(Text[i])) { count++; } } return count; } int compute_sentences(string Text) { int count = 0; for (int i = 0, len = strlen(Text); i < len; i++) { if(Text[i] == '.' || Text[i] == '?' || Text[i] == '!') { count++; } } return count; } float compute_Readability(int letters, int words, int sentences) { // 强制转换为float避免整数除法精度丢失 float avgletters = (float)letters / words * 100; float avgsentences = (float)sentences / words * 100; return 0.0588 * avgletters - 0.296 * avgsentences - 15.8; }
关键修改点
- 移除全局变量,改用局部变量,每个计算函数内部初始化计数器,彻底避免垃圾值干扰
- 调整调用顺序:先计算字母、单词、句子数,再计算阅读等级
- 修改
compute_Readability的参数逻辑,直接传入已计算好的数值,逻辑更清晰 - 修复整数除法问题:将int类型的计数强制转为float后再做除法,避免精度丢失
- 规范代码格式,添加必要的大括号,防止逻辑歧义
内容的提问来源于stack exchange,提问作者user21406404
相关产品推荐
相关产品推荐

