用函数求一个二维数组的最大值及其行下标和列下标

#include<stdio.h>
#define M 5
#define N 5
void main()
{
int i,j,m,n;
int a[M][N],*p,*array(int(*p)[N],int m,int n);
printf("输入二维数组的行数和列数\n");
scanf("%d%d",&m,&n);
printf("输入二维数组如下\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
p=array(a,m,n);
printf("最大值为%d,其对应的行下标为%d,其对应的列下标为%d",a,m,n);
}
int *array(int (*p)[N],int m,int n)
{
int i,j;
int t[3];
t[0]=p[0][0];
t[1]=0;
t[2]=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(p[i][j]>t[0])
{
t[0]=p[i][j];
t[1]=i;
t[2]=j;
}
return t;

哪儿错了?求帮助啊!有大侠帮我改写下么?要求二维数组名作为实参,对应的虚参用行指针啊。。。

两处错误:
1. 返回函数内的局部变量。函数内局部变量在函数返回后就不再有效了。换成static.
2.输出的应该是p[0],p[1],p[2].

给你改过了。

结果测试:

输入二维数组的行数和列数
2 3
输入二维数组如下
1 2 3
4 8 0
最大值为8,其对应的行下标为1,其对应的列下标为1

改过的代码:
#include<stdio.h>
#define M 5
#define N 5
void main()
{
int i,j,m,n;
int a[M][N],*p,*array(int(*p)[N],int m,int n);
printf("输入二维数组的行数和列数\n");
scanf("%d%d",&m,&n);
printf("输入二维数组如下\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
p=array(a,m,n);
printf("最大值为%d,其对应的行下标为%d,其对应的列下标为%d", p[0], p[1], p[2]);
}
int *array(int (*p)[N],int m,int n)
{
int i,j;
static int t[3];
t[0]=p[0][0];
t[1]=0;
t[2]=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(p[i][j]>t[0])
{
t[0]=p[i][j];
t[1]=i;
t[2]=j;
}

return t;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-06
/*
我写了一个,你随便参考参考吧 呵呵

注意一下:
数组中如果有多个最大值,
输出的是第一个最大值的行标和列标
*/
# include <stdio.h>

# define M 5
# define N 5

//初始化数组,为数组赋值
void init_Array(int (* arrayName)[5], int rows, int cols);
//处理二维数组
void do_Array(int (* a)[5], int (* result)[5], int rows, int cols);
//输出数组中最大的元素的值以及其下标
void getMaxAndRowCol(int (* a)[5], int (* result)[5], int rows, int cols);

int num;
int main(void)
{

int i,j,m,n;
int a[M][N];
printf("输入二维数组的行数和列数\n");
scanf("%d%d",&m,&n);

init_Array(a, m, n);

int result[5][5];
do_Array(a,result, 5, 5);

getMaxAndRowCol(a,result, 5, 5);

return 0;
}
void init_Array(int (* arrayName)[5], int rows, int cols)
{
printf("输入二维数组如下\n");
int i,j;
for (i=0; i<rows; ++i)
{
for (j=0;j<cols;++j)
{
scanf("%d",&arrayName[i][j]);
}
}
}

void do_Array(int (* a)[5], int (* result)[5], int rows, int cols)
{
int i,j;
num = a[0][0];
for (i=0; i<rows; ++i)
{
for (j=0; j<cols; ++j)
{
if (num <= a[i][j])
{
result[i][j] = a[i][j];

num = a[i][j];
}
}
}

}

void getMaxAndRowCol(int (* a)[5], int (* result)[5], int rows, int cols)
{
int i,j;
for (i=0; i<rows; ++i)
{
for (j=0;j<cols;++j)
{
if (result[i][j] >= num)
{
printf("\n最大元素%3d\t行标:%3d\t列标:%3d\n",a[i][j],i,j);
return ;
//找到最大的值,
//并且行号列号最小,
//然后结束函数
}

}
}
}

/*
运行结果:
--------
输入二维数组的行数和列数
3 3
输入二维数组如下
10 20 30
30 50 30
20 18 50

最大元素 50 行标: 1 列标: 1
---------
*/
第2个回答  2012-05-06
#include<stdio.h>
#define M 5
#define N 5
void main()
{
int i,j,m,n;
int a[M][N],*p,*array(int(*p)[M],int m,int n);
printf("输入二维数组的行数和列数\n");
scanf("%d%d",&m,&n);
printf("输入二维数组如下\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
p=array(a,m,n);
printf("最大值为%d,其对应的行下标为%d,其对应的列下标为%d",p[0],p[1],p[2]);
}
int *array(int (*p)[M],int m,int n)
{
int i,j;
int t[3];
t[0]=p[0][0];
t[1]=0;
t[2]=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(p[i][j]>t[0])
{
t[0]=p[i][j];
t[1]=i;
t[2]=j;
}
return t;
}
第3个回答  2012-05-06
1 p=array(a,m,n); p是野指针
2 printf("最大值为%d,其对应的行下标为%d,其对应的列下标为%d",a,m,n); 输出不对
3 return t; 返回局部变量的地址