OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 18 Январь, 2020 12:20

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




Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Среда, 14 Октябрь, 2009 20:34 

Зарегистрирован: Среда, 13 Май, 2009 21:05
Сообщения: 109
Откуда: Саратов
По ходу дела возникли вопросы.
Из Дракон-схемы циклы делать как-то неудобно, как я понял. В связи с этим вопрос
- А почему цикл
While... DO
END;

Не сделать таким:

DO
что-то делаем
While...

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

И еще вопрос. Часто встречается в примерах, когда при проверке условия в циклах с постусловием вызывается какая-нибудь функция:

WHILE z< SIZE(simplerecord) DO
....
END;

Может быть с точки зрения быстродействия лучше было бы присваивать SIZE(simplerecord) какой-нибудь переменной, а не выполнять каждый раз вызов функции?
Понимаю, что на современных процессорах это не очень актуально, но как-то неаккуратненько это


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 14 Октябрь, 2009 20:48 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2320
Откуда: Россия, Томск
Бытко Сергей писал(а):
Может быть с точки зрения быстродействия лучше было бы присваивать SIZE(simplerecord) какой-нибудь переменной, а не выполнять каждый раз вызов функции?
Компилятор заранее знает размер simplerecord, поэтому выражение SIZE(simplerecord) на самом деле заменяется на константу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 14 Октябрь, 2009 20:50 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9170
Откуда: Россия, Орёл
Ну, есть цикл REPEAT-UNTIL. Но с ним неудобно, что у него обратное условие. Пользуюсь очень-очень редко им; а когда пару раз использовал - с непривычки путался на этом :)

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

По поводу построения циклов (в программах) почитайте здесь:
http://oberoncore.ru/wiki/start
Базовые паттерны циклов
и
Пример доказательного построения процедуры.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 14 Октябрь, 2009 20:51 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2320
Откуда: Россия, Томск
По поводу цикла вопрос не совсем понял. В КП есть цикл с постусловием:
REPEAT
...
UNTIL <условие выхода>
Выполняется как минимум один раз, так как нет условия на вход. Заканчивается выполнение тогда, когда <условие выхода> станет истинным.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 14 Октябрь, 2009 21:06 

Зарегистрирован: Среда, 13 Май, 2009 21:05
Сообщения: 109
Откуда: Саратов
Александр Ильин писал(а):
По поводу цикла вопрос не совсем понял. В КП есть цикл с постусловием:
REPEAT
...
UNTIL <условие выхода>

Про этот цикл я как-то забыл, честно говоря...)))
Первоначальный мотив высказывания был такой - надо как-то сделать чтобы из Дракон-схемы циклы получались бы естественным образом при сборке текста. В настоящее время, как я понял, с этим проблемы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 15 Октябрь, 2009 22:08 

Зарегистрирован: Среда, 13 Май, 2009 21:05
Сообщения: 109
Откуда: Саратов
Вчера я высказался, неграмотно, по поводу перевода циклов из Дракона непосредственно в текст программы.
Пришел к выводу, что лучше всего для этого подходит использование оператора CASE.

Проходило сообщение, что у лондонских таксистов чрезмерно развиты доли мозга, отвечающие за ориентацию в пространстве.
Допускаю, что у матерых программистов также развиты доли мозга, отвечающие за построение всяких вложенных циклов :D
Но у меня (по крайней мере, пока) - такие области не так развиты. К чему этот плач?
Из приведенной выше схемы я вывел 2 варианта - один с использованием вложенных циклов, 2-й - с использованием оператора CASE. Так вот - 2-й вариант показался мне более удобным, а времени на его написание ушло гораздо меньше. Думаю, что и трансляция Дракон-схем в готовый текст с использованием CASE облегчится. В конце-то концов - если будет автоматический перевод схемы в текст, то какая разница, что в этом тексте?!
Вот примеры:

Код:
PROCEDURE  ReadObjToArr; (* Этот вариант разрывает мне мозг*)

