输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。 输入格式

img


#####

#include 
void input(int *s, int n);   
void sort(int *s, int n);    
void print(int *s, int n);   
int main()
{
    int n[10], *p=n;
    input(p, 10);            
    sort(p, 10);             
    print(p, 10);            
    return 0;
}
void input(int *s, int n)
{
    int *m;
    for (m=s; mscanf("%d", m++));
}
void sort(int *s, int n)
{
    int *i, *j, *min, *max, t;
    for (i=s, min=i; ifor (j=i+1; j*j ? min=j++ : j++);
    t=*min, *min=*s, *s=t;
    for (i=s+1, max=i; ifor (j=i+1; j-1), *(s+n-1)=t;
}
void print(int *s, int n)
{
    int *i;
    for (i=s; iprintf("%d ", *i++));
    printf("\n");
}
#include
void way1(int a[],int n)
{
    int i;
    for(i=0;iscanf("%d",&a[i]);
}
void way2(int a[],int n)
{
    int i,x,y,t;
    for(i=1,x=0,y=0;iif(a[x]>a[i])x=i;
        if(a[y]0];
        a[0]=t;    
    }
    {
        t=a[y];
        a[y]=a[n-1];
        a[n-1]=t;
    }
}
void way3(int a[],int n)
{
    int i;
    for(i=0;iprintf("%d ",a[i]);
}
int main()
{
    int a[10];
    way1(a,10);
    way2(a,10);
    way3(a,10);
    printf("\n");
    return 0;
}
  1. 这两个代码有什么实质性的区别,为什么法二提交会出现答案错误,但运行的结果是一样的?

法一和法二的区别是:
法一是两次遍历,第一次遍历找到最小值,然后将最小值与数组第一个元素交换。再进行第二次遍历,找到最大值,然后将最大值与数组最后的元素交换。两次遍历,完成不同的任务。
法二的问题在,一次遍历数组,找到最大最小值所在的位置,然后按题目要求直接进行了元素交换,没有考虑如果最大值刚好在数组第一个位置时的特殊情况,将最小值与数组第一个元素交换后,此时最大值的位置发生了变化,已被调整到原来的最小值位置,如果仍然将原位置与最后元素交换就出现问题了。
法二修改如下,供参考:

#include<stdio.h>
void way1(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
}
void way2(int a[],int n)
{
    int i,x,y,t;
    for(i=1,x=0,y=0;i<n;i++)
    {
        if(a[x]>a[i])x=i;
        if(a[y]<a[i])y=i;
    }
    {
        t=a[x];
        a[x]=a[0];
        a[0]=t;
    }
    if (y == 0) y = x; //修改
    {
        t=a[y];
        a[y]=a[n-1];
        a[n-1]=t;
    }
}
void way3(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
    printf("%d ",a[i]);
}
int main()
{
    int a[10];
    way1(a,10);
    way2(a,10);
    way3(a,10);
    printf("\n");
    return 0;
}