Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2011, 15:20   #1
ms.yur
 
Регистрация: 31.03.2011
Сообщений: 9
Вопрос прекращение работы цикла

у меня есть цикл

for q1:=1 to 10 do
for q2:=1 to 10 do
for q3:=1 to 10 do

как сделать чтобы он прекратил работу (конечно если это возможно) если условие

if w1=q1 and w2=q2 and w3=q3

выполнится
помогите плиз
ms.yur вне форума Ответить с цитированием
Старый 01.04.2011, 15:30   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
у меня есть цикл
1) у Вас их целых три. Какой именно интересует?

2) для прерывания текущего цикла используйте break
если это внутренний цикл, то остальные циклы тоже можно прервать по break

3) возможно переписать цикл на условные циклы (while ... ) и добавить туда нужное условие.

4) самый "дубовый" вариант - это использовать метку за последним циклом и переход goto на неё.
(последний способ НЕ РЕКОМЕНДУЮ!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.04.2011, 15:37   #3
ms.yur
 
Регистрация: 31.03.2011
Сообщений: 9
По умолчанию

программа должна перебрать все комбинации трех чисел от 1 до 10 когда подбирет нужное должна полностью остановится
ms.yur вне форума Ответить с цитированием
Старый 01.04.2011, 15:44   #4
ms.yur
 
Регистрация: 31.03.2011
Сообщений: 9
По умолчанию

а вообще спасибо
ms.yur вне форума Ответить с цитированием
Старый 01.04.2011, 22:26   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
4) самый "дубовый" вариант - это использовать метку за последним циклом и переход goto на неё.
(последний способ НЕ РЕКОМЕНДУЮ!)
А что если у нас имеется один цикл, но с большой степенью вложенности?
Например
Код:
Цикл1
   Цикл2
      цикл3
         цикл4
И необходимо остановить ВСЕ эти циклы при выполнении некоторого условия?
Разве здесь Goto - не самый лучший способ?
Вадим Мошев вне форума Ответить с цитированием
Старый 01.04.2011, 23:10   #6
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Разве здесь Goto - не самый лучший способ?
А что, если в одном из циклов создается или удаляется объект?
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 01.04.2011, 23:19   #7
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
А что, если в одном из циклов создается или удаляется объект?
И что? Мы же выходим толкьо в том случае, когда это нам надо
Вадим Мошев вне форума Ответить с цитированием
Старый 03.04.2011, 07:15   #8
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
2) для прерывания текущего цикла используйте break
если это внутренний цикл, то остальные циклы тоже можно прервать по break
Кстати, сравнение Break и goto:

Лекция №3.3: Ветвления. Массивы. Циклы

Код:
Write('Матрица ');
for i := 1 to n do
begin
  flag := False;
 for j := 1 to m do
   if a[i, j] > a[i, i] then
   begin
      flag := True;
     Write('не ');
     Break;
   end;
 if flag then Break;
end;
WriteLn('обладает свойством' +
 ' диагонального преобладания.');
Код:
Write('Матрица ');
for i := 1 to n do
 for j := 1 to m do
   if a[i, j] > a[i, i] then
   begin
     Write('не ');
     goto 1;
   end;
1: WriteLn('обладает свойством' +
 ' диагонального преобладания.');
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 03.04.2011, 10:51   #9
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
1)
4) самый "дубовый" вариант - это использовать метку за последним циклом и переход goto на неё.
(последний способ НЕ РЕКОМЕНДУЮ!)
Однажды мне надо было найти нужное положение в восьми вложеных циклах
В этом случае goto вполне оправдано
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 03.04.2011, 12:28   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) Да что ж Вы меня убеждаете, что "ГОТО" удобнее?!!
Удобнее - пользуйтесь на здоровье!
я лично просто не люблю этот оператор (ну, скажем, это личная неприязнь к нему! )

2) Соглашусь. выход из вложенных циклов (особенно сложных и большой вложенности!) - это, пожалуй, единственный оправданный способ применения GOTO (IMHO, разумеется).

Правда, в этом случае я бы не рекомендовал использовать значения переменных, которые использовались для органиции цикла FOR (ну, если они нужны, разумеется!) - согласно документации, после выхода из цикла, из значение может быть неопределённым... Хотя, возможно, что при использовании Goto это и не так критично..

3) задача TC мне, честно говоря, до конца не ясна - ибо зачем перебирать в трёх циклах, если результирующие значения уже известны?!

Но, я бы лично решал примерно так:
Код:
function IsFound( w1, w2, w3 : integer; var q1, q2, q3 : integer ) : boolean;
var i1, i2, i3 : integer;
begin
  IsFound := false;
  for i1:=1 to 10 do
   for i2:=1 to 10 do
    for i3:=1 to 10 do
      if (w1=i1) and (w2=i2) and (w3=i3) then
        begin
          q1 := i1;
          q2 := i2;
          q3 := i3;
          isFound := true;
          exit
        end;
end;        
var k1,k2,k3 : integer;
begin
  if IsFound(1,5,7,k1,k2,k3) then 
    WriteLn('Найдено. Позиции: ',k1,' ',k2,' ',k3)
  else
    WriteLn('Поиск закончился безрезультатно!')
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прекращение работы программы EddieG Общие вопросы C/C++ 2 16.01.2011 22:52
Прекращение выполнения макроса AesmaDiv Microsoft Office Excel 6 12.12.2010 18:30
Прекращение выполнения функции через N-ое количество тактов AlterX Общие вопросы C/C++ 9 23.05.2010 17:33
Переход от цикла к циклу не выходя из цикла (без multithreading) Qousio Общие вопросы C/C++ 2 16.05.2009 09:27
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10