DRAKON.SU

Текущее время: Четверг, 28 Март, 2024 23:38

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 67 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Среда, 08 Февраль, 2012 10:52 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
Уважаемые участники дискуссии!

Рекомендую ознакомиться с материалами Сергея Ефанова:

:idea: 4 видеоурока (на это потребуется примерно час).
:idea: 4 текста к каждому уроку. Эти тексты образуют Курс молодого бойца (на изучение Курса потребуется примерно 2 часа).

Итого, в сумме требуется затратить примерно 3 часа.

Мне кажется, что после этого многие сомнения и возражения отпадут.

Ознакомиться можно здесь. http://drakon-practic.ru/
См. раздел Уроки ДРАКОНа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Среда, 08 Февраль, 2012 13:56 

Зарегистрирован: Понедельник, 09 Ноябрь, 2009 17:29
Сообщения: 904
Откуда: Россия, Питер
Уважаемый Владимир Паронджанов!

Хотелось бы услышать именно Ваше мнение о допустимости переходов показанных на рисунках ниже
Вложение:
3.png
3.png [ 20.88 КБ | Просмотров: 21332 ]

Вложение:
1a.png
1a.png [ 15.14 КБ | Просмотров: 21331 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Среда, 08 Февраль, 2012 15:12 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
Ильченко Эдуард писал(а):
Уважаемый Владимир Паронджанов!

Хотелось бы услышать именно Ваше мнение о допустимости переходов показанных на рисунках ниже
Вложение:
3.png

Вложение:
1a.png


Уважаемый Эдуард!

Спасибо за вопрос.

Верхний алгоритм работоспособен, но нарисован коряво. Этот недостаток (корявость) можно легко убрать, сделав рокировку в верхней иконе вопрос.

Пояснение. На верхнем рисунке изображены два вложенных веточных цикла.

Цикл А внешний.
Цикл Б внутренний.
Цикл Б вложен в цикл А.

Нижний алгоритм неработоспособен. Например, потому, что вход в ветки В, Г и Выход отсутствует.
И с циклами какая-то путаница. Это не вложенные циклы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Среда, 08 Февраль, 2012 15:57 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1098
Откуда: Россия, Чебоксары
Владимир Паронджанов писал(а):
Верхний алгоритм работоспособен, но нарисован коряво. Этот недостаток (корявость) можно легко убрать, сделав рокировку в верхней иконе вопрос.
Владимир Даниелович!

Прошу Вас не отрываться от контекста вопроса: http://forum.oberoncore.ru/viewtopic.php?p=70409#p70409

Там показаны оба изображения одного и того же алгоритма. Данным ответом Вы признали, что изображения обеих конструкций допустимы.
Фиксируем, что на порядок следования "обратных связей" Вы не накладываете строгих ограничений.

Владимир Паронджанов писал(а):
Нижний алгоритм неработоспособен. Например, потому, что вход в ветки В, Г и Выход отсутствует. И с циклами какая-то путаница. Это не вложенные циклы.
Опять же вернитесь к контексту! http://forum.oberoncore.ru/viewtopic.php?p=70409#p70409. На вопрос Эдуарда Вы так в результате и не ответили.

Вопрос заключался вовсе не в оценке работоспособности алгоритма, который на скорую руку переделал Эдуард из моего рисунка, а в критике моих тезисов:

Alexey_Donskoy писал(а):
Вернёмся к первому представлению.
Адресные иконы, которые завершают ветку В (сейчас назначенные на Б и Г) точно так же можем назначить куда угодно.
Адресную икону Б первой ветки можем назначить куда угодно, кроме В (переход внутрь вложенного цикла, который можно диагностировать однозначно).
А вот адресные иконы в ветке Г мы тоже можем назначить куда угодно (!).
Назначив на А, получим продолжение цикла А.
Назначив на Б, получим продолжение цикла Б (сам цикл при этом просто становится многоветочным!).
И конкретный вопрос Эдуарда можно проиллюстрировать более корректно - куда можно назначить переход:
Вложение:
Веточный цикл-1-п_1.png
Веточный цикл-1-п_1.png [ 11 КБ | Просмотров: 21309 ]
Согласно моим соображениям, все варианты допустимы:
А - представляет собой Countinue для внешнего цикла с началом в А;
Б - образует новый вложенный цикл с началом в Б;
В - просто продолжение тела цикла;
Г - выход из внутреннего цикла;
Выход - выход из обоих вложенных циклов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Среда, 08 Февраль, 2012 21:06 

Зарегистрирован: Понедельник, 09 Ноябрь, 2009 17:29
Сообщения: 904
Откуда: Россия, Питер
Уважаемый Владимир Даниелович!

Хочется добраться до истины : )
Alexey_Donskoy писал(а):
Владимир Паронджанов писал(а):
Верхний алгоритм работоспособен, но нарисован коряво. Этот недостаток (корявость) можно легко убрать, сделав рокировку в верхней иконе вопрос.

