C语言程序修改需求:仅统计正分数并将平均值改为浮点数
解决你的C语言分数统计问题
我来帮你修复代码里的两个问题,同时对齐你想要的输出效果。先梳理下原代码里的关键问题,再一步步修正:
问题分析
- 未初始化变量导致循环异常:原代码中
score进入for循环前没有赋值,score>0的初始判断属于未定义行为,程序可能直接跳过循环或出现异常。 - 负数被错误计入统计数量:输入负数时,
i仍会自增,导致统计的分数数量多算一次(比如输入-1的那次也被计入了)。 - float平均值计算逻辑错误:
sum和i都是int类型,整数除法会直接丢弃小数部分,就算把average改成float,得到的也是整数结果转float,自然看不到小数。 - 输出内容与格式不符:缺少你期望的初始提示语,平均值输出格式也没匹配到保留两位小数的要求。
修改后的完整代码
#include <stdio.h> int main() { int i = 0, score, sum = 0; float average; // 打印初始提示语 printf("The program calculates the average of scores you enter. End with a negative integer.\n"); while (1) { printf("Enter score (4-10): "); scanf("%d", &score); // 遇到负数直接退出循环 if (score < 0) { break; } // 只累加合法正分数并统计数量 sum += score; i++; } printf("You entered %d scores.\n", i); // 强制浮点除法:将sum转为float后再计算,避免整数截断 average = (float)sum / i; // 格式化输出保留两位小数的平均值 printf("Average score: %.2f\n", average); return 0; }
关键修改说明
- 初始化变量+重构循环逻辑:把
i初始化为0,避免未定义行为;将for循环改成while(1)无限循环,遇到负数就break退出,逻辑更清晰直观。 - 正确忽略负数统计:只有输入的
score是非负数时,才累加分数sum和统计数量i,负数直接跳出循环,不会被计入统计。 - 修复浮点平均值计算:通过
(float)sum将整数类型的sum强制转换为float,让除法运算按照浮点规则执行,得到带小数的正确结果。 - 对齐期望输出:添加了初始提示语,用
%.2f格式化平均值输出,保留两位小数,和你想要的6.71格式完全匹配。
可选优化(按需添加)
如果需要限制分数必须在4-10之间,可以在非负数判断后再加一层校验:
if (score >= 4 && score <= 10) { sum += score; i++; } else { printf("Invalid score! Please enter a number between 4 and 10.\n"); }
这样就能完全符合你的需求啦~
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

