Перейти к содержимому

Как выйти из всех циклов сразу c

  • автор:

Как выйти из всех циклов сразу c

Если циклы типа «пока», то переменной:
Выйти=0;
Пока (. ) и (Выйти=0) Цикл
Пока (. ) и (Выйти=0) Цикл
Пока (. ) и (Выйти=0) Цикл
.
Если . Тогда
.
Выйти=1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;

Прервать;Прервать;Прервать;, (перейти не пойдет — как будет выполняться по находжениб следующего конецЦикла). Воспользоваться если. (если С=1 тогда Прервать;)

(3) Перейти или возврат;
других вариантов нет.
хотя есть
Предупреждение(«Нажмите Reset»);

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

По задумке после выполнения математической операции код должен повторяться и заново выводить ввод операции.Но на деле получается выйти только из одного цикла,если писать Break.А завершать программу полностью должен case ‘br’,но получилось так,что он бесполезен

#include #include using namespace std; float sum(float a, float b) < return(a + b); >float sum(float a, float b,float c) < return(a + b + c); >float min(float a, float b) < return(a - b); >float min(float a, float b, float c) < return(a - b - c); >float mult(float a, float b) < return(a * b); >float mult(float a, float b,float c) < return(a * b * c); >float div(float a, float b) < return(a / b); >float div(float a, float b, float c) < return(a / b / c); >float square(float a) < return(a * a); >float cube(float a) < return(a * a * a); >float root(float a, float b) < return(pow(a, 1 / b)); >float degree(float a, float b) < return(pow(a, b)); >void main() < char command; cout > command; for (int num;;) < float a, b, c; switch (command) < case '+': cout > num; if (num == 2) < float a, b; cout > a >> b; cout else if (num == 3) < float a, b, c; cout > a >> b >> c; cout else cout << "error" << endl; break; case '-': cout > num; if (num == 2) < float a, b; cout > a >> b; cout else if (num == 3) < float a, b, c; cout > a >> b >> c; cout else cout << "enter another value" << endl; break; case '*': cout > num; if (num == 2) < cout > a >> b; cout else if (num == 3) < cout > a >> b >> c; cout else cout << "enter another value" << endl; break; case '/': cout > num; if (num == 2) < cout > a >> b; cout else if (num == 3) < cout > a >> b >> c; cout else cout > a; cout > a; cout > a >> b; cout > a >> b; cout > > 

Отслеживать
задан 6 мар 2022 в 14:22
Максим Валеска Максим Валеска
21 1 1 серебряный знак 4 4 бронзовых знака

У вас тут всего один цикл, так что если вместо return будет continue то вы перейдете к началу основного цикла

6 мар 2022 в 14:32

‘*2’ — когда Вы вписываете в одинарные кавычки больше одного символа — (если не ошибаюсь) это UB. Но точно могу сказать, что это делает не то, что Вы ожидаете. К тому же как Вы в переменную типа char , которая может хранить один символ, сможете записать два символа?

– user361068
6 мар 2022 в 14:33
Действительно.Не знал этого и проверить не успел.спасибо
6 мар 2022 в 14:40

Я попробовал continue вместо return , но меня возвращает ко вводу количества чисел, а не ко вводу математической операции

6 мар 2022 в 14:48

Так операцию вы вводите до начала цикла, конечно туда вы никогда не вернетесь. Перенесите вводи операции в цикл, сразу после for.

Как выйти из всех циклов сразу c

 for (int i = 0; i < 10; i++) < for (int j = 0; j < 10; j++) < if (i >5 && j == 7) < //действия //выход из цикла >> > 

Использую break внутри второго цикла даст только выход из него

 for (int i = 0; i < 10; i++) < for (int j = 0; j < 10; j++) < if (i >5 && j == 7) < //действия /* При такой конструкции мы будем выходить из внутреннего цикла (j), но внешний так и продолжит свою работу(i) */ break;//выход из цикла >> > 

Для полного выхода из цикла есть несколько вариантов.
1) применить оператор goto

 for (int i = 0; i < 10; i++) < for (int j = 0; j < 10; j++) < if (i >5 && j == 7) < //действия goto Found;//выход из цикла >> > Found: //едем дальше 

2) Затолкать цикл в функции и использовать оператор return

 public void Loop() < for (int i = 0; i < 10; i++) < for (int j = 0; j < 10; j++) < if (i >5 && j == 7) < //действия return;//выход из цикла >> > > 