Владимир Паронджанов писал(а):
Нижний алгоритм неработоспособен. Например, потому, что вход в ветки В, Г и Выход отсутствует. И с циклами какая-то путаница. Это не вложенные циклы.

...
На вопрос Эдуарда Вы так в результате и не ответили.

Вопрос заключался вовсе не в оценке работоспособности алгоритма, который на скорую руку переделал Эдуард из моего рисунка ...

Да, именно так.
Интересуют правила создания веточных циклов.
Например, Вы утверждали:

Владимир Паронджанов писал(а):
...
дополнительный вход в веточный цикл запрещён.

Из этого правила НЕТ исключений.

Таким образом, наиболее общей является формулировка:
Цитата:
В языке Дракон цикл (любой цикл) имеет только один вход.

Я попытался применить это правило и возникли ситуации, которые хотелось бы однозначно разрешить.

Допустим имеется схема алгоритма (Рис. 1)
Вложение:
1.png
1.png [ 24.11 КБ | Просмотров: 21279 ]

Если я нигде не ошибся, то вполне себе рабочая схема.

Допустим, что алгоритм требуется доработать таким образом как на Рис. 2.
Здесь появляется вопрос: Могу ли я, согласно правилам Дракона, создать переход с адреса, помеченного красной точкой, на имя ветки помеченной зелёной точкой?
Вложение:
2.png
2.png [ 30.28 КБ | Просмотров: 21279 ]

В чём мои сомнения?
Появились два веточных цикла, при этом один из них (цикл Б) имеет два входа, т. е. такая схема запрещена.
Правильно ли я понимаю?

По поводу рис. 1а из моего предыдущего сообщения вопрос снимается. Это аналогичный случай.

Соответственно с правилом «Дополнительный вход в веточный цикл запрещён.» на рисунке, предоставленном уважаемым Алексеем Донским (Alexey_Donskoy), как я полагаю, запрещён только переход на ветку А.

Владимир Даниелович, по-прежнему хочется услышать Ваш комментарий по-поводу Дракон-схемы из сообщения http://forum.oberoncore.ru/viewtopic.php?p=70404#p70404


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Четверг, 09 Февраль, 2012 13:05 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
Уважаемые Эдуард и Алексей!

Я не смог понять Ваш вопрос.

Давайте разбиратся вместе.

ПРАВИЛА ПОСТРОЕНИЯ ВЕТОЧНЫХ ЦИКЛОВ

Веточный цикл — это цикл, у которого в иконе адрес указано имя собственной или одной из левых веток.

Веточный цикл имеет только один вход. Это означает, что:

— входом в веточный цикл является одна-единственная икона «имя ветки»;

— входом называется вход в указанную икону СЛЕВА;

— вход в указанную икону СПРАВА (цепи обратной связи) не считаются входами;

— цепей обратной связи может быть несколько (см. пример на рис. 4 в книге «Как улучшить…». На рис. 4 показаны 2 цепи обратной связи).

