C语言数组求平均、最高/次高/最低分问题及代码错误修复咨询
修复数组平均值计算问题及求解最高分、次高分、最低分
原代码的核心错误分析
你的代码输出随机数是因为几个关键问题导致内存访问错误或未初始化数据被读取:
- 数组定义时机错误:在读取学生数量
T之前就用T定义了变长数组char name[T]和int score[T],此时T是未初始化的垃圾值,数组大小随机,后续操作必然出问题。 - 名字存储逻辑错误:
char name[T]只能存一个字符串,每次输入新名字会直接覆盖之前的内容,应该用二维数组存储多个学生的名字。 - 分数存储地址错误:
scanf("%d", score)传递的是数组首地址,所有分数都会被存在score[0],其他位置的元素都是未初始化的垃圾值,求和时读取这些值就会得到随机数。 - 数组下标越界:C语言数组下标从0开始,你的循环用
i=1到i=T访问score[i],会超出数组的合法范围(数组最后一个元素是score[T-1])。 - 平均值计算冗余:每次循环都计算平均值完全没必要,应该在所有分数累加完成后再计算。
修复后的平均值计算代码
#include <stdio.h> int main(){ int i, T, sum = 0; double avg; // 用double存储平均值,避免整数除法丢失精度 printf("Input number of students: "); scanf("%d", &T); // 读取T后再定义变长数组,确保数组大小合法 char name[T][50]; // 二维数组存储每个学生的名字,单名字最长50字符 int score[T]; for(i = 0; i < T; i++){ // 下标从0开始,符合C数组使用习惯 printf("Input student names-%d: ", i+1); scanf("%s", name[i]); // 每个学生的名字存入name[i] printf("Input student scores-%d: ", i+1); scanf("%d", &score[i]); // 分数存入对应下标位置 sum += score[i]; // 边输入边累加,减少一次循环 } avg = (double)sum / T; // 强制转换为浮点型,保留小数部分 printf("Average score = %.2f\n", avg); return 0; }
新增最高分、次高分、最低分的实现
在上面的代码基础上,添加遍历比较逻辑即可实现需求,完整代码如下:
#include <stdio.h> #include <limits.h> // 提供INT_MIN常量,用于初始化次高分 int main(){ int i, T, sum = 0; double avg; int highest, second_highest, lowest; printf("Input number of students: "); scanf("%d", &T); char name[T][50]; int score[T]; for(i = 0; i < T; i++){ printf("Input student names-%d: ", i+1); scanf("%s", name[i]); printf("Input student scores-%d: ", i+1); scanf("%d", &score[i]); sum += score[i]; } // 计算平均值 avg = (double)sum / T; printf("Average score = %.2f\n", avg); // 初始化极值变量 highest = lowest = score[0]; second_highest = INT_MIN; // 初始化为最小整数,确保能被有效分数替换 for(i = 1; i < T; i++){ // 更新最高分和次高分 if(score[i] > highest){ second_highest = highest; highest = score[i]; } else if(score[i] > second_highest && score[i] < highest){ second_highest = score[i]; } // 更新最低分 if(score[i] < lowest){ lowest = score[i]; } } // 处理所有分数相同的情况 if(second_highest == INT_MIN){ second_highest = highest; } printf("Highest score = %d\n", highest); printf("Second highest score = %d\n", second_highest); printf("Lowest score = %d\n", lowest); return 0; }
注:如果需要次高分严格小于最高分(排除多个最高分的情况),可以调整else if的判断条件为score[i] > second_highest,并在遍历后额外检查次高分是否等于最高分,再做对应处理。
内容的提问来源于stack exchange,提问作者Juju
相关产品推荐
相关产品推荐