3) Использование дополнительного флага для первого цикла

 var flag = false; for (int i = 0; i < 10; i++) < for (int j = 0; j < 10; j++) < if (i >5 && j == 7) < //действия //выход из цикла flag = true; break; >> if(flag == true) break; > 

4) Последний вариант. Присвоить i максимально возможное значение при первом выходе из цикла.

 for (int i = 0; i < 10; i++) < for (int j = 0; j < 10; j++) < if (i >5 && j == 7) < //действия //выход из цикла i = Int32.MaxValue - 1; /* Это примерно тоже само что сделать i = 1000000; */ >> > 

Комментарии 0 2019-10-29 04:10:33 5

Как выйти из всех циклов сразу c

Как это сделать?

Re: Выйти из двух циклов сразу

От: Mish
Дата: 27.05.02 10:26
Оценка: +3 -1

Здравствуйте LeonGorbachev, Вы писали:

LG>while(1) LG> < LG>for(int i = 0; i < 100; i++) LG> < LG>if(i == 77) LG> // вот тут хочу выйти вообще из всех циклов - из for и из while LG> > LG>> LG>

LG>Как это сделать?

Использовать goto. Ничего страшного не будет при умеренном использовании goto.

Re: Выйти из двух циклов сразу

От: OlegO http://www.mediachase.ru
Дата: 27.05.02 10:31
Оценка: -1

Здравствуйте LeonGorbachev, Вы писали:

LG>while(1) LG> < LG>for(int i = 0; i < 100; i++) LG> < LG>if(i == 77) LG> // вот тут хочу выйти вообще из всех циклов - из for и из while LG> > LG>> LG>

LG>Как это сделать?

Например сгенерить исключение:

try < while(1) < for(int i = 0; i < 100; i++) < if(i == 77) throw 77; > > > catch(int e) < // e==77 >

С уважением, OlegO.
Re[2]: Выйти из двух циклов сразу
Здравствуйте OlegO, Вы писали:

OO>

OO>try OO> < OO>while(1) OO> < OO>for(int i = 0; i < 100; i++) OO> < OO>if(i == 77) OO> throw 77; OO> > OO> > OO>> OO>catch(int e) OO> < OO>// e==77 OO>> OO>

Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.

Re[3]: Выйти из двух циклов сразу

От: LeonGorbachev
Дата: 27.05.02 10:39
Оценка:

Здравствуйте Mishka, Вы писали:

MT>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.

я вот как раз и не хочу через исключения. И не хочу гоу-ту.
Чего делать?

Re[4]: Выйти из двух циклов сразу

Здравствуйте LeonGorbachev, Вы писали:

LG>я вот как раз и не хочу через исключения. И не хочу гоу-ту.
LG>Чего делать?

while(1) < for(int i = 0; i < 100; i++) < if(i == 77) break; > if (i < 100) break; >

Re[5]: Выйти из двух циклов сразу

От: Андрей
Дата: 27.05.02 10:53
Оценка: 14 (2)

Здравствуйте Mishka, Вы писали:

MT>Здравствуйте LeonGorbachev, Вы писали:

LG>>я вот как раз и не хочу через исключения. И не хочу гоу-ту.
LG>>Чего делать?

MT>Можно так:
MT>

MT>while(1) MT> < MT>for(int i = 0; i < 100; i++) MT> < MT>if(i == 77) MT> break; MT> > MT> if (i < 100) break; MT>> MT>

Это прокатит только на VC6

Я обычно делаю так:

bool bContinue = true; while(bContinue) < for(int i = 0; i < 100; i++) < if (i == 77) < bContinue = false; break; > > >

Возможны варианты, в зависимости от контекста

Re[3]: Выйти из двух циклов сразу

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 27.05.02 10:56
Оценка: 6 (1) +1 -1

Здравствуйте Mishka, Вы писали:

MT>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.

Не пугай так народ, от и так уже запуганный.

terminate вызывается, только если второй exception не был перехвачен внутри деструктора, чего не наблюдается в данном примере.

Так что выход из вложенного цикла через исключение — нормальная ситуация.

Re[4]: return

От: Vi2 http://www.adem.ru
Дата: 27.05.02 10:57
Оценка: 1 (1) +1 -1

Здравствуйте LeonGorbachev, Вы писали:

LG>я вот как раз и не хочу через исключения. И не хочу гоу-ту.
LG>Чего делать?

Если есть возможность ВЫНЕСТИ эти циклы (не очень много переменных и т.д.),
можно сделать функцию и сделать возврат

