老谭的习题10.10,自己想写的效率高点,然后改了好多遍还是不成功,求纠错,着实无语了
结果有一部分出错,总是又一个被其他数覆盖题目如下:
将一个5*5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序为从左到右,从上到下顺序一次从小到大存放,编写一个函数实现之,用main函数调用
自编代码如下,求纠错,运行结果不对,自测后感觉应该为move函数中的第一个while循环赋值出错,但找了好多遍,测试了好多遍也没有弄清楚,是否是我基础未学好有的写法不可以被我忽略了?
程序代码:#include<stdio.h>
#define N 5
#define P *(p+N*i+j)/* 指针p当前指向元素的地址 */
#define P0 *p
#define P1 *(p+N-1)
#define P2 *(p+N*(N-1))
#define P3 *(p+N*N-1)
#define P4 *(p+(N*N-1)/2)/* 最大值应放的位置的指针 */
#define P5 *(p+is[n]*N+js[n])/* 应放到四角的数字未整理时的位置的指针 */
int i,j;
void move(int *p)
{
int n=0,s[5],is[5],js[5],t,ps[5];/* 数组s依次存放最小值、 数组is,js存放最小值的对应坐标、数组ps存放四角以及二维数组中心点的值 */
s[0]=P0;
ps[0]=P0;/* 存储应放到四角以及放到中心点的值 */
ps[1]=P1;
ps[2]=P2;
ps[3]=P3;
ps[4]=P4;
while(n<4)/* 三重循环寻找最小的四个数及其标号以及最大数数值及标号 */
{
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
if(s[n]>P) {is[n]=i;js[n]=j;s[n]=P;}
if((n==0)&&(s[4]<P)) {is[4]=i;js[4]=j;s[4]=P;} /* 筛选最大值,一次即够,故条件(n==0) */
}
P5=s[4]; /* 将当前数组的最小值赋为最大值 (排出当前最小值,下一次循环为倒数第二小) */
s[++n]=s[4]; /* 将下一个s[n]赋为最大值 */
}
while(n>=0) /* 将四个最小值依大小顺序排放在四角、将最大值放在中间 */
{
P5=ps[n];
ps[n]=s[n];
n--;
}
P0=ps[0];
P1=ps[1];
P2=ps[2];
P3=ps[3];
P4=ps[4];
}
void main()
{
void move();
int s[N][N];
printf("input matrix:\n");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&s[i][j]);
move(s);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%4d",s[i][j]);
printf("\n");
}
getch();
}




