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

#include <stdio.h> void swap_negmax_last(int size, int a[]) { int max = a[0]; int n = 0; for (int i = 0; i < size; i++) { if (a[i] < max) { max = a[i]; } } for (int i = 0; i < size; i++) { if (a[i] < 0) { if (a[i] > max) { max = a[i]; n = i; } } } a[n] = a[size - 1]; a[size - 1] = max; for (int i = 0; i < size; i++) { printf("%d", a[i]); } } int main() { int a[5] = {1, 2, 3, -5, 4}; swap_negmax_last(5, a); return 0; }
这段代码试图找到数组中的最大负元素,并将其与最后一个元素交换。但代码中存在逻辑错误。

- 第一个循环本意是找最小值(负的最大值),但条件 `a[i] < max` 实际上是在找最小值,而不是最大负值。这导致 `max` 被初始化为 `a[0]` 后,会不断更新为更小的值,最终得到整个数组的最小值,而不是最大负值。
- 第二个循环试图找最大负值,但比较条件 `a[i] > max` 中 `max` 已经是第一个循环得到的最小值,所以这个循环可能找不到正确的最大负值,或者找到错误的值。
- 如果数组中没有负数,`n` 保持为0,但此时 `max` 可能不是负数,交换操作会错误地修改数组。

- 提示1:第一个循环的目的是什么?你真正需要的是找到所有负数中的最大值,而不是整个数组的最小值。考虑如何只关注负数。
- 提示2:如果数组中没有负数,程序应该如何处理?当前代码没有处理这种情况,可能导致错误交换。