2021秋-实验5-一维数组 7-1 交换最小值和最大值 

本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。

注意:题目保证最大和最小值都是唯一的。

输入格式:

输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。

输出格式:

在一行中顺序输出交换后的序列,每个整数后跟一个空格。

输入样例:

5
8 2 5 1 4
 
结尾无空行

输出样例:

1 2 5 4 8 
 
结尾无空行
 
一开始我的代码:
int main()
{
    int i,n,flagmax=1,flagmin=1,t;//用以记录最大和最小值的位置
    int a[11];
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[flagmin]>a[i])
            flagmin=i;
        if(a[flagmax]<a[i])
            flagmax=i;//比较,更新
    }
    t=a[flagmin];
        a[flagmin]=a[1];
        a[1]=t;//依题意,先交换最小值与第一个数
    t=a[flagmax];
        a[flagmax]=a[n];
        a[n]=t;//再交换最大值与最后一个数
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);
    return 0;
}

然而,当我输入样例时,却出现下面的结果(感谢老师出的这个特殊样例)

 

 

 

因为在这列数中,最大值恰好处于首位。第一次交换时,最大值的位置被移动了,不再是我记录的flagmax处。

既然问题找到了,那我就直接遍历两遍,即第一次交换后,再遍历一次,寻找并记录最大值,之后进行第二次交换。

顺便写了个交换数的函数。

第二次的代码(已AC):

void Swap(int *m,int *n)
    {
        int t;
        t=*m;
        *m=*n;
        *n=t;
    }
int main()
{
    int i,n,flagmax=1,flagmin=1;
    int a[11];
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[flagmin]>a[i])
            flagmin=i;
    }
    Swap(&a[1],&a[flagmin]);
    for(i=1;i<=n;i++)
        if(a[flagmax]<a[i])
            flagmax=i;
    Swap(&a[n],&a[flagmax]);
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);
    return 0;
}

也许还有可以简化的地方,下次再谈。