Онлайн компилятор C

#include <stdio.h> enum { SIZE = 10 }; int main() { int A[SIZE]; int max, min; for (int i = 0; i < SIZE; i++) { scanf("%d", &A[i]); } max = A[0]; min = A[0]; int i_max = 0, i_min = 0; for (int i = 0; i < SIZE; i++) { if (max < A[i]) { max = A[i]; } if (max == A[i]) { i_max = i+1; } } printf("%d %d ", i_max, max); for (int i = 0; i < SIZE; i++) { if (min > A[i]) { min = A[i]; } if (min == A[i]) { i_min = i+1; } } printf("%d %d ", i_min, min); return 0; }
这段代码的功能是:读入10个整数,找出最大值和最小值,并输出它们最后一次出现的位置(位置从1开始计数)和对应的值。

代码中存在一个逻辑错误,导致最大值和最小值的位置记录不正确。

- 在寻找最大值时,你同时更新了最大值和位置,但条件判断的顺序有问题。当 `max < A[i]` 时,你更新了 `max`,但紧接着又用 `max == A[i]` 来更新位置。由于刚更新完 `max`,这个条件一定成立,所以位置会被更新为当前索引。但这样会导致:如果后面出现相同的最大值,位置会继续被更新,最终得到的是最后一次出现的位置。这可能是你想要的,但注意:当 `max < A[i]` 时,位置更新是多余的,因为紧接着的 `if (max == A[i])` 已经会执行。更关键的问题是:如果最大值出现在第一个元素(索引0),后续没有更大的值,那么 `i_max` 会保持为0,但你的位置是从1开始计数的,所以初始值 `i_max = 0` 会导致输出0,而不是1。你需要确保初始位置对应第一个元素的位置。

- 同样的问题也出现在最小值部分。初始 `i_min = 0`,如果最小值就是第一个元素,输出会是0而不是1。你需要将初始位置设为1(对应第一个元素)。