零开始的C语言学习之路——谭浩强教材课后题实践记录与问题解析(第八章指针⑩)

本文介绍了一个C语言程序,通过函数实现将5x5矩阵中的最大元素放在中心,其余四个角分别放置四个最小元素,按照从左到右、从上到下的顺序递增存储。程序使用指针遍历矩阵并记录最大值和四个最小值的位置进行交换。
摘要由CSDN通过智能技术生成

8.10 题目

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

思路

        ① 实参是二维数组a[5][5],形参是由五个元素组成的一维数组针织变量p,将二维数组的首行的起始地址传递给指针变量p

        ②找最大值:先假定数组首个元素为max,通过循环遍历数组,若找到大于当前max的元素则进行替换,并记录此元素所在的行、列,直到循环结束。

        ③找最小值:先随便给min一个数组里元素的值(代码里假设max为min),通过循环遍历数组,若找到小于当前max的元素则进行替换,并记录此元素所在的行、列,直到循环结束。

        ④找次最小值:在循环里多加一个判断语句,当前的行和列元素不是最小值的行和列(也就是排除最小值)

#include<stdio.h>

void Matrix(int(*p)[5])
{
	int max = *(*p);
	int min1, min2, min3, min4;
	int row0, column0, row1, column1, row2, column2, row3, column3, row4, column4;
	int i, j;
    int temp;
	for (i = 0; i < 5; i++)//先假定p[0][0]是最大的元素,再遍历整个矩阵,找出最大的那个元素
	{
		for (j = 0; j < 5; j++)
		{
            if (*(*(p + i) + j) >= max)
            {
                max = *(*(p + i) + j);
                row0 = i;
                column0 = j;
            }
		}
	}

    // 找出最小值及其坐标
    min1 = max;
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            if (*(*(p + i) + j) <= min1) {
                min1 = *(*(p + i) + j);
                row1 = i;
                column1 = j;
            }
        }
    }

    // 找出第二个最小值及其坐标(排除已找到的最小值位置)
    min2 = max;
    for (i = 0; i < 5; i++) 
    {
        for (j = 0; j < 5; j++)
        {
            if (*(*(p + i) + j) <= min2 && *(*(p + i) + j) != min1)
            {
                min2 = *(*(p + i) + j);
                row2 = i;
                column2 = j;
            }
        }
    }

    // 找出第三个最小值及其坐标(排除已找到的最小值位置)
    min3 = max;
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            if (*(*(p + i) + j) <= min3 && *(*(p + i) + j) != min1 && *(*(p + i) + j) != min2) {
                min3 = *(*(p + i) + j);
                row3 = i;
                column3 = j;
            }
        }
    }

    // 找出第四个最小值及其坐标(排除已找到的最小值位置)
    min4 = max;
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            if (*(*(p + i) + j) <= min4 && *(*(p + i) + j) != min1 && *(*(p + i) + j) != min2 && *(*(p + i) + j) != min3) {
                min4 = *(*(p + i) + j);
                row4 = i;
                column4 = j;
            }
        }
    }
    temp = *(*(p + 2) + 2);
    *(*(p + 2) + 2) = max;
    *(*(p + row0) + column0) = temp;

    temp = *(*(p + 0) + 0);
    *(*(p + 0) + 0) = min1;
    *(*(p + row1) + column1) = temp;

    temp = *(*(p + 0) + 4);
    *(*(p + 0) + 4) = min2;
    *(*(p + row2) + column2) = temp;

    temp = *(*(p + 4) + 0);
    *(*(p + 4) + 0) = min3;
    *(*(p + row3) + column3) = temp;

    temp = *(*(p + 4) + 4);
    *(*(p + 4) + 4) = min4;
    *(*(p + row4) + column4) = temp;
        
}

int main()
{
	int a[5][5], i, j;
	printf("请输入25个整数:\n");
	for (i = 0; i < 5; i++)
		for (j = 0; j < 5; j++)
			scanf_s("%d", &a[i][j]);
	printf("原矩阵为:\n");
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
			printf("%4d", a[i][j]);
		printf("\n");
	}
	Matrix(a);
	printf("经过重新排列后矩阵为:\n");
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
			printf("%4d", a[i][j]);
		printf("\n");
	}
	return 0;
}

缺点:代码有点繁琐

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值