在线编译器 C

#include <stdio.h> int main() { int a[10]; int min; int max; int q=1; int p=1; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } max = a[0]; for (int i = 0; i < 10; i++) { if (a[i] > max) { max = a[i]; p = i + 1; } } printf("%d ", p); printf("%d ", max); min = a[0]; for (int i = 0; i < 10; i++) { if (a[i] < min) { min = a[i]; q = i + 1; } } printf("%d ", q); printf("%d ", min); return 0; }
这段代码的功能是:读入10个整数,找出最大值及其位置(从1开始计数),再找出最小值及其位置,然后依次输出最大值的位置、最大值、最小值的位置、最小值。

代码逻辑基本正确,但有一个潜在问题需要注意。

- 变量 `q` 和 `p` 的初始值都设为1,这假设了第一个元素就是最大值或最小值。但如果最大值或最小值出现在第一个位置,这个初始值是正确的。然而,如果数组的第一个元素不是最大值或最小值,这个初始值会被循环中的条件覆盖,所以目前代码在大多数情况下能正常工作。但更严谨的做法是,在找到第一个元素时就应该记录位置,而不是依赖初始值。

- 另外,你的代码中 `q` 和 `p` 分别用于记录最小值和最大值的位置,但 `q` 和 `p` 的初始值都设为1,而循环中只在找到更大或更小的元素时才更新位置。如果第一个元素恰好是最大值或最小值,位置会被正确记录为1。但如果数组所有元素都相等,那么最大值和最小值都是第一个元素,位置也会正确。所以这个初始值设定在逻辑上没有问题,但为了代码清晰,可以考虑在初始化最大值和最小值时同时初始化位置。