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

#include<stdio.h>
void input(int number[10]){
int i;
printf("Input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&number[i]);
}
void max_min_value(int array[10])
{
int *max,*min,*p,*array_end;
array_end=array+9;
max=min=array;
for(p=array+1;p<=array_end;p++)

if(*p>*max)
max=p;
else if(*p<*min)
min=p;

*p=array[0];
array[0]=*min;
*min=*p;
*p=array[9];
array[9]=*max;
*max=*p;
}
void output(int array[10])
{
int *p;
printf("Now,they are:");
for(p=array;p<=array+9;p++)
printf("%d ",*p);
}
int main()
{
int number[10];
input(number);
max_min_value(number);
output(number);
}
请帮忙看下这段代码哪里有错,我是在MAC上面的XCODE上面运行的,编译没有错,但是输入10个数之后有问题

在void max_min_value(int array[10])这个函数体内:

for(p=array+1;p&lt;=array_end;p++)
if(*p&gt;*max)
max=p;
else if(*p&lt;*min)
min=p;


楼主写的这段代码是通过for循环找出max和min,但是for循环以后p=array+10了,而数组最末尾的

地址是array+9,所以我觉得是这里出了问题,因为p指向的array+10的地址储存的是个未知的值,下面再进行交换的时候再用*p作为中间量进行值的交换时可能就会出问题。所以我建议楼主在上面这段代码下写个:printf("now,*p=%d\n",*p);看*p是否能够正确打印出来。再定义一个整型变量temp作为中间变量应该可以解决问题。 

  我现在编译了一下(才回家),发现楼主的程序是没有问题的,可以得到预想的结果,楼主输入10个数之后遇到了什么问题呢?附运行结果如下:

追问

别人之前也让我再定义了一个中间变量,编译成功,但是运行总是会出问题,我是在Imac上面的Xcode运行,看不懂什么问题,不过今天运行又没问题,真心搞不懂啥意思,还是谢谢楼主的回答,万分感谢。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-26
void max_min_value(int array[10])
{
int *max,*min,*p,*array_end;
int tmp;
array_end=array+9;
max=min=array;
for(p=array+1;p<=array_end;p++)
if(*p>*max)
max=p;
else if(*p<*min)
min=p;
tmp=array[0]; //这里需要用临时变量保存第一个元素值,否则后面一句会把第一个元素覆盖,下面max的问题一样
array[0]=*min;
*min=tmp;
tmp=array[9];
array[9]=*max;
*max=tmp;
}追问

谢谢哈,按照你的方法,现在可以正常运行。感谢感谢。

本回答被提问者采纳
第2个回答  2013-04-26
//觉得你的太长了,我自己写的,你看看,在VC下能运行
#include<stdio.h>
int main()
{
int i,j,k,min=32767,max=-32768,t,a[10];
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
if(a[i]>max){max=a[i];j=i;}
if(a[i]<min){min=a[i];k=i;}
}
t=a[0];a[0]=a[k];a[k]=t;
t=a[9];a[9]=a[j];a[j]=t;
for(i=0;i<10;i++)printf("%d ",a[i]);
printf("\n");
}追问

我知道写的是有点复杂,我是想知道这个错在哪里了 呵呵

追答

我只能说你的最大最小值的for循环里面由问题,因为你那样的话只把最大最小值分别放进了a[0]和a[9]但不是交换(这里逻辑没写好也少了个括号)。还有最好少用指针,用了指针没有free最后会很麻烦,其他部分没什么问题