Пока что все в порядке. Рис. 1 Ильченко у меня сомнений не вызывает.

__________________________________________________________________

ВЛОЖЕННЫЕ ВЕТОЧНЫЕ ЦИКЛЫ.

В языке ДРАКОН вложенные циклы разрешены. В том числе разрешены вложенные веточные циклы.

Но! Надо тщательно проверить, что они действительно вложенные.

Для этого нужно проверить, что:

Первым начинает работать внешний цикл, а затем внутренний.
После внутреннего (пусть через условие) работает внешний и т.д.


На рис. 2 у Ильченко показаны циклы Б и В. Предположим, что они вложенные.

Проверяем, так ли это.

Проверка 1.
Первым начинает работать внешний цикл Б, а затем внутренний В.
Проверка 1 завершена успешно.

Проверка 2.

После Внутреннего В должен работать (пусть через условие) внешний цикл Б. Что-то я такое не увидел. Или я ошибся?

Предварительный вывод.

При анализе вашего вопрооса я столкнулся с противоречием.

С одной стороны в языке ДРАКОН разрешены вложенные веточные циклы.
С другой стороны, на рисунке 2 Ильченко я не обнаружил вложенных веточных циклов.

Вполне возможно, что я ошибся. Если это так, прошу меня поправить.

На всякий случай в следующем сообщении дана выдержка из википедии о вложенных циклах.


Последний раз редактировалось Владимир Паронджанов Четверг, 09 Февраль, 2012 13:50, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Четверг, 09 Февраль, 2012 13:15 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
http://ru.wikipedia.org/wiki/%D0%A6%D0% ... 0%B8%D0%B5)

Вложенные циклы

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

Полное число исполнений тела внутреннего цикла не превышает произведения числа итераций внутреннего и всех внешних циклов. Например взяв три вложенных друг в друга цикла, каждый по 10 итераций, получим 10 исполнений тела для внешнего цикла, 100 для цикла второго уровня и 1000 в самом внутреннем цикле.

Одна из проблем, связанных с вложенными циклами — организация досрочного выхода из них. Во многих языках программирования есть оператор досрочного завершения цикла (break в Си, exit в Турбо Паскале, last в Perl и т. п.), но он, как правило, обеспечивает выход только из цикла того уровня, откуда вызван. Вызов его из вложенного цикла приведёт к завершению только этого внутреннего цикла, внешний же цикл продолжит выполняться.

Проблема может показаться надуманной, но она действительно иногда возникает при программировании сложной обработки данных, когда алгоритм требует немедленного прерывания в определённых условиях, наличие которых можно проверить только в глубоко вложенном цикле.

Решений проблемы выхода из вложенных циклов несколько.

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

Альтернатива — использовать штатные средства завершения циклов, в случае необходимости устанавливая специальные флаги, требующие немедленного завершения обработки. Недостаток — усложнение кода, снижение производительности без каких-либо преимуществ, кроме теоретической «правильности» из-за отказа от goto.

Размещение вложенного цикла в процедуре. Идея состоит в том, чтобы всё действие, которое может потребоваться прервать досрочно, оформить в виде отдельной процедуры, и для досрочного завершения использовать оператор выхода из процедуры (если такой есть в языке программирования). В языке Си, например, можно построить функцию с вложенным циклом, а выход из неё организовать с помощью оператора return. Недостаток — выделение фрагмента кода в процедуру не всегда логически обосновано, и не все языки имеют штатные средства досрочного завершения процедур.

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

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

Наконец, существуют специальные языковые средства для выхода из вложенных циклов. Так, в языке Ада программист может пометить цикл (верхний уровень вложенного цикла) меткой, и в команде досрочного завершения цикла указать эту метку. Выход произойдёт не из текущего цикла, а из всех вложенных циклов до помеченного, включительно


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Четверг, 09 Февраль, 2012 14:00 

