求建议,求指点,能不能改进?
看代码
程序代码:/*
题目要求如下:
输入两个行、列数相同的矩阵(实际上是二维数组)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;
}
/*
问题:能不能把程序简化,少用参数,或用函数指针代替代替,
改进程序,指点下要注意什么问题,思想等
程序好长,麻烦各位了,万分感谢
*/






