C语言实现数组元素求平均值程序返回错误结果如何解决优化
问题修复及优化方案
原有代码错误点
- 数组访问越界:你定义的
grades[6]合法下标范围是0~5,代码中sum = sum + grades[6]访问了数组外的未知内存,拿到的是随机垃圾值 - 未完成累加逻辑:你只对越界的
grades[6]做了一次加法,前面输入的所有成绩都没有参与求和计算 - 逻辑数值不匹配:提示语要求输入5个成绩,实际写了6个
scanf读取输入,最后计算平均又除以5,三者数值完全不统一 - 精度丢失:用int类型存储平均值会自动截断小数部分,无法得到更准确的平均结果
如果你之前用for循环也得到错误结果,大概率是循环边界设置错误、或者累加时没有用+=累积求和导致的。
基础修复版(保持原有手写输入的逻辑修正错误)
#include <stdio.h> int main() { // 用宏定义统一管理成绩数量,后续修改更方便 #define GRADE_COUNT 5 int grades[GRADE_COUNT]; // 平均值用浮点型存储避免精度丢失 float average; int sum = 0; printf("请输入你的%d门考试成绩:\n", GRADE_COUNT); scanf("%d", &grades[0]); scanf("%d", &grades[1]); scanf("%d", &grades[2]); scanf("%d", &grades[3]); scanf("%d", &grades[4]); sum = grades[0] + grades[1] + grades[2] + grades[3] + grades[4]; average = sum / (float)GRADE_COUNT; printf("学生考试成绩的平均值为:%.2f\n", average); return 0; }
更高效的循环实现方案
#include <stdio.h> int main() { #define GRADE_COUNT 5 int grades[GRADE_COUNT]; float average; int sum = 0; printf("请输入你的%d门考试成绩:\n", GRADE_COUNT); // 循环完成输入+累加,无需重复写相同代码,适配任意数量的成绩统计 for(int i = 0; i < GRADE_COUNT; i++) { scanf("%d", &grades[i]); sum += grades[i]; } average = sum / (float)GRADE_COUNT; printf("学生考试成绩的平均值为:%.2f\n", average); return 0; }
优化点说明
- 用宏定义统一管理成绩数量,后续要修改统计的成绩门数只需要修改宏定义的值即可,不用逐行调整代码
- 循环实现输入和累加逻辑,代码冗余度极低,即使要统计几十上百个成绩也只需要修改宏定义即可
- 计算平均值时将分母强制转换为浮点型,最终结果保留两位小数输出,精度更高
- 完全规避数组越界问题,输入、统计、计算的数值逻辑完全自洽
内容的提问来源于stack exchange,提问作者N3Xxus6
相关产品推荐
相关产品推荐

