Онлайн компилятор 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]; break; }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[11]; for(int m=0;m<10;m++){ scanf("%d",&a[m]); } swap_negmax_last(10,a); return 0; }
这段代码的目的是在数组中找到最大的负数,并将其与数组的最后一个元素交换位置。但代码中存在逻辑错误,导致无法正确完成任务。

代码的主要问题在于寻找最大负数的逻辑不正确。第一个循环找到了第一个负数,但第二个循环的起始条件有问题,而且两个循环都使用了 `break`,导致只检查了部分元素。此外,变量 `n_save` 的更新方式也不对,没有正确比较所有负数的大小。

- 第一个循环只找到第一个负数就停止了,没有继续遍历整个数组。你需要遍历整个数组来找到所有负数,并从中选出最大的那个。
- 第二个循环的条件 `if(a[t]<0||a[t]>n_save)` 逻辑有误。当 `a[t]` 是正数时,条件也会成立,导致错误地更新 `n_save`。你应该只比较负数,并且需要确保 `n_save` 始终记录当前遇到的最大负数。