AppleBJTU 发表于 2017-12-7 13:43:48

关于指针的一道题

题目如下:
1.输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。请分别用数组写法和指针法完成上述功能。
函数原型分别为:void action1(int dArray[],int n)和void action2(int *pInt,int n)。

数组的那一种我已经解决了,不知道指针的怎么写,下面我写的运行不对,不知道哪里出了问题,请指教。

#include <stdio.h>
void action2(int *p,int n)
{
        int max,min,i,pmin = 0,pmax = 0,t1,t2;
        max = min = *(p);
        for(i = 1; i < n; i++)
        {
                if(*(p+i)<min)
                {
                        min = *(p+i);
                        pmin = i;
                }
                else if (*(p+i)>max)
                {
                        max = *(p+i);
                        pmax = i;
                }
        }
        t1 = *(p);
    *(p) = *(p+min);
    *(p+i) = t1;
    t2 = *(p+n-1);
    *(p+n-1) = *(p+max);
    *(p+max) = t2;
}
int main()
{
        int i,n,arr;
        int *p = arr;
        printf("请输入即将输入的数目个数:");
        scanf("%d",&n);
        printf("请输入一组数:");
        for(i = 0;i < n;i++)
        {
                scanf("%d",&arr);
        }
        action2(arr,n);
        for(i = 0;i < n;i++)
        {
                printf("%d ",arr);
        }
        return 0 ;
}

BngThea 发表于 2017-12-7 14:05:57

数据交换的下标索引不对,应该是
   t1 = *(p);
    *(p) = *(p+pmin);
    *(p+pmin) = t1;
    t2 = *(p+n-1);
    *(p+n-1) = *(p+pmax);
    *(p+pmax) = t2;

AppleBJTU 发表于 2017-12-7 14:55:25

BngThea 发表于 2017-12-7 14:05
数据交换的下标索引不对,应该是

还是不太对呢..

BngThea 发表于 2017-12-7 14:59:45

AppleBJTU 发表于 2017-12-7 14:55
还是不太对呢..

为什么我改了以后就可以了?
你改了以后哪里出错?

AppleBJTU 发表于 2017-12-7 15:02:15

BngThea 发表于 2017-12-7 14:59
为什么我改了以后就可以了?
你改了以后哪里出错?

输入5 4 3 2 1
输出 1 5 3 2 1

BngThea 发表于 2017-12-7 15:36:21

AppleBJTU 发表于 2017-12-7 15:02
输入5 4 3 2 1
输出 1 5 3 2 1

你肯定没有改对,我输入5 4 3 2 1,得到的是 5 4 3 2 1

仔细推敲一下,发现你的代码逻辑存在一个漏洞:
当数组的首尾恰好是最小和最大值时,通过交换对应位置会出现错误
所以 5 4 3 2 1 第一次交换的时候变成了 1 4 3 2 5
再一次交换变回去了


AppleBJTU 发表于 2017-12-7 16:11:59

BngThea 发表于 2017-12-7 15:36
你肯定没有改对,我输入5 4 3 2 1,得到的是 5 4 3 2 1

仔细推敲一下,发现你的代码逻辑存在一个漏洞 ...

#include <stdio.h>
void action2(int *p,int n)
{
        int max,min,i,pmin = 0,pmax = 0,t1,t2;
        max = min = *(p);
        for(i = 1; i < n; i++)
        {
                if(*(p+i)<min)
                {
                        min = *(p+i);
                        pmin = i;
                }
                else if (*(p+i)>max)
                {
                        max = *(p+i);
                        pmax = i;
                }
        }
        t1 = *(p);
    *(p) = *(p+pmin);
    *(p+min) = t1;
    t2 = *(p+n-1);
    *(p+n-1) = *(p+pmax);
    *(p+pmax) = t2;
}
int main()
{
        int i,n,arr;
        int *p = arr;
        printf("请输入即将输入的数目个数:");
        scanf("%d",&n);
        printf("请输入一组数:");
        for(i = 0;i < n;i++)
        {
                scanf("%d",&arr);
        }
        action2(arr,n);
        for(i = 0;i < n;i++)
        {
                printf("%d ",arr);
        }
        return 0 ;
}

