Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

goto и вложенные циклы   Найти похожие ветки 

 
tippa   (2010-02-24 17:38) [0]

есть цикл1, а в нем цикл2. При наступлении какого-то условия во 2 цикле нужно перейти к следующей итерации в первом цикле. Вроде через goto самое очевидное. Ho goto - это же "зло". А по другому и не знаю как?


 
12 ©   (2010-02-24 17:40) [1]

repeat until
while
procedure


 
Ega23 ©   (2010-02-24 17:42) [2]

var
 i, j : Integer;
 fl : Boolean;
begin
 for i:= 0 to 9 do
 begin
   for j := 0 to 9 do
   begin
     fl := Какое-то условие;
     if fl then Break;
   end;
   if fl then Continue;
   Продолжаем работу первого цикла;
 end;
end;


 
Игорь Шевченко ©   (2010-02-24 17:53) [3]


> Ho goto - это же "зло".


нет, goto это не зло


 
12 ©   (2010-02-24 18:23) [4]

Формально доказано, что применение GOTO не является обязательным (то есть не существует такой программы с GOTO, которую нельзя было бы переписать без этого оператора с полным сохранением функциональности) (однако с потерями эффективности
http://ru.wikipedia.org/wiki/GOTO

var
i, j : Integer;
begin
j:=-1;
for i:= 0 to 9 do
begin
  repeat
    inc(j);
  until  Какое-то условие;
  Продолжаем работу первого цикла;
end;

j:=0;
for i:= 0 to 9 do
begin
  while  Какое-то условие do
  begin
     inc(j);
  end;
  Продолжаем работу первого цикла;
end;

for i:= 0 to 9 do
begin
  for j := 0 to 9 do CallProc(j);
  Продолжаем работу первого цикла;
end;

end;

procedure CallProc(AParam:integer);
begin
if Какое-то условие then exit else
begin

end;
end;


 
12 ©   (2010-02-24 18:36) [5]


> for i:= 0 to 9 do
> begin
>    CallProc;
>   Продолжаем работу первого цикла;
> end;
>
> end;
>
> procedure CallProc(AParam:integer);
> begin
> for j:= 0 to 10 do
begin
  if Какое-то условие then exit else
> begin
>
> end;
end;


всмысле


 
Вася   (2010-02-24 20:16) [6]


> 12 ©   (24.02.10 18:23) [4]
>
> Формально доказано, что применение GOTO не является обязательным
> (то есть не существует такой программы с GOTO, которую нельзя
> было бы переписать без этого оператора с полным сохранением
> функциональности) (однако с потерями эффективности


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


 
KilkennyCat ©   (2010-02-24 20:54) [7]

а также доказано, к википедии не стоит относиться серъезно. Существует алгоритм с гоуту, без гоуту невозможный.


 
Игорь Шевченко ©   (2010-02-24 21:22) [8]


> Существует алгоритм с гоуту, без гоуту невозможный


????


 
KilkennyCat ©   (2010-02-24 21:27) [9]

Элементарно
1. ля-ля-ля
2. трам-пам-пам
3. goto 7
....
7. если сюда пришли при помощи именно goto и только goto  и никаким иным образом, выдать сообщение "Привет, мир! я - Великий ГоуТу!"

это навскидку. Могу исчо придумать, более серъезных. На более низком уровне.


 
Игорь Шевченко ©   (2010-02-24 21:56) [10]


> 7. если сюда пришли при помощи именно goto и только goto
>  и никаким иным образом


Что-то мне это напоминает...Оператор COME FROM в языке INTERCAL


 
sniknik ©   (2010-02-24 21:57) [11]

> ????
goto из одной процедуры в другую, в произвольное место (в середину), с выходом из нее соответственно по адресу вызова первой. это типа более полно использовать код.
в дельфи нельзя скорее всего, на бейсике возможно (или было возможно. может они уже одумались...)

и, да, сам я это не назвал бы алгоритмом, скорее одним из методов (кривым/запутанным) решения задачи, но преподносили мне это именно под "алгоритмическим соусом".


 
Игорь Шевченко ©   (2010-02-24 23:07) [12]

sniknik ©   (24.02.10 21:57) [11]


> goto из одной процедуры в другую, в произвольное место (в
> середину), с выходом из нее соответственно по адресу вызова
> первой.


И твой пример и KilkennyCat © [9] имеют отношение не к алгоритмам, а только к способам их реализации.

Обработка исключительных ситуаций без goto не работает. Только называется иначе.

Многопоточность, реализуемая пользователем, без goto не работает. И опять же, называется по-другому (setjmp/longjmp в C), Fiber-функции в Windows.


 
Jeer ©   (2010-02-24 23:19) [13]

Мне всегда нравилось в конце асм процедуры верхнего уровня  вместо  
...
CALL Proc2
Return

делать
goto Proc2

:)


 
KilkennyCat ©   (2010-02-24 23:29) [14]

А вот Case можно тоже рассматривать как GoTo (в некоторых языках)


 
sniknik ©   (2010-02-25 00:21) [15]

> И опять же, называется по-другому
тогда break, continue в циклах exit в процедуре это все goto, только называется по-другому... тот же самый безусловный переход, в конец/начало цикла, и к месту вызова процедуры...

в общем мысль понял, но чувство, что где то на., обманули осталось...


 
sniknik ©   (2010-02-25 00:25) [16]

> А вот Case
кстати забыл, if ... else ..., тоже goto только называется по-другому, ну а как же, там же все на джампах условных/безусловных. т.е. суть одна - goto.


 
Игорь Шевченко ©   (2010-02-25 00:27) [17]

sniknik ©   (25.02.10 00:21) [15]

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

Ни break, ни continue не могут перейти за границы блока begin/end


 
KilkennyCat ©   (2010-02-25 00:32) [18]


> в общем мысль понял, но чувство, что где то на

аналогично. я так же хотел написать, но не смог сформулировать.


 
KilkennyCat ©   (2010-02-25 00:35) [19]


> sniknik ©   (25.02.10 00:25) [16]

с Сase (если память не изменяет в Актшион скрипт) cходство вообще явное: отсутствие брека позволит пройти все тело кэйса. Классический гоуту, только красиво оформленный.


 
Германн ©   (2010-02-25 01:19) [20]


> нет, goto это не зло
>

+1
Как и, к примеру, алкоголь. Принятая "в меру" доза в подходящий момент в подходящих условиях - это добро. А вот не в меру, не ко времени или в немеряном количестве - это зло!
Сам лично использовал в одной из своих программ goto. Поскольку все прочие варианты были гораздо менее читаемые (т.е. не влезали в один экран).


 
Германн ©   (2010-02-25 01:27) [21]


> Германн ©   (25.02.10 01:19) [20]

Блин, смайлик забыл поставить! :(
Устал очень сегодня.


 
oldman ©   (2010-02-25 14:19) [22]


> tippa   (24.02.10 17:38)  
> есть цикл1, а в нем цикл2. При наступлении какого-то условия
> во 2 цикле нужно перейти к следующей итерации в первом цикле


если система такая:

begin цикл1
 begin цикл2
 end цикл2
end цикл1

то нормальный exit из цикла2 по условию спасет Вас?



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.068 c
15-1268415749
Leonid Troyanovsky
2010-03-12 20:42
2010.08.27
by Riply


2-1274454281
Semen
2010-05-21 19:04
2010.08.27
возможно ли открытие документа Word по записи в таблице?


15-1266565974
balepa
2010-02-19 10:52
2010.08.27
C#. Объявление типов


15-1271696488
sniknik
2010-04-19 21:01
2010.08.27
Кодировки в RSS.


2-1272400279
rizhiy87
2010-04-28 00:31
2010.08.27
TWebBrowser и сеансы