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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 44, средняя оценка - 4.86
miriganua
131 / 102 / 4
Регистрация: 05.02.2012
Сообщений: 241
#1

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

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

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

Прерывание - C++
При вызове прерывание компилятор пишет ошибка доступа. #include <iostream> using namespace std; char a = "hello"; int main() ...

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

Прерывание по таймеру - C++
Здравствуйте! Возможно ли сделать в консольном приложении на Visual Studio так, чтобы во время работы одного из циклов программы, раз...

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

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

прерывание, вывод числа - C++
Здравствуйте, подскажите пожалуйста как по прерыванию от порта ввода выводить в порт вывода очередное число последовательности 0..255 ?...

Прерывание по таймеру на C++ в консоли - C++
Подскажите пожалуйста,как в консольном приложении можно написать прерывание срабатывающее при истечении какого-то промежутка времени? ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
1904 / 1436 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
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
Эксперт С++
1904 / 1436 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
26.05.2012, 14:39     Прерывание циклов #4
Я ещё способ вспомнил. Во внутреннем цикле выкинуть исключение, а поймать его за пределами внешнего. Но по моему мнению исключения не для этого.
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 15:01     Прерывание циклов #5
Еще способ - вынести оба цикла в отдельную функцию, и в нужном месте просто сделать return.
grizlik78
Эксперт С++
1904 / 1436 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
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
Эксперт С++
1904 / 1436 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
26.05.2012, 15:45     Прерывание циклов #8
Цитата Сообщение от Bers Посмотреть сообщение
1. Нарушение инкапсуляции логического блока.
2. Нарушение инварианта логического блока.
Я умные слова не понимаю. Но throw в данном применении мало чем отличается от goto. И ни то, ни другое я не рекомендовал.
diagon
Higher
1927 / 1193 / 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
131 / 102 / 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     Прерывание циклов
Еще ссылки по теме:

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

Прерывание в си++, отслеживание нажатых клавиш - C++
Доброго времени суток, пишу программу, которая выполняет ряд различных простых задач друг за другом в бесконечном цикле. Задача следующая,...

Прерывание программы в процессе выполнения - C++
Доброго времени суток! Подскажите, есть ли возможность прерывать программу во время выполнения? Т.е. у меня в программе есть цикл,...

Прерывание цикла и выполнение его вручную - C++
Доброго времени суток! Есть следующий код { cout &lt;&lt; &quot;start&quot; &lt;&lt; endl; cout &lt;&lt; &quot;enter signalWaitTime&quot; &lt;&lt; endl; ...

Прерывание цикла, через клавишу Esc - C++
Мне нужно в прервать цикл при нажатии клавиши Esc. Делаю через getch(). Все работает, но есть одна проблема, в каждом прогоне цикла...


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

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

Не по теме:

не по теме

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

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