CS50课程学习中C语言平均分计算向下取整问题求解
问题解决:整数除法导致平均分取整的问题
你的猜测完全正确,问题确实出在整数除法上。C语言里,如果两个整数做除法,结果会直接舍弃小数部分只保留整数——哪怕你最后把结果赋值给float变量,也只是把这个已经取整后的整数转成了浮点数,所以输出会是.0000的格式。你之前改int为float没解决,是因为没改到关键:sum和s都是int类型,它们的除法运算本身还是整数运算,和最终赋值的变量类型无关。
两种可行的解决方法:
方法1:强制转换其中一个操作数为float
把除法表达式里的任意一个操作数转成float,C语言会自动把另一个操作数也提升为float,执行浮点数除法:
#include <cs50.h> #include <stdio.h> int main(void) { int s = get_int("how many scores? "); int sum = 0; int score[s]; for(int i = 0; i < s; i++) { score[i] = get_int("score: "); sum = sum + score[i]; } // 将sum强制转换为float后再执行除法 float avg = (float)sum / s; printf("average: %f\n", avg); }
方法2:将sum定义为float类型
一开始就把sum设为float类型,累加分数时直接用浮点数存储,最后除以int类型的s时,会自动触发浮点数除法:
#include <cs50.h> #include <stdio.h> int main(void) { int s = get_int("how many scores? "); // 初始化为float类型的0.0 float sum = 0.0; int score[s]; for(int i = 0; i < s; i++) { score[i] = get_int("score: "); sum = sum + score[i]; } float avg = sum / s; printf("average: %f\n", avg); }
两种方法都能解决问题,第一种适合保留整数累加的特性,第二种逻辑更直观,根据你的习惯选就行。
内容的提问来源于stack exchange,提问作者Robin Stronkhorst
相关产品推荐
相关产品推荐