Зарегистрирован: Понедельник, 09 Ноябрь, 2009 17:29
Сообщения: 904
Откуда: Россия, Питер
Владимир Паронджанов писал(а):
Проверка 1.
Первым начинает работать внешний цикл Б, а затем внутренний В.
Проверка 1 завершена успешно.

Это не совсем так. В зависимости от ответа на вопрос "Идти на Б?" может начать работать цикл В. Таким образом появляется второй вход СЛЕВА в цикл Б. К этому привела переделка схемы 1 в схему 2. Нарушено правило об одном входе в цикл. Следовательно схема 2 некорректна. Следовательно, редактор не должен разрешать подключать адрес с красной точкой к ветке с зелёной точкой. Про редактор было здесь.


Последний раз редактировалось Ильченко Эдуард Четверг, 09 Февраль, 2012 22:36, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Четверг, 09 Февраль, 2012 14:16 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
Эдуард, Вы, конечно, правы.
Я согласен с Вашим замечанием.
С одним мелким уточнением из двух пунктов.

Пункт 1. Для порядка надо исправить опечатку.
Цитата:
Неправильно.
Таким образом появляется второй вход СЛЕВА в цикл Б.


Цитата:
Правильно.
Таким образом появляется второй вход СЛЕВА в цикл В.


Пункт 2.
Цитата:
Следовательно, редактор не должен разрешать подключать адрес с красной точкой к ветке с зелёной точкой.
Это не так.
После исправления опечатки МОЖНО подключать адрес с красной точкой к ветке с зелёной точкой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Четверг, 09 Февраль, 2012 22:31 

Зарегистрирован: Понедельник, 09 Ноябрь, 2009 17:29
Сообщения: 904
Откуда: Россия, Питер
Владимир Паронджанов писал(а):
Пункт 1. Для порядка надо исправить опечатку.
Цитата:
Неправильно.
Таким образом появляется второй вход СЛЕВА в цикл Б.


Цитата:
Правильно.
Таким образом появляется второй вход СЛЕВА в цикл В.


Ваше утверждение ошибочно. Здесь нет опечатки. Я имел ввиду именно второй вход в цикл Б.
Для наглядности привожу рисунок 3. Синими стрелками выделен цикл Б.
Вложение:
3.png
3.png [ 38.63 КБ | Просмотров: 21190 ]

Маршрут цикла Б проходит, в том числе, через ветку В. В то же время имеется маршрут после вопроса «Идти на Б?» (через ответ «Нет») на адрес «В» и переходом на ветку «В». Тем самым образуются второй вход в цикл «Б» и соображения о запрете преобразования схемы с рисунка 1 в схему на рисунке 2.

Если Вы по-прежнему считаете, что второй вход в цикл Б отсутствует, возможно я не правильно понимаю, что такое второй вход в цикл. В таком случае, не могли бы вы привести рисунок веточного цикла со вторым входом?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Пятница, 10 Февраль, 2012 11:58 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
Уважаемый Эдуард!

Большое спасибо за тщательное исследование вопроса.
И за подробные разъяснения.
Благодаря Вашим разъяснениям я смог лучше понять Вашу точку зрения.

Прошу Вас обратить внимание, что я написал СЛЕВА прописными буквами. Это слово играет важную роль. Ниже я разъяснил это слово, выделив текст красным шрифтом.

Еще раз большое спасибо за важные подробности.
Благодаря Вашим аргументам я решил начать разговор «с чистого листа».

Ниже я заново отредактировал правила и помещаю их в рамочку.

Цитата:
ПРАВИЛА ПОСТРОЕНИЯ ВЕТОЧНЫХ ЦИКЛОВ

1. Веточный цикл — это цикл, у которого в иконе адрес указано имя собственной или одной из левых веток.

2. Веточный цикл имеет только один вход. Это означает, что:

2.1. — входом в веточный цикл является одна-единственная икона «имя ветки»;

