老谭的习题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(); }