Невозможно создать для l oop, чтобы найти элемент массива в двумерном массиве. - PullRequest
1 голос
/ 18 апреля 2020

Итак, у меня есть массив (из 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++;
            }
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 18 апреля 2020

Полагаю, вы хотите просто напечатать строку и столбец каждого сопоставленного элемента в матрице с вашим массивом, это можно сделать так:

#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]
1 голос
/ 18 апреля 2020

Ваша функция не будет выполнять тщательный тест, потому что вы сбрасываете j и k на 0 внутри внутреннего l oop, но, поскольку k увеличивается до следующей итерации, matrix[0][0] не будет сравнивать со следующим элементом массива, поэтому вывод будет неполным, если matrix[0][0] не самый маленький элемент в матрице.

Обратите внимание, что n не используется, и неясно, что этот аргумент должен быть. Кроме того, функция определена как возвращающая int, но ничего не возвращает.

Смущает и подвержен ошибкам изменение переменных индекса l oop внутри тела l oop. Вы можете просто написать 3 вложенных цикла: для перечисления ячеек матрицы в порядке появления в массиве вы можете выполнить итерацию внешнего l oop для элементов массива и выполнить итерации по строкам и столбцам матрицы во внутренних циклах:

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.
}
1 голос
/ 18 апреля 2020

Пожалуйста, не меняйте объявление функции каждые пять минут.

Ваша функция имеет тип возврата int, но ничего не возвращает. Он должен иметь тип возвращаемого значения void.

. Функция может выглядеть следующим образом как

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

В обоих случаях значение параметра n должно быть равно 3 при вызове функции, если вы использовали это значение для заполнения массивов.

...