BEGIN
   obj:=Files.dir.Temp(); objr:=obj.NewReader(NIL); objw:=obj.NewWriter (NIL);
   star.SetPos(0);
   fr.SetPos(0);
   
   WHILE  star.Pos()<sta.Length()  DO
      ProbaRecIO.RecFromFile (st,star);
      IF  ~st.del  THEN
         fr.SetPos(st.fstart);
         LOOP (*1*)
            ProbaRecIO.RecToFile (rec,fw);
            IF  fr.Pos()>st.fend  THEN EXIT END;
            IF  rec.tag='против'   THEN
               objr.SetPos(0);
               LOOP (*2*)
                  ProbaRecIO.RecFromFile (o,objr);
                  IF  rec.tagcontext$=o$  THEN EXIT END;
                  IF  objr.Pos()>=obj.Length()  THEN
                     o:=rec.tagcontext$;
                     objw.SetPos(obj.Length());
                     ProbaRecIO.RecToFile (o,objr);
                  END; (*objr.Pos()=>obj.Length()*)
               END;(*2*)
            END; (* rec.tag='против'*)
         END; (*loop 1*)         
      END; (*~sta.del*)
   END; (* star.Pos()<sta.Length()*)
END ReadObjToArr;


Код:
PROCEDURE  ReadObjToArr2;   (*А этот хоть длиннее, но гуманнее*)
   VAR adr: INTEGER;
BEGIN
adr:=1;
   LOOP
      CASE  adr  OF
      1  :   obj:=Files.dir.Temp();
            objr:=obj.NewReader(NIL);
            objw:=obj.NewWriter (NIL);    
            star.SetPos(0);
            fr.SetPos(0);
            adr:=2
      | 2 : WHILE  star.Pos()<sta.Length()  DO
               ProbaRecIO.RecFromFile (st,star);
               IF  ~st.del  THEN
                  fr.SetPos(st.fstart);
                  adr:=3
               END;
            END;
      | 3 : ProbaRecIO.RecToFile (rec,fw);
            IF  fr.Pos()>st.fend  THEN
               adr:=2;
            ELSE
               IF rec.tag='против' THEN
                  objr.SetPos(0);
                  adr:=4;                  
               ELSE
                  adr:=3;
               END;               
            END;
      | 4: ProbaRecIO.RecFromFile (o,objr);
            IF  rec.tagcontext$=o$  THEN
               adr:=3;
            ELSE
               IF  objr.Pos()<obj.Length()  THEN
                  adr:=4;
               ELSE
                  o:=rec.tagcontext$;
                  objw.SetPos(obj.Length());
                  ProbaRecIO.RecToFile (o,objr);
                  adr:=4;
               END;
            END;
      | 5 : EXIT;
      
      END; (* CASE*)
   
   END; (*LOOP*)
   
END ReadObjToArr2;


Вложения:
Комментарий к файлу: Схема на Драконе
3.png
3.png [ 30.1 КБ | Просмотров: 6843 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 15 Октябрь, 2009 22:40 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9170
Откуда: Россия, Орёл
Сергей, без пояснений относительно объектов (sta, st...) трудно с ходу (и с усталости) понять, что Вы хотите сделать в этой процедуре.

Такой ужас с LOOP однозначно наворачивать не стоит; да и на несколько процедур наверняка поделить можно. Там примитивнейшие WHILE должны быть.

Давайте попробуем перетряхнуть :) Только поясните, что Вы делаете.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 16 Октябрь, 2009 00:08 

Зарегистрирован: Среда, 13 Май, 2009 21:05
Сообщения: 109
Откуда: Саратов
Пояснения. Есть список тегов ко всем составам преступлений. На один состав - несколько тегов, например - чему причиняется вред, кто потерпевший, каким способом совершено преступление и т.п. (10-15- и больше тегов к одному составу). Этот список хранится в массиве F.

В списке STA хранится список составов преступлений, удовлетворяющих условию поиска. Записи из этого списка считываются в st.
st.fstart - позиция, начиная с которой в массиве F хранятся все теги к определенному составу. СОответственно st.fend - конечная позиция в массиве F для тегов данного состава.
Флаг st.del показывает удовлетворяет ли запись условиям поиска или нет. В начале работы - для всех записей st.del=FALSE

Obj - список тегов, характеризующих объекты посягательства (на что направлено преступление). (Вообще подобных массивов будет несколько - для способов совершения преступления, для описания потерпевших и т.д.)
Записи в данный массив считываются для всех составов преступлений, удовлетворяющих условию поиска (st.del=FALSE).

