在线编译器 C

#include <stdio.h> void swap_negmax_last(int size, int a[]){ int n_save=a[size-1],t=0,s=0; while(s<size){ if(a[s]<0){ n_save=a[s]; break; }s++; } while(t<size){ if(a[t]<0&&a[t]>n_save){ n_save=a[t]; }t++; } int b=0; while(b<size){ if(a[b]==n_save){ break; }b++; } a[b]=a[size-1]; a[size-1]=n_save; for(int i=0;i<size;i++){ printf("%d ",a[i]); } return; } int main() { int a[10],n; scanf("%d",&n); for(int m=0;m<10;m++){ scanf("%d",&a[m]); } swap_negmax_last(10,a); return 0; }
这段代码的目的是在数组中找出最大的负数元素,然后把它和数组的最后一个元素交换位置。但代码中存在几个问题。

首先,`main` 函数中读取数组的方式有问题。你声明了数组大小为10,但先读取了 `n`,然后又用循环读取了10个数。这样实际上读取了11个数,而且 `n` 没有被使用。数组大小应该是 `n` 而不是固定10。

其次,在 `swap_negmax_last` 函数中,寻找最大负数的逻辑有缺陷。第一个循环找到了第一个负数,但把它赋值给了 `n_save`,这覆盖了原本保存的最后一个元素的值。之后第二个循环试图找更大的负数,但比较条件 `a[t] > n_save` 对于负数来说,更大的负数其实是绝对值更小的负数(比如 -1 比 -5 大),这个逻辑是正确的,但初始值 `n_save` 被第一个负数覆盖了,如果第一个负数不是最大的,后续比较可能出错。

- 提示1:检查 `main` 函数中数组大小和输入读取的匹配。数组大小应该由用户输入的 `n` 决定,而不是固定10。
- 提示2:在 `swap_negmax_last` 中,`n_save` 的初始值应该是什么?如果数组中没有负数,你的代码会怎么处理?考虑用一个标志变量来记录是否找到了负数。