魏沐 2022-12-31 11:24 采纳率: 75%
浏览 55
已结题

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

img


#####

#include <stdio.h>
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; m<s+n; scanf("%d", m++));
}
void sort(int *s, int n)
{
    int *i, *j, *min, *max, t;
    for (i=s, min=i; i<s+n; i++)
        for (j=i+1; j<s+n; *min>*j ? min=j++ : j++);
    t=*min, *min=*s, *s=t;
    for (i=s+1, max=i; i<s+n; i++)
        for (j=i+1; j<s+n; *max<*j ? max=j++ : j++);
    t=*max, *max=*(s+n-1), *(s+n-1)=t;
}
void print(int *s, int n)
{
    int *i;
    for (i=s; i<s+n; printf("%d ", *i++));
    printf("\n");
}
#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;    
    }
    {
        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;
}
  1. 这两个代码有什么实质性的区别,为什么法二提交会出现答案错误,但运行的结果是一样的?
  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-12-31 12:05
    关注

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

    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 创建了问题 12月31日

悬赏问题

  • ¥15 找一个网络防御专家,外包的
  • ¥100 能不能让两张不同的图片md5值一样,(有尝)
  • ¥15 informer代码训练自己的数据集,改参数怎么改
  • ¥15 请看一下,学校实验要求,我需要具体代码
  • ¥50 pc微信3.6.0.18不能登陆 有偿解决问题
  • ¥20 MATLAB绘制两隐函数曲面的交线
  • ¥15 求TYPCE母转母转接头24PIN线路板图
  • ¥100 国外网络搭建,有偿交流
  • ¥15 高价求中通快递查询接口
  • ¥15 解决一个加好友限制问题 或者有好的方案