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

#include <stdio.h> void swap_negmax_last(int size, int a[]){ int n_save=0,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++; } a[t]=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]; for(int m=0;m<10;m++){ scanf("%d",&a[m]); } swap_negmax_last(10,a); return 0; }
这段代码的目的是在数组中找出最大的负数元素,然后将其与数组的最后一个元素交换位置。但代码中存在逻辑错误。

- 第一个循环试图找到第一个负数作为初始最大值,但这里有一个问题:如果数组中没有负数,`n_save` 会保持为0,后续比较会出错。
- 第二个循环中,条件 `a[t]<0 || a[t]>n_save` 的逻辑不正确。当遇到非负数时,条件 `a[t]<0` 为假,但 `a[t]>n_save` 可能为真,这会导致将非负数也纳入比较,从而可能选出一个正数而不是最大的负数。
- 最后交换时,`a[t]` 中的 `t` 在循环结束后已经等于 `size`,这会导致数组越界访问。

- 提示1:检查第二个循环的条件,确保只比较负数,并且正确更新最大负数的索引,而不仅仅是值。
- 提示2:注意循环结束后 `t` 的值,交换时应该使用记录最大负数位置的索引,而不是循环变量 `t`。