关于指针的一道题
题目如下: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 ;
}
数据交换的下标索引不对,应该是
t1 = *(p);
*(p) = *(p+pmin);
*(p+pmin) = t1;
t2 = *(p+n-1);
*(p+n-1) = *(p+pmax);
*(p+pmax) = t2; BngThea 发表于 2017-12-7 14:05
数据交换的下标索引不对,应该是
还是不太对呢.. AppleBJTU 发表于 2017-12-7 14:55
还是不太对呢..
为什么我改了以后就可以了?
你改了以后哪里出错? BngThea 发表于 2017-12-7 14:59
为什么我改了以后就可以了?
你改了以后哪里出错?
输入5 4 3 2 1
输出 1 5 3 2 1 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
再一次交换变回去了
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,。。 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上测试了,只出现了我上面提到的逻辑错误 兄弟,你这个程序我倒是改了一点,可以算出来,不过这个程序还是有问题。不能把最大的那个数放在第一个。
#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: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 ;
}
淘气跑跑 发表于 2017-12-7 19:35
兄弟,你这个程序我倒是改了一点,可以算出来,不过这个程序还是有问题。不能把最大的那个数放在第一个。
...
你是就加了一个p = arr是吗 BngThea 发表于 2017-12-7 16:30
我在vs2010上测试了,只出现了我上面提到的逻辑错误
我用的Dev和vs不会差很多吧,这是为什么呢? tailor_long 发表于 2017-12-7 20:30
楼主大人,你好,在下写了一个程序,完美运行无BUG
楼主大人可以一试
你太厉害啊!我看了好一会儿,有些都还不懂,老师一看就不像是我写的{:10_250:} tailor_long 发表于 2017-12-7 20:30
楼主大人,你好,在下写了一个程序,完美运行无BUG
楼主大人可以一试
int pmin = 9999,pmax = -99999;
int a, b;
请问这是什么意思? 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:}
int a, b;//这两个数组是分别用来存储最大值和最大值对应的位置;最小值和最小值对应的位置的,因为你在调换的时候,不知道位置怎么换呀?{:5_91:}
不知楼主能不能明白我混乱的逻辑???{:10_250:} 本帖最后由 tailor_long 于 2017-12-7 22:37 编辑
AppleBJTU 发表于 2017-12-7 22:10
int pmin = 9999,pmax = -99999;
int a, b;
请问这是什么意思?
其实我写的程程序也不麻烦,也就是在你的代码的基础上多加了几个函数!楼主大人加油哦{:5_92:}
tailor_long 发表于 2017-12-7 22:33
int pmin = 9999,pmax = -99999; //他的意思是:我将一个最小的数的初值设置的非常大,这样的话,数组中 ...
哦哦,大概明白,但是刚学,一时间还不能接受消化{:10_250:}我再琢磨琢磨,有什么问题再麻烦您啦 AppleBJTU 发表于 2017-12-7 23:22
哦哦,大概明白,但是刚学,一时间还不能接受消化我再琢磨琢磨,有什么问题再麻烦您啦
{:10_254:}好的呀
页:
[1]