Онлайн компилятор 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`,但紧接着的 `if (max == A[i])` 总是成立,所以 `i_max` 会被更新为当前索引。这本身没问题,但问题在于当 `max` 和 `A[i]` 相等时,你也会更新 `i_max`,导致位置记录为最后一个出现该值的位置,而不是第一个。

- 更关键的是,在最小值循环中,当 `min >= A[i]` 成立时,你更新了 `min`,然后 `if (min == A[i])` 也总是成立,同样会记录最后一个出现该值的位置。但这里还有一个问题:如果数组中有多个相同的最小值,你希望记录哪一个位置?题目没有明确说明,但通常要求记录第一个出现的位置。

提示:
- 思考一下,当 `max <= A[i]` 时,你更新了 `max`,此时 `i_max` 应该立即更新为当前索引,而不需要再单独检查相等条件。你可以把位置更新直接放在更新最大值的条件分支内。
- 同样,对于最小值,当 `min >= A[i]` 时,更新 `min` 的同时也应该更新 `i_min`,而不是在后面的单独判断中。注意,这里 `>=` 意味着如果遇到相等的值也会更新,这会导致记录最后一个最小值的位置。如果希望记录第一个,应该使用 `>` 而不是 `>=`。