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

代码:

#include <stdio.h>
#define N 5
int main(){
    void max_sort(int (*q1)[N]);
    //[]比*优先级高,
    // *p[3]  一个指针数组,有3个元素,每个元素都是一个指针。
    // (*p)[3]  一个指针,指向一个数组,数组的类型为int [3],即二维数组。(3为二维数组的列数)
    int num[N][N],(*p)[N];
    //定义二维数组指针
    //在一维数组中,数组名表示的是数组第一个元素的地址。
    //二维数组a[3][4]是有三个元素 a[0]、a[1]、a[2] 的一维数组,
    //二维数组a的第一个元素不是a[0][0],而是a[0],所以数组名a表示的是a[0]的地址。
    p=num;
    printf("请输入%d个数:\n",N*N);
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            scanf("%d",*(p+i)+j);
        }
    }
    printf("您输入的数构成的矩阵为:\n");
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            printf("%d ",*(*(p+i)+j));
        }
        printf("\n");
    }
    p=num;
    max_sort(p);
    return 0;
}
void max_sort(int (*q1)[N]){
    void min_sort(int (*q2)[N]);
    int max,i,j;
    //定义两个数组,记录行号,列号
    int row,col;
    //1、找出最大值和其所在位置
    max=*(*(q1+0)+0);
    // printf("初始值max=%d\n",max);
    //q=num[0]即,所以max=num[0][0]
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            if(*(*(q1+i)+j)>=max){
                max=*(*(q1+i)+j);
                row=i;
                col=j;
            }
        }
    }
    printf("矩阵最大的数为%d,所处位置为num[%d][%d]\n",max,row,col);
    //2、将最大值与矩阵中心元素交换
    int center,c_row,c_col;
    c_row=c_col=(N-1)/2;
    center=*(*(q1+c_row)+c_col);
    printf("中心元素的值为%d,所处位置为num[%d][%d]\n",center,c_row,c_col);
    *(*(q1+c_row)+c_col)=max;
    *(*(q1+row)+col)=center;
    printf("最大值与中心元素交换后的结果为:\n");
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            printf("%d ",*(*(q1+i)+j));
        }
        printf("\n");
    }
    printf("--------------------------------\n");
    min_sort(q1);
}
void min_sort(int (*q2)[N]){
    int min[4],i,j,k=0,row,col,n;
    do{
        //1、初始化min数组个元素的值,假定最小min[0]=num[0][0],第二小min[1]=num[0][1]……
        min[k]=*(*(q2+0)+k);
        //2、找到真实的最小值、第二小、第三小、第四小的值
        for(i=0;i<N;i++){
            for(j=0;j<N;j++){
                //注意数组下标最小为0,k-1不能小于0,故分情况k>0和等于0
                if(k>0){
                    //3、如果遍历的数比min小
                    if(*(*(q2+i)+j)<min[k]){
                        //4、再次判断,不能只判断与前一个数是否相同,而应该判断min[k]与前面的所有数是否相同,确保是依次从最小值找到第四小值,而不是找第3小的值而找到的是第2小的值
                        for(n=k-1;n>=0&&*(*(q2+i)+j)!=min[n];
                        n--){
                            if(n==0){
                                min[k]=*(*(q2+i)+j);
                                //记录下此时找到的小的值对应的行号列号
                                row=i;
                                col=j;
                            }
                        }
                    }
                }
                //k==0
                else {
                    if(*(*(q2+i)+j)<min[k]){
                        min[k]=*(*(q2+i)+j);
                        row=i;
                        col=j;
                    }
                }
            }
        }
        //找到了第几小值,就先交换位置,把小值放在题目要求的地方,再循环遍历进行下一次。
        //如果一次找4个小值,可能出现第二小的值原本在num[0][0]处,将真实最小值与num[0][0]处交换后,第二小的值的位置已变,开始找出的记录的第二小的值位置已变化。
        switch (k){
            case 0:
            *(*(q2+row)+col)=*(*(q2+0)+0);
            *(*(q2+0)+0)=min[k];
            break;
            case 1:
            *(*(q2+row)+col)=*(*(q2+0)+(N-1));
            *(*(q2+0)+(N-1))=min[k];
            break;
            case 2:
            *(*(q2+row)+col)=*(*(q2+(N-1))+0);
            *(*(q2+(N-1))+0)=min[k];
            break;
            case 3:
            *(*(q2+row)+col)=*(*(q2+(N-1))+(N-1));
            *(*(q2+(N-1))+(N-1))=min[k];
            break;
        }
        // 5、检查每次找到的小值的结果和对换结果
        printf("第%d小的值: min[%d]=%d\n",k+1,k,min[k]);
        printf("交换后的结果为:\n");
        for(i=0;i<N;i++){
            for(j=0;j<N;j++){
                printf("%d ",*(*(q2+i)+j));
            }
            printf("\n");
        }
        k++;
    }
    while(k<4);
    printf("--------------------------------\n");
    printf("四个小值分别放于矩阵4个角后的矩阵为:\n");
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            printf("%d ",*(*(q2+i)+j));
        }
        printf("\n");
    }
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是实现该功能的代码: ```c #include <stdio.h> void max_min(int (*p)[5]) { int max = p[2][2]; // 中心元素 int min[4]; // 四个角元素 int i, j, k; // 找出最大元素最小元素 for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (p[i][j] > max) { max = p[i][j]; } } } for (k = 0, i = 0; i < 5; i += 4) { for (j = 0; j < 5; j += 4) { min[k++] = p[i][j]; } } for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (i == 0 && j == 0) { printf("%3d", min[0]); } else if (i == 0 && j == 4) { printf("%3d", min[1]); } else if (i == 4 && j == 0) { printf("%3d", min[2]); } else if (i == 4 && j == 4) { printf("%3d", min[3]); } else if (i == 2 && j == 2) { printf("%3d", max); } else { printf("%3d", p[i][j]); } } printf("\n"); } } int main() { int a[5][5]; int i, j; // 输入矩阵 for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { scanf("%d", &a[i][j]); } } // 调用函数 max_min(a); return 0; } ``` 其,`max_min` 函数用于实现最大元素最小元素放在矩阵中心和四个角的功能。该函数接收一个指向 5x5 矩阵指针作为参数。 首先,我们找出矩阵最大元素最小元素最大元素可以通过遍历整个矩阵得到,而最小元素则位于矩阵的四个角上,我们可以通过循环遍历四个角来获取它们。 接着,我们遍历整个矩阵,并根据元素的位置输出它们。如果当前元素位于矩阵中心,则输出最大元素;如果当前元素位于矩阵的四个角之一,则输出相应的最小元素;否则,输出原来的元素。 最后,在 `main` 函数,我们先读入一个 5x5矩阵,再调用 `max_min` 函数来对该矩阵进行处理并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值