无法创建 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]
你的函数不会进行彻底的测试,因为你在内部循环中将 j
和 k
重置为 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.
}
所以我有一个升序排列的数组(包含 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]
你的函数不会进行彻底的测试,因为你在内部循环中将 j
和 k
重置为 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.
}