10.10 將一個5×5的矩陣中最大的元素放在中心,4個角分別放在4個最小的元素(按從左到右,從上到下的順序,依次從小到大存放),寫一個函數實現之,並用main函數調用。
#include <stdio.h> int main(){ void change(int * p); int num[5][5]; int i,j,* p; p=&num[0][0]; printf("請輸入矩陣的值:\n"); for(i=0; i<5; i++){ for(j=0; j<5; j++){ scanf("%d",&num[i][j]); } } //輸出原來的矩陣 printf("所輸入的矩陣為:\n"); for(i=0; i<5; i++){ for(j=0; j<5; j++){ printf("%3d",num[i][j]); } printf("\n"); } //調用函數 change(p); //輸出調整后的矩陣 printf("按要求調整后的矩陣為:\n"); for(i=0; i<5; i++){ for(j=0; j<5; j++){ printf("%3d",num[i][j]); } printf("\n"); } return 0; } void change(int * p){ //printf("%d\n",p[3]); //找到最大值,並放到中間 int i,j,t,* max=p; for(i=0; i<5; i++){ for(j=0; j<5; j++){ if(* max < * (p+i*5+j)) max=p+i*5+j; } } t=*(p+2*5+2); *(p+2*5+2)=*max; *max=t; int * min=p; //找到最小的值 for(i=0; i<5; i++){ for(j=0; j<5; j++){ if(*min > * (p+i*5+j)){ min=p+i*5+j; } } } //最小的值和第一個元素交換 t=*min; *min=*p; *p=t; min=p+1;//從第二個元素開始 //找到次小的值 for(i=0; i<5; i++){ for(j=0; j<5; j++){ if(i==0 && j==0) continue; else if(*min > *(p+i*5+j)){ min=p+i*5+j; } } } //次小的值和第5個元素交換 t=*min; *min=*(p+4); *(p+4)=t; min=p+1;//從第二個元素開始 //找到第三小的值 for(i=0; i<5; i++){ for(j=0; j<5; j++){ if((i==0 && j==0) || (i==0 && j==4)) continue; else if(*min > *(p+i*5+j)){ min=p+i*5+j; } } } //第三小的值和第21個元素交換 t=*min; *min=*(p+20); *(p+20)=t; min=p+1;//從第二個元素開始 //找到第四小的值 for(i=0; i<5; i++){ for(j=0; j<5; j++){ if((i==0 && j==0) || (i==0 && j==4) || (i==4 && j==0)) continue; else if(*min > *(p+i*5+j)){ min=p+i*5+j; } } } //第四小的值和第25個元素交換 t=*min; *min=*(p+24); *(p+24)=t; }
結果: