CS50可读性实验代码计算s_avg始终为0问题求助
问题原因
核心是C语言的整数除法规则导致的计算错误:
- C语言中两个int类型变量做除法时,会直接截断小数部分,仅保留整数结果
- 通常输入文本的句子数
sentences远小于单词数words,因此sentences/words的结果会直接被截断为0,乘以100后s_avg自然始终为0,同理l_avg也存在精度丢失的问题。
修复方案
将除法运算的其中一个操作数强制转换为浮点类型,再进行计算,同时用浮点类型存储平均值即可:
// 把原来计算l_avg、s_avg的两行替换为以下代码 float l_avg = ((float)letters / words) * 100; float s_avg = ((float)sentences / words) * 100;
额外优化建议
你代码中判断字符的逻辑可以用ctype.h提供的标准函数简化,可读性更强,也避免手写ASCII码出错:
- 判断字母可以用
isalpha(text[i]),代替手动判断大小写字母的ASCII范围 - 判断空格可以用
isspace(text[i]),代替判断ASCII 32 - 标点判断也可以直接写字符字面量
text[i] == '.'、text[i] == '!'、text[i] == '?',比写ASCII码更易读。
内容的提问来源于stack exchange,提问作者bee3oo
相关产品推荐
相关产品推荐

