【问题标题】:Write a function that finds the biggest element of a 2D array in C [duplicate]编写一个函数,在 C 中找到二维数组的最大元素 [重复]
【发布时间】:2021-06-14 04:13:35
【问题描述】:

基本上,我需要按照标题所说的去做。我已经在main() 内完成了几次,它相当简单,但从来没有在单独的函数内完成,所以我在面对多维(在这种情况下为二维)时如何处理指针时遇到了一些麻烦大批。任务的完整标题是: 编写一个单独的函数,查找由维度 n*m 组成的二维数组的最大元素,其中 2main() 中填写矩阵,数据类型为int,并使用"%d" 打印出函数的结果。

这是我目前想出的:

#include <stdio.h>

int search(int **M , int x , int y){
    
    int i , j;
    
    int max;
    
    for(i=0; i<x; i++){
        for(j=0; j<y; j++){
            if(M[i][j] > max){
                max = M[i][j];
            }
        }
    }
    
    return max;
}

int main(){
    
    int n , m;
    
    do{
        scanf("%d" , &n);
        
    }while(n<2 || n>5);
    
    do{
        scanf("%d" , &m);
        
    }while(m<2 || m>8);
    
    int A[n][m];

    int i , j;

    for(i=0; i<n; i++){
        for(j=0; j<m; j++){
            scanf("%d" , &A[i][j]);
        }
    }

    int r = search(**A , n , m);
    
    printf("RESULTS:\n");
    printf("%d" , r);
    
    return 0;
}

这是我的编译器在运行程序时显示的错误:

main.c:48:24: warning: passing argument 1 of ‘search’ makes pointer from integer without a cast [-Wint-conversion]

main.c:7:9: note: expected ‘int **’ but argument is of type ‘int’

基本上,它运行程序,您可以成功输入数组的维度和元素,但它永远不会在整个函数中正常运行。所以是的,如果可能的话,可以在这里使用一些帮助。

【问题讨论】:

  • int r = search(**A , n , m); 应该是 int r = search(A , n , m); 因为 A 是一个双指针,但是当你取消引用它时,你会得到里面的值,这意味着 **A 相当于 A[0][0] 这只是第一个元素.

标签: arrays c function pointers matrix


【解决方案1】:

VLA 获胜 :-)

#include <stdio.h>
#include <stdlib.h>

int search(int rows, int cols, int M[rows][cols]) { // VLA, M must be after rows/cols
    int max = M[0][0];
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (M[i][j] > max) {
                max = M[i][j];
            }
        }
    }
    return max;
}

int main(void) {
    int n, m;
    //scanf("%d%d", &n, &m);
    n = 4; m = 7;

    int A[n][m];                             // VLA
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            A[i][j] = rand() % 1000;
            printf("%4d", A[i][j]);
        }
        puts("");
    }

    int r = search(n, m, A);
    printf("RESULTS: %d\n", r);

    return 0;
}

函数search() 接受具有指定值的VLA 参数。
之后,只需将 M 视为数组。

【讨论】:

    【解决方案2】:

    C 中的数组与 Java 中的不同。所以假设你有一个数组

    array = {{1,2},{3,4}}
    

    为了访问它的元素,您需要做的就是在整个数组中迭代一次。元素一个接一个地堆叠在内存中。为了得到 3 你需要做的就是:

    array[2]
    

    所以只要把数组想象成一维的,你所需要的只是元素的总数,你可以通过乘以它的维度来获得。

    【讨论】:

      【解决方案3】:

      您必须更改此行删除**

      int r = search(**A , n , m);
      

      变成

      int r = search(A , n , m);
      

      【讨论】:

        猜你喜欢
        • 2022-11-13
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        相关资源
        最近更新 更多