Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

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

13
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
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
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
26.05.2012, 14:39 #4
Я ещё способ вспомнил. Во внутреннем цикле выкинуть исключение, а поймать его за пределами внешнего. Но по моему мнению исключения не для этого.
1
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 15:01 #5
Еще способ - вынести оба цикла в отдельную функцию, и в нужном месте просто сделать return.
2
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
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
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
26.05.2012, 15:45 #8
Цитата Сообщение от Bers Посмотреть сообщение
1. Нарушение инкапсуляции логического блока.
2. Нарушение инварианта логического блока.
Я умные слова не понимаю. Но throw в данном применении мало чем отличается от goto. И ни то, ни другое я не рекомендовал.
1
diagon
Higher
1930 / 1196 / 49
Регистрация: 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 / 4
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2012, 16:42
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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