DRAKON.SU
https://forum.drakon.su/

Пример алгоритма на ДРАКОНе
https://forum.drakon.su/viewtopic.php?f=178&t=957
Страница 2 из 4

Автор:  Александр Ильин [ Суббота, 19 Апрель, 2008 16:31 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Axcel писал(а):
Что касается цикла, может лучше так?
Это будет неправильно, поскольку в вашем варианте проверка IdentChar выполняется перед ReadPrev, а не после. Прокрутите мысленно первую итерацию цикла: IdentChar выполняется два раза подряд, без ReadPrev между вызовами. Это значит, что r.ch не меняет значение. Кроме того, по этой же причине в id.name может быть записан лишний символ, не удовлетворяющий условию IdentChar.

Автор:  Axcel [ Суббота, 19 Апрель, 2008 18:07 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Да, действительно. Тогда, если следовать схеме с LOOP, то
Код:
      LOOP
         IF (IdentChar (r.ch))
         THEN id.name [i] := r.ch END 
         ELSE EXIT END;;
         DEC (i);
         IF (i >= 0)
         THEN  r.ReadPrev  END 
         ELSE EXIT END
       END
   END

Ну, с циклом Вы наверно сами разберетесь. Или Вы хотите сказать, что имено Дракон-схема обеспечила Вам "глубокое понимание".

Автор:  Илья Ермаков [ Суббота, 19 Апрель, 2008 18:33 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

И таки задачка автоматная. И нечего тут мудрить с циклами :-)

Автор:  Владимир Паронджанов [ Суббота, 19 Апрель, 2008 20:42 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Уважаемый Геннадий Тышов!

Вы сделали великое дело. Создали дракон-редактор. И смело показали его в открытом доступе. Вы сделали это ПЕРВЫМ. Огромное Вам спасибо.

Благодаря Вам появилась возможность превратить Дракон из туманной абстракции в конкретный факт. Попробовать его на зуб. Пощупать руками. Попинать ногами. Более тщательно выявить его недостатки. И обрушить на него новую волну критики. А критика — это величайшая ценность, которая позволяет двинуть дело вперед.

Ваш редактор в некоторых отношениях ПРЕВОСХОДИТ наш редактор. Ваш редактор имеет БОЛЕЕ РАЗВИТУЮ СИСТЕМУ РАБОТЫ С УЗЛАМИ И ЛИНИЯМИ.
У нашего, конечно, тоже есть достоинства — он полностью отработан, вылизан и работает, как часы. Но это мелочь.

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

Но есть одно замечание, которое мне хотелось бы высказать уже сейчас.

Отвечая Александру Ильину, Вы сказали (Пятница, 18 Апрель, 2008 21:42):

    «Вы успешно осваиваете Дракон-редактор. Надо освоить объединение линий, икона "Конец" должна находиться на одной вертикали (шампуре) с заголовком».
Конечно, Вы правы. Правило шампура — важное правило языка Дракон. И его, конечно, надо соблюдать.

Однако здесь есть одно «но». Причем очень важное.

Александр Ильин — это ЦАРЬ. Не царское это дело — помнить и соблюдать дурацкие правила. ЦАРЬ должен МЫСЛИТЬ. А помнить и соблюдать правила должен НЕГР. Негром является дракон-редактор.

Задача состоит в том, чтобы воспитать такого негра. Беда в том, что ваш негр — большой либерал. Он дает царю слишком много свободы. Позволяет ему делать явные глупости. В результате царь оказывается в неудобном положении. Это плохо. Это неуважение к царю. Потому что царь не должен ошибаться. Ведь он — царь. Цари не ошибаются.

Негр должен быть не либералом, а цербером. Допустим, царь по забывчивости или по другой причине собирается совершить ошибку. Цербер должен в зародыше пресекать такие попытки. То есть полностью исключать возможность ошибочных действий (ошибок графического синтаксиса).
В частности, любые попытки царя нарушить «правило шампура» НЕ ДОЛЖНЫ исполняться. Независимо от того, что хочет или не хочет царь, правило шампура должно соблюдаться АВТОМАТИЧЕСКИ.
К сожалению, для примитива Ваш редактор эту задачу не решает. А он обязан ее решать.

Ни в коем случае нельзя загружать ЦАРЯ подобной черновой работой.
Повторю еще раз: не царское это дело! Надо создать для царя по-настоящему ЦАРСКИЕ условия. То есть обеспечить для него максимальный интеллектуальный комфорт.

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

Это с одной стороны. А с другой, либерализм вашего негра — большое достоинство. Например, Илья Ермаков хочет разместить элементы так, как ему нужно для наглядности. Негр не повинуется — Илья недоволен. Цитирую (Илья Ермаков Пятница, 18 Апрель, 2008 21:00):

    «Позиции элементов не сохраняются (не могу выровнять операторы в разных ветках относительно друг друга — всё равно сбрасываются)».

Илья прав — негр должен исполнять РАЗУМНЫЕ приказы царя.
Так что задача существенно усложняется: с одной стороны негр должен быть цербером, с другой — либералом. Это не так просто. Можно ли этого добиться? Полагаю, да. Но как это сделать?

Рискуя ошибиться, изложу свое понимание проблемы. In my humble opinion, решение состоит в следующем. Редактор должен работать в двух режимах. Назовем их:
    • цербер-режим,
    • либерал-режим.

На первом этапе по умолчанию выбирается цербер-режим. В чем его суть? Редактор работает как цербер-автомат. Либерализм категорически запрещен. Шаг налево, шаг направо — расстрел. На этом этапе пользователю запрещено работать с узлами и линиями.
Но! Это вовсе не значит, что каких-то узлов и линий не будет. Вовсе нет. В цербер-режиме формируется ПОЛНОСТЬЮ ЗАКОНЧЕННАЯ дракон-схема. Которая полностью соответствует правилам языка Дракон, описанным в моей книге.
Если речь идет о программировании, формируется ПОЛНОСТЬЮ ЗАКОНЧЕННЫЙ код программы. (Например, в том смысле, как это делает Александр Ильин).

В конце исполнения цербер-режима формируется логически правильная, но, возможно, недостаточно удобная дракон-схема. Которую, надо подправить вручную с помощью дракон-редактора. Например, сделать некоторые предусмотренные у Тышова операции с узлами и линиями. Чтобы сделать схему «покрасивее», чем это сделал цербер. Или, например, расположить элементы так, как хочет Илья Ермаков.

Для этой цели следует перейти в либерал-режим.

В либерал-режиме изменяется (улучшается) только графика. Алгоритм и программный код на выходе редактора НЕ МОГУТ ИЗМЕНЯТЬСЯ. Такие изменения блокируются.

Иными словами, в либерал-режиме разрешаются только косметические улучшения графики, которые никак не влияют на алгоритм и программный код. Они (алгоритм или код) остаются инвариантом относительно проводимых графических преобразований.

Сказанное мною следует воспринимать с осторожностью по следующим причинам.
    1. Геннадий Тышов выбрал непривычный для меня алгоритм работы дракон-редактора. Анализируя этот новый для меня стиль, я мог что-то не понять и ошибиться в суждениях.
    2. Наш редактор работает только в цербер-режиме. Он не умеет делать либерал-операции.
    3. В моей книге описан только цербер-режим работы дракон-редактора. В ней, насколько я помню, ничего не говорится о либерал-операциях (в явном виде).
    4. Я давно мечтал о либерал-операциях, но по разным причинам мне не удалось добиться их реализации в нашем редакторе.
    5. Поэтому мои рассуждения о либерал-операциях не опираются на опыт практической работы. И следовательно, могут содержать ошибки.
    6. Геннадий Тышов продемонстрировал, что его редактор умеет выполнять некоторые либерал операции. Этот неожиданный для меня факт является воплощением моей старинной мечты. Но Тышов заплатил за либерализацию неоправданно высокую цену — он ухудшил характеристики цербер-режима. В результате этого некоторые операции, которые должны выполняться автоматически, возлагаются на пользователя, что провоцирует ошибки.
    7. Терминологию я выдумывал на ходу. Извините, если коряво получилось.

Автор:  Евгений Темиргалеев [ Суббота, 19 Апрель, 2008 21:40 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Владимир Паронджанов писал(а):
Наш редактор работает только в цербер-режиме. Он не умеет делать либерал-операции.
Я думал, что ваш редактор сам располагает элементы схемы по таким правилам, что дальше красоту наводить не надо. Если схемы из Вашей книги сделаны в вашем редакторе, то, мне кажется, либерал режим и не нужен...

Автор:  Александр Ильин [ Суббота, 19 Апрель, 2008 22:01 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Axcel писал(а):
Или Вы хотите сказать, что имено Дракон-схема обеспечила Вам "глубокое понимание".
Формат работы с Дракон-схемой одновременно и вынудил, и помог мне избежать дублирования логических блоков кода (будь то проверки или другие элементарные действия). При записи алгоритма в линейный текст выяснилось, что приходится дублировать, "зеркалить" некоторые элементарные блоки, тем самым "замыливая", делая менее отчётливой логическую структуру алгоритма. Дракон помог мне записать алгоритм в более свободной форме, ближе соотносящейся и точнее отражающей моё внутреннее представление.

А LOOP я вообще не использую, равно как и FOR. Недавно в чужом коде натолкнулся на вот такой LOOP:
Код:
LOOP
   IF WinEvent.GetModal (App.objEditWin) # Commands.Ok THEN EXIT END;
   IF App.obj.classId = -1 THEN App.objEditWin.Hide; Template.Show (App.obj.name); RETURN;
   ELSE Classes.CreateObject (App.objScrollWin, App.obj.classId, itm, po); EXIT END;
END; (* loop *)
Выполняется этот LOOP, как можно понять, только один раз, а первый EXIT - ни что иное как GOTO, перепрыгивающее второй IF. По моим наблюдениям, в подавляющем большинстве случаев благодаря использованию LOOP достигается мизерная экономия вычислительных ресурсов (чаще - чуть уменьшается объём кода или сокращается текст программы), но всегда ценой существенного понижения читабельности и ясности структуры алгоритма.

Автор:  ==== [ Воскресенье, 20 Апрель, 2008 10:23 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Евгений Темиргалеев писал(а):
Владимир Паронджанов писал(а):
Наш редактор работает только в цербер-режиме. Он не умеет делать либерал-операции.
Я думал, что ваш редактор сам располагает элементы схемы по таким правилам, что дальше красоту наводить не надо. Если схемы из Вашей книги сделаны в вашем редакторе, то, мне кажется, либерал режим и не нужен...
О либерал-операциях в Дракон-редакторе:
В выбранной схеме, взаимное размещение элементов относительно друг друга (по критерию: левее, правее, выше, ниже) можно изменить вручную. Для этого выбирается и сдвигается (клавишами Ctrl+стрелки) элемент или узел и соответственно вся вертикаль или горизонталь. Потом выполните коррекцию: пункт меню "Обновить схему". Коррекция выполняется неявно при выполнении других операций.

При коррекция взаимное размещение не изменяется. Программно устраняются наложения элементов и линий различных вертикалей или горизонталей путем их сдвига. Сокращаются или увеличиваются промежутки между элементами и линиями до установленной величины. Коррекция производится сначало для всех вертикалей, потом для всех горизонталей. Для схемы "Силуэт", иконки "Заголовок" выравнивается по верхней линии, "Адрес" выравнивается по нижней линии.

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

Автор:  Александр Ильин [ Воскресенье, 20 Апрель, 2008 10:48 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Геннадий Тышов писал(а):
В выбранной схеме, взаимное размещение элементов относительно друг друга (по критерию: левее, правее, выше, ниже) можно изменить вручную....
При коррекция взаимное размещение не изменяется.
Вот вам пример из приведённого в первом сообщении алгоритма - процедура SkipBack. Я уже писал, что самое лучшее, что я обнаружил для себя в Драконе, - это однозначное отображение структуры аглоритма без дублирования блоков. Так вот, в процедуре SkipBack я продублировал вызов r.ReadPrev только потому, что редактор не позволил мне создать корректную схему. Вот так она должна была бы выглядеть по первоначальной задумке (данная картинка получена ручным перемещением элемента "SkipSquareBrackets" налево, а элемента "r.ReadPrev" - направо):
Вложение:
Комментарий к файлу: Отлично, будет работать! Пересечений и наложений нет
SkipBackGood.PNG
SkipBackGood.PNG [ 5.66 КБ | Просмотров: 21094 ]
А вот, что редактор делает при выборе пункта "Обновить" в контекстном меню (либо автоматически при дальнейшей работе со схемой):
Вложение:
Комментарий к файлу: Ой, блоки поменялись местами, и появились пересечения
SkipBackRefreshed.PNG
SkipBackRefreshed.PNG [ 5.51 КБ | Просмотров: 21092 ]
Выходит, что при коррекции взаимное размещение элементов всё-таки меняется?

Автор:  ==== [ Воскресенье, 20 Апрель, 2008 11:58 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

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

Вложение:
.drt


Сообщение поправлено администратором.

Автор:  Владимир Паронджанов [ Воскресенье, 20 Апрель, 2008 18:19 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Vlad писал(а):

О! Совсем другое дело. Хотя я и не изучал Дракон. Мне кажется, что главное отличие - видимая структура.


Уважаемый Vlad!

Существует возможность "изучить" Дракон всего за 20 минут.
См. Паронджанов В.Д. Занимательная информатика. М.: Дрофа, 2007.
В книге дано упрощенное описание Дракона для детей. Есть в продаже.
Аннотацию можно посмотреть в сети.

P.S. С Вашей оценкой полностью согласен. Считаю ее очень меткой.
"Видимая структура" - очень хорошо сказано!

Автор:  Valery Solovey [ Понедельник, 21 Апрель, 2008 11:46 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Код:
   i := LEN (id.name);          (* текущий символ переменной *)
   (* r.ch                         предыдущий символ текста *)
   WHILE (i > 0) & IdentChar (r.ch) DO
      DEC (i);                  (* предыдущий символ переменной *)
      id.name [i] := r.ch;      (* присвоить предыдущему символу переменной предыдущий символ текста *)
      r.ReadPrev                (* символ перед предыдущим символом текста *)
   END;
А такой вариант подходит?

Автор:  Info21 [ Понедельник, 21 Апрель, 2008 17:17 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Valery Solovey писал(а):
А такой вариант подходит?


Вот!
Только помогает ли его найти графическое представление?
Что-то не пойму я, в чем преимущество по сравнению с хорошей индентацией.

Автор:  Владимир Паронджанов [ Вторник, 22 Апрель, 2008 13:09 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Уважаемые коллеги!

До сих пор комментарии были посвящены тщательному анализу и шлифовке решений, предложенных Александром Ильиным. Но есть иной подход, предложенный Ильей Ермаковым. У меня просьба: высказать свое мнение (желательно с аргументацией) по поводу идеи (схемы) Ермакова.

Автор:  Vlad [ Вторник, 22 Апрель, 2008 19:26 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Владимир Паронджанов писал(а):
Существует возможность "изучить" Дракон всего за 20 минут.
См. Паронджанов В.Д. Занимательная информатика. М.: Дрофа, 2007.
В книге дано упрощенное описание Дракона для детей. Есть в продаже.


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

Автор:  Александр Ильин [ Вторник, 22 Апрель, 2008 23:58 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Valery Solovey писал(а):
А такой вариант подходит?

Да! Отличный вариант! : ))

Автор:  Александр Ильин [ Среда, 23 Апрель, 2008 00:05 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Геннадий Тышов писал(а):
Надо получить Ваш файл и проверить его.
Я сформировал такой же и все нормально.

Вот, попробовал воспроизвести.

Вложения:
Комментарий к файлу: См. процедуру SkipBack
BadSkipBack.drt [8.45 КБ]
Скачиваний: 856

Автор:  Info21 [ Среда, 23 Апрель, 2008 06:59 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Valery Solovey писал(а):
А такой вариант подходит?

Но все равно что-то тут не то в этом цикле:
слишком хитроумная синхронизация хода по i и обратного хода по литерам.
Тупее должно быть.
Но надо объемлющую задачу смотреть.

Автор:  ==== [ Среда, 23 Апрель, 2008 21:49 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Александр Ильин писал(а):
Геннадий Тышов писал(а):
Надо получить Ваш файл и проверить его.
Я сформировал такой же и все нормально.

Вот, попробовал воспроизвести.
Александр, выполнил эквивалентные пребразования Ваших алгоритмов в соответствии с правилами ДРАКОНА (в моем понимании):
1. В схемах вида "Примитив" иконку "Конец" расположил на 1-й вертикали (шампуре) с иконкой "Заголовок".
2. Объединил линии приходящие в общие точки.
3. Соседние иконки "Действие" объединил в более крупные.
4. Логические выражения с несколькими переменными разнес в отделные иконки "Вопрос". В книге "Как ...." этому посвещена глава "ВИЗУАЛИЗАЦИЯ ЛОГИЧЕСКИХ ФОРМУЛ".
5. Для анализа нескольких значений переменной, использовал "Переключатель", аналог оператора CASE.
6. У Вас, процедура SkipBack непонятна:
- или имеется внутренний цикл, при этом должно быть 2 стрелки,
- или имеется вход в середину цикла от 2-й иконки "Вопрос", что недопускается.

Извините если, что неправильно понял или сказал.

Автор:  Valery Solovey [ Суббота, 26 Апрель, 2008 22:29 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Info21 писал(а):
Но все равно что-то тут не то в этом цикле:
слишком хитроумная синхронизация хода по i и обратного хода по литерам.
Тупее должно быть.
Но надо объемлющую задачу смотреть.
Я не совсем понимаю, что Вы имеете в виду под синхронизацией. По выложенным здесь условиям лично я, к сожалению, ничего более простого придумать не могу.

Проверка i является аномалией, поскольку это второстепенный элемент алгоритма. Гораздо удобнее (и правильнее) было бы опираться только на проверку символа (может быть частью имени или нет). Но для этого требуется заранее знать длину идентификатора в тексте и быть уверенным в том, что он не превышает длины id.name. В случае, когда длина идентификатора в тексте превышает длину поля id.name, выскочит трап. Этот факт повышает приоритет i.

Насколько я понимаю задачу Александра, по каким-то причинам нет хорошего способа определения длины. Проще совмещать это с распознаванием идентификатора.

Автор:  Александр Ильин [ Воскресенье, 27 Апрель, 2008 08:08 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Valery Solovey писал(а):
Насколько я понимаю задачу Александра, по каким-то причинам нет хорошего способа определения длины. Проще совмещать это с распознаванием идентификатора.
Да, длина идентификатора выясняется именно в процессе прохода. Собственно, для этого проход и нужен: найти идентификатор либо констатировать его отсутствие по какой-либо причине (в том числе - чрезмерная длина).

Страница 2 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/