2.2. — входом называется вход в указанную икону СЛЕВА.
Что значит СЛЕВА? Это значит, что икона адрес (адресующаяся к иконе «имя ветки») расположена в силуэте СЛЕВА от иконы «имя ветки».

2.3. — вход в указанную икону СПРАВА (цепи обратной связи) не считаются входами;

2.4. — цепей обратной связи может быть несколько (см. пример на рис. 4 в книге «Как улучшить…». На рис. 4 показаны 2 цепи обратной связи).


3. ВЛОЖЕННЫЕ ВЕТОЧНЫЕ ЦИКЛЫ.

3.1. В языке ДРАКОН вложенные циклы разрешены. В том числе разрешены вложенные веточные циклы.

3.2. Система вложенных веточных циклов — это несколько вложенных друг в друга веточных циклов.

3.3. Система вложенных веточных циклов имеет только один вход. Этот единственный вход совпадает со входом во внешний цикл.

3.4. Первый вложенный веточный цикл имеет только один вход.
На этот вход передается управление из внешнего веточного цикла.

3.5. Второй вложенный веточный цикл имеет только один вход.
На этот вход передается управление из первого вложенного внешнего веточного цикла.

3.6. И т.д.

3.7. Таким образом, вход ИЗВНЕ в любой из внутренних циклов запрещен, поскольку такой вход означает появление второго входа в систему вложенных веточных циклов.


Уважаемый Эдуард!

Прошу критиковать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Основной цикл человека
СообщениеДобавлено: Воскресенье, 12 Февраль, 2012 10:13 

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 1657
Пример вложенного веточного цикла

Алгоритм: Основной цикл человека. Автор Ю.Ю. Кочетков
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Основной цикл человека
СообщениеДобавлено: Воскресенье, 12 Февраль, 2012 14:42 

Зарегистрирован: Понедельник, 09 Ноябрь, 2009 17:29
Сообщения: 904
Откуда: Россия, Питер
Геннадий Тышов писал(а):
Пример вложенного веточного цикла

Алгоритм: Основной цикл человека. Автор Ю.Ю. Кочетков

Похоже, что здесь не вложенные циклы, а пересекающиеся.
Таковые, вроде бы, Владимиром Паронджановым не описывались.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Февраль, 2012 13:37 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 1443
Что-то тут (в правилах построения ВЦ) непонятно... Цикл алгоритма - это то, что в терграфе "контур" (на граф-схеме алгоритма). Так как мы определяем начало этого контура? Ведь "цикл имеет один вход", только если любые слияния маршрутов (атомарные, лианные ли при шампур-выводе - неважно) на схеме попадают либо раньше начальной вершины контура (точки слияния конца петли цикла, идущей "против шампура", с вертикалью, идущей "по шампуру"), либо позже конечной (за которую принимаем первую развилку, от которой можно прийти к петле цикла). А соблюдается ли это в обсуждаемом силуэте?.. Если смотреть на визуально-структурный анализ Эдуарда, то переход, отмеченный красным, как раз присоединяет маршрут внутрь контура... ибо за начальную его вершину нужно принимать "Имя ветки Б" (не обращая внимания на относительное положение выходов развилки "Идти на Б" - она и служит конечной вершиной контура).

В шампур-силуэте у нас есть только одно правило определять, где "по", а где "против" шампура (т.е., где прямая связь, а где обратная). Это то самое "чем правее - тем позже". Точнее сказать: "Переход с данной ветки на ветку правее в силуэте считаем следованием по шампуру, тогда переход с данной ветки на ветку правее всегда будет против шампура - т.е. представляющим замыкание некоего цикла". В общем, смотрим на тексты меток...
Кстати, снова выявляется желательность индексировать ВЦ - как делали "реакторщики" в примерах из "Как улучшить..." - см. выдержку здесь: viewtopic.php?p=57898#p57898. Что и сделано при развитии метода здесь: http://grafit-basis.narod.ru/L3/grafit- ... l#GR-n1462. Кстати, это и попытка визуализировать, "что есть правильная маршрут-схема"... :) А вторая схема - как делается реализация через "необлагороженный goto" (jmp... ну и call, где нужно)... :wink:

