题目
本题是谭浩强《C程序设计课后习题》题8.10。
题目:
将一个5x5的矩阵中最大的元素放在中心, 4个角分别放4个最小的元素(顺序为从
左到右, 从上到下依次从小到大存放), 写一函数实现之。用main函数调用。
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj
一、解题思路
思路:
利用将二维数组转换为一维数组的思想进行遍历,逐个找元素然后替换,具体情况看代码和注释部分。
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.主函数部分
代码如下(示例):
int i, j;
void seek(int* s, int a,int b)
{
int tmp;
int* pmax = s;
int* pmin = s;
for (i = 0; i < a * b; i++)
{
if (*pmax < *(s + i))pmax = s + i;//找到数组中最大数
if (*pmin > *(s + i))pmin = s + i;//找到数组中最小数
}
tmp = *(s + 12); *(s + 12) = *pmax; *pmax = tmp;//最大的元素放在中心
tmp = *s; *s = *pmin; *pmin = tmp;//最小元素放左上角
pmin = s + 1;
for (i = 0; i < a * b; i++)
{
if (i == 0)continue;//再次遍历时排除已找到的最小元素
if (*pmin > *(s + i))pmin = s + i;//找到数组中最小数
}
tmp = *(s+4); *(s + 4) = *pmin; *pmin = tmp;//第二小元素放右上角
pmin = s + 1;
for (i = 0; i < a * b; i++)
{
if (i == 0||i==4)continue;//再次遍历时排除已找到的最小元素
if (*pmin > *(s + i))pmin = s + i;//找到数组中最小数
}
tmp = *(s + 20); *(s + 20) = *pmin; *pmin = tmp;//第三小元素放右下角
pmin = s + 1;
for (i = 0; i < a * b; i++)
{
if (i == 0 || i == 4||i==20)continue;//再次遍历时排除已找到的最小元素
if (*pmin > *(s + i))pmin = s + i;//找到数组中最小数
}
tmp = *(s + 24); *(s + 24) = *pmin; *pmin = tmp;//第四小元素放左下角
}
int main()
{
int s[5][5];
printf("请输入一个5行5列的数组:\n");
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++)
scanf("%d", &s[i][j]);
seek((int*)s, 5, 5);//转换为一维数组,方便运算
printf("转换后的数组为:\n");
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
printf("%2d ", s[i][j]);
}
printf("\n");
}
return 0;
}
三、执行结果
输出:
请输入一个5行5列的数组:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
转换后的数组为:
1 5 21 13 2
6 7 8 9 10
11 12 25 14 15
16 17 18 19 20
3 22 23 24 4