Соответственно в дальнейшем при поиске выбирается нужный тег, например, для объекта посягательства. Далее по этому тегу ищутся в массиве F записи с такими же тегами, считываем из этих записей № статей, в массиве sta флаг для статей не удовлетворяющих условию поиска переводим в TRUE

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 16 Октябрь, 2009 19:32 

Зарегистрирован: Среда, 13 Май, 2009 21:05
Сообщения: 109
Откуда: Саратов
Код:
TYPE simplerecord= RECORD (*запись, считываемая из файла CSV. Использование CSV - временная мера, позже надеюсь сделать в блакбоксе редактор и теги забивать непосредственно в нем*)
      stnum: ARRAY 6 OF CHAR; (*№ статьи*)
      partnum: CHAR; (* № части статьи*)
      pnum: CHAR; (* № пункта соответствующей части статьи*)
      tag: ARRAY 30 OF CHAR; (* тег - точнее вид определенного тега*)
      tagcontext: ARRAY 256 OF CHAR; (*собственно тег*)
   END;
   
   TYPE strec= RECORD (*запись, заносимая в список составов, удовлетворяющих условию поиска*)
      stnum: ARRAY 6 OF CHAR;
      partnum: CHAR;
      pnum: CHAR;
      del:BOOLEAN;
      fstart:INTEGER;
      fend:INTEGER;
   END;
      
   TYPE objrec=ARRAY 256 OF CHAR; (* наверное, надо добавить флажок, чтобы определять использовать ли соответствующий тег или нет*)

   VAR rec:simplerecord;
         st:strec;
         o:objrec;
         eof: BOOLEAN;
          f,sta,obj:Files.File; fw,staw,objw:Files.Writer; fr,star,objr: Files.Reader;
            


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 17 Октябрь, 2009 08:16 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9170
Откуда: Россия, Орёл
Посмотрел - не могу пока вникнуть в Вашу затею (впрочем, мозг у меня на этой неделе далеко не в лучшем состоянии, ввиду усталости). А навязывать сразу своё, не поняв, что именно хочет человек, я считаю неправильным. Это касается общей организации данных и работы с ними. Не могу понять, какую логику "кэширования" в sta Вы собрались задействовать (на приведённой схеме она совершенно непонятна; отсюда зверские циклы, и т.п.) Наверное, пока откажитесь от этого убыстрения, давайте проясним структуру программы для просто поиска в основном файле (а она будет простой), а дальше можно будет, если нужно, улучшить аккуратными изменениями.

Общая организация алгоритма должна быть такого характера:

Код:
PROCEDURE RegisterTag;
   (* Если тега ещё нет в файле obj, то регистрируем его там *)
   VAR o: ObjRec;
BEGIN
   objr.SetPos(0);
   (* Базовая схема цикла "линейный поиск" *)
   ProbaRecIO.RecFromFile(o, objr);
   WHILE ~objr.eof & ~( rec.tagcontext = o.obj ) DO
      ProbaRecIO.RecFromFile(o, objr)
   END;
   IF objr.eof THEN (* Если не нашли... *)
      o.obj := rec.tagcontext$;
      objw.SetPos(obj.Length());
      ProbaRecIO.RecToFile(o, objw)
   END
END RegisterTag;

... ещё процедуры ...

PROCEDURE Open;
BEGIN
   obj := Files.dir.Temp();
   objr := obj.NewReader(NIL);
   objw := obj.NewWriter(NIL);
   star.SetPos(0);
   fr.SetPos(0);
END Open;

PROCEDURE ReadTags;
   VAR st: StRec;
BEGIN
   (* А здесь делаем просто полный проход от начала до конца с фильтрацией IF-ом по признаку *)
   ProbaRecIO.RecFromFile(st, star);
   WHILE ~o.star.eof DO
      IF st.del # TRUE THEN
         Вызов_ещё_какой_то_процедуры
      END;
      ProbaRecIO.RecFromFile(st, star)
   END   
END ReadTags;


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 17 Октябрь, 2009 08:20 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9170
Откуда: Россия, Орёл
И на уровне программирования точно оставьте в покое ДРАКОН. Он тут совершенно не нужен; но уже спровоцировал Вас на использование неадекватных задаче средств (автоматных циклов; вместо пошагового уточнения "сверху вниз" в процедуры с обычными WHILE).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 19 Октябрь, 2009 22:46 

