C语言查找数组最大与第二大元素的代码问题咨询
C语言查找数组最大值、第二大值的实现验证
问题描述
我编写了一段用于查找数组元素最大值、第二大值的C语言代码,想确认是否存在匹配我设计思路的解决方案:我定义的第二大数值需同时满足两个要求:
- 严格小于数组最大值
- 大于遍历过程中记录的前序符合要求的数值
如果本次问题属于重复提问我深表歉意,我确实非常好奇是否存在同类实现思路。
原实现代码
#include <stdio.h> #include <stdbool.h> #include <stdlib.h> int main() { int arr[10]; int i; int greatest; int second; printf("Enter 10 values:"); for (i = 0; i < 10; i++) { scanf("\n%d", &arr[i]); } greatest = arr[0]; for (i = 1; i < 10; i++) { if (greatest < arr[i]) { greatest = arr[i]; } } second = arr[i]; for (i = 0; i < 10; i++) { if (arr[i] < greatest && second > arr[i - 1]) { second = arr[i]; } } printf("The greatest number is : %d", greatest); printf("\nThe second greatest number is: %d", second); return 0; }
原代码问题说明
原代码存在3处会直接导致运行结果错误的问题:
- 数组越界访问:第一轮找最大值的循环结束后,循环变量
i的值为10,此时执行second = arr[i]访问的是数组范围外的内存,拿到的是随机垃圾值;后续第二轮循环i=0时访问arr[i-1]即arr[-1],也是非法的越界访问。 - 第二大值判断逻辑不符合设计思路:写的判断条件
second > arr[i - 1]完全没有关联第二大值的判定规则,既没有校验当前元素是否比已记录的第二大值大,还引入了无关的相邻元素比较逻辑。 - 第二大值初始化逻辑缺失:没有给
second设置合理的初始值,直接用越界取到的垃圾值参与比较,结果完全不可控。
匹配设计思路的修正实现
完全匹配你提出的「第二大值小于最大值、且为遍历过程中大于所有前序符合条件值」的思路,修正后的代码如下:
#include <stdio.h> #include <limits.h> int main() { int arr[10]; int i; int greatest; int second; printf("Enter 10 values:"); for (i = 0; i < 10; i++) { scanf("%d", &arr[i]); } // 第一遍遍历找最大值 greatest = arr[0]; for (i = 1; i < 10; i++) { if (greatest < arr[i]) { greatest = arr[i]; } } // 第二遍遍历找符合要求的第二大值 second = INT_MIN; // 用int类型最小值做初始值,避免垃圾值干扰 for (i = 0; i < 10; i++) { // 满足:小于最大值,且大于当前记录的second(即大于所有之前记录的符合条件值) if (arr[i] < greatest && arr[i] > second) { second = arr[i]; } } printf("The greatest number is : %d", greatest); printf("\nThe second greatest number is: %d", second); return 0; }
这种两次遍历找前两大值的思路是C语言入门阶段非常经典的基础实现,和你最初的设计方向完全一致,你只是在判断条件和变量初始化环节出了逻辑和语法错误。如果追求更高的遍历效率,也可以改成单次遍历同时更新最大值和第二大值,核心判定逻辑和你的思路没有本质区别。
内容的提问来源于stack exchange,提问作者Benz91 Benz
相关产品推荐
相关产品推荐

