鱼C论坛

 找回密码
 立即注册
查看: 1748|回复: 17

[已解决]关于指针的一道题

[复制链接]
发表于 2017-12-7 13:43:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


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

  1. #include <stdio.h>
  2. void action2(int *p,int n)
  3. {
  4.         int max,min,i,pmin = 0,pmax = 0,t1,t2;
  5.         max = min = *(p);
  6.         for(i = 1; i < n; i++)
  7.         {
  8.                 if(*(p+i)<min)
  9.                 {
  10.                         min = *(p+i);
  11.                         pmin = i;
  12.                 }
  13.                 else if (*(p+i)>max)
  14.                 {
  15.                         max = *(p+i);
  16.                         pmax = i;
  17.                 }
  18.         }
  19.         t1 = *(p);
  20.     *(p) = *(p+min);
  21.     *(p+i) = t1;
  22.     t2 = *(p+n-1);
  23.     *(p+n-1) = *(p+max);
  24.     *(p+max) = t2;
  25. }
  26. int main()
  27. {
  28.         int i,n,arr[10000];
  29.         int *p = arr;
  30.         printf("请输入即将输入的数目个数:");
  31.         scanf("%d",&n);
  32.         printf("请输入一组数:");
  33.         for(i = 0;i < n;i++)
  34.         {
  35.                 scanf("%d",&arr[i]);
  36.         }
  37.         action2(arr,n);
  38.         for(i = 0;i < n;i++)
  39.         {
  40.                 printf("%d ",arr[i]);
  41.         }
  42.         return 0 ;
  43. }
复制代码
最佳答案
2017-12-7 20:30:20
本帖最后由 tailor_long 于 2017-12-7 20:32 编辑

楼主大人,你好,在下写了一个程序,完美运行无BUG
楼主大人可以一试

  1. #include <stdio.h>

  2. void maxInt(int *p, int max, int n, int *a){
  3.         //找出p数组中出现的最大的数以及他的下标
  4.         int temp = 0;
  5.         for(int i=0; i<n; i++)
  6.         {
  7.                 if(max < *(p+i)){
  8.                         max = *(p+i);
  9.                         temp = i;
  10.                 }
  11.         }
  12.         *a = max;
  13.         *(a+1) = temp;
  14.         //把P数组中最大的数传给a[0],下标传给a[1];

  15. }
  16.        
  17. void minInt(int *p, int min, int n, int *b){
  18.         //找出p数组中出现的最小的数以及他的下标
  19.         int temp = 0;
  20.         for(int i=0; i<n; i++)
  21.         {
  22.                 if(min > *(p+i)){
  23.                         min = *(p+i);
  24.                         temp = i;
  25.                 }
  26.         }
  27.         *b = min;
  28.         *(b+1) = temp;
  29. //把P数组中最小的数传给b[0],下标传给b[1];
  30. }

  31. void exchangeMax(int *a, int *p, int n){//将最大的数和p数组中最后一个数交换
  32.         int temp = *(p+n-1);
  33.         *(p+n-1) = *(p + a[1]);
  34.         *(p+a[1]) = temp;
  35. }
  36. void exchangeMin(int *a, int *p, int n){//将最小的数和p数组中第一个数交换
  37.         int temp = *(p);
  38.         *(p) = *(p + a[1]);
  39.         *(p+a[1]) = temp;
  40. }

  41.        
  42. void action2(int *p,int n)
  43. {
  44.         int max,min,i;
  45.         int pmin = 9999,pmax = -99999;
  46.         int a[2], b[2];

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

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

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

  61. int main()
  62. {
  63.          int i,n,arr[10000];
  64.      int *p = arr;
  65.      printf("input the length of array\n");

  66.      scanf("%d",&n);
  67.      printf("input the member of array: \n");
  68.      for(i = 0;i < n;i++)
  69.      {
  70.             scanf("%d",&arr[i]);
  71.      }
  72.      action2(arr,n);
  73.      for(i = 0;i < n;i++)
  74.      {
  75.              printf("%d ",arr[i]);
  76.      }
  77.      return 0 ;
  78. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-7 14:05:57 | 显示全部楼层
数据交换的下标索引不对,应该是
  1.      t1 = *(p);
  2.     *(p) = *(p+pmin);
  3.     *(p+pmin) = t1;
  4.     t2 = *(p+n-1);
  5.     *(p+n-1) = *(p+pmax);
  6.     *(p+pmax) = t2;
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 14:55:25 | 显示全部楼层
BngThea 发表于 2017-12-7 14:05
数据交换的下标索引不对,应该是

还是不太对呢..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 14:59:45 | 显示全部楼层

为什么我改了以后就可以了?
你改了以后哪里出错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 15:02:15 | 显示全部楼层
BngThea 发表于 2017-12-7 14:59
为什么我改了以后就可以了?
你改了以后哪里出错?

输入5 4 3 2 1
输出 1 5 3 2 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
再一次交换变回去了


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 16:11:59 | 显示全部楼层
BngThea 发表于 2017-12-7 15:36
你肯定没有改对,我输入5 4 3 2 1,得到的是 5 4 3 2 1

仔细推敲一下,发现你的代码逻辑存在一个漏洞 ...
  1. #include <stdio.h>
  2. void action2(int *p,int n)
  3. {
  4.         int max,min,i,pmin = 0,pmax = 0,t1,t2;
  5.         max = min = *(p);
  6.         for(i = 1; i < n; i++)
  7.         {
  8.                 if(*(p+i)<min)
  9.                 {
  10.                         min = *(p+i);
  11.                         pmin = i;
  12.                 }
  13.                 else if (*(p+i)>max)
  14.                 {
  15.                         max = *(p+i);
  16.                         pmax = i;
  17.                 }
  18.         }
  19.         t1 = *(p);
  20.     *(p) = *(p+pmin);
  21.     *(p+min) = t1;
  22.     t2 = *(p+n-1);
  23.     *(p+n-1) = *(p+pmax);
  24.     *(p+pmax) = t2;
  25. }
  26. int main()
  27. {
  28.         int i,n,arr[10000];
  29.         int *p = arr;
  30.         printf("请输入即将输入的数目个数:");
  31.         scanf("%d",&n);
  32.         printf("请输入一组数:");
  33.         for(i = 0;i < n;i++)
  34.         {
  35.                 scanf("%d",&arr[i]);
  36.         }
  37.         action2(arr,n);
  38.         for(i = 0;i < n;i++)
  39.         {
  40.                 printf("%d ",arr[i]);
  41.         }
  42.         return 0 ;
  43. }
复制代码


没明白...我输入5 4 3 2 1结果是1 5 3 2 1
输入1 2 3 4 5结果是1 1 3 4 5,。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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上测试了,只出现了我上面提到的逻辑错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[10000];

        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[i]);

        }

                printf("\n");
        return 0 ;

}




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 20:30:20 | 显示全部楼层    本楼为最佳答案   
本帖最后由 tailor_long 于 2017-12-7 20:32 编辑