. f(. ) < while(1) < for(int i = 0; i < 100; i++) < if(i == 77) // вот тут хочу выйти вообще из всех циклов - из for и из while return; > > >

Vita Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Выйти из двух циклов сразу

От: Рек
Дата: 27.05.02 10:57
Оценка:

Здравствуйте Mishka, Вы писали:

MT>Здравствуйте OlegO, Вы писали:

OO>>

OO>>try OO>>< OO>> while(1) OO>> < OO>> for(int i = 0; i < 100; i++) OO>> < OO>> if(i == 77) OO>> throw 77; OO>> > OO>> > OO>>> OO>>catch(int e) OO>>< OO>> // e==77 OO>>> OO>>

MT>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.

То что не надо так делать — это ты прав.
А на счет того, что программа будет завершена — не совсем.

Исключение ведь перехватывется, и из деструктора не выпускаться не будет, потому всё будет работать.

А делать так не надо, потому что исключение это дорогое средство и должны
происходить редко (так в книжках пишут), слно алгоритмы с их помощью реализовывать не нужно,
только обработку ошибок.

По мне так вариант с goto наиболее понятен, слно предпочтителен.

Если с души воротит от goto, то можно оформить внутренний цикл как функцию
и делать из неё return вместо goto.

Re[6]: Выйти из двух циклов сразу

От: LeonGorbachev
Дата: 27.05.02 11:00
Оценка: 2 (1)

А>Я обычно делаю так:
А>

А>bool bContinue = true; А>while(bContinue) < А>for(int i = 0; i < 100; i++) < А>if (i == 77) < А>bContinue = false; А> break; А> > А> > А>> А>

Я в общем то так и делаю, только подумалось, что можно по-другому.

Re[4]: Выйти из двух циклов сразу

От: slonnik
Дата: 27.05.02 11:19
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Mishka, Вы писали:

MT>>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.

DG>Не пугай так народ, от и так уже запуганный.

DG>terminate вызывается, только если второй exception не был перехвачен внутри деструктора, чего не наблюдается в данном примере.

DG>Так что выход из вложенного цикла через исключение — нормальная ситуация.

А если не cекрет а почему именно ВТОРОЙ exception и в чем его отличие от первого

Re[6]: Выйти из двух циклов сразу

От: Kaa http://blog.meta.ua/users/kaa/
Дата: 27.05.02 11:51
Оценка:

Здравствуйте Андрей, Вы писали:

MT>>

MT>>while(1) MT>>< MT>> for(int i = 0; i < 100; i++) MT>> < MT>> if(i == 77) MT>> break; MT>> > MT>> if (i < 100) break; MT>>> MT>>

А>Это прокатит только на VC6
Что именно? Scoping? Тогда да. А выход прокатит везде.

2 Mishka
Только это неправильное условие. Надо выйти из циклов при i == 77, а if — совсем другое условие дает (расширяет диапазон значений немеряно).

Алексей Кирдин
Re[7]: Выйти из двух циклов сразу

От: LeonGorbachev
Дата: 27.05.02 12:01
Оценка:

Здравствуйте Kaa, Вы писали:

Kaa>Здравствуйте Андрей, Вы писали:

А>>Это прокатит только на VC6
Kaa>Что именно? Scoping? Тогда да. А выход прокатит везде.
Что такое Scoping?

Re[4]: Выйти из двух циклов сразу

От: Kaa http://blog.meta.ua/users/kaa/
Дата: 27.05.02 12:04
Оценка:

Здравствуйте Рек, Вы писали:

Рек>А делать так не надо, потому что исключение это дорогое средство и должны
Рек>происходить редко (так в книжках пишут), слно алгоритмы с их помощью реализовывать не нужно,
Рек>только обработку ошибок.

Есть еще способ с использованием __leave у Microsoft, и им некоторые писатели книжек пользуются, но тогда SEH надо привлекать, что часто невозможно/трудно.

Рек>Если с души воротит от goto, то можно оформить внутренний цикл как функцию
Рек>и делать из неё return вместо goto.

Стоит добавить, что для встроенной функции никакого оверхеда не будет (если она компилятору понравится, конечно), а способ самый красивый. Но с добавочной переменной типа bool — еще красивее. Не так наглядна декомпозиция алгоритма, но зато потерь в производительности не будет.

Алексей Кирдин
Re[8]: Выйти из двух циклов сразу

От: Kaa http://blog.meta.ua/users/kaa/
Дата: 27.05.02 12:07
Оценка: 15 (1) +1

