将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素
(顺序为从左到右,从上到下,从小到大存放)写一个函数实现之。用main函数调用
- 代码如下:
#include<stdio.h>
void change(int *p);
int main()
{
int a[5][5],*p;
printf("input a:\n");
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%d",&a[i][j]); //输入数组每个数
}
}
p=&a[0][0];
change(p);
for(int k=0;k<5;k++){
for(int t=0;t<5;t++){
printf("%d ",a[k][t]);//将调换后的数组输出
}
printf("\n");
}
return 0;
}
void change(int *p)
{
int temp,i,j;
int *pmax,*pmin;
pmax=p;
pmin=p;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(*pmax<*(p+5*i+j)) pmax=p+5*i+j; //找出最大值
if(*pmin>*(p+5*i+j)) pmin=p+5*i+j; //找出最小值
}
}
temp=*(p+12); //既然找到了最大值,那就和中间的元素交换顺序吧
*(p+12)=*pmax;
*pmax=temp;
temp=*p;
*p=*pmin; //最小值先和数组第一个元素交换位置,*p的意思就是a数组中第一个
*pmin=temp; //*p相当于a[0][0]
pmin=p+1;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(((p+5*i+j)!=p) && (*pmin>*(p+5*i+j))) pmin=p+5*i+j;
} //接着找第二个小的值,和右上角的值交换顺序
}
temp=*pmin;
*pmin=*(p+4);
*(p+4)=temp;
pmin=p+1;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(((p+5*i+j)!=(p+4)) &&((p+5*i+j)!=p)&&(*pmin)>*(p+5*i+j))
pmin=p+5*i+j;
}
}
temp=*pmin;
*pmin=*(p+20);//接着找第三个小的值,和左下角的值交换顺序
*(p+20)=temp;
pmin=p+1;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=(p+20))
&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;
}
}
temp=*pmin;
*pmin=*(p+24);//接着找第四个小的值,和右下角的值交换顺序
*(p+24)=temp;
}
运行结果如图:
- 此方法为笨方法,如果有更好的方法,欢迎多多指点。