Почему я не могу получить только первое вхождение элемента в матрицу?

#c

#c

Вопрос:

Я новичок в языке C, и я пытаюсь создать программу для выполнения некоторых задач с использованием матрицы, поэтому я работаю над задачей поиска элемента матрицы и указания позиции (строки, столбца) первого вхождения элемента. Ниже приведены функции:

    void Do_Search(Matrix M, int row, int col, int elem_search)
   {
   int i, j, aux = 0;

   for(i = 0; i < row; i  )
   {
       for(j = 0; j < col; j  )
       {
           if(M[i][j] == elem_search)
           {
           printf("nElement first found in [%d][%d]", i, j);
           break;
           }
         }
       }
    }

    void Search_Element(Matrix M, int row, int col){
    int i, j, num_elem, elem_search, elements = row * col;

    while(num_elem > elements || num_elem < 1)
    {
    printf("nEnter the number of elements to search >> ", element );
    scanf("%d", amp;num_elem);
    }

    for(i = 0; i < num_elem; i  )
    {
        printf("nnEnter the element to search >> ");
        scanf("%d", amp;elem_search);
        Do_Search(M, row, col, elem_search);
    }
}
 

В

            if(M[i][j] == elem_search)
           {
               printf("nElement first found in [%d][%d]", i, j);
               break;
           }
 

Я хотел бы просто получить первое вхождение, но программа выдает одну позицию, когда есть только одно вхождение, и двухпозиционную, несмотря на то, что количество элементов превышает 2.

Комментарии:

1. Пожалуйста, предоставьте MCVE

Ответ №1:

break; Оператор только выходит из внутреннего цикла for. Итак, внешний (строковый) цикл for продолжает выполняться, и, следовательно, если элемент существует в нескольких строках, ваша функция найдет их все.

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

  if(M[i][j] == elem_search)
 {
   printf("nElement first found in [%d][%d]", i, j);
   return;
 }
 

Ответ №2:

У вас есть вложенные циклы. Вы выходите только из внутреннего цикла.

Итак, вам нужна переменная «stop» (например found ), чтобы указать внешнему циклу остановиться на совпадении:

 void
Do_Search(Matrix M, int row, int col, int elem_search)
{
    int i, j, aux = 0;

    int found = 0;
    for (i = 0; i < row; i  ) {
        for (j = 0; j < col; j  ) {
            found = (M[i][j] == elem_search);
            if (found) {
                printf("nElement first found in [%d][%d]", i, j);
                break;
            }
        }
        if (found)
            break;
    }
}
 

Ответ №3:

Я использую переменную booleen и инициализирую ее значением false , если элемент существует в матрице, переменная booleen инициализируется значением true, и он выполняет выход из цикла (while(i<строка) amp; while(j<col))

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

void Do_Search(int row, int col,int M[row][col], int elem_search);

int main(void)
{
int rows, cols;

do
{
      printf("Give me the number of rows :");
      scanf("%d",amp;rows);
}while(rows<1);

do
{
      printf("Give me the number of cols :");
      scanf("%d",amp;cols);
}while(cols<1);

int arr[rows][cols];

printf("nThe filling of the Matrix :n");
for (int i = 0; i < rows; i  )
{
    for (int j = 0; j < cols; j  )
    {
        scanf("%d", amp;arr[i][j]);
    }
}

printf("nDisplay of the Matrix :n");
for (int i = 0; i < rows; i  )
{printf("n");
    for (int j = 0; j < cols; j  )
    {
        printf("[%d]",arr[i][j]);
    }
}

printf("n");
Do_Search(rows,cols,arr,5);
printf("n");

}

void Do_Search(int row, int col,int M[row][col], int elem_search)
{
int i=0, j=0, aux = 0;
bool found = false;
while(i<rowamp;amp;found==false)
{j=0;
     while(j<colamp;amp;found==false)
     {
          if(M[i][j] == elem_search)
          {
                printf("nElement first found in [%d][%d]", i, j);
                found=true;
          }
          j  ;
     }
     i  ;
}

}