第八章: 8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(四个角的元素的顺序是从左到右,从上到下,依次从小到大存放)

第八章: 8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(四个角的元素的顺序是从左到右,从上到下,依次从小到大存放)

思考:

1.输入矩阵的值

int a[5][5] = { 0 };
    int i = 0, j = 0;
    printf("请输入一个5*5的数组:\n");
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }

2. 交换最大值最小值

二维数组在内存中连续存放

int* p = &a[0][0];
    change(p);

(1)找出最大值、最小值,并且交换

 for (i = 0; i < 5; i++)
    {
        for (j = i; 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;
        }
    }
    int tmp = 0;
    tmp = *(p + 12);
    *(p + 12) = * max;
    * max = tmp;
    tmp = *p;
    *p = *min;
    *min = tmp;

(2)找出最小值,并且交换

 min = p + 1;
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            if (((p + 5 * i + j)!=p) &&(*(p + 5 * i + j) < * min))
                min = p + 5 * i + j;
        }
    }
    tmp = *(p+4);
    *(p+4) = * min;
    * min = tmp;

3. 输出数组

printf("\n\n");
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

思考完毕,开始敲代码

//将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素
//(四个角的元素的顺序是从左到右,从上到下,依次从小到大存放)
#define _CRT_SECURE_NO_WARNINGS
#include
void change(int* p)
{
	int* max;
	max = p;
	int* min;
	min = p;
	int i = 0, j = 0;
	//找出最大值,并且交换给中间值
	for (i = 0; i < 5; i++)
	{
		for (j = i; 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;
		}
	}
	int tmp = 0;
	tmp = *(p + 12);
	*(p + 12) = * max;
	* max = tmp;
	tmp = *p;
	*p = *min;
	*min = tmp;
	
	//找出最小值,并且交换给右上角的值
	min = p + 1;
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
		{
			if (((p + 5 * i + j)!=p) &&(*(p + 5 * i + j) < * min))
				min = p + 5 * i + j;
		}
	}
	tmp = *(p+4);
	*(p+4) = * min;
	* min = tmp;
	//找出最小值,并且交换给左下角的值
	min = 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) && (*(p + 5 * i + j) < * min))
				min = p + 5 * i + j;
		}
	}
	tmp = *(p + 20);
	*(p + 20) = * min;
	* min = tmp;
	//找出最小值,并且交换给右下角的值
	min = p + 1;
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
		{
			if (((p + 5 * i + j) != (p + 20))&& ((p + 5 * i + j) != (p + 4)) && ((p + 5 * i + j) != p)&&(*(p + 5 * i + j) < * min))
				min = p + 5 * i + j;
		}
	}
	tmp = *(p + 24);
	*(p + 24) = * min;
	* min = tmp;
}
int main()
{
	//输入矩阵的值
	int a[5][5] = { 0 };
	int i = 0, j = 0;
	printf("请输入一个5*5的数组:\n");
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	//交换最大值最小值
	int* p = &a[0][0];
	change(p);
	//输出数组
	printf("\n\n");
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

输出结果:

 

 第八章: 8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(四个角的元素的顺序是从左到右,从上到下,依次从小到大存放)_第1张图片

你可能感兴趣的:(C程序设计(第五版)课后习题,矩阵,算法,1024程序员节,c语言,c#,线性代数)