编写函数voidfun(int*x,intn),功能是:求出长度为n的数组x中的最大数与次最大数

编写函数voidfun(int*x,intn),功能是:求出长度为n的数组x中的最大数与次最大数,并把最大数和a[0]对调,次最大数与a[1]对调,其余的数保持不变.下面程序运行时若输入:2 4 6 1 3 9 7 0 5 8,则输出:9 8 6 1 3 2 7 0 5 4。 #include

#define N 10 void fun(int *x,int n) { } int main() {int a[N],i; for(i=0;i<N;i++) scanf("%d",a+i); fun(a,N); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); return 0; } 求完整void fun(int *x,int n)程序。谢谢

void fun(int *x,int n)
{
int max=*x; /*定义个最大*/
int index1,index2;/*最大和次最大索引号*/
int a; /*交换时空间*/
int max2; /*次大*/
for(i=1;i<=n;i++)
if(max<(*(x+i))) /*从第一个开始往后比较,最终max存着最大值*/
max=*(x+i);
for(i=0;i<=n;i++)
while(max==*(x+i)) /*找到最大值是对应的后,把索引取出来*/
index1=i-1;
a=*x;
*x=*(x+index);
*(x+index)=a;
max2=*(x+1); //现在第一位已经是最大了,从第二位再重复一次
for(i=2;i<=n;i++)
if(max2<(*(x+i)))
max2=*(x+i);
for(i=0;i<=n;i++)
while(max2==*(x+i))
index2=i-1;
a=*(x+1);
*(x+1)=*(x+index2);
*(x+index2)=a;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-12-28
#include<stdio.h>

#define N 10
void fun(int *x,int n)
{
int i,j,k,temp;
for(i = 0 ; i < 2 ; i ++) //利用选择排序进行两次比较就行了,因为我们只需改变前边两个数a[0],a[1]的值
{
k = i;
for(j = i + 1 ; j < n ; j ++)
if(*(x + k) < *(x + j)) //这句代码等同于 if(a[k] < a[j])
k = j;
if(k != i)
{ temp = *(x+k);*(x+k) = *(x+i);*(x+i)=temp; }
}
}

int main()
{
int a[N],i;
for(i=0;i<N;i++)
scanf("%d",a+i);
fun(a,N);
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}

//不知道这样是否达到了你的要求本回答被提问者采纳
第2个回答  2013-12-28
下面是完整的代码,我写得时候可能会多写一些变量什么的,你可以做个简单的优化,让程序更加简洁一点。还有,下次发代码的时候记得分行,不然别人不容易看的

#include<stdio.h>

#define N 10
void fun(int *x,int n)
{
int j,temp,mark1=x[0];
for(int i=0;i<n;i++)
{
if(mark1<=x[i])
{ mark1=x[i]; j=i;}
}
temp=x[0];x[0]=x[j];x[j]=temp;
int mark2=x[1];
for(int k=1;k<n;k++)
{
if(mark2<=x[k])
{mark2=x[k];j=k;}
}
temp=x[1];x[1]=x[j];x[j]=temp;

}
int main()
{
printf("请输入10个数字,以空格隔开");
int a[N],i;
for(i=0;i<N;i++)
scanf("%d",a+i);
fun(a,N);
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
相似回答