例题
将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从左到右,从上到下顺序依次从小到大存放),写一函数实现。用man函数调用
解析
#include <iostream>
using namespace std;
int main()
{
void fun(int *p);
int a[5][5],i,j,*p;
cout << "Please input the 5*5 matrix: " << endl;
for (i=0; i<5; i++) //输入矩阵
for (j=0; j<5; j++)
cin >> a[i][j];
p = &a[0][0]; //使p指向0行0列元素
fun(p); //调用函数,实现交换
cout << "The final matrix will be like this: " << endl;
for (i=0; i<5; i++)
{
for (j=0; j<5; j++)
cout << a[i][j] << " "; //输出已交换的矩阵
cout << endl;
}
return 0;
}
void fun(int *p)
{
int i,j,*max,*min,temp;
max = p;
min = p;
for (i=0; i<5; i++)
for (j=0; j<5; j++)
{
if (*(p+5*i+j)>*max) max = p+5*i+j;
if (*(p+5*i+j)<*min) min = p+5*i+j;
}
temp = *(p+12); //将最大值与中心元素互换
*(p+12) = *max;
*max = temp;
temp = *p; //将最小值与左上角元素互换
*p = *min;
*min = temp;
min = p+1; //将a[0][1]的地址赋给min,从该位置开始找最小的元素
for (i=0; i<5; i++)
for (j=0; j<5; j++)
if ((*(p+5*i+j)<*min) && (*(p+5*i+j)!=*p)) min = p+5*i+j;
temp = *(p+4); //找第二最小值的地址赋给 min
*(p+4) = *min;
*min = temp;
min = p+1;
for (i=0; i<5; i++)
for (j=0; j<5; j++)
if ((*(p+5*i+j)<*min) && (*(p+5*i+j)!=*p) && (*(p+5*i+j)!=*(p+4))) min = p+5*i+j;
temp = *(p+20); //找第三最小值的地址赋给 min
*(p+20) = *min;
*min = temp;
min = p+1;
for (i=0; i<5; i++)
for (j=0; j<5; j++)
if ((*(p+5*i+j)<*min) && (*(p+5*i+j)!=*p) && (*(p+5*i+j)!=*(p+4)) && (*(p+5*i+j)!=*(p+20))) min = p+5*i+j;
temp = *(p+24); //找第四最小值的地址赋给 min
*(p+24) = *min;
*min = temp;
}