没明白...我输入5 4 3 2 1结果是1 5 3 2 1
输入1 2 3 4 5结果是1 1 3 4 5,。。

BngThea 发表于 2017-12-7 16:30:00

AppleBJTU 发表于 2017-12-7 16:11
没明白...我输入5 4 3 2 1结果是1 5 3 2 1
输入1 2 3 4 5结果是1 1 3 4 5,。。

我在vs2010上测试了,只出现了我上面提到的逻辑错误

淘气跑跑 发表于 2017-12-7 19:35:59

兄弟,你这个程序我倒是改了一点,可以算出来,不过这个程序还是有问题。不能把最大的那个数放在第一个。
#include <stdio.h>

void action2(int *p,int n)

{

      int max,min,i,pmin = 0,pmax = 0,t1,t2;

      max = min = *p;

      for(i = 0; i < n; i++)

      {

                if(*(p+i)<min)

                {

                        min = *(p+i);

                        pmin = i;

                }

                else if (*(p+i)>max)

                {

                        max = *(p+i);

                        pmax = i;

                }

      }

      t1 = *(p);

    *(p) = *(p+pmin);

    *(p+pmin) = t1;

    t2 = *(p+n-1);

    *(p+n-1) = *(p+pmax);

    *(p+pmax) = t2;

}

int main()

{

      int i,n,arr;

      int *p = arr;

      printf("请输入即将输入的数目个数:");

      scanf("%d",&n);

      printf("请输入一组数:");

      for(i = 0;i < n;i++)

      {

                scanf("%d",p++);

      }
                p=arr;
                /*for(i=0;i<n;i++)
                {
                printf("%d",*p++);
                }*/

      action2(arr,n);

      for(i = 0;i < n;i++)

      {

                printf("%5d ",arr);

      }

                printf("\n");
      return 0 ;

}




tailor_long 发表于 2017-12-7 20:30:20

本帖最后由 tailor_long 于 2017-12-7 20:32 编辑

楼主大人,你好,在下写了一个程序,完美运行无BUG
楼主大人可以一试
{:10_297:}
#include <stdio.h>

void maxInt(int *p, int max, int n, int *a){
        //找出p数组中出现的最大的数以及他的下标
        int temp = 0;
        for(int i=0; i<n; i++)
        {
                if(max < *(p+i)){
                        max = *(p+i);
                        temp = i;
                }
        }
        *a = max;
        *(a+1) = temp;
        //把P数组中最大的数传给a,下标传给a;

}
       
void minInt(int *p, int min, int n, int *b){
        //找出p数组中出现的最小的数以及他的下标
        int temp = 0;
        for(int i=0; i<n; i++)
        {
                if(min > *(p+i)){
                        min = *(p+i);
                        temp = i;
                }
        }
        *b = min;
        *(b+1) = temp;
//把P数组中最小的数传给b,下标传给b;
}

void exchangeMax(int *a, int *p, int n){//将最大的数和p数组中最后一个数交换
        int temp = *(p+n-1);
        *(p+n-1) = *(p + a);
        *(p+a) = temp;
}
void exchangeMin(int *a, int *p, int n){//将最小的数和p数组中第一个数交换
        int temp = *(p);
        *(p) = *(p + a);
        *(p+a) = temp;
}

       
void action2(int *p,int n)
{
        int max,min,i;
        int pmin = 9999,pmax = -99999;
        int a, b;

        maxInt(p, pmax, n, a);
        minInt(p, pmin, n, b);

        //printf("the max of this array is p[%d] = %d and the min of this array is p[%d] = %d\n", a, a, b, b);
        //将最大的数和p数组中最后一个数交换
    exchangeMax(a, p, n);

        maxInt(p, pmax, n, a);
        minInt(p, pmin, n, b);
        if(a == n-1 && b == 0){//判断当前p数组是不是最大数放在最后,最小数放在最前面,如果是,那么程序结束
                return ;
        }
        else{//如果不是,//将最小的数和p数组中第一个数交换
                exchangeMin(b, p, n);
        }
}

