Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.66/47: Рейтинг темы: голосов - 47, средняя оценка - 4.66
miriganua
131 / 102 / 61
Регистрация: 05.02.2012
Сообщений: 241
1

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

26.05.2012, 14:23. Просмотров 8856. Ответов 13
Метки нет (Все метки)

Допустим есть цикл в цикле и если во внутреннем цикле выполняется некоторое условие, необходимо прервать оба цикла.Возможно ли это? Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2012, 14:23
Ответы с готовыми решениями:

Прерывание
При вызове прерывание компилятор пишет ошибка доступа. #include <iostream>...

Прерывание ввода
Я написал программу, которая просит пользователя ввести массив, потом...

Прерывание по таймеру
Здравствуйте! Возможно ли сделать в консольном приложении на Visual Studio...

Прерывание цикла!
каким образом можно прервать while путем ввода какого нибудь символа, чтобы не...

Прерывание цикла по условию
Ребят,помогите пожалуйста,мне нужно,например если сработал первый if, то...

13
grizlik78
Эксперт С++
1988 / 1480 / 192
Регистрация: 29.05.2011
Сообщений: 3,059
26.05.2012, 14:28 2
1. Можно использовать goto, но это некрасиво.
2. Можно ввести переменную-флаг, при возникновении необходимости во внутреннем цикле устанавливаем флаг и прерываем внутренний цикл. Сразу после внутреннего цикла проверяем флаг и если он установлен прерываем и внешний.
3. Внутренний цикл можно засунуть в функцию, которая возвращает логическое значение, свидетельствующее о необходимости прерывания внешнего цикла.
Я обычно использую 2-й или 3-й варианты, хотя они более громоздкие, чем первый.
2
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;
}
1
grizlik78
Эксперт С++
1988 / 1480 / 192
Регистрация: 29.05.2011
Сообщений: 3,059
26.05.2012, 14:39 4
Я ещё способ вспомнил. Во внутреннем цикле выкинуть исключение, а поймать его за пределами внешнего. Но по моему мнению исключения не для этого.
1
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 15:01 5
Еще способ - вынести оба цикла в отдельную функцию, и в нужном месте просто сделать return.
2
grizlik78
Эксперт С++
1988 / 1480 / 192
Регистрация: 29.05.2011
Сообщений: 3,059
26.05.2012, 15:27 6
diagon, точно. Я когда третий способ описывал, держал в голове именно это. Ещё подумал, что третий способ от второго у меня не сильно отличается.
1
Bers
Заблокирован
26.05.2012, 15:30 7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Я ещё способ вспомнил. Во внутреннем цикле выкинуть исключение, а поймать его за пределами внешнего.
Это называется "код вырви глаз, и дай люлей тому, кто такое написал".
1. Нарушение инкапсуляции логического блока.
2. Нарушение инварианта логического блока.

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

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

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

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

Не по теме:

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

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

Во всех других ситуациях, его лучше избегать.
0
daslex
26.05.2012, 16:42     Прерывание циклов
  #14

Не по теме:

не по теме

1
26.05.2012, 16:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2012, 16:42
Привет! Вот еще темы с ответами:

Прерывание по таймеру на C++ в консоли
Подскажите пожалуйста,как в консольном приложении можно написать прерывание...

Прерывание программы по ESC C++
доброй ночи Добрался до такой вот темы Пытаюсь реализовать перехват нажатия...

прерывание, вывод числа
Здравствуйте, подскажите пожалуйста как по прерыванию от порта ввода выводить в...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru