在线编译器 C

#include <stdio.h> void swap_negmax_last(int size, int a[]) { int o = 0; for (int i = 0 ; i< size; i++) { if (a[0]> -1) { o++; } } if (o == size ) { for(int i = 0 ; i < size; i++) { printf ("%d ", a[i]); } return; } else { int max = -1000, m; for (int i = 0 ; i < size ; i++) { if (a[i] < 0 && a[i] > max) { max = a[i]; m = i; } } int tem = a[m]; a[m] = a[size-1]; a[size-1] = tem; for(int i = 0 ; i < size; i++) { printf ("%d ", a[i]); } return; } } int main() { int size = 10,a[10] = { 1, -2, -3, -4, 5, 6, 7, 8, 9, 10}; swap_negmax_last(size, a); return 0; }
这段代码定义了一个函数 `swap_negmax_last`,它的功能是:在整数数组中找出最大的负数(即最接近0的负数),然后把这个数和数组的最后一个元素交换位置。如果数组中没有负数,则直接输出原数组。主函数中用一个包含正负数的测试数组来调用这个函数。

代码中存在一个逻辑错误:在判断数组是否包含负数时,你使用了 `if (a[0] > -1)` 来计数,这实际上是在检查数组第一个元素是否非负,而不是检查每个元素。这会导致即使数组中有负数,只要第一个元素非负,`o` 也会增加,从而可能错误地认为数组没有负数。

- 检查数组中是否有负数的循环条件写错了。你只检查了 `a[0]` 的值,而不是遍历每个元素。应该用 `a[i]` 而不是 `a[0]` 来判断每个元素是否为负数。
- 另外,初始化 `max` 为 `-1000` 可能不够通用。如果数组中的负数都小于 `-1000`,比如 `-2000`,那么 `max` 就不会被正确更新。可以考虑用更通用的方法,比如先找到第一个负数作为初始最大值。