将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下顺序依次从小到大存放),写一函数实现之。用main函数调用。

将一个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");
}
  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值