Зарегистрирован: Среда, 13 Май, 2009 21:05
Сообщения: 109
Откуда: Саратов
Вот файл тегов для составов преступлений. Составов немного - ст. с 105 по 132, а тегов уже 1063


Вложения:
Комментарий к файлу: теги
Export.zip [5.56 КБ]
Скачиваний: 210
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Октябрь, 2009 15:53 

Зарегистрирован: Среда, 13 Май, 2009 21:05
Сообщения: 109
Откуда: Саратов
Столкнулся со следующей проблемой:
выводится форма на которой имеется несколько выпадающих списков, в каждом из которых содержатся теги соответствующего вида.
Мне хотелось бы добиться, чтобы при выборе элемента в любом из списков сразу бы, без нажатия каких-либо управляющих кнопок, вызывалась некая процедура.
Смысл в том, чтобы не дать пользователю выбрать больше одного элемента за раз.
Не подскажите, как это можно сделать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Октябрь, 2009 15:54 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9170
Откуда: Россия, Орёл
Посмотрите в тексте ББ про формы раздел про Notifiers (уведомители).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Октябрь, 2009 22:14 

Зарегистрирован: Среда, 13 Май, 2009 21:05
Сообщения: 109
Откуда: Саратов
Вот некоторые промежуточные результаты. Что здесь: это модуль "Квалификация преступлений". Файл Base.txt из архива надо поместить в папку где находится блэкбокс.
Запускается программа коммандером из файла kval.odc (ниже текста программы).
Поиск нужного состава из УК производится последовательным уточнением признаков -
выбирается радиокнопкой нужный признак - затем из списка выбирается нужный контекст и нажимается кнопка "искать"

Место и роль квалификации преступлений можно посмотреть из схем, размещенных в ветке "Уголовное право в Дракон-схемах".

Что в этом модуле еще хотелось бы сделать, так это
1. Выводить текст УК, соответствующий найденной статье, а также выводить экспертную информацию - тексты из учебников, материалы судебной практики.
Но как это сделать - пока не знаю, жду Ваших советов

PS Нужно будет еще оптимизировать размер базы, думаю раза в 3 можно будет ужать.

PPS База пока пробная. Всего в ней 1063 записи о преступлениях, предусмотренных ст. 105-132 УК. Сейчас привлек студентов своих отличников - помогут мне в набивании базы данных.


Вложения:
PROBA.zip [94.86 КБ]
Скачиваний: 264


Последний раз редактировалось Бытко Сергей Пятница, 30 Октябрь, 2009 22:49, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Октябрь, 2009 22:48 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9170
Откуда: Россия, Орёл
Мне программа понравилась :)

Просто и работает; что ещё надо?

Внутри устроено вполне аккуратно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Октябрь, 2009 23:12 

Зарегистрирован: Воскресенье, 04 Ноябрь, 2007 23:01
Сообщения: 151
Весьма наглядно и просто. Хороший результат.

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

1 и 2 - чисто технические детали, насчёт 3 - пока непонятно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Октябрь, 2009 23:21 

Зарегистрирован: Среда, 13 Май, 2009 21:05
Сообщения: 109
Откуда: Саратов
Рэйлвэй Каген писал(а):
3. если налицо букет статей, выбор, видимо, может стать не так прост.



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


Последний раз редактировалось Бытко Сергей Пятница, 30 Октябрь, 2009 23:38, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Октябрь, 2009 23:36 

Зарегистрирован: Воскресенье, 04 Ноябрь, 2007 23:01
Сообщения: 151
Бытко Сергей писал(а):
..Модуль же должен, как я представляю, помочь сориентироваться и дать экспертную помощь.
Но всё-таки, для сложного случая, получившийся набор тегов может быть формализован в несколько наборов статей? Соответственно и результат показан..?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Октябрь, 2009 23:44 

Зарегистрирован: Среда, 13 Май, 2009 21:05
Сообщения: 109
Откуда: Саратов
Рэйлвэй Каген писал(а):
Но всё-таки, для сложного случая, получившийся набор тегов может быть формализован в несколько наборов статей? Соответственно и результат показан..?

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


Тут даже специалист навскидку не скажет сколько преступлений, надо хорошенько посчитать.


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

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


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

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


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

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