int main()
{
       int i,n,arr;
   int *p = arr;
   printf("input the length of array\n");

   scanf("%d",&n);
   printf("input the member of array: \n");
   for(i = 0;i < n;i++)
   {
            scanf("%d",&arr);
   }
   action2(arr,n);
   for(i = 0;i < n;i++)
   {
             printf("%d ",arr);
   }
   return 0 ;
}

AppleBJTU 发表于 2017-12-7 20:56:23

淘气跑跑 发表于 2017-12-7 19:35
兄弟,你这个程序我倒是改了一点,可以算出来,不过这个程序还是有问题。不能把最大的那个数放在第一个。
...

你是就加了一个p = arr是吗

AppleBJTU 发表于 2017-12-7 20:57:08

BngThea 发表于 2017-12-7 16:30
我在vs2010上测试了,只出现了我上面提到的逻辑错误

我用的Dev和vs不会差很多吧,这是为什么呢?

AppleBJTU 发表于 2017-12-7 22:07:58

tailor_long 发表于 2017-12-7 20:30
楼主大人,你好,在下写了一个程序,完美运行无BUG
楼主大人可以一试

你太厉害啊!我看了好一会儿,有些都还不懂,老师一看就不像是我写的{:10_250:}

AppleBJTU 发表于 2017-12-7 22:10:03

tailor_long 发表于 2017-12-7 20:30
楼主大人,你好,在下写了一个程序,完美运行无BUG
楼主大人可以一试

      int pmin = 9999,pmax = -99999;
      int a, b;
请问这是什么意思?

tailor_long 发表于 2017-12-7 22:33:39

AppleBJTU 发表于 2017-12-7 22:10
int pmin = 9999,pmax = -99999;
      int a, b;
请问这是什么意思?

int pmin = 9999,pmax = -99999; //他的意思是:我将一个最小的数的初值设置的非常大,这样的话,数组中只要有值比pmin要小,那么我就将小值赋值给小变量。也就是你的pmin;然后pmax是一样的原理,我将max的初始值设置的非常小,只要有值比pmax大,我就将max值改变
但是为甚么要这么做呢?因为我看你的程序将他们设置为0,然后我就想,万一数组中出现负数怎么办?{:5_91:}
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int a, b;//这两个数组是分别用来存储最大值和最大值对应的位置;最小值和最小值对应的位置的,因为你在调换的时候,不知道位置怎么换呀?{:5_91:}
不知楼主能不能明白我混乱的逻辑???{:10_250:}

tailor_long 发表于 2017-12-7 22:34:54

本帖最后由 tailor_long 于 2017-12-7 22:37 编辑

AppleBJTU 发表于 2017-12-7 22:10
int pmin = 9999,pmax = -99999;
      int a, b;
请问这是什么意思?

其实我写的程程序也不麻烦,也就是在你的代码的基础上多加了几个函数!楼主大人加油哦{:5_92:}

AppleBJTU 发表于 2017-12-7 23:22:42

tailor_long 发表于 2017-12-7 22:33
int pmin = 9999,pmax = -99999; //他的意思是:我将一个最小的数的初值设置的非常大,这样的话,数组中 ...

哦哦,大概明白,但是刚学,一时间还不能接受消化{:10_250:}我再琢磨琢磨,有什么问题再麻烦您啦

tailor_long 发表于 2017-12-8 01:11:01

AppleBJTU 发表于 2017-12-7 23:22
哦哦,大概明白,但是刚学,一时间还不能接受消化我再琢磨琢磨,有什么问题再麻烦您啦

{:10_254:}好的呀
页: [1]
查看完整版本: 关于指针的一道题