无法创建 for 循环来查找二维数组中的数组元素

Cannot create a for loop to find element of an array in 2D array

所以我有一个升序排列的数组(包含 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++;
            }
        }
    }
}

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

您的函数具有 return 类型 int 但 return 什么都没有。它应该具有 return 类型 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。

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

#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]

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

另请注意 n 未使用,并且不清楚该参数应该是什么。此外,该函数被定义为 returning 一个 int 但没有 return 任何东西。

在循环体内更改循环索引变量会造成混淆并且容易出错。可以简单的写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.
}