Кстати, полезно "снимать петлю силуэта", как сделано в этом примере: http://drakonografika.narod.ru/L3/imper ... ml#del3112. Т.е. жёстко связывать силуэт с неким примитивом (возможно, содержащим пересечения - которые мы и хотим устранить переходом к силуэту). Возможно, так частично устраняются те "разрывы", о котрых говорили Илья и Алексей...

P.S. Ну и совсем точное определение "по шампуру" - это направление, при каждом переходе в котором расстояние от текущей позиции на графе до заголовка (вершины, принятой за начальную) увеличивается. Что имеет отношение и к сказанному в следующем посте - конец в "зацикленном" графе есть вершина, при выходе (любых возможных выходах, если это мультивершина... вдруг :wink:) из которой расстояние до начальной вершины будет уменьшаться за один шаг (проход до следующей значащей вершины) "до нуля" (м.б. до минимального - как в зацикленных шампур-схемах, где возвращаемся не на заголовок, а под него). Так, Илья Евгеньевич?.. :)


Последний раз редактировалось Владислав Жаринов Воскресенье, 19 Февраль, 2012 18:52, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Суббота, 18 Февраль, 2012 03:33 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 1443
Ильченко Эдуард в viewtopic.php?p=70404#p70404 писал(а):
...
Значит ли это, что конструкция, показанная на рисунке ниже, некорректна (учитывая, что силуэт может не содержать икону «Конец»)?
Вложение:
Светофор.png
Рискну тоже высказаться. :wink:
И силуэт, и примитив могут не содержать конечной вершины - как результат операций "удаления конца" (визуализацию см. Правило 120, 121). Так что всё корректно. Это тот же LOOP без EXIT по всему телу алгоритма - говорил тут: http://drakonografika.narod.ru/L3/diost ... html#n2311. В реализации - явный БП на начало тела (если это вставка и её пролог реализуется в вызывающей программе - то на начало кода, если в самой вставке - то на первую команду за прологом). Так, видимо... :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Февраль, 2012 04:51 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 1443
Alexey_Donskoy писал(а):
Ильченко Эдуард писал(а):
Таки да : ) С чёрным треугольничком ...
Э-э, нетушки!
Это всего лишь передача управления на предыдущую ветку. Ясно, что сам по себе подобный переход образует циклическую конструкцию, но для строгого определения границ цикла (особенно когда они вложенные) требуются дополнительные ограничения, которые явно не сформулированы в языке.
Кроме того, при вложенных циклах возникнет неоднозначность а) выхода из цикла, б) допустимости выбора иконы "адрес" одной из предыдущих веток...
Согласен. Сам прорисовывал варианты вложений ВЦ. Лекарство от ошибок то же - соотносить с примитивом. Тогда понятно, что любая петля цикла, "не влезающая" в тело одной ветки, д.б. целиком "вписана" в кросс ("петлю") силуэта. Это главное ограничение.
Посему, если у нас принято, что если выходим из ветки на вход ветки, более правой в силуэте, то это "по шампуру" - значит, если выходим на вход более левой, то это "против" - т.е. замыкание цикла в позиции входа этой более левой ветки. А началом петли будет как раз позиция выхода влево. И надо смотреть - а тот ли это цикл, который нам нужен по условию задачи?.. :wink:
Кстати, это "принято" определяется тем, что заголовок присоединён к самой левой ветке... тогда как читающим на арабском и/или иврите привычнее м.б. происоединить к самой правой, дабы и ветки шли "чем левее - тем позже"...

