求建议,求指点,能不能改进?
看代码程序代码:
/* 题目要求如下: 输入两个行、列数相同的矩阵(实际上是二维数组)A、B,以矩阵的方式分别输出A、B; 求矩阵的和并输出; 求出每个矩阵中的最大值及其位置; 求出每个矩阵中绝对值最大的元素及其位置。 下面的各要求通过编写函数实现: ① 输入矩阵(实际上是二维数组); ② 输出矩阵; ② 求出两个矩阵的和。设A=(aij)m×n,B=(bij)m×n,则C=A+B=(cij)m×n,cij= aij+ bij; ③ 求矩阵中的最大值及其位置; ④ 求矩阵中绝对值最大的元素及其位置。 */ //下面是我写的代码,求改进! #define N 9 #define M 7 #include "stdio.h" #include "math.h" void main() { void findsum(int *p1,int a, int b, int *p2,int c, int d, int *sum);//求和函数 int findmax1(int *p, int a, int *row1, int *col1, int n, int *max);//求第一个数组的最大值及位置 int findmax2(int *q, int c, int *row2, int *col2, int n, int *max);//求第二个数组的最大值及位置 int find_fabs_max1(int *p, int a, int *row1, int *col1, int n, int *fabs_max);//求第一个数组绝对值的最大值及位置 int find_fabs_max2(int *q, int c, int *row2, int *col2, int n, int *fabs_max);//求第二个数组绝对值的最大值及位置 int array[N][N], row1[N*N], col1[N*N];//定义第一个数组 int arr[M][M], row2[M*M], col2[M*M];//定义第二数组 int fabs_max, i, j, sum=0; int a, max;//a为最大值的个数 for(i=0; i < N; i++) for(j=0; j < N; j++) scanf("%d", &array[i][j]); printf("\n"); for(i=0; i < M; i++) for(j=0; j < M; j++) scanf("%d", &arr[i][j]); printf("\n"); for(i=0; i < N; i++) { for(j=0; j < N; j++) { printf("%4d", array[i][j]); } printf("\n"); } printf("\n"); for(i=0; i < M; i++) { for(j=0; j < M; j++) { printf("%4d", arr[i][j]); } printf("\n"); } printf("\n"); //输出和 findsum(*array,N, N, *arr, M, M, &sum); printf("sum=%d\n", sum); printf("\n"); //输出第一数组最大值和位置 a=findmax1(*array, N, row1, col1, N*N, &max); printf("find max1=%d\n", max); for(i=0; i < a; i++) { printf("row1=%d\tcol1=%d\n",row1[i]+1, col1[i]+1); } printf("\n"); //输出第二数组最大值和位置 a=findmax2(*arr, M, row2, col2, M*M, &max); printf("find max2=%d\n", max); for(i=0; i < a; i++) printf("row=%d\tcol=%d\n", row2[i]+1, col2[i]+1); printf("\n"); //输出第一数组绝对值最大值和位置 a=find_fabs_max1(*array, N, row1, col1, N*N, &fabs_max); printf("find fabs_max1 = %d\n", fabs_max); for(i=0; i < a; i++) printf("row=%d\tcol=%d\n", row1[i]+1, col1[i]+1); printf("\n"); //输出第二数组绝对值最大值和位置 a=find_fabs_max2(*arr, M, row2, col2, M*M, &fabs_max); printf("find fabs_max2 = %d\n", fabs_max); for(i=0; i < a; i++) printf("row=%d\tcol=%d\n", row2[i]+1, col2[i]+1); printf("\n"); } //计算两个数组的和 void findsum(int *p1, int a, int b, int *p2, int c, int d, int *sum) { int sum1=0, sum2=0, i, j; for(i=0; i < N; i++) for(j=0; j < N; j++) { sum1 += p1[i*a+j]; } for(i=0; i < M; i++) for(j=0; j < M; j++) { sum2 += p2[i*c+j]; } *sum=sum1+sum2; } //寻找第一个数组的最大值和最大值得个数及其位置 int findmax1(int *p, int a, int *row1, int *col1, int n, int *max) { int i, j, k; *max=-999; for(i=0; i < a; i++) for(j=0; j < a; j++) { if(p[i*a+j] > *max) { *max=p[i*a+j]; k=0; } if(p[i*a+j] == *max) { row1[k]=i; col1[k++]=j; } } return k?k:1; } //寻找第二个数组的最大值和个数及位置 int findmax2(int *q, int c, int *row2, int *col2, int n, int *max) { int i, j, k; *max=-999; for(i=0; i < c; i++) for(j=0; j < c; j++) { if(q[i*c+j] > *max) { *max=q[i*c+j]; k=0; } if(q[i*c+j] == *max) { row2[k]=i; col2[k++]=j; } } return k?k:1; } //寻找第一个数组的绝对值最大值和个数及位置 int find_fabs_max1(int *p, int a, int *row1, int *col1, int n, int *fabs_max) { int i, j, k; *fabs_max=-999; for(i=0; i < a; i++) for(j=0; j < a; j++) { if(fabs(p[i*a+j]) > *fabs_max) { *fabs_max=fabs(p[i*a+j]); k=0; } if(fabs(p[i*a+j]) == *fabs_max) { row1[k]=i; col1[k++]=j; } } return k?k:1; } //寻找第二个数组绝对值的最大值和个数及位置 int find_fabs_max2(int *q, int c, int *row2, int *col2, int n, int *fabs_max) { int i, j, k; *fabs_max=-999; for(i=0; i < c; i++) for(j=0; j < c; j++) { if(fabs(q[i*c+j]) > *fabs_max) { *fabs_max=fabs(q[i*c+j]); k=0; } if(fabs(q[i*c+j]) == *fabs_max) { row2[k]=i; col2[k++]=j; } } return k?k:1; } /* 问题:能不能把程序简化,少用参数,或用函数指针代替代替, 改进程序,指点下要注意什么问题,思想等 程序好长,麻烦各位了,万分感谢 */