鱼C论坛

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

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

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

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

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

x
题目如下:
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[10000];
         int *p = arr;
         printf("请输入即将输入的数目个数:");
        scanf("%d",&n);
        printf("请输入一组数:");
        for(i = 0;i < n;i++)
        {
                scanf("%d",&arr[i]); 
        }
        action2(arr,n);
        for(i = 0;i < n;i++)
        {
                printf("%d ",arr[i]);
        }
        return 0 ; 
}
最佳答案
2017-12-7 20:30:20
本帖最后由 tailor_long 于 2017-12-7 20:32 编辑

楼主大人,你好,在下写了一个程序,完美运行无BUG
楼主大人可以一试
#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[0],下标传给a[1];

}
        
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[0],下标传给b[1];
}

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

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

        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[1], a[0], b[1], b[0]);
        //将最大的数和p数组中最后一个数交换
    exchangeMax(a, p, n);

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

 int main()
 {
         int i,n,arr[10000];
     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[i]); 
     }
     action2(arr,n);
     for(i = 0;i < n;i++)
     {
             printf("%d ",arr[i]);
     }
     return 0 ; 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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; 
想知道小甲鱼最近在做啥?请访问 -> 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

仔细推敲一下,发现你的代码逻辑存在一个漏洞 ...
#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[10000];
         int *p = arr;
         printf("请输入即将输入的数目个数:");
        scanf("%d",&n);
        printf("请输入一组数:");
        for(i = 0;i < n;i++)
        {
                scanf("%d",&arr[i]); 
        }
        action2(arr,n);
        for(i = 0;i < n;i++)
        {
                printf("%d ",arr[i]);
        }
        return 0 ; 
}

没明白...我输入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
楼主大人可以一试
#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[0],下标传给a[1];

}
        
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[0],下标传给b[1];
}

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

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

        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[1], a[0], b[1], b[0]);
        //将最大的数和p数组中最后一个数交换
    exchangeMax(a, p, n);

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

 int main()
 {
         int i,n,arr[10000];
     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[i]); 
     }
     action2(arr,n);
     for(i = 0;i < n;i++)
     {
             printf("%d ",arr[i]);
     }
     return 0 ; 
}
想知道小甲鱼最近在做啥?请访问 -> 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-11-28 22:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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