Здравствуйте LeonGorbachev, Вы писали:

LG>Здравствуйте Kaa, Вы писали:

Kaa>>Здравствуйте Андрей, Вы писали:

А>>>Это прокатит только на VC6
Kaa>>Что именно? Scoping? Тогда да. А выход прокатит везде.
LG>Что такое Scoping?
Я имел ввиду, что область видимости переменной, объявленной в заголовке цикла, ограничена самим циклом (так написано в стандарте). В VC6 же это не так. Областью видимости переменных, там объявленых, является объемлющая для цикла область видимости.

Алексей Кирдин
Re: Выйти из двух циклов сразу

От: VladD2 www.nemerle.org
Дата: 27.05.02 12:57
Оценка: 6 (1) -1

Здравствуйте LeonGorbachev, Вы писали:

LG>

LG>while(1) LG> < LG>for(int i = 0; i < 100; i++) LG> < LG>if(i == 77) LG> // вот тут хочу выйти вообще из всех циклов - из for и из while LG> > LG>> LG>

LG>Как это сделать?

goto это единственный сто процентный выход из ситуации. Но выход это плохой. Лучше переделать условие циклов так, чтобы они учитывали такую ситуацию. Например:

bool b = true; while(1) < for(int i = 0; b && i < 100; i++) < if(i == 77) < // вот тут хочу выйти вообще из всех циклов - из for и из b = false; break; > // Если далее есть кол. // то дописываем проверку: if(b) break; // некоторый код > >

Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Выйти из двух циклов сразу

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 27.05.02 13:33
Оценка: 11 (4)

Здравствуйте slonnik, Вы писали:

S>А если не cекрет а почему именно ВТОРОЙ exception и в чем его отличие от первого

Потому что третьего уже не будет , программа завершится раньше.
При возникновении второго не обработанного исключения у компилятора возникает дилема, какое из исключений тянуть «на верх».

//есть класс A, деструктор которого кидает исключение Exception2; struct A < ~A() throw Exception2();> >; //есть сервер, который кидает исключение void Server() < A a; throw Exception1(); > //и есть клиент, который их ловит void Client() < try < Server(); >catch (. ) < >>

Так вот, если при размотке стека при обработке исключения Exception1, окажется, что сгенерировалось еще одно исключение Exception2, которое ловится «выше», чем генериется первое, то у компилятора возникает дилема, какое исключение из этих двух передать в catch. В C++ пошли наиболее простым путем, и грохают всю программу(что очень сильно мешает написанию устойчивых программ), в остальных языках(Java, C#) второе исключение просто игнорируется.

Рассматривать программу, как дерево, и проведем линии от возникновений исключений до их обработки. Если линии сливаются, то в этом случае программа будет завершена.

Re[6]: Выйти из двух циклов сразу

От: KA it-knowledge-base.blogspot.com
Дата: 27.05.02 16:30
Оценка:

Здравствуйте DarkGray, Вы писали:

[skipped]

DG>Так вот, если при размотке стека при обработке исключения Exception1, окажется, что сгенерировалось еще одно исключение Exception2, которое ловится «выше», чем генериется первое, то у компилятора возникает дилема, какое исключение из этих двух передать в catch. В C++ пошли наиболее простым путем, и грохают всю программу(что очень сильно мешает написанию устойчивых программ), в остальных языках(Java, C#) второе исключение просто игнорируется.

По указанному простому пути идут программы, которые в деструкторах выбрасывают исключения и при этом не вызывают функцию

bool std::uncaught_exception();

//
#import
class IWindows9x:protected DOS < private: virtual HANDLE EnumClouds()=0; >;
Re[7]: Выйти из двух циклов сразу

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 27.05.02 17:28
Оценка:

Здравствуйте KA, Вы писали:

KA>По указанному простому пути идут программы, которые в деструкторах выбрасывают исключения и при этом не вызывают функцию
KA>

bool std::uncaught_exception();

Так обычно выброс исключения происходит не прямо в деструкторе, а в функции, которая вызывается из деструктора. Сама функция может и не предполагать, что ее будут вызывать из деструктора.
В С++ нельзя, например, защититься от обращения по нулевому указателю внутри деструктора, что очень мешает жить программе — 24x7x365.

Предлагаешь завернуть каждый деструктор в такой код. ИМХО, это уже издевательство над программистом, лучше было бы предложить выбрать, какую модель я хочу.

void ~Destructor() < try < //bla-bla > catch (. ) < if (std::uncaught_exception()) < throw; > > >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *