将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下顺序依次从小到大存放),写一函数实现之。用main函数调用。
方法一:
#include <stdio.h>
int main()
{
void change(int* p);
int num[5][5];
int i, j, *p;
p = &num[0][0];
printf("请输入矩阵的值:\n");
for (i = 0; i<5; i++)
{
for (j = 0; j<5; j++)
{
scanf("%d", &num[i][j]);
}
}
//输出原来的矩阵
printf("所输入的矩阵为:\n");
for (i = 0; i<5; i++)
{
for (j = 0; j<5; j++)
{
printf("%3d", num[i][j]);
}
printf("\n");
}
//调用函数
change(p);
//输出调整后的矩阵
printf("按要求调整后的矩阵为:\n");
for (i = 0; i<5; i++)
{
for (j = 0; j<5; j++)
{
printf("%3d", num[i][j]);
}
printf("\n");
}
return 0;
}
void change(int * p) {
//printf("%d\n",p[3]);
//找到最大值,并放到中间
int i, j, t, *max = p;
for (i = 0; i<5; i++)
{
for (j = 0; j<5; j++)
{
if (*max < *(p + i * 5 + j)) max = p + i * 5 + j;
}
}
t = *(p + 2 * 5 + 2);
*(p + 2 * 5 + 2) = *max;
*max = t;
int * min = p;
//找到最小的值
for (i = 0; i<5; i++)
{
for (j = 0; j<5; j++)
{
if (*min > * (p + i * 5 + j))
{
min = p + i * 5 + j;
}
}
}
//最小的值和第一个元素交换
t = *min;
*min = *p;
*p = t;
min = p + 1;//从第二个元素开始
//找到次小的值
for (i = 0; i<5; i++)
{
for (j = 0; j<5; j++)
{
if (i == 0 && j == 0) continue;
else if (*min > *(p + i * 5 + j))
{
min = p + i * 5 + j;
}
}
}
//次小的值和第5个元素交换
t = *min;
*min = *(p + 4);
*(p + 4) = t;
min = p + 1;//从第二个元素开始
//找到第三小的值
for (i = 0; i<5; i++)
{
for (j = 0; j<5; j++)
{
if ((i == 0 && j == 0) || (i == 0 && j == 4)) continue;
else if (*min > *(p + i * 5 + j))
{
min = p + i * 5 + j;
}
}
}
//第三小的值和第21个元素交换
t = *min;
*min = *(p + 20);
*(p + 20) = t;
min = p + 1;//从第二个元素开始
//找到第四小的值
for (i = 0; i<5; i++)
{
for (j = 0; j<5; j++)
{
if ((i == 0 && j == 0) || (i == 0 && j == 4) || (i == 4 && j == 0)) continue;
else if (*min > *(p + i * 5 + j))
{
min = p + i * 5 + j;
}
}
}
//第四小的值和第25个元素交换
t = *min;
*min = *(p + 24);
*(p + 24) = t;
}
方法二:
#include<stdio.h>
#include<stdlib.h>
#define N 5
void swop(int* a, int* b)
{//交换两个数,两个形参为指针
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
void fun(int(*p)[N])
{
int* max = (int*)p;//最大值
int* min1 = (int*)p;//最小值
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
if (*max < *(*(p + i) + j))
{
max = *(p + i) + j;
}
if (*min1 > *(*(p + i) + j))
{
min1 = *(p + i) + j;
}
}
}
int* min2 = *(p + 2) + 2;//次小值
int* min3 = *(p + 2) + 2; //倒数第三小值
int* min4 = *(p + 2) + 2;//倒数第四小值
swop(max, *(p + 2) + 2);//最大值与中间的值交换
swop(min1, *p);//最小值与左上角的值交换
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
if (*(p + i) + j == *p)
{
continue;
}
if (*min2 > *(*(p + i) + j))
{
min2 = *(p + i) + j;
}
}
}
swop(min2, *(p)+N - 1);//次小值与右上角的值交换
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
if (*(p + i) + j == *p || *(p + i) + j == *(p)+N - 1)
{
continue;
}
if (*min3 > *(*(p + i) + j))
{
min3 = *(p + i) + j;
}
}
}
swop(min3, *(p + N - 1));//倒数第三小值与左下角的值交换
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
if (*(p + i) + j == *p || *(p + i) + j == *(p)+N - 1 || *(p + i) + j == *(p + N - 1))
{
continue;
}
if (*min4 > *(*(p + i) + j))
{
min4 = *(p + i) + j;
}
}
}
swop(min4, *(p + N - 1) + N - 1); //倒数第四小值右下角的值交换
}
void main()
{
int arr[N][N];
int(*p)[N] = arr;//定义指向二维数组的指针p
int count = 25;
for (int i = 0; i < N; ++i)
{//初始化二维数组
for (int j = 0; j < N; ++j)
{
*(*(p + i) + j) = count;
count -= 1;
}
}
printf("原矩阵为:\n");
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
printf("%d\t", *(*(p + i) + j));
}
printf("\n");
}
printf("\n转换后的矩阵为:\n");
fun(p);
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
printf("%d\t", *(*(p + i) + j));
}
printf("\n");
}
system("pause");
}