按如下函数原型编程从键盘输入一个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"
时间: 2023-05-31 22:19:35 浏览: 216
二维数组求最大数
3星 · 编辑精心推荐
### 回答1:
题目中给出了两个函数原型和具体的输入输出要求,需要我们根据题目描述,编写一个程序,实现这两个函数,同时满足题目中要求的输入输出格式和输出内容。
关于第一个函数inputarray,根据函数原型,这个函数需要输入一个二维数组的指针p、该数组的行数m和列数n,需要在键盘上输入m行n列的二维数组,存储到指针p指向的数组中。所以我们可以用两个for循环来实现:
```
void inputarray(int *p, int m, int n){
int i, j;
for(i=0; i<m; i++){
for(j=0; j<n; j++){
scanf("%d", p+i*n+j);
}
}
}
```
这里用了p+i*n+j来表示p指向的一维数组中的某个元素,i和j分别表示二维数组中该元素的行列索引,因为C语言中的二维数组在内存中是按行优先存储的,所以我们需要用i和j来计算每个元素在一维数组中的索引。
关于第二个函数findmax,根据函数原型,这个函数需要输入一个二维数组的指针p、该数组的行数m和列数n以及两个指针prow和pcol,需要在该数组中找到最大的元素及其所在的行和列,并将这些信息存储到prow和pcol指向的变量中。函数的返回值为最大元素的值。所以我们可以用两个for循环遍历整个二维数组,找到最大的元素及其所在的位置:
```
int findmax(int *p, int m, int n, int *prow, int *pcol){
int i, j, max=0;
for(i=0; i<m; i++){
for(j=0; j<n; j++){
if(*(p+i*n+j) > max){
max = *(p+i*n+j);
*prow = i;
*pcol = j;
}
}
}
return max;
}
```
需要注意的是,题目中要求输入格式为"input m, n:"和"input %d*%d array:\n",输出格式为"max = %d, row = %d, col = %d\n"。所以我们需要在主函数中按照题目要求先输入m和n,再输入二维数组,输出最大值及其所在的行列:
```
int main(){
int m, n;
printf("input m, n:");
scanf("%d%d", &m, &n);
int arr[m][n];
printf("input %d*%d array:\n", m, n);
inputarray(&arr[0][0], m, n);
int row, col, max;
max = findmax(&arr[0][0], m, n, &row, &col);
printf("max = %d, row = %d, col = %d\n", max, row+1, col+1);
return 0;
}
```
这里需要注意,题目中要求输出行列的时候行列从1开始计数,而不是从0开始,所以我们需要将row和col的值均加1。另外,二维数组arr需要定义为int arr[m][n],而不是int *arr,这是因为题目要求我们需要在键盘上输入m行n列的二维数组,而这样的输入方式是需要提前指定数组的行列数的。
### 回答2:
题目需要我们编写一个程序,从用户键盘输入一个m行n列的二维数组,并计算出数组中元素的最大值及其所在的行列下标值。接下来,我将详细说明如何实现这个程序。
首先,我们需要先了解函数原型的含义。题目中给出的函数原型为:
void inputarray(int *p, int m, int n);
int findmax(int *p, int m, int n, int *prow, int *pcol);
其中,inputarry函数用于从用户键盘输入一个m行n列的二维数组,p为数组的首地址;findmax函数用于计算数组中元素的最大值及其所在的行列下标值,prow和pcol分别指向最大值所在的行列下标。
接下来,我们分别对这两个函数进行详细说明。
1. inputarray函数
首先,我们需要先从用户键盘输入m和n的值,以确定数组的大小。代码如下:
printf("input m, n:");
scanf("%d,%d", &m, &n);
接下来,我们需要通过双重循环从键盘输入二维数组中每个元素的值,并保存到数组中。代码如下:
printf("input %d*%d array:\n", m, n);
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
scanf("%d", p + i * n + j);
}
}
最后,我们不需要返回任何值,直接结束函数即可。
2. findmax函数
这个函数需要先找到数组中的最大值及其位置。代码如下:
max = *p;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
if (*(p + i * n + j) > max) {
max = *(p + i * n + j);
*prow = i;
*pcol = j;
}
}
}
需要注意的是,在找到更大的元素时,需要同时更新最大值max和其所在的行列下标prow和pcol。
最后,我们需要返回max的值作为计算结果。
最后,我们需要在主函数中调用这两个函数,并输出计算结果。代码如下:
inputarray(p, m, n);
max = findmax(p, m, n, &row, &col);
printf("max = %d, row = %d, col = %d\n", max, row, col);
这样,就完成了这道题目的解答了。完整代码如下:
### 回答3:
本题需要分两部分来回答:
1. 函数编写
函数inputarray和findmax的函数原型已经给出,需要我们来实现这两个函数。
inputarray函数需要从键盘输入一个m行n列的二维数组,函数原型中给出了一个一维数组p,我们需要按照二维数组的方式来访问其中的元素。具体实现方法如下:
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);
}
}
}
findmax函数需要计算数组中元素的最大值及其所在的行列下标值。函数原型中给出了两个指针prow和pcol,分别指向最大值所在的行和列。具体实现方法如下:
int findmax(int *p, int m, int n, int *prow, int *pcol) {
int max = p[0];
int row = 0, col = 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];
row = i;
col = j;
}
}
}
*prow = row;
*pcol = col;
return max;
}
注:函数中的变量说明,p[i * n + j]表示二维数组中第i行第j列的元素;*prow和*pcol表示指针所指向的值,即最大值所在的行和列。
2. 主函数编写
主函数中需要先从键盘输入m和n的值,再调用inputarray函数输入数组元素,最后调用findmax函数计算最大值及其所在的行列下标值,并输出结果。具体实现方法如下:
int main() {
int m, n;
printf("input m, n:");
scanf("%d,%d", &m, &n);
int a[10][10];
inputarray(&a[0][0], m, n); // 传入数组的首地址
int row, col;
int max = findmax(&a[0][0], m, n, &row, &col); // 传入数组的首地址、行列指针的地址
printf("max = %d, row = %d, col = %d\n", max, row, col);
return 0;
}
注:在调用函数时,需要传入数组的首地址,即&a[0][0],可以简写为a。而在传入行列指针时,需要传入指针的地址,即&prow和&pcol。
阅读全文