C语言数组将最小值与第一个数交换,最大值与最后一个数交换

大致意思是输入一个数n,然后输入n个数字组成一个数组,将最小值与第一个数交换,最大值与最后一个数交换,下面是我写的程序,请问有什么错误。

#include<stdio.h>
int main(void)
{
int a[10];
int i,n,temp1,max,j,temp2;
printf("Input n:");
scanf("%d",&n);
printf("Input %d integers:",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);

//*最小值与第一个数交换*//

temp1=a[0];
for(i=1;i<n;i++)
if(a[i]<a[0]){
a[0]=a[i];
a[i]=temp1;}

//*最大值与最后一个数交换*//
j=0;
temp2=a[n-1];
max=a[0];

for(i=1;i<n-1;i++)
if(a[i]>max){
max=a[i];
j=i;}

a[n-1]=a[j];
a[j]=temp2;

//*输出数组*//
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");

return 0;
}

不对,思路似乎有些乱。
第一个for循环,写出的功能是:只要遇到比a[0]小的值例如a[i],a[0]就会被替换,而a[i]则会被a[0]覆盖。那么试问,如果数组有多个数值比a[0]小,那么那些值统统都会被赋值为a[0]的值么?
例如: 5 4 3 2 1
你的代码在最小值替换那里已经变成了: 1 5 5 5 5

在最大值与最后一个数交换那里,用变量j记录最大值的位置,这个想法就蛮好的。
不过,第二for循环那里问题是,找到一个为什么就要把值换掉呢?
不是应该是查询完整个数组后,找到最大的是哪一个值,最后再进行替换。不是应该这样么?

主要问题是:不要一找到就进行替换。先找,整个数组找完后,既for循环结束后,再进行替换。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-26
首先是a[10],你已经限定了数组的元素为10个,所以你输入的n与数组元素个数不符!在交换最小值时,每次交换a[i]都会赋值成a[0];而在交换最大值时max=a[i]这句好像没什么用处!我的代码是这样的!
#include<stdio.h>
void out_arry(int a[],int n);
int main()
{
int a[10];
int i,k,t;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
{
k=0;
if(a[k]>a[i])
k=i;
if(k!=0)
{
t=a[0];
a[0]=a[k];
a[k]=t;
}
}
out_arry(a,10);
for(i=0;i<9;i++)
{
k=9;
if(a[k]<a[i])
k=i;
if(k!=9)
{
t=a[9];
a[9]=a[k];
a[k]=t;
}
}
out_arry(a,10);
return 0;
}
void out_arry(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
}
第2个回答  2013-12-27
#include<cstdio>
#include<cstdlib>
int main()
{
int i,n;
int a[100];
int s,p;
printf("n: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
s=a[0];
p=0;
for(i=1;i<n;i++)
{
if(s<a[i])
{
s=a[i];
p=i;
}
}
a[p]=a[n-1];
a[n-1]=s;
s=a[0];
p=0;
for(i=1;i<n;i++)
{
if(s>a[i])
{
s=a[i];
p=i;
}
}
a[p]=a[0];
a[0]=s;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
system("pause");
return 0;
}

【这个是我很久之前写的 不知道是不是这道题的了 假如不是我再尝试写一写吧】
相似回答