Онлайн компилятор 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]; i_max = i+1; } } printf("%d %d ", i_max, max); for (int i = 0; i < SIZE; i++) { if (min >= A[i]) { min = A[i]; i_min=i+1; } } printf("%d %d ", i_min, min); return 0; }
这段代码的功能是:读取10个整数存入数组,然后分别找出最大值及其位置(从1开始计数),以及最小值及其位置,最后输出这两组信息。

代码中存在一个逻辑问题,导致输出结果可能不符合预期。

- 在查找最大值和最小值的循环中,你使用了 `<=` 和 `>=` 的比较条件。这意味着当遇到与当前最大值相等的元素时,位置会被更新为更靠后的那个;同样,最小值也会更新为更靠后的相等元素。这可能是你想要的,但需要注意:如果所有元素都相等,最终输出的最大值和最小值位置会是最后一个元素的位置。

- 更关键的问题是:你分别用两个独立的循环查找最大值和最小值,这本身没有问题。但请注意,在第一个循环中,你更新了 `i_max` 为 `i+1`,而在第二个循环中,你更新了 `i_min` 为 `i+1`。然而,你并没有在第二个循环中重置 `min` 的值,它已经在第一个循环中被赋值为 `A[0]`,所以第二个循环可以正常工作。但有一个潜在问题:如果数组中有多个相同的最大值或最小值,你的代码会记录最后一个出现的位置,这可能是你预期的行为。

- 主要需要检查的是:你的输出格式要求是“先输出最大值的位置和最大值,再输出最小值的位置和最小值”,但你的代码中先输出最大值,再输出最小值,顺序是正确的。不过,输出语句中 `printf("%d %d ", i_max, max);` 后面有一个空格,而第二个 `printf` 后面也有空格,这可能导致输出末尾多一个空格,但通常不影响。

- 一个需要你思考的细节:如果数组中有多个相同的最大值,你的代码会记录最后一个的位置。但题目可能要求记录第一个出现的位置?请根据题目要求检查你的比较条件。如果要求记录第一个最大值的位置,你应该使用 `>` 而不是 `>=`;同样,最小值应使用 `<` 而不是 `<=`。