【问题标题】:Cannot create a for loop to find element of an array in 2D array无法创建 for 循环来查找二维数组中的数组元素
【发布时间】:2020-07-31 21:46:34
【问题描述】:

所以我有一个按升序排列的数组(由 9 个元素组成),在另一个函数中我有一个 3x3 矩阵(相同的元素但无序),我希望 找到数组中每个元素的行和列矩阵,但我写不出来:

int find_path(int matrix_1[3][3], int array_1[9], int n) {
    int i = 0;
    for (int j = 0; j < 3; j++) {
        for (int k = 0; k < 3; k++) {
            if (i == 9) {
                break;
            }
            if (matrix_1[j][k] == array_1[i]) {
                printf("(%d, %d)", j, k);
                j = 0;
                k = 0;
                i++;
            }
        }
    }
}

【问题讨论】:

  • 你说“我有一个 3x3 矩阵”,那么int matrix_1[][100] 是什么意思?我期待int matrix_1[3][3]。请创建一个minimal reproducible example 来演示如何调用该函数(第一个参数特别有趣)以及它是如何失败的。另外,请尝试我的预期。也许它已经解决了。
  • @Ahmad Labouff 为什么函数的返回类型是int?函数返回什么?
  • @Ahmad Labouff 会不会是矩阵不包含数组中的元素?
  • matrix_1[j][k] = array_1[i] 我确定你的意思是==
  • 我和@SaymoinSam 在一起。结合我的尝试他们的建议。这两个问题中的任何一个都可能破坏您的功能。

标签: c arrays loops for-loop nested-loops


【解决方案1】:

请不要每五分钟更改一次函数声明。

您的函数的返回类型为int,但什么也不返回。它应该有返回类型void

函数可以如下所示

void find_path( int matrix_1[][3], int array_1[], size_t n )
{
    for ( size_t i = 0; i < n * n; i++ )
    {
        int found = 0;

        size_t row = 0, col = 0;

        while ( !found && row < n )
        {
            while ( !found && col < n )
            {
                if ( !( found = matrix_1[row][col] == array_1[i] ) )
                {
                    ++col;
                }    
            }

            if ( !found ) ++row;
        }

        printf( "(%zu, %zu)", row, col );
    }
}

如果数组最初声明为大小等于 100,则只需更改函数声明,如

void find_path( int matrix_1[][100], int array_1[], size_t n )

在这两种情况下,如果使用此值填充数组,则调用函数时参数 n 的值应等于 3。

【讨论】:

    【解决方案2】:

    我猜你只想用你的数组打印矩阵中每个匹配元素的行和列,可以这样完成

    #include <stdio.h>
    
    void find_path(int matrix_1[][3], int array_1[]) {
      for(int i = 0;i < 9; i++) {
        for(int j = 0;j < 9; j++) {
          if(matrix_1[i / 3][i % 3] == array_1[j]) {
            printf("The item '%i' matrix[%i][%i] is the same item array[%i]\n", array_1[j], i / 3, i % 3, j);
          }
        }
      }
    }
    
    int main() {
      int matrix[][3] = {
        {1, 6, 8}, {3, 9, 2}, {7, 4, 5}
      }, array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    
      find_path(matrix, array);
      return 0;
    }
    

    输出:

    The item '1' matrix[0][0] is the same item array[0]
    The item '6' matrix[0][1] is the same item array[5]
    The item '8' matrix[0][2] is the same item array[7]
    The item '3' matrix[1][0] is the same item array[2]
    The item '9' matrix[1][1] is the same item array[8]
    The item '2' matrix[1][2] is the same item array[1]
    The item '7' matrix[2][0] is the same item array[6]
    The item '4' matrix[2][1] is the same item array[3]
    The item '5' matrix[2][2] is the same item array[4]
    

    【讨论】:

    • 为什么你认为矩阵中的位置和数组中的位置之间应该存在关系?
    • @chqrlieforyellowblockquotes 因为 Op 这么说“我有一个按升序排列的数组(由 9 个元素组成),在另一个函数中我有一个 3x3 矩阵(相同的元素但无序)”
    • 好的,我没有注意到从0 运行到9 的外循环。您的解决方案有效,但有点晦涩,您可以将外部循环更改为 for (int i = 0; i &lt; 3 * 3; i++) 以强调它枚举矩阵单元的事实。使用 2 个嵌套循环更具可读性,并且避免了编译器可能优化也可能不优化的不必要的除法和模运算。
    • 从OP的代码中,我认为输出应该是数组的顺序,因此你应该转置循环。
    【解决方案3】:

    您的函数不会进行彻底的测试,因为您在内部循环内将jk 重置为0,但由于k 在下一次迭代之前递增,matrix[0][0] 不会与数组的下一个元素,因此如果matrix[0][0] 不是矩阵中的最小元素,则输出将不完整。

    还要注意n 是未使用的,不清楚这个参数应该是什么。此外,该函数被定义为返回int,但不返回任何内容。

    在循环主体内更改循环索引变量会造成混淆且容易出错。您可以简单地编写3个嵌套循环:对于要在数组中按出现顺序枚举的矩阵单元,您可以对数组元素进行外循环迭代,在内循环中对矩阵行和列进行迭代:

    void find_path(int matrix_1[3][3], int array_1[9], int n) {
        int i, j, k;
        for (i = 0; i < 9; i++) {
            for (j = 0; j < 3; j++) {
                for (k = 0; k < 3; k++) {
                    if (matrix_1[j][k] == array_1[i]) {
                        printf("(%d, %d)", j, k);
                        break;
                    }
                }
                if (k < 3)
                    break;
            }
        }
    }
    

    上面的代码将为重复值输出相同的矩阵单元格。如果没有重复值,则可以删除break 语句和第二条if 语句。

    这是对您的代码的简单修复:

    int find_path(int matrix_1[3][3], int array_1[9], int n) {
        int i = 0;
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
                if (matrix_1[j][k] == array_1[i]) {
                    printf("(%d, %d)", j, k);
                    if (++i == 9)
                        return i;
                    j = 0;
                    k = -1; // restart the inner loop at 0,0
                }
            }
        }
        return i; // return the number of values found.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 2021-09-03
      相关资源
      最近更新 更多