По вложенности - нельзя переходить из данной ветки влево на ветку, если она левее какой-то, на которую уже есть переход влево из ветки, более правой, чем данная (иначе будет пересечение ВЦ). И симметрично - нельзя переходить из данной ветки вправо на ветку, если она правее какой-то, из которой уже есть переход влево на ветку, более левую, чем данная (снова будет пересечение, только "с другой стороны"). Это необходимые ограничения. Достаточные должны касаться совпадения начальных и/или конечных веток двух и более ВЦ.
Можно переходить влево на одну и ту же ветку из разных ВЦ - это очевидно (замыкания вложенных циклов будут совпадать). При этом правильный порядок вложения соблюдается, так сказать, "автоматически" - тем, что внутри есть цепочка межветочных переходов "по шампуру" (от самой левой ветки к самой правой), те или иные ветвления от которой приводят к началам петель циклов. И в каждой ветке эта цепочка должна:
    а) проходить по главной её вертикали;
    б) при наличии двух и более выходов "по шампуру" зацикливаемые выходы д.б. правее.
Иначе будут пересечения уже петель циклов с побочными трассами ветвлений. Устраняется рокировками - при этом "держим в уме" опять-таки эквивалентный примитив. Но б) можно и не соблюдать - имея в виду, что силуэт есть средство разрешения пересечений примитива. Допустимых - т.е. не между циклами (граф-контурами). А рокировки тут не всегда помогают - было при "Преобразовании графов". И могут нарушать эргономически целесообразный порядок маршрутов.
    Вопрос - как из одной ветки переходить "против шампура" (влево) два и и более раз (конечно, для этого у неё д.б. соответствующее число выходов - см. также сказанное далее)? Тут правильный порядок - по доминантности. Ясно, что если в теле данной ветки нет пересечений - то чем правее её выход, тем он "рецессивнее". И корректно будет, если замыкается на вход ветки не более левой, чем от любого более левого из зацикливаемых выходов той же ветки. Иначе снова будут пересечения циклов.
Если пытаемся перейти изо всех выходов одной ветки влево - это формально возможно (при соблюдении порядка замыкания справа опять же "по доминантности"), но не всегда целесообразно... ибо ветки после этой не будут доступны... :) Вот если их нет - т.е. данная ветка самая правая в "зацикленном" силуэте - тогда есть смысл (конечно, если нагрузка предшествующих маршей будет разной - иначе опять-таки зачем?).

Неважно, является ли выход влево из рассматриваемой ветки главным или одним из побочных (в конкретной ветке м.б. и только главный). Также понятно, что "каких-то" веток м.б. и более одной. Ну и к одноветочным циклам сказанное равно относится.

Что это значит для синтаксиса схем? Во-первых, надо иметь уникальные обозначения ВЦ (точнее, их петель, вписываемых в силуэт-кросс). Ну, это решено ещё до меня :) - недавно напоминал. Во-вторых, вложенные циклы (не только веточные) накладывают ограничения на возможность разрешать пересечения в теле схемы (не только силуэта). Если одновременно допустить - не всегда легко будет распознавать пересечения циклов. Впрочем, при адекватной разметке это м.б. проверено автоматически, видимо...
    Смежный вопрос - как всё-таки оформлять разделение большого силуэта между двумя и более диосценами? Разрыв "петли" блок-схемными соединителями м.б. неоптимален эргономически - не показывает сразу, какие ветки имеют связи с другими диосценами (надо восстанавливать, сличая все части). Поэтому здесь в Правиле 241 было предложено решение, логически унифицированное с ЕСКД - "внешние" контакты. Т.е. мы не разрываем силуэт - а рассматриваем его как систему силуэтов, неиерархически связанных через конкретные ветки. При этом все силуэты считаются выложенными в линию (порядок указывается сквозной индексацией веток).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Суббота, 18 Февраль, 2012 21:07 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
Эдуард Ильченко в сообщении viewtopic.php?p=70404#p70404 писал(а):
Вопрос Владимиру Паронджанову

