用指针实现:找出二维数组(设3行4列)中的最大数及其位置

输入: 二维数组(设3行4列)。
输出: 最大数及其位置。
输入样例: 1 2 5 4
6 8 7 2
0 2 4 5
输出样例: 1 1 8

  在内存中实际上没有二维数组的概念,可以完全看成一维数组。求最大值,可以使用假设法,假设第1个元素为最大值,然后遍历数组,通过比较求出最大值即可。找到在1维数组中的维数再转换成二维数组中的维数即可。

#include <stdio.h>
int main()
{
int a[3][4] =  {
{92,108,3000,1},
{100,101,102,103},
{799,10000,20, 0}
};
int *pstart = &a[0][0];
int max = a[0][0];
int pos = 0;
for (int inx=0; inx!=12; ++inx) {
if (*(pstart+inx) > max)  max = *(pstart+inx), pos = inx;
}
printf("最大值是:%d\t其所在位置:a[%d][%d]\n", max, pos / 4, pos % 4);
return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-30
楼主,其实二维数组在内存中是按一维数组存储的,用指针的话,可以当成顺序存储的3*4=12个元素的一维数组来对待。下面是C语言代码:
/*---------指针实现:找出二维数组(设3行4列)中的最大数及其位置--------*/
#include<stdio.h>
void main()
{
int i=0, j, large, array[3][4], *p=&array[0][0]; /* p是数组的指针,
large是最大数,
j 是最大数的位置 */

printf("Please input data:\n"); /* 输入数据 */
while(i++<12) { /* 用指针p实现数据输入 */
scanf("%d", p++);
}
i=0,j=0; /* 数据归零 */
p=&array[0][0];
while(i<12) { /* 找出最大数,并记下位置给 j */
if(*p>large) {large=*p; j=i;}
p++;
i++; }
printf("%d,%d, %d\n", j/4, j%4, large); /* 计算出最大数位置并输出位置和最大数 */
}
第2个回答  2011-04-26
#include<stdio.h>
int main()
{
int a[3][4];
int i,j,m,n,max;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
max=a[0][0];m=n=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(a[i][j]>max)
{
max=a[i][j];
m=i;
n=j;
}
printf("%d %d %d\n",m,n,max);
return 0;
}
第3个回答  2011-04-26
C语言源代码:
#include<stdio.h>

void main()
{
int arr[3][4];
int i,j;
int maxI, maxJ;
int maxValue;

for(i=0; i<3; i++)
for(j=0; j<4; j++)
scanf("%d", &arr[i][j]);

maxValue = arr[0][0];
maxI = maxJ = 0;

for(i=0; i<3; i++)
for(j=0; j<4; j++)
if(*(*(arr+i)+j) > maxValue)
{
maxValue = *(*(arr+i)+j);
maxI = i;
maxJ = j;
}

printf("%d %d %d", maxI, maxJ, maxValue);
}

运行结果:
1 2 5 4
6 8 7 2
0 2 4 5
输出样例:
1 1 8本回答被提问者和网友采纳