求数组的三个最大值与两个最小值:C语言代码错误修正求助
修正C语言找数组最小/次小值及三个最大值的代码
原代码的核心错误
- 遍历对象错误:随机生成的数值存在
M数组,但你遍历的是未初始化的a数组,a内全是垃圾值,直接导致逻辑完全失效。 - 变量未初始化:
min和smin没有设置初始值,栈上未初始化变量的数值是随机垃圾值,无法正确参与比较。 - 次小值赋值错误:
else if分支里错误地将smin赋值为a[1],应该赋值为当前遍历的数组元素。 - 逻辑冗余:
a[i] != min的判断多余,若a[i]等于min,前面的a[i] < min不成立,且此时a[i]不可能小于smin(smin至少等于min)。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> // 用于初始化随机种子 #define N 9 int main() { int M[N], i; // 定义并初始化最值变量 int first_max, second_max, third_max; int min, second_min; // 初始化随机种子,确保每次运行生成不同随机序列 srand((unsigned int)time(NULL)); // 生成-10到9的随机数组并打印 for (i = 0; i < N; i++) { M[i] = rand() % 20 - 10; printf("%d\t", M[i]); } printf("\n"); // 将最值变量初始化为数组第一个元素,确保从有效数据开始比较 first_max = second_max = third_max = M[0]; min = second_min = M[0]; // 遍历数组查找三个最大值和两个最小值 for (i = 1; i < N; i++) { // 处理最大值逻辑 if (M[i] > first_max) { third_max = second_max; second_max = first_max; first_max = M[i]; } else if (M[i] > second_max) { third_max = second_max; second_max = M[i]; } else if (M[i] > third_max) { third_max = M[i]; } // 处理最小值逻辑 if (M[i] < min) { second_min = min; min = M[i]; } else if (M[i] < second_min) { second_min = M[i]; } // 若需要次小值严格大于最小值,可添加判断条件:&& M[i] != min } // 输出结果 printf("\n三个最大值:%d, %d, %d\n", first_max, second_max, third_max); printf("两个最小值:%d, %d\n", min, second_min); return 0; }
额外说明
- 加入
srand((unsigned int)time(NULL))初始化随机种子,避免每次运行生成完全相同的随机数组。 - 同时实现了任务要求的三个最大值和两个最小值查找逻辑。
- 关于最小值的重复处理:如果允许次小值等于最小值(数组存在多个相同最小值时),保留现有逻辑即可;如果需要次小值严格大于最小值,可在
else if分支添加&& M[i] != min判断。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