В книге «Как улучшить работу ума» сказано
Цитата:
Ветка называется одноадресной, если она имеет одну икону “адрес”. Если все ветки одноадресные, силуэт считается одноадресным.

Цитата:
Веточные циклы образуются только в многоадресных силуэтах, в одноадресных их в принципе не может быть.

Значит ли это, что конструкция, показанная на рисунке ниже, некорректна (учитывая, что силуэт может не содержать икону «Конец»)?
Вложение:
Светофор.png


Уважаемый Эдуард Ильченко!

Огромное Вам спасибо за этот вопрос.

Дело в том, что Вы ударили в больное место.
Своим вопросом Вы очень метко и точно указали на слабое место.

На недостаток, который надо устранить.

В моих книгах Тезис 33 сохранялся в неизменном виде. Но сейчас —
благодаря Вашему критическому вопросу — я внес в него Ограничение
(см. красный шрифт).

Цитата:
Тезис 33. Удаление последней ветки – преобразование силуэта, при ко-
тором удаляется крайняя правая ветка. Этот прием используется при
описании бесконечного процесса, как показано в приме-
рах на рис. 140 и 148.

О г р а н и ч е н и е. В силуэте не может быть меньше двух веток.

Еще раз, большое спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Воскресенье, 19 Февраль, 2012 01:30 

Зарегистрирован: Понедельник, 09 Ноябрь, 2009 17:29
Сообщения: 904
Откуда: Россия, Питер
Владимир Паронджанов писал(а):
О г р а н и ч е н и е. В силуэте не может быть меньше двух веток.

Непонятно.
Почему силуэт не может состоять только из одной ветки?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно построить цикл?
СообщениеДобавлено: Воскресенье, 19 Февраль, 2012 17:06 

Зарегистрирован: Вторник, 20 Ноябрь, 2007 10:45
Сообщения: 31
Ильченко Эдуард писал(а):
Владимир Паронджанов писал(а):
О г р а н и ч е н и е. В силуэте не может быть меньше двух веток.

Непонятно.
Почему силуэт не может состоять только из одной ветки?

Ну наверное тогда он вырождается в "шампур".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Шампур-заготовки и схемы
СообщениеДобавлено: Воскресенье, 19 Февраль, 2012 17:20 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 1443
Потому, что это не силуэт уже будет, а "зацикленный" примитив... :) Как раз это и было разобрано в Драконографике.
Точнее, силуэт из одной полной ветки м.б. отождествлён с зацикленным, а из одной конечной - с простым примитивом. Термины анализа силуэта были введены здесь: http://drakonografika.narod.ru/L3/diost ... .html#n232.
    Это и было использовано при определении "правильной маршрут-схемы" в графит-методе с целью получения компактного инварианта примитива, силуэта и дейкстрала. Но там операции "зацикливания" были уточнены в сравнении с ШМ и сведены к удалению не ветки целиком, а только конечной вершины - с соответствующим замыканием вертикали на начало тела схемы (Правило 121). Т.к. удаление ветки удобно, только если она пустая (в частности, сразу после ввода заготовки). Иначе надо думать, что делать с уже непустым её телом...
У В.Д. можно найти мысль, как использовать именно в этом случае:
Паронджанов В.Д. в "Как улучшить..." на с. 226 писал(а):
... в целях экономии применяется следующий приём: в меню вводится только ...заготовка-силуэт..., а заготовка-примитив получается из неё в результате простой операции, описание которой мы для краткости опускаем.
Нетрудно понять, что эта простая операция и есть удаление целой ветки из заготовки силуэта. Причём, как я уже сказал, удаление любой из двух веток заготовки будет иметь смысл. :)

Да, кстати для анализа циклов и вообще структуры полезно перестраивать шампур-силуэт в компоновку с вертикальным порядком веток. Что обсуждалось здесь: http://drakonografika.narod.ru/L3/algos ... l#Doc-n322.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 67 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2008-2024, участники конференции «DRAKON.SU», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB