Форум программистов, компьютерный форум CyberForum.ru

Прерывание циклов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 44, средняя оценка - 4.86
miriganua
129 / 100 / 4
Регистрация: 05.02.2012
Сообщений: 241
26.05.2012, 14:23     Прерывание циклов #1
Допустим есть цикл в цикле и если во внутреннем цикле выполняется некоторое условие, необходимо прервать оба цикла.Возможно ли это? Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2012, 14:23     Прерывание циклов
Посмотрите здесь:

Прерывание C++
C++ [C++] Прерывание цикла
Прерывание ввода C++
C++ Прерывание программы по ESC C++
C++ прерывание, вывод числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.05.2012, 14:28     Прерывание циклов #2
1. Можно использовать goto, но это некрасиво.
2. Можно ввести переменную-флаг, при возникновении необходимости во внутреннем цикле устанавливаем флаг и прерываем внутренний цикл. Сразу после внутреннего цикла проверяем флаг и если он установлен прерываем и внешний.
3. Внутренний цикл можно засунуть в функцию, которая возвращает логическое значение, свидетельствующее о необходимости прерывания внешнего цикла.
Я обычно использую 2-й или 3-й варианты, хотя они более громоздкие, чем первый.
ruslawik
9 / 33 / 1
Регистрация: 25.05.2012
Сообщений: 113
26.05.2012, 14:34     Прерывание циклов #3
Удобно использовать второй способ.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int y=0;
for(int i=0; i<100; ++i)
{
     for(int j=0; j<100; ++i)
     {
            if(i==20)
            {
                   y=1;
                   break;
            }
     }
     if(y==1)break;
}
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.05.2012, 14:39     Прерывание циклов #4
Я ещё способ вспомнил. Во внутреннем цикле выкинуть исключение, а поймать его за пределами внешнего. Но по моему мнению исключения не для этого.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 15:01     Прерывание циклов #5
Еще способ - вынести оба цикла в отдельную функцию, и в нужном месте просто сделать return.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.05.2012, 15:27     Прерывание циклов #6
diagon, точно. Я когда третий способ описывал, держал в голове именно это. Ещё подумал, что третий способ от второго у меня не сильно отличается.
Bers
Заблокирован
26.05.2012, 15:30     Прерывание циклов #7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Я ещё способ вспомнил. Во внутреннем цикле выкинуть исключение, а поймать его за пределами внешнего.
Это называется "код вырви глаз, и дай люлей тому, кто такое написал".
1. Нарушение инкапсуляции логического блока.
2. Нарушение инварианта логического блока.

Тут либо сразу goto: раздолбайство
Либо флаги: if(mFlags.IsFlag(eINTERCEPT) == true) { break; }

Читабельный, и целостный логический код подразумевает, что вы в любой момент можете разнести оба цикла по функциям. И тогда, внешний цикл получается вызывающей стороной для внутреннего цикла. Со всеми вытекающими последствиями, и возможностью вызывающей стороны проверить результат работы поставщика услуг.

Во всех других случаях имеет место быть резко возрастающая сложность проекта, и как следствие - убытки компании при сопровождении продукта.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.05.2012, 15:45     Прерывание циклов #8
Цитата Сообщение от Bers Посмотреть сообщение
1. Нарушение инкапсуляции логического блока.
2. Нарушение инварианта логического блока.
Я умные слова не понимаю. Но throw в данном применении мало чем отличается от goto. И ни то, ни другое я не рекомендовал.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 15:49     Прерывание циклов #9
Цитата Сообщение от grizlik78 Посмотреть сообщение
Но throw в данном применении мало чем отличается от goto.
Только throw замедляет выполнение, а goto, напротив, ускоряет(относительно булевых флагов).
Bers
Заблокирован
26.05.2012, 15:56     Прерывание циклов #10
Цитата Сообщение от grizlik78 Посмотреть сообщение
Я умные слова не понимаю. Но throw в данном применении мало чем отличается от goto. И ни то, ни другое я не рекомендовал.
Смысл не в том, что от чего отличается. А в том, что бы читая код, читатель мог понять мысль автора кода. В твоем случае - он будет долго втыкать что бы догнать. goto в этом случае более красноречив.

Исключения служат для исключительный ситуаций, а не для замены goto
grizlik78
26.05.2012, 16:01
  #11

Не по теме:

Bers, если написанную мною мысль на русском-то языке понять не могут, то куда мне до понятных программ.

miriganua
129 / 100 / 4
Регистрация: 05.02.2012
Сообщений: 241
26.05.2012, 16:14  [ТС]     Прерывание циклов #12
Всем спасибо. Мне больше всего понравился способ с функцией, а метка goto, как я понял, не приветствуется вообще.
Bers
Заблокирован
26.05.2012, 16:22     Прерывание циклов #13
Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
а метка goto, как я понял, не приветствуется вообще.
бывают ситуации, когда оператор goto помогает избежать падения производительности.
бывают ситуации, когда оператор goto помогает помогает улучшить читабельность кода.

Во всех других ситуациях, его лучше избегать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2012, 16:42     Прерывание циклов
Еще ссылки по теме:

Прерывание цикла! C++
C++ Прерывание в си++, отслеживание нажатых клавиш
C++ Прерывание цикла по условию

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
daslex
26.05.2012, 16:42     Прерывание циклов
  #14

Не по теме:

не по теме

Yandex
Объявления
26.05.2012, 16:42     Прерывание циклов
Ответ Создать тему
Опции темы

Текущее время: 13:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru