代码:
#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");
}
}
运行结果: