Online Compiler C

#include <stdio.h> void swap_negmax_last(int size, int a[]){ int n_save=a[size-1],t=0,s=1; 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` 函数中读取数组的方式有问题。你声明了 `a[10]`,但用 `scanf` 读取了 `n` 之后,又用循环读取了10个数,而实际上应该只读取 `n` 个数。这会导致数组内容不符合预期。

其次,`swap_negmax_last` 函数中寻找最大负数的逻辑有误。第一个循环试图找到第一个负数,但之后第二个循环用 `a[t] > n_save` 来比较,这实际上是在找比第一个负数更大的数,而不是找最大的负数。注意,负数中“最大”是指数值上最大(即最接近0),比如 -1 比 -5 大。

- 检查 `main` 中数组的读取方式:你只应该读取 `n` 个数,而不是固定的10个。
- 检查寻找最大负数的比较条件:负数中更大的数是指数值更大(例如 -1 > -5),所以比较时应该用 `>` 来更新最大值。