按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。
void InputArray(int *p, int m, int n);
int FindMax(int *p, int m, int n, int *pRow, int *pCol);
输入提示信息:
"Input m, n:"
"Input %d*%d array:\n"
输入格式:"%d,%d"
输出提示信息和格式:"max = %d, row = %d, col = %d\n"
程序运行示例:
Input m, n:3,3↙
Input 3*3 array:
3 4 5↙
6 8 6↙
9 7 2↙
max = 9, row = 2, col = 0
用两个嵌套的for循环遍历整个数组,并记录最大值和其所在的行列下标。
#include <stdio.h>
void InputArray(int *p, int m, int n);
int FindMax(int *p, int m, int n, int *pRow, int *pCol);
int main() {
int m, n;
printf("Input m, n:");
scanf("%d,%d", &m, &n);
int a[m][n];
InputArray(&a[0][0], m, n);
int row, col, max;
max = FindMax(&a[0][0], m, n, &row, &col);
printf("max = %d, row = %d, col = %d\n", max, row, col);
return 0;
}
void InputArray(int *p, int m, int n) {
printf("Input %d*%d array:\n", m, n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", p + i * n + j);
}
}
}
int FindMax(int *p, int m, int n, int *pRow, int *pCol) {
int max = *p;
*pRow = 0;
*pCol = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (*(p + i * n + j) > max) {
max = *(p + i * n + j);
*pRow = i;
*pCol = j;
}
}
}
return max;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:int getMaxIndex(int m, int n, int a[m][n], int *max_value, int *max_row, int *max_col){
int i, j, max_i, max_j;
*max_value = a[0][0];
max_i = max_j = 0;
for(i=0; i<m; i++){
for(j=0; j<n; j++){
if(a[i][j] > *max_value){
*max_value = a[i][j];
max_i = i;
max_j = j;
}
}
}
*max_row = max_i;
*max_col = max_j;
return 0;
}
解释:
这是一个函数 getMaxIndex
,输入为行数 m
,列数 n
和二维数组 a
,输出为数组中最大值及其所在的行列下标。
首先,在函数中声明变量 i
和 j
,max_i
和 max_j
作为最大元素的行列下标。 变量 *max_value
,*max_row
,*max_col
分别是输出的最大值及其所在的行列下标。
在初始化 *max_value
为数组的首个元素,同时将 max_i
和 max_j
初始化为 0。
然后,使用双重循环来遍历整个数组。 如果当前元素大于当前最大值 *max_value
,则把当前元素赋值给 *max_value
,将当前行列下标分别保存到 max_i
和 max_j
中。
最后,将 max_i
和 max_j
的值保存到 *max_row
和 *max_col
中,函数运行完毕。