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

#include <stdio.h> void change_max_min(int size, int a[]){ int max=a[0],min=a[0]; for(int i=0;i<size;i++){ if(a[i]>max){ max=a[i]; }if(a[i]<min){ min=a[i]; } } int i=0,num_max=0,num_min=0; while(i<size){ if(a[i]==max){ num_max=i; }if(a[i]==min){ num_min=i; }i++; } int n_save=a[num_max]; a[num_max]=a[num_min]; a[num_min]=n_save; for(int t=0;t<size;t++){ printf("%d ",a[t]); }return; } int main() { int a[10]; for(int i=0;i<10;i++){ scanf("%d",&a[i]); } change_max_min(10,a); return 0; }
这段代码的功能是:读入10个整数,找到数组中的最大值和最小值,然后交换它们的位置,最后输出交换后的数组。

代码整体思路正确,但存在一个逻辑问题。

- 在寻找最大值和最小值的循环中,你使用了两个独立的if语句。当数组元素同时等于最大值和最小值(即数组中所有元素都相等)时,这两个if都会执行,导致max和min被更新为同一个值。但这不是主要问题。
- 主要问题在于:你只记录了第一次出现的最大值和最小值的下标。如果最大值或最小值在数组中出现多次,你的代码只会交换第一次出现的位置。但题目要求通常是交换所有最大值和最小值?还是只交换一个?你需要确认题目要求。如果要求只交换一个,那么你的代码是可行的;如果要求交换所有,则需要修改。
- 另外,在寻找最大值和最小值的循环中,第二个if应该使用else if,否则当a[i]同时是最大值和最小值(所有元素相等)时,min会被错误地更新。但这种情况很少见,你可以考虑是否要处理。

提示:
- 检查当最大值和最小值在数组中出现多次时,你的交换逻辑是否符合题目要求。
- 考虑在寻找最大值和最小值的循环中,是否应该用else if来避免同时更新两个变量。