c语言指针题(1)

来源:互联网 发布:java手机编译器aide 编辑:程序博客网 时间:2024/06/06 03:34

将一个5*5的矩阵中最大元素放在中心,4个角分别放四个最小的元素

  相较之前所做的提取最大最小值,本题有五个数据需要处理,所以不能在for循环中简单得通过遍历数组处理。解决的策略是将二维数组转化为一维数组,并排序,通过指针处理这5个数据。
  另外一个难点在于矩阵的四个角,但是通过指针可以很灵活的实现数据的交换即位置处理。
#include<stdio.h>#include<stdlib.h>int main(){    void change(int(*nkz_name)[5]);    int old_nkz[5][5],i,j,m;    int (*new_nkz)[5],n=1;    system("color 2a");    new_nkz=old_nkz;    printf("你是否使用默认数组?如果是请输入(Y),如果不是请输入(N)\n");    if ((m=getchar())=='Y'||m=='y')    {        printf("转换前:\n");        for (i=0;i<5;i++)        {            for (j=0;j<5;j++)            {                *(*(new_nkz+i)+j)=n++;//数组赋值                printf("%4d",*(*(new_nkz+i)+j)=n++);            }            printf("\n");        }        change(new_nkz);//调用函数        printf("转化后\n");        for (i=0;i<5;i++)        {            for (j=0;j<5;j++)            {                printf("%4d",*(*(new_nkz+i)+j));            }            printf("\n");        }        getchar();//???    }    if (m=='N'||m=='n')    {        printf("请依次输入数组5*5的值\n");        for (i=0;i<5;i++)            for(j=0;j<5;j++)            scanf("%d",&old_nkz[i][j]);    }    //便于对照    printf("您选用的测试数组为:\n");    for (i=0;i<5;i++)        {            for (j=0;j<5;j++)                printf("%4d",old_nkz[i][j]);            printf("\n");        }        printf("\n");        change(new_nkz);        printf("转化后\n");        for (i=0;i<5;i++)        {            for (j=0;j<5;j++)            {                printf("%4d",*(*(new_nkz+i)+j));            }            printf("\n");        }        getchar();}/***********************************将一个5*5的矩阵中最大的元素放在中心,4个角分别放四个最小的元素***********************************/void change(int (*nkz_name)[5]){    int temp_nkz[25],i,j,k=0,temp;    int *temp_p=temp_nkz;//把二维数组中元素按行的顺序存放到一维数组    for(i=0;i<5;i++)    {        for(j=0;j<5;j++)        {            *(temp_p+k)=*(*(nkz_name+i)+j);            k++;        }    }    //选择排序法,对一维数组中的元素从小到大排序    for(i=0;i<24;i++)    {        k=i;        for(j=i+1;j<25;j++)        {            if(*(temp_p+j)<*(temp_p+k)) k=j;        }        if (k!=i)        {            temp=*(temp_p+k);            *(temp_p+k)=*(temp_p+i);            *(temp_p+i)=temp;        }    }    //将一个5*5矩阵中最大元素放在中心    for(i=0;i<5;i++)        for(j=0;j<5;j++)    {        if(*(*(nkz_name+i)+j)==*(temp_p+24))        {            temp=*(*(nkz_name+i)+j);            *(*(nkz_name+i)+j)=*(*(nkz_name+2)+2);            *(*(nkz_name+2)+2)=temp;            break;        }    }    //将最小的元素放在左上角for(i=0;i<5;i++)    for(j=0;j<5;j++)     {      if(*(*(nkz_name+i)+j)==*(temp_p))        {            temp=*(*(nkz_name+i)+j);            *(*(nkz_name+i)+j)=*(*(nkz_name+0)+0);            *(*(nkz_name+0)+0)=temp;            break;        }     }     //将次小的元素放在右上角for(i=0;i<5;i++)    for(j=0;j<5;j++)     {      if(*(*(nkz_name+i)+j)==*(temp_p)+1)        {            temp=*(*(nkz_name+i)+j);            *(*(nkz_name+i)+j)=*(*(nkz_name+0)+4);            *(*(nkz_name+0)+4)=temp;            break;        }     }     //将第3小的元素放在左下角for(i=0;i<5;i++)    for(j=0;j<5;j++)     {      if(*(*(nkz_name+i)+j)==*(temp_p)+2)        {            temp=*(*(nkz_name+i)+j);            *(*(nkz_name+i)+j)=*(*(nkz_name+4)+0);            *(*(nkz_name+4)+0)=temp;            break;        }     }     //将第四小的元素放在右下角for(i=0;i<5;i++)    for(j=0;j<5;j++)     {      if(*(*(nkz_name+i)+j)==*(temp_p)+3)        {            temp=*(*(nkz_name+i)+j);            *(*(nkz_name+i)+j)=*(*(nkz_name+4)+4);            *(*(nkz_name+4)+4)=temp;            break;        }     }}


原创粉丝点击