楼主大人,你好,在下写了一个程序,完美运行无BUG
楼主大人可以一试

  1. #include <stdio.h>

  2. void maxInt(int *p, int max, int n, int *a){
  3.         //找出p数组中出现的最大的数以及他的下标
  4.         int temp = 0;
  5.         for(int i=0; i<n; i++)
  6.         {
  7.                 if(max < *(p+i)){
  8.                         max = *(p+i);
  9.                         temp = i;
  10.                 }
  11.         }
  12.         *a = max;
  13.         *(a+1) = temp;
  14.         //把P数组中最大的数传给a[0],下标传给a[1];

  15. }
  16.        
  17. void minInt(int *p, int min, int n, int *b){
  18.         //找出p数组中出现的最小的数以及他的下标
  19.         int temp = 0;
  20.         for(int i=0; i<n; i++)
  21.         {
  22.                 if(min > *(p+i)){
  23.                         min = *(p+i);
  24.                         temp = i;
  25.                 }
  26.         }
  27.         *b = min;
  28.         *(b+1) = temp;
  29. //把P数组中最小的数传给b[0],下标传给b[1];
  30. }

  31. void exchangeMax(int *a, int *p, int n){//将最大的数和p数组中最后一个数交换
  32.         int temp = *(p+n-1);
  33.         *(p+n-1) = *(p + a[1]);
  34.         *(p+a[1]) = temp;
  35. }
  36. void exchangeMin(int *a, int *p, int n){//将最小的数和p数组中第一个数交换
  37.         int temp = *(p);
  38.         *(p) = *(p + a[1]);
  39.         *(p+a[1]) = temp;
  40. }

  41.        
  42. void action2(int *p,int n)
  43. {
  44.         int max,min,i;
  45.         int pmin = 9999,pmax = -99999;
  46.         int a[2], b[2];

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

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

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

  61. int main()
  62. {
  63.          int i,n,arr[10000];
  64.      int *p = arr;
  65.      printf("input the length of array\n");

  66.      scanf("%d",&n);
  67.      printf("input the member of array: \n");
  68.      for(i = 0;i < n;i++)
  69.      {
  70.             scanf("%d",&arr[i]);
  71.      }
  72.      action2(arr,n);
  73.      for(i = 0;i < n;i++)
  74.      {
  75.              printf("%d ",arr[i]);
  76.      }
  77.      return 0 ;
  78. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你是就加了一个p = arr是吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 20:57:08 | 显示全部楼层
BngThea 发表于 2017-12-7 16:30
我在vs2010上测试了,只出现了我上面提到的逻辑错误

我用的Dev和vs不会差很多吧,这是为什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 22:07:58 | 显示全部楼层
tailor_long 发表于 2017-12-7 20:30
楼主大人,你好,在下写了一个程序,完美运行无BUG
楼主大人可以一试

你太厉害啊!我看了好一会儿,有些都还不懂,老师一看就不像是我写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 22:10:03 | 显示全部楼层
tailor_long 发表于 2017-12-7 20:30
楼主大人,你好,在下写了一个程序,完美运行无BUG
楼主大人可以一试

        int pmin = 9999,pmax = -99999;
        int a[2], b[2];
请问这是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 22:33:39 | 显示全部楼层
AppleBJTU 发表于 2017-12-7 22:10
int pmin = 9999,pmax = -99999;
        int a[2], b[2];
请问这是什么意思?

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

使用道具 举报

发表于 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[2], b[2];
请问这是什么意思?


其实我写的程程序也不麻烦,也就是在你的代码的基础上多加了几个函数!楼主大人加油哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哦哦,大概明白,但是刚学,一时间还不能接受消化我再琢磨琢磨,有什么问题再麻烦您啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 01:11:01 From FishC Mobile | 显示全部楼层
AppleBJTU 发表于 2017-12-7 23:22
哦哦,大概明白,但是刚学,一时间还不能接受消化我再琢磨琢磨,有什么问题再麻烦您啦

好的呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 21:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表