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

C程序设计(第四版) 谭浩强 习题8.10 个人设计

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

代码块:

#include <stdio.h>
void sort(int (*s)[5], int x, int y);       //定义排序函数
int main()
{
    int n[5][5], *p, i, j;
    for (p=*n, printf("Please enter array: "); p<*n+25; scanf("%d", p++));        //输入5*5矩阵
    sort(n, 5, 5);                                                                //调用排序函数
    for (i=0, printf("Array:\n"); i<5; printf("\n"), i++)                         //输出变更后的矩阵
        for (j=0; j<5; printf("%3d", n[i][j++]));
    return 0;
}
//排序函数,函数思路是:通过每轮循环找出最小的元素,然后记录该元素的行列号,循环完毕,把该元素与放置位置元素进行互换。
void sort(int (*s)[5], int x, int y)
{
    int i, j, t, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, min, max;
    for (i=0, min=**s; i<x; i++)
        for (j=0; j<y; *(*(s+i)+j)<min ? min=*(*(s+i)+j), m0=i, m1=j, j++ : j++);
    t=**s, **s=*(*(s+m0)+m1), *(*(s+m0)+m1)=t;
    for (i=0, min=*(*s+1); i<x; i++)
        for (j=0; j<y; j++)
            if (!i&&!j) continue;
            else if (*(*(s+i)+j)<min) min=*(*(s+i)+j), m2=i, m3=j;
    t=*(*s+4), *(*s+4)=*(*(s+m2)+m3), *(*(s+m2)+m3)=t;
    for (i=0, min=*(*s+1); i<x; i++)
        for (j=0; j<y; j++)
            if ((!i&&!j)||(!i&&j==4)) continue;
            else if (*(*(s+i)+j)<min) min=*(*(s+i)+j), m4=i, m5=j;
    t=*(*(s+4)), *(*(s+4))=*(*(s+m4)+m5), *(*(s+m4)+m5)=t;
    for (i=0, min=*(*s+1); i<x; i++)
        for (j=0; j<y; j++)
            if ((!i&&!j)||(!i&&j==4)||(i==4&&!j)) continue;
            else if (*(*(s+i)+j)<min) min=*(*(s+i)+j), m6=i, m7=j;
    t=*(*(s+4)+4), *(*(s+4)+4)=*(*(s+m6)+m7), *(*(s+m6)+m7)=t;
    for (i=0, max=**s; i<x; i++)
        for (j=0; j<y; *(*(s+i)+j)>max ? max=*(*(s+i)+j), m8=i, m9=j, j++ : j++);
    t=*(*(s+2)+2), *(*(s+2)+2)=*(*(s+m8)+m9), *(*(s+m8)+m9)=t;
}

猜你喜欢

转载自blog.csdn.net/navicheung/article/details/79385461