8.10 题目:
将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。
思路:
① 实参是二维数组a[5][5],形参是由五个元素组成的一维数组针织变量p,将二维数组的首行的起始地址传递给指针变量p
②找最大值:先假定数组首个元素为max,通过循环遍历数组,若找到大于当前max的元素则进行替换,并记录此元素所在的行、列,直到循环结束。
③找最小值:先随便给min一个数组里元素的值(代码里假设max为min),通过循环遍历数组,若找到小于当前max的元素则进行替换,并记录此元素所在的行、列,直到循环结束。
④找次最小值:在循环里多加一个判断语句,当前的行和列元素不是最小值的行和列(也就是排除最小值)
#include<stdio.h>
void Matrix(int(*p)[5])
{
int max = *(*p);
int min1, min2, min3, min4;
int row0, column0, row1, column1, row2, column2, row3, column3, row4, column4;
int i, j;
int temp;
for (i = 0; i < 5; i++)//先假定p[0][0]是最大的元素,再遍历整个矩阵,找出最大的那个元素
{
for (j = 0; j < 5; j++)
{
if (*(*(p + i) + j) >= max)
{
max = *(*(p + i) + j);
row0 = i;
column0 = j;
}
}
}
// 找出最小值及其坐标
min1 = max;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
if (*(*(p + i) + j) <= min1) {
min1 = *(*(p + i) + j);
row1 = i;
column1 = j;
}
}
}
// 找出第二个最小值及其坐标(排除已找到的最小值位置)
min2 = max;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (*(*(p + i) + j) <= min2 && *(*(p + i) + j) != min1)
{
min2 = *(*(p + i) + j);
row2 = i;
column2 = j;
}
}
}
// 找出第三个最小值及其坐标(排除已找到的最小值位置)
min3 = max;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
if (*(*(p + i) + j) <= min3 && *(*(p + i) + j) != min1 && *(*(p + i) + j) != min2) {
min3 = *(*(p + i) + j);
row3 = i;
column3 = j;
}
}
}
// 找出第四个最小值及其坐标(排除已找到的最小值位置)
min4 = max;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
if (*(*(p + i) + j) <= min4 && *(*(p + i) + j) != min1 && *(*(p + i) + j) != min2 && *(*(p + i) + j) != min3) {
min4 = *(*(p + i) + j);
row4 = i;
column4 = j;
}
}
}
temp = *(*(p + 2) + 2);
*(*(p + 2) + 2) = max;
*(*(p + row0) + column0) = temp;
temp = *(*(p + 0) + 0);
*(*(p + 0) + 0) = min1;
*(*(p + row1) + column1) = temp;
temp = *(*(p + 0) + 4);
*(*(p + 0) + 4) = min2;
*(*(p + row2) + column2) = temp;
temp = *(*(p + 4) + 0);
*(*(p + 4) + 0) = min3;
*(*(p + row3) + column3) = temp;
temp = *(*(p + 4) + 4);
*(*(p + 4) + 4) = min4;
*(*(p + row4) + column4) = temp;
}
int main()
{
int a[5][5], i, j;
printf("请输入25个整数:\n");
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++)
scanf_s("%d", &a[i][j]);
printf("原矩阵为:\n");
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
printf("%4d", a[i][j]);
printf("\n");
}
Matrix(a);
printf("经过重新排列后矩阵为:\n");
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
printf("%4d", a[i][j]);
printf("\n");
}
return 0;
}
缺点:代码有点繁琐