evgeniy8705
@evgeniy8705
Повелитель вселенной

Как выйти из нескольких вложенных циклов?

Пожскажите пожалуйста, как можно выйти из 2+ вложенных циклов? Если на самом дне срабатывает условие то завершить сразу работу всех циклов? без goto

PS. С++/Py

for (int i = 0; i < LIMIT; i++)
  {
    for (int j = 0; j < LIMIT; j++)
    {
      int value = matrix[i][j];

      for (int a = 0; a < LIMIT; a++)
      {
        for (int b = 0; b < LIMIT; b++)
        {
          if (value == matrix[a][b])
            count++;

          if (count == 2)
          {
            std::cout << "Indexes of elements: " << "[" << i << ", " << j << "], ";
            std::cout << "[" << a << ", " << b << "]" << std::endl;

            // exit
          }
        }
      }

      count = 0;
    }
  }
  • Вопрос задан
  • 1268 просмотров
Пригласить эксперта
Ответы на вопрос 6
15432
@15432
Системный программист ^_^
i = j = a = LIMIT;
break;
Ответ написан
iamevg, это не ответ на вопрос насчёт именно "как выйти из десятка вложенных циклов", это просто другое решение вашей задачи, в котором этого не требуется. Делений больше, сравнений меньше:
std::vector<std::vector<int>> matrix = {{1,2,3,42},{5,6,7,8},{9,10,11,42}};
    const size_t limit = matrix.size() * matrix.front().size();
    const size_t cols = matrix.front().size();
    size_t i = 0;
    size_t j = 1;
    while(i < limit - 1 && matrix[i / cols][i % cols] != matrix[j / cols][j % cols])
    {
        if(++j == limit) j = ++i + 1;
    }
    if(i < limit - 1)
    {
        std::cout << "Indices of elements: [" << i / cols << "," << i % cols << "]";
        std::cout << "[" << j / cols << "," << j % cols << "]" << std::endl;
    }
    else std::cout << "Not found" << std::endl;
Ответ написан
@ks0
А теперь задачка оформить это следуя стандарту MISRA C - без break, без goto, без модификации счетчика цикла в теле цикла, с одной точкой выхода из функции =)
Ответ написан
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Вынести в функцию, которая ищет то, что тебе надо и возвращает в виде результата, типа такого:
/* looks for some indices */
std::pair<size_t, size_t> findSomething(/* some parameters */) {
// ...
  return value;
// ...
}
// ...
auto result = findSomething(/* some arguments */);
std::cout << "[" << << result.first << ", " << result.second << "]" << std::endl;
Ответ написан
@Ariox41
Простейший способ для c++ - обернуть в лямбду и выйти через return. Аналогичный подход можно применять для инициализации переменных, но о читаемости такого кода до сих пор идут споры.

LIMIT = ...
matrix = ...
count = ...
[&]{
    for (int i = 0; i < LIMIT; i++) {
        for (int j = 0; j < LIMIT; j++){
            int value = matrix[i][j];

            for (int a = 0; a < LIMIT; a++) {
                for (int b = 0; b < LIMIT; b++)  {
                    if (value == matrix[a][b]){
                        count++;
                    }
                    if (count == 2) {
                        std::cout << "Indexes of elements: " << "[" << i << ", " << j << "], ";
                        std::cout << "[" << a << ", " << b << "]" << std::endl;

                        return;
                    }
                }
            }
        count = 0;
        }
    }
}();
Ответ написан
@d_ilyich
В данном конкретном случае можно "развернуть" матрицу в одномерный массив и обойтись одним циклом. Вот, набросал на скорую руку.
#define MAX_SAME 2
...
void search_matrix( int* matr, const int limit )
{
  int same_count = 0;
  int i = 0;
  int j = i + 1;

  while ( same_count < MAX_SAME && i < limit*limit - 1 ) {
    if ( matr[ i ] == matr[ j ] ) {
      same_count++;
    }

    if ( same_count < MAX_SAME ) {
      j++;
      if ( j == limit*limit ) {
        i++;
        same_count = 0;
        j = i + 1;
      }
    }
  }

  if ( same_count == MAX_SAME ) {
    cout << same_count << ' ' << i << ' ' << j;
  }
}

Да, придётся ещё индексы "вернуть" к двумерным.

P.S. Я в C++ не силён, если что - сильно не пинайте :)
P.P.S. Тут, конечно, 2 цикла. Прошу прощения, был взволнован :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы