用指针和数组的形式去交换数组中的数据

题目

题目描述:

输入10个整数,将其中最小的数与第一个数交换,把最大的数与最后一个数交换。

程序运行结果范例(蓝色字体表示输入):

请输入10个整数:2  3  4  23  5  78  0  1  6  12

交换后的结果为:0  3  4  23  5  12  2  1  6  78

请输入10个整数:1  25  7  40  5  6  12  8  30  19

交换后的结果为:1  25  7  19  5  6  12  8  30  40

提示:

要求用数组及数组传参方式实现上述程序。

要求写3个函数:(1)输入10个数;(2)进行处理;(3)输出10个数。

这个程序有多种实现思路,尝试使用数组和指针两种方法实现。

数组的形式

#include<stdio.h>
void getnum(int a[],int n)
{
    int i;

    printf("你要输入的数据个数是%d:\n",n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);

    }


}


void swap(int * p,int * q)
{
    int temp=*p;
    *p=*q;
    *q=temp;
   //这两个都是void类型
}


void process(int arr[],int n)
{
    int i,temp;
    int maxnum=arr[0];
    int minnum=arr[0];
    int max=0,min=0;//所以这里要有初始值
    for(i=0;i<n;i++)
    {
        if(arr[i]>maxnum)
        {
            maxnum=arr[i];
            max=i;
        }
        if(arr[i]<minnum)
        {
            minnum=arr[i];
            min=i;
//如果0是最小值的话,是进不来的,那么这个i或者说min是不对的
        }
        }


    }

    if(min!=0)
    {
        swap(arr,&arr[min]);//这里如果是&arr[0]可以,但是如果是&arr就不行,这表示两次求指针
    }
    if(max!=n-1)
    {
        swap(&arr[n-1],&arr[max]);
    }

    //你看这种函数都是void类型

}


void print(int arr[],int n)
{
    printf("结果是:\n");
    int i;
    for(i=0;i<n;i++)
    {
        printf("%d  ",arr[i]);
    }
}
int main()
{
    int n,arr[100];
    scanf("%d",&n);
    getnum(arr,n);

    process(arr,n);
    print(arr,n);


    return 0;
}

指针方法

​
#include<stdio.h>
void getnum(int a[],int n)
{
    int i;

    printf("你要输入的数据个数是%d:\n",n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);

    }


}


void swap(int * p,int * q)
{
    int temp=*p;
    *p=*q;
    *q=temp;
   //这两个都是void类型
}


void process(int*arr,int n)
{

  int *min,*max;
  int*p;
  p=max=min=arr;//指针相等,是所指向的地址相等
  for(;p<arr+n;p++)
//这是在使用指针,数组用指针的方式去表示,arr表示第一个数据,arr+i表示第i个
//数据,p++实际上是后面的i在++
  {
      if(*p<*min)//解引用,去比较数据大小
      {
          min=p;//赋值地址
      }
      if(*p>*max)
      {
          max=p;
      }




  }//别把if判断放在for循环里面
      if(min!=arr)//这是在看地址是否相等,能起到比较地址后面的数据是否相等的作用
      {
        
          swap(arr,min);

      }
       if(max!=arr+n-1)
      {
          if(max==arr)
          {
             
                swap(arr+n-1,min);//当max==arr时,经历上面的交换,arr的值到了min里面,所以这里是交换min
          }




         else  if(max!=arr)
          {
            swap(arr+n-1,max);


          }
      }
}


void print(int arr[],int n)
{
    printf("结果是:\n");
    int i;
    for(i=0;i<n;i++)
    {
        printf("%d  ",arr[i]);
    }
}
int main()
{
    int n,arr[100];
    scanf("%d",&n);
    getnum(arr,n);

    process(arr,n);
    print(arr,n);


    return 0;
}


​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值