魏沐 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 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了
  • ¥100 H5网页如何调用微信扫一扫功能?