Разработка алгоритмического и программного обеспечения ситуационного управления безопасностью магистральных газопроводов
Аварийные ситуации на магистральных газопроводах, их классификация. Характеристики аварий, причины их возникновения на объектах нефтегазового профиля. Методика анализа риска. Описание программы управления безопасностью магистральных газопроводов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 28.07.2009 |
Размер файла | 1,8 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Совокупность дедуктивного вывода, описание модели функционирования магистрального газопровода, связанных с ней программных модулей и закономерностей функционирования магистрального газопровода вместе с процедурами их проверки образуют интеллектуальный пакет прикладных программ. В виде такого пакета в данном случае выступает Коррелятор. Его основная компонента - набор логико-трансформационных правил вида:
, где
- описание фрагмента текущей ситуации, наличие которого определяет применимость логико-трансформационного правила;
- описание преобразуемого фрагмента;
- результирующее описание нового фрагмента описания.
Если рассматривать , и как дескрипторы, а как некоторый спецификатор, то легко установить соответствие между функциональными моделями и набором логико-трансформационных правил, хранящихся в базе знаний.
В задаче управления безопасностью магистральных газопроводов переходы между состояниями в пространстве состояний недетерминированы, что отражает неполноту знаний о возможностях таких переходов. В этом случае дуги сети, на которой производится планирование, взвешиваются значениями функции принадлежности.
В идеале необходимо получить прогноз развития событий на уровне описания тех ситуаций, которые могут возникнуть в будущем. То есть необходимо получить экстраполяцию в виде перевернутого дерева, показанного на рис.3.5 Его корень соответствует ситуации на объекте в данный момент времени. Если в качестве решения планируется , то последующие ярусы дерева показывают те ситуации, в которые может попасть объект в результате реализации именно данного решения. Ветвление дерева соответствует той неопределенности, с которой можно представить процесс развертывания событий. Около каждой ситуации, лежащей на концевых ветвях дерева, проставлены оценки , характеризующие возможность такого исхода.
Рисунок 3.5 - Дерево экстраполяции управленческих решений.
Если в исходной ситуации кроме решения можно использовать некоторые другие решения, то для всех них строится имитационный процесс, порождающий свое дерево такого же типа, как на рис.3.5 Далее по некоторому решающему правилу оцениваются полученные в результате моделирования оценки и выбирается то решение , для которого решающее правило дает наилучший результат.
Особенность описанного метода состоит в том, что при моделировании каждый раз имеется описание получаемой ситуации, а, значит, ее можно классифицировать с помощью Классификатора и оценивать ее конфликтность или неконфликтность для управления объектом.
3.3 Схема программы управления безопасностью магистральных газопроводов
Схема программы формирования дерева событий и определения пути движения по нему (поиск наиболее вероятного сценария развития событий) приведена на рис.3.6.
Поиск наименее вероятного сценария развития событий осуществляется аналогично, с той лишь разницей, что рассчитывается минимальная вероятность для выбранного следствия, а затем выбирается наименьшая из текущей и предыдущей.
По этой же схеме определяется сценарий развития событий с максимальным /минимальным ущербом. Отличие состоит в том, что рассчитывается значение не вероятности, а возможного совокупного коэффициента ущерба.
Рисунок 3.6 - Схема процесса формирования дерева событий и поиска пути движения по нему.
4. Программное обеспечение ситуационного управления безопасностью магистральных газопроводов
4.1 Описание программы управления безопасностью магистральных газопроводов
Программа предназначена для работы в операционных средах MicroSoft Windows 98/NT/XP. Windows обеспечивает удобный и наглядный интерфейс для осуществления операций с файлами, дисками и т.д. А также позволяет приложениям взаимодействовать с дисплеем, клавиатурой, мышью вне зависимости от конкретной модели устройства. Такая независимость от аппаратуры позволяет одному и тому же приложению работать на компьютерах с различной аппаратной конфигурацией.
В качестве среды программирования была выбрана Delphi 7.
Данный язык создает программы для операционной системы Windows, обеспечивает полную поддержку всех возможностей предоставляемых системой. Язык является полностью объектно-ориентированным, что позволяет легко моделировать необходимые модули программы. Большинство необходимых визуальных элементов уже встроены в оболочку и легко переносятся в проект. Основная концепция Delphi - это многомодульность. Объектно-ориентированный язык Delphi 7 позволяет сократить количество межмодульных вызовов и уменьшить объем информации, передаваемой между модулями, по сравнению с модульным программированием.
Программное обеспечение "МАГ" представлено следующими модулями:
Модуль формирования узлов дерева;
Модуль обработки степени доверия;
Модуль вопросов об объектах;
Модуль использования правил базы знаний;
Модуль поиска пути движения по дереву.
Модуль формирования узлов дерева выполняет следующие функции:
1) создание нового узла в вершине дерева (см. рис.4.1);
Рисунок 4.1 - Схема создания нового узла в вершине дерева
2) вставка узла в дерево после указанного узла (см. рис.4.2);
Рисунок 4.2 - Схема процесса вставки узла в дерево после указаного.
3) поиск узла - осуществляется последовательным перебором всех узлов дерева;
4) просмотр узлов дерева - позволяет вывести на экран список всех объектов и их значений, содержащихся в базе данных.
Модуль обработки степени доверия позволяет:
1) добавлять коэффициент доверия для каждого значения объекта;
2) изменять существующий коэффициент доверия;
3) извлекать коэффициент доверия из пары "объект-значение".
Модуль вопросов об объектах выполняет следующие функции:
1) добавляет вопрос об объекте;
2) выводит существующий вопрос для заданного объекта;
3) позволяет пользователю ответить на вопрос об объекте.
Модуль использования правил базы знаний позволяет:
1) добавлять к текущему правилу предпосылку;
2) добавлять к текущему правилу заключение;
3) считывать правила из текстового файла и заносить его в список правил базы знаний.
Модуль поиска пути движения по дереву выполняет следующие функции:
1) выводит наиболее или наименее вероятный сценарий развития ситуации;
2) подсчитывает вероятности реализации событий;
3) подсчитывает возможный ущерб при реализации каждого сценария.
В базе знаний хранятся сведения обо всех ситуациях, складывающихся либо на объекте транспорта газа, либо во внешней среде и связанных с возникновением аварии. В программе понятие "ситуация" определено как "объект". Для каждой ситуации определяются возможные пути трансформации текущей ситуации в другие ситуации ("значения объекта"). Каждое значение тот или иной объект может принимать с определенной степенью доверия, которая выражается относительной величиной - коэффициентом доверия (изменяется в пределах от 0 до 100).
Кроме того, каждая ситуация характеризуется коэффициентом ущерба - некоторой неотрицательной величиной, определяющей сумму материальных затрат, направленных на ликвидацию последствий ситуации.
Основной модуль программы - MAG. dpr. Модуль MainUnit описывает процедуру формирования "дерева" и поиска возможных путей движения по нему. В текстовом файле rules. txt хранятся все факты базы знаний и правила движения по "дереву".
Текст программы приведен в приложении Б.
4.2 Руководство по эксплуатации
Для запуска программы необходимо выбрать файл MAG. exe. На экране появится главная рабочая форма программы (рис.4.3).
Рисунок 4.3 - Главная форма ПО "МАГ".
Для того, чтобы наполнить базу знаний фактами, необходимо ввести имена объектов, их возможные значения коэффициенты доверия и коэффициенты ущерба. После чего нажать кнопку "1. Добавление факта в базу знаний" (рис.4.4).
Рисунок 4.4 - Область добавления фактов в базу знаний
Для проверки наличия в базе объекта с определенным значением необходимо ввести в соответствующее поле имя объекта и значение, а затем нажать кнопку "2. Проверить факт из базы" (рис.4.5).
Рисунок 4.5 - Область проверки наличия фактов в базе
Просмотреть все имеющиеся в базе факты можно, нажав кнопку "3. Просмотр фактов базы знаний". При этом результаты отобразятся в окне "Ход выполнения" (рис.4.3).
Запись всех фактов в текстовый файл осуществляется при нажатии кнопки "Сохранить базу в файл".
Для каждого объекта возможно добавление вопроса. Для этого необходимо ввести имя объекта и вопрос, после чего нажать кнопку "4. Добавить вопрос объекта" (рис.4.6).
Рисунок 4.6 - Область добавления вопроса объекта.
Кнопка "5.1. Получить вопрос об объекте" позволяет определить заданный по конкретному объекту вопрос.
Для того, чтобы выбрать определенное значение ответа на вопрос, необходимо выбрать его порядковый номер и затем нажать кнопку "5.2. Ответить на вопрос об объекте" (рис.4.7).
Рисунок 4.7 - Область получения ответа на вопрос
Для определения наименее вероятного сценария развития событий необходимо ввести описание ситуации и нажать кнопку "6. Поиск наименее вероятного сценария развития событий". Результаты поиска отобразятся в окне "Ход выполнения".
Для определения наиболее вероятного сценария развития событий необходимо ввести описание ситуации и нажать кнопку "7. Поиск наиболее вероятного сценария развития событий". Результаты поиска отобразятся в окне "Ход выполнения".
Для поиска сценария с наименьшим возможным ущербом необходимо ввести описание ситуации и нажать кнопку "8. Поиск сценария с наименьшим ущербом". Результаты поиска отобразятся в окне "Ход выполнения".
Для поиска сценария с наибольшим возможным ущербом необходимо ввести описание ситуации и нажать кнопку "9. Поиск сценария с наибольшим ущербом". Результаты поиска отобразятся в окне "Ход выполнения".
Завершение работы программы осуществляется при нажатии кнопки "Выход".
4.3 Контрольный пример
Для начала работы с программой необходимо запустить файл MAG. exe. После запуска файла на экране появится главная форма (рис.4.3).
Сначала необходимо наполнить базу фактами. Для этого нужно ввести имена объектов, их возможные значения, коэффициенты доверия и коэффициенты ущерба.
Например, объект "ветер на здание", значение "концентрация <1%", коэффициент доверия 35, коэффициент ущерба 79.
Далее нажать кнопку "1. Добавление факта в базу знаний". Факт будет добавлен в базу знаний (рис.4.8).
Рисунок 4.8 - Добавление факта в базу знаний
Проверить факт на наличие в базе можно следующим образом. Ввести имя объекта ("ветер на здание") и его значение ("концентрация <1%"), затем нажать кнопку "2. Проверить факт из базы". В окне "Ход выполнения" появится информация "Факт верен" (рис.4.9).
Рисунок 4.9 - Проверка наличия факта в базе (факт имеется)
Если факт отсутствует в базе знаний (например, объект "ветер на здание" со значением "концентрация <10%"), то после нажатия кнопки "2. Проверить факт из базы" в окне "Ход выполнения" появится информация "Факт неверен" (рис.4.10).
Рисунок 4.10 - Проверка наличия факта в базе (факт отсутствует)
Чтобы просмотреть все имеющиеся в базе факты необходимо нажать кнопку "3. Просмотр фактов базы знаний". В окне "Ход выполнения" отобразятся все имеющиеся в базе факты (рис.4.11).
Рисунок 4.11 - Просмотр всех имеющихся в базе фактов
Для того, чтобы добавить вопрос объекта, необходимо ввести имя объекта, например "ветер на здание", и вопрос - "какова концентрация". После этого нажать кнопку "4. Добавить вопрос объекта" (рис.4.12).
Рисунок 4.12 - Добавление вопроса об объекте
Все имеющиеся в базе факты, включающие сведения об объектах, их значениях, коэффициентах доверия, коэффициентах ущерба и вопросах, можно сохранить в текстовый файл rules. txt. Для этого необходимо нажать кнопку "Сохранить базу в файл".
Файл rules. txt будет иметь следующее содержание - рис.4.13.
Рисунок 4.13 - Содержание файла rules. txt
Для того, чтобы получить вопрос об объекте, необходимо ввести имя объекта ("ветер на здание") и нажать кнопку "5.1. Получить вопрос об объекте". В поле "Вопрос" выведется имеющийся в базе вопрос о данном объекте ("какова концентрация").
Для установления конкретного (одного) значения объекта из нескольких имеющихся (например, значения "концентрация <1%" для объекта "ветер на здание") необходимо выбрать номер значения 2 и нажать кнопку "5.2. Ответить на вопрос об объекте" (рис.4.14).
Рисунок 4.14 - Установка ответа на вопрос
Для ситуации "выброс газа" определим наименее вероятный сценарий развития событий, наиболее вероятный сценарий развития событий, сценарий с наименьшим ущербом, сценарий с наибольшим ущербом.
При нажатии кнопки "6. Поиск наименее вероятного сценария развития событий" в окне "Ход выполнения" отобразятся все возможные варианты развития событий, наименее вероятный сценарий развития событий, его вероятность и коэффициент ущерба (рис.4.15).
Рисунок 4.15 - Поиск наименее вероятного сценария развития событий
При нажатии кнопки "7. Поиск наиболее вероятного сценария развития событий" в окне "Ход выполнения" отобразятся все возможные варианты развития событий (рис.4.15), наиболее вероятный сценарий развития событий, его вероятность и коэффициент ущерба (рис.4.16).
Рисунок 4.16 - Поиск наиболее вероятного сценария развития событий
Для того, чтобы определить сценарий с наименьшим ущербом, необходимо нажать кнопку "8. Поиск сценария с наименьшим ущербом". Результаты поиска отобразятся в окне "Ход выполнения" (рис.4.17).
Рисунок 4.17 - Поиск сценария с наименьшим ущербом
Для того, чтобы определить сценарий с наибольшим ущербом, необходимо нажать кнопку "9. Поиск сценария с наибольшим ущербом". Результаты поиска отобразятся в окне "Ход выполнения" (рис.4.18).
Рисунок 4.18 - Поиск сценария с наибольшим ущербом
Для окончания работы с программой необходимо нажать кнопку "Выход".
5. Техническое обеспечение
Программа функционирует на универсальной ПЭВМ. ПЭВМ имеют небольшие габариты, обладают большой мощностью и быстродействием.
Для реализации программного обеспечения "МАГ" необходим набор аппаратных средств со следующими минимальными техническими характеристиками:
процессор INTEL Pentium IV с тактовой частотой 1,5 ГГц,
объем оперативной памяти не менее 128 Мб;
жесткий диск объемом 2 Гб;
видеоадаптер SVGA;
клавиатура;
манипулятор мышь;
17" SVGA монитор.
Выбор данного комплекса технических средств обусловлен требованиями, предъявляемыми к надежному обеспечению безопасности магистральных газопроводов, а именно:
оперативность и качество принимаемых управленческих решений,
необходимость наличия обширной информации о возможных ситуациях, возникающих при предаварийной и аварийной работе магистрального газопровода.
Кроме того, выбранный комплекс технических средств отвечает требованиям программного обеспечения "МАГ" - требованиям выбранного языка Delphi 7.
Заключение
В данной выпускной квалификационной работе были рассмотрены принципы обеспечения безопасности магистральных газопроводов.
В частности, в ходе выполнения работы выделены основные характеристики и поражающие факторы аварий на объектах нефтегазового профиля. Кроме того, выделены причины возникновения аварий на объектах транспорта газа и причины роста числа таких аварий. Это позволило определить основные направления обеспечения безопасности магистральных газопроводов.
В работе были рассмотрены существующие методы анализа риска. В результате было установлено, что для реализации процесса управления безопасностью объектов транспорта газа целесообразно использовать логико-графические методы построения и анализа "дерева отказов" и "дерева событий".
Кроме того, проведен анализ риска, включающий следующие стадии:
идентификация опасностей - выделены основные присущие системе транспорта газа опасности;
анализ частоты аварий - построены "дерево отказов" и "дерево событий", рассчитаны вероятности и частоты реализации возможных сценариев;
анализ последствий аварий - оценено воздействие опасных факторов на имущество, людей, окружающую среду.
Для управления безопасностью магистральных газопроводов использован ситуационный подход, предполагающий выявление проблемных ситуаций и выполнение различных преобразований имеющейся информации в управленческие решения, приводящие к их разрешению.
На основе обработанной информации построен алгоритм поиска возможного пути развития аварийной ситуации на магистральном газопроводе.
Выбраны технические средства реализации процесса поиска возможного пути развития аварийной ситуации на магистральном газопроводе.
На базе выбранного комплекса технических средств данный алгоритм реализован программно. Корректность работы программы проверена на контрольном примере.
Правила пользования разработанным программным средством приведены в инструкции по эксплуатации программы.
Разработанная программа позволяет оперативно прослеживать ход развития аварийной ситуации на магистральном газопроводе, определять вероятности достижения системой интересующих оператора состояний.
Библиографический список
Анализ аварий и несчастных случаев на трубопроводном транспорте России: учеб. пособие для вузов/ Под ред. Б.Е. Прусенко, В.Ф. Мартынюка. - М.: Анализ опасностей, 2003. - 351 с.
Андриянова М.А. Управление риском эксплуатации потенциально опасных объектов. Автореферат диссертации на соискание ученой степени кандидата технических наук. Тулу, ТулГУ, 1999.
Арсеньев Ю.Н., Бушинский В.И., Фатуев В.А. Принципы техногенной безопасности производств и построения систем управления риском. ТулГУ, Тула, 1994. - 111 с.
Бушинский В.И., Охинько В.А., Смолин С.А., Кузьмина Н.В. Исследование влияния управления персоналом на безопасность жизнедеятельности человека. Монография. Воронеж, 1999. - 310 с.
Гражданкин А.И., Дегтярев Д.В., Лисанов М.В., Печеркин А.С. Основные показатели риска аварии в терминах теории вероятностей // Безопасность труда в промышленности. - 2002. - №7. - с.35-39
Захаров В. Интеллектуальные технологии в современных системах управления // Проблемы теории и практики управления. - 2005. - №4. - с.2-10
Кульечев В.М., Иванов Е.А., Дадонов Ю.А., Мокроусов С.Н. Трубопроводный транспорт природного газа, нефти и нефтепродуктов и его роль в обеспечении развития и стабильности топливно-энергетического комплекса // Безопасность труда в промышленности. - 2002. - №7. - с.4-10
Мартынюк В.Ф., Прусенко Б.Е. Защита окружающей среды в чрезвычайных ситуациях. Москва, 2003.
Мокроусов С.Н. Пути повышения безопасности работы нефтегазового комплекса и систем магистрального трубопроводного транспорта // Безопасность труда в промышленности. - 2005. - №1. - с.18-20
Поспелов Д.А. Ситуационное управление: теория и практика. - М.: Наука, 1986. - 288 с.
Саати Т., Кернс К. Аналитическое планирование. Организация систем. М.: Радио и связь, 1991. - 216 с.
Управление безопасностью магистральных газопроводов / В.А. Фатуев, С.А. Васин, В.И. Бушинский, В.М. Митин, К.А. Морозов; Под ред. д. т. н., проф., академика МАНЭБ В.А. Фатуева; изд.2-е; ТулГУ, М.: Недра, 2000. - 144 с.
Фатуев В.А., Митин В.М., Морозов К.А., Югфельд А.С. Теоретические основы построения систем управления риском опасных производств. - Учебное пособие. Тула, Тульский государственный университет, 2000. - 179 с.
Фатуев В.А., Морозов К.А., Югфельд А.С., Шадрин А.А. Обеспечение надежности магистральных газопроводов. - Тула: Гриф и К, 2003. - 130 с.
Чекинов Г.П., Чекинов С.Г. Ситуационное управление: состояние и перспективы // Информационные технологии. - 2004. - №2. -Приложение
Приложение А
Текст программы управления безопасностью магистральных газопроводов:
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Spin, ComCtrls;
const
word_max=100;
line_max=255;
colon=': ';
period='. ';
comma=',';
spase='';
equals='=';
nextrow=#13#10;
definite=100;
type
TMainForm = class (TForm)
Memo_Report: TMemo;
LE_Crash_Name: TLabeledEdit;
Bevel1: TBevel;
Bevel2: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
Bevel6: TBevel;
Bevel7: TBevel;
Label1: TLabel;
Label2: TLabel;
Bevel9: TBevel;
B_AddFact: TButton;
LE_AddFact_Frime: TLabeledEdit;
LE_AddFact_Value: TLabeledEdit;
LE_AddFact_Cf: TLabeledEdit;
B_TestFact: TButton;
LE_TestFact_Frime: TLabeledEdit;
LE_TestFact_Value: TLabeledEdit;
B_SeeFacts: TButton;
B_MakeFrimeMultivalid: TButton;
LE_MakeMulti_Frime: TLabeledEdit;
B_MakeLegal: TButton;
LE_MakeLegal_Frime: TLabeledEdit;
B_AddQuestion: TButton;
LE_AddQuestion_Frime: TLabeledEdit;
B_Answer: TButton;
LE_Answer_Frime: TLabeledEdit;
B_GetQuestion: TButton;
SE_Answer: TSpinEdit;
LE_Answer_Value: TLabeledEdit;
B_Answer_GetNumVals: TButton;
M_MakeLegal_Value: TMemo;
LE_AddQuestion_Value: TLabeledEdit;
LE_GetQuestion: TLabeledEdit;
B_GetTarget: TButton;
LE_GetTarget: TLabeledEdit;
Button1: TButton;
Bevel8: TBevel;
Button2: TButton;
Label3: TLabel;
procedure FormCreate (Sender: TObject);
procedure B_AddFactClick (Sender: TObject);
procedure B_TestFactClick (Sender: TObject);
procedure B_SeeFactsClick (Sender: TObject);
procedure B_MakeFrimeMultivalidClick (Sender: TObject);
procedure B_MakeLegalClick (Sender: TObject);
procedure B_AddQuestionClick (Sender: TObject);
procedure B_AnswerClick (Sender: TObject);
procedure B_GetQuestionClick (Sender: TObject);
procedure B_Answer_GetNumValsClick (Sender: TObject);
procedure LE_OnExit (Sender: TObject);
procedure M_MakeLegal_ValueExit (Sender: TObject);
procedure B_GetTargetClick (Sender: TObject);
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
word_string=string [word_max] ;
line_string=string [line_max] ;
value_ptr=^value;
legal_ptr=^legal_value;
frime_ptr=^frime;
value=record // значение
name: word_string; // Имя
cert: integer; // коэффициент доверия
next: value_ptr; // указатель на след. значение
end;
legal_value=record // Допустимое значение
name: word_string; // Имя
next: legal_ptr; // Указатель на следующее допуст. значение
end;
frime=record // Фрейм
name: word_string; // имя
question: line_string; // атрибут ("вопрос")
question: line_string; // атрибут ("вопрос")
multivald: boolean; // флаг многозначности
legal_list: legal_ptr; // указатель на 1ый элемент списка допустимых значений
sought: boolean; // флаг "найденности"
value_list: value_ptr; // указатель на 1ый элемент списка значений ("ответ (ы)")
next: frime_ptr // указатель на следующий фрейм
end;
prem_ptr=^prem;
con_ptr=^con;
rule_ptr=^rule;
prem=record // Предпосылка
frime: word_string; // имя фрейма
value: word_string; // имя значение
next: prem_ptr; // указатель на следующую
end;
con=record // заключение
frime: word_string; // имя фрейма
value: word_string; // имя значения
cert: integer; // коэффициент доверия
next: con_ptr; // указатель на следующее
end;
rule=record // правило
name: word_string; // имя
prem: prem_ptr; // указатель на предпосылку
con: con_ptr; // указатель на заключение
next: rule_ptr; // указатель на следующее
end;
var
MainForm: TMainForm;
last_try, // результат последнего поиска
top_fact: frime_ptr; // указатель на начало списка фреймов-объктов
top_rule: rule_ptr; // указатель на начало списка правил
rulesFile: TextFile;
explain: boolean;
procedure make_node (var curr_frime: frime_ptr);
function find_frime (f_frime: word_string): frime_ptr;
procedure split (f_line: line_string; var f_frime,f_value: word_string);
function test (f_frime,f_value: word_string): value_ptr;
procedure add_frime (f_frime,f_value: word_string);
procedure see_vals (curr_frime: frime_ptr; cf_on: boolean);
procedure see_frimes (cf_on: boolean);
function get_cf (f_line: line_string): integer;
function blend (cf1,cf2: integer): integer;
procedure add_cf (f_frime,f_value: word_string; cf2: integer);
function ok_add (f_frime: word_string; cf: integer): boolean;
procedure make_multi (f_frime: word_string);
function find_word (f_line: line_string; n: integer; var _word: word_string): boolean;
procedure add_legal (f_legal: word_string; curr_frime: frime_ptr);
function find_legal (f_frime: word_string; n: integer; var _word: word_string): boolean;
procedure make_legals (m_line: word_string);
procedure make_legals_from_form (f_frime: word_string);
procedure add_question (f_frime,s_value: word_string);
function p_question (f_frime: word_string): line_string;
procedure ask (f_frime: word_string; var f_value: word_string);
procedure p_read (var oline: line_string);
function add_prem (curr_prem: prem_ptr; f_line: line_string): prem_ptr;
function add_con (curr_con: con_ptr; f_line: line_string): con_ptr;
procedure p_rule (curr_rule: rule_ptr);
procedure enter_rule (rule_name: word_string);
procedure LoadFormFile;
procedure SaveToFile;
function find_rule (fri: word_string; curr_rule: rule_ptr): rule_ptr;
procedure pursue (f_frime: word_string);
procedure q_result (f_frime: word_string);
procedure explain_how (curr_rule: rule_ptr);
procedure explain_why (f_frime: word_string);
implementation
{$R *. dfm}
procedure make_node;
var
head: frime_ptr;
begin
new (curr_frime);
head: =top_fact;
top_fact: =curr_frime;
with curr_frime^ do begin
next: =head;
value_list: =nil;
question: ='';
legal_list: =nil;
multivald: =false;
sought: =false;
end;
end;
function find_frime;
var
curr_frime: frime_ptr;
begin
if (last_try<>nil) and (last_try^. name=f_frime)
then begin
Result: =last_try;
exit;
end
else begin
curr_frime: =top_fact;
last_try: =nil;
Result: =nil;
while (curr_frime<>nil) and (Result=nil) do begin
if (curr_frime^. name=f_frime)
then begin
Result: =curr_frime;
Last_try: =curr_frime;
exit;
end;
curr_frime: =curr_frime^. next;
end;
end;
end;
procedure split;
var
st_left,
st_right: integer;
begin
st_right: =pos (period,f_line);
if st_right=length (f_line) then f_line: =copy (f_line,1,st_right-1);
st_left: =pos (equals,f_line);
st_right: =pos (comma,f_line);
if ( (st_left=0) and (st_right=0)) then f_frime: =f_line;
if (st_right=0) then st_right: =length (f_line) +1;
if st_left>0
then begin
f_frime: =copy (f_line,1,st_left-1);
if pos (') ',f_frime) =0
then f_value: =copy (f_line,st_left+1,st_right-st_left-1);
end;
st_right: =pos (') ',f_frime);
Приложение А (продолжение)
if st_right>0 then f_frime: =copy (f_line,1,st_right-1);
end;
function test (f_frime,f_value: word_string): value_ptr;
var
curr_frime: frime_ptr;
curr_value: value_ptr;
begin
curr_frime: =find_frime (f_frime);
Result: =nil;
if curr_frime<>nil
then begin
curr_value: =curr_frime^. value_list;
while (curr_value<>nil) do begin
if curr_value^. name= f_value
then Result: =curr_value;
curr_value: =curr_value^. next;
end;
end;
end;
procedure add_frime (f_frime,f_value: word_string);
var
curr_frime: frime_ptr;
value_list,head: value_ptr;
begin
curr_frime: =find_frime (f_frime);
if curr_frime=nil
then begin
make_node (curr_frime);
curr_frime^. name: =f_frime;
end;
curr_frime^. sought: = true;
value_list: =test (f_frime, f_value);
if value_list=nil
then begin
head: =curr_frime^. value_list;
new (value_list);
with value_list^ do begin
next: =head;
cert: =0;
name: =f_value;
end;
curr_frime^. value_list: =value_list;
end;
end;
procedure see_vals;
var
curr_value: value_ptr;
cf: integer;
bufStr: string;
begin
curr_value: =curr_frime^. value_list;
bufStr: =curr_frime^. name+equals;
if curr_value=nil
then bufStr: =bufStr+' He определено';
while (curr_value<>nil) do begin
bufStr: =bufStr+curr_value^. name;
if (cf_on=true)
then begin
cf: =curr_value^. cert;
bufStr: =BufStr+' (Кд='+IntToStr (cf) +') ';
end;
curr_value: =curr_value^. next;
if curr_value<>nil then bufStr: =BufStr+','+NextRow;
end;
MainForm. Memo_Report. Lines. Add (BufStr);
end;
procedure see_frimes (cf_on: boolean);
var
curr_frime: frime_ptr;
begin
MainForm. Memo_Report. Lines. Add ('');
MainForm. Memo_Report. Lines. Add ('Просмотр фактов базы знаний: ');
curr_frime: =top_fact;
while (curr_frime<>nil) do begin
see_vals (curr_frime,cf_on);
curr_frime: =curr_frime^. next;
MainForm. Memo_Report. Lines. Add ('');
end;
end;
function get_cf;
var
resultat,
st_right: integer;
trim: line_string;
begin
Result: =definite;
st_right: =pos (period,f_line);
if st_right=length (f_line)
then f_line: =copy (f_line, 1,st_right-1);
st_right: =pos ('Кд',f_line);
if (st_right>0) and (st_right+3<line_max)
then begin
trim: =copy (f_line,st_right+3,length (f_line) - st_right-2);
val (trim,Result,resultat);
if result>0 then Result: =definite;
if pos ('Плохой',trim) >0
then Result: =25;
if pos ('Средний',trim) >0
then Result: =50;
if pos ('Хороший',trim) >0
then Result: =75;
if pos ('Абсолютный',trim) >0
then Result: =definite;
end;
end;
function blend;
begin
blend: = (100* (cf1+cf2) - (cf1*cf2)) div 100;
end;
procedure add_cf (f_frime,f_value: word_string; cf2: integer);
var
cf1: integer;
curr_value: value_ptr;
begin
curr_value: =test (f_frime,f_value);
cf1: =curr_value^. cert;
curr_value^. cert: =blend (cf1,cf2);
end;
function ok_add;
var
curr_frime: frime_ptr;
curr_value: value_ptr;
is_100: boolean;
begin
is_100: =false;
curr_frime: =find_frime (f_frime);
if curr_frime<>nil
then begin
curr_value: =curr_frime^. value_list;
while (curr_value<>nil) do begin
if curr_value^. cert=definite
then begin
is_100: =true;
break;
end;
curr_value: =curr_value^. next;
end;
end;
Result: =not ( (cf=definite) and (is_100) and (not (curr_frime^. multivald)));
end;
procedure make_multi;
var
curr_frime: frime_ptr;
begin
curr_frime: =find_frime (f_frime);
if curr_frime=nil
then begin
make_node (curr_frime);
curr_frime^. name: =f_frime;
end;
curr_frime^. multivald: =true;
end;
function find_word;
var
x, com_place: integer;
begin
Result: =false;
_word: ='';
for x: =1 to n do begin
com_place: =pos (comma,f_line);
if com_place=0
then begin
com_place: =length (f_line) +1;
Result: =true;
end;
_word: =copy (f_line,1,com_place-1);
f_line: =copy (f_line,com_place+1,length (f_line) - com_place);
end;
end;
procedure add_legal;
var curr_legal,head: legal_ptr;
begin
new (curr_legal);
curr_legal^. next: =nil;
curr_legal^. name: =f_legal;
head: =curr_frime^. legal_list;
if head<>nil
then begin
while (head^. next<>nil) do
head^. next: =curr_legal;
end
else
curr_frime^. legal_list: =curr_legal;
end;
function find_legal;
var
curr_frime: frime_ptr;
curr_legal: legal_ptr;
counter: integer;
begin
curr_frime: =find_frime (f_frime);
Result: =true;
if curr_frime<>nil
then begin
curr_legal: =curr_frime^. legal_list;
_word: =curr_legal^. name;
counter: =1;
if curr_legal=nil
then Result: =false;
while (curr_legal<>nil) and (counter<n) do begin
curr_legal: =curr_legal^. next;
if curr_legal<>nil
then begin
_word: =curr_legal^. name;
inc (counter);
end
else
Result: =False;
end;
end
else
Result: =False;
end;
procedure make_legals;
var
curr_frime: frime_ptr;
counter,
st_place: integer;
new_line: line_string;
_word,
f_frime,
dummy: word_string;
done: boolean;
begin
split (m_line,f_frime,dummy);
curr_frime: =find_frime (f_frime);
if curr_frime=nil
then begin
make_node (curr_frime);
curr_frime^. name: =f_frime;
end;
st_place: =pos (equals,f_frime);
new_line: =copy (f_frime,st_place+1,length (f_frime) - st_place);
counter: =1;
done: =false;
while not done do begin
done: =find_word (new_line,counter,_word);
add_legal (_word,curr_frime);
counter: =counter+1;
end;
end;
procedure make_legals_from_form;
var
curr_frime: frime_ptr;
i: integer;
begin
curr_frime: =find_frime (f_frime);
if curr_frime=nil
then begin
make_node (curr_frime);
curr_frime^. name: =f_frime;
end;
with MainForm. M_MakeLegal_Value do
If Lines. Count>0 then
for i: =0 to Lines. Count-1 do
add_legal (Lines [i],curr_frime);
end;
procedure add_question;
var
curr_frime: frime_ptr;
begin
curr_frime: =find_frime (f_frime);
if curr_frime=nil
then begin
make_node (curr_frime);
curr_frime^. name: =f_frime;
end;
curr_frime^. question: =s_value;
end;
function p_question;
var
curr_frime: frime_ptr;
begin
curr_frime: =find_frime (f_frime);
if curr_frime<>nil
then begin
if curr_frime^. question<>''
then
Result: =curr_frime^. question
else
Result: ='Вопрос объекта пуст';
еnd
else
Result: ='Объект в базе не найден';
end;
procedure ask;
var
pick,
num_vals: integer;
_word: word_string;
begin
if not find_legal (f_frime,1,_word)
then begin
MainForm. Memo_Report. Lines. Add ('Введите значение и нажмите кнопку "Выбрать"');
MainForm. B_Answer_GetNumVals. Enabled: =True;
while MainForm. B_Answer_GetNumVals. Tag=0 do
Application. ProcessMessages;
MainForm. B_Answer_GetNumVals. Tag: =0;
f_value: =MainForm. LE_Answer_Value. Text; // readln (f_value)
end
else begin
num_vals: =1;
with MainForm. Memo_Report. Lines do begin
Add ('Допустимые значения объекта "'+f_frime+'": ');
while find_legal (f_frime,num_vals,_word) do begin
Add (IntToStr (num_vals) +'. '+_word);
inc (num_vals);
end;
end;
MainForm. SE_Answer. MaxValue: =num_vals-1;
MainForm. Memo_Report. Lines. Add ('Выберите номер ответа и нажмите кнопку "Выбрать"');
MainForm. B_Answer_GetNumVals. Enabled: =True;
while MainForm. B_Answer_GetNumVals. Tag=0 do
Application. ProcessMessages;
pick: =MainForm. SE_Answer. Value; // ord (select [1]) - 48;
MainForm. B_Answer_GetNumVals. Tag: =0;
find_legal (f_frime,pick,_word);
f_value: =_word;
end;
end;
procedure p_read;
var
c: char;
len,
counter,
st_place: integer;
supress: boolean;
in_line: line_string;
begin
readln (RulesFile, in_line);
in_line: =AnsiLowerCase (in_line);
oline: ='';
len: =length (in_line);
st_place: =pos (' (', in_line);
if st_place>0
then len: =st_place;
supress: =false;
for counter: =1 to len do begin
c: =in_line [counter] ;
if (c=equals) and (pos ('вопрос',oline) >0)
then supress: =true;
if ord (c) =9
then c: =' ';
if (c<>'') or (supress=true)
then oline: =concat (oline,c);
end;
end;
function add_prem;
var
new_prem: prem_ptr;
f_frime,f_value: word_string;
begin
split (f_line,f_frime,f_value);
add_prem: =curr_prem;
new (new_prem);
with new_prem^ do begin
frime: =f_frime;
value: =f_value;
next: =nil;
end;
if curr_prem=nil
then
add_prem: =new_prem
else begin
while (curr_prem^. next<>nil) do
curr_prem: =curr_prem^. next;
curr_prem^. next: =new_prem;
end;
end;
function add_con (curr_con: con_ptr; f_line: line_string): con_ptr;
var
new_con: con_ptr;
f_frime,
f_value: word_string;
begin
split (f_line,f_frime,f_value);
add_con: =curr_con;
new (new_con);
with new_con^ do begin
frime: =f_frime;
value: =f_value;
cert: =get_cf (f_line);
next: =nil;
end;
if curr_con=nil
then
add_con: =new_con
else begin
while (curr_con^. next<>nil) do
curr_con^. next: =new_con;
end;
end;
procedure p_rule (curr_rule: rule_ptr);
var
curr_prem: prem_ptr;
curr_con: con_ptr;
bufStr: string;
begin
bufStr: =curr_rule^. name+' ';
curr_prem: =curr_rule^. prem;
while (curr_prem<>nil) do begin
bufStr: =bufStr+curr_prem^. frime+'=';
bufStr: =bufStr+curr_prem^. value;
curr_prem: =curr_prem^. next;
if curr_prem<>nil
then
bufStr: =bufStr+' '
else
MainForm. Memo_Report. Lines. Add (BufStr);
end;
curr_con: =curr_rule^. con;
while curr_con<>nil do begin
bufStr: =curr_con^. frime+'=';
bufStr: =bufStr+curr_con^. value+', Кд='+IntToStr (curr_con. cert);
curr_con: =curr_con^. next; if curr_con<>nil
then
bufStr: =bufStr+' '
else
MainForm. Memo_Report. Lines. Add (BufStr);
end;
end;
procedure enter_rule (rule_name: word_string);
var
new_rule,
curr_rule: rule_ptr;
line: line_string;
done: boolean;
begin
new (new_rule);
if top_rule<>nil
then begin
curr_rule: =top_rule;
while curr_rule^. next<>nil do
curr_rule: =curr_rule^. next;
curr_rule^. next: =new_rule;
end
else
top_rule: =new_rule;
with new_rule^ do begin
name: =rule_name;
next: =nil;
prem: =nil;
con: =nil;
end;
p_read (line);
done: =false;
while ( (not done) and (not Eof (RulesFile))) do begin
new_rule^. prem: =add_prem (new_rule^. prem,line);
p_read (line);
done: = (pos ('ВВ',line) >0) and (length (line) =2);
end;
p_read (line);
repeat
done: =Eof (RulesFile);
new_rule^. con: =add_con (new_rule^. con,line);
done: =done or (line [length (line)] ='. ');
if not done then p_read (line);
until done;
p_rule (new_rule);
end;
procedure LoadFormFile;
var
command: word_string;
m_line,f_line: line_string;
st_place: integer;
s_frime,s_value: word_string;
begin
MainForm. Memo_Report. Lines. Add ('Чтение файла, содержащего правила');
assign (RulesFile,'rules. txt');
reset (RulesFile);
top_rule: =nil;
command: ='';
while not Eof (RulesFile) do begin
p_read (f_line);
st_place: =pos (' (',f_line);
if st_place=0
then
st_place: =pos (colon,f_line);
if st_place>1
then begin
command: =copy (f_line,1,st_place-1);
m_line: =copy (f_line,st_place+1,length (f_line) - st_place);
if command='многозначный'
then begin
split (m_line,s_frime,s_value);
make_multi (s_frime);
add_frime (s_frime,s_value);
add_cf (s_frime,s_value,get_cf (m_line));
end else
if command='вопрос'
then begin
split (m_line,s_frime,s_value);
add_question (s_frime,s_value);
end else
if command='разрешён'
then begin
make_legals (m_line);
end else
if command='правило'
then begin
split (m_line,s_frime,s_value);
enter_rule (s_frime);
end;
end;
end;
end;
procedure SaveToFile;
var
a_frime: frime_ptr;
a_legal: legal_ptr;
a_value: value_ptr;
a_rule: rule_ptr;
a_con: con_ptr;
a_prem: prem_ptr;
f: TextFile;
begin
AssignFile (f,'rules. txt');
Rewrite (f);
a_frime: =top_fact;
while a_frime<>nil do begin
a_value: =a_frime^. value_list;
while a_value<>nil do begin
writeln (f,'многозначный'+colon+a_frime^. name+equals+a_value^. name+comma+'Кд=',a_value^. cert);
a_value: =a_value. next;
end;
a_Legal: =a_frime^. Legal_list;
write (f,'разрешён'+colon,a_frime^. name,equals);
while a_Legal<>nil do begin
write (f,a_legal^. name,comma);
a_legal: =a_legal. next;
end;
writeln (f);
writeln (f,'вопрос'+colon+a_frime^. name+equals+a_frime^. question);
a_frime: =a_frime^. next;
end;
a_rule: =top_rule;
while a_rule<>nil do begin
writeln (f,'правило'+a_rule^. name);
a_prem: =a_rule^. prem;
while a_prem<>nil do begin
writeln (f,a_prem^. frime+equals+a_prem^. value);
a_prem: =a_prem^. next;
end;
writeln (f,'ВВ');
a_con: =a_rule^. con;
while a_con<>nil do begin
writeln (f,a_con^. frime+equals+a_con^. value+comma+'Кд=',a_con^. cert);
a_con: =a_con^. next;
if a_prem=nil
then writeln (f,'. ');
end;
a_rule: =a_rule^. next;
end;
CloseFile (f);
end;
function find_rule (fri: word_string; curr_rule: rule_ptr): rule_ptr;
var
found: boolean;
curr_con: con_ptr;
begin
found: =false;
find_rule: =nil;
while (curr_rule<>nil) and (not found) do begin
curr_con: =curr_rule^. con;
while curr_con<>nil do begin
if curr_con^. frime=fri
then begin
found: =true;
find_rule: =curr_rule;
end;
curr_con: =curr_con^. next;
end;
curr_rule: =curr_rule^. next;
end;
end;
procedure conclude (curr_rule: rule_ptr; prem_cert: integer);
var
curr_con: con_ptr;
cert: integer;
begin
curr_con: =curr_rule^. con;
while curr_con<>nil do begin
add_frime (curr_con^. frime,curr_con^. value);
cert: = (prem_cert*curr_con^. cert) div 100;
add_cf (curr_con^. frime,curr_con^. value,cert);
curr_con: =curr_con^. next;
end;
end;
procedure pursue;
var
f_value: word_string;
curr_frime: frime_ptr;
curr_value: value_ptr;
curr_rule: rule_ptr;
curr_prem: prem_ptr;
bad: boolean;
solved: boolean;
lowest: integer;
begin
curr_frime: =find_frime (f_frime);
if curr_frime=nil
then begin
make_node (curr_frime);
curr_frime^. name: =f_frime;
end;
solved: =false;
if not curr_frime^. sought then begin
solved: =false;
curr_frime^. sought: =true;
curr_rule: =find_rule (f_frime,top_rule);
while (curr_rule<>nil) and (ok_add (f_frime,definite)) do begin
curr_prem: =curr_rule^. prem;
bad: =false;
lowest: =definite;
while (curr_prem<>nil) and (not bad) do begin
pursue (curr_prem^. frime);
curr_value: =test (curr_prem^. frime,curr_prem^. value);
if curr_value=nil
then
bad: =true
else
if curr_value^. cert<lowest
then
lowest: =curr_value^. cert;
curr_prem: =curr_prem^. next;
end;
if not bad
then begin
if explain
then
conclude (curr_rule,lowest);
solved: =true;
end;
curr_rule: =find_rule (f_frime,curr_rule^. next);
end;
if not solved
then begin
if explain
then
ask (f_frime,f_value);
add_frime (f_frime,f_value);
add_cf (f_frime,f_value,definite);
end;
end;
end;
procedure q_result (f_frime: word_string);
var
curr_frime: frime_ptr;
begin
MainForm. Memo_Report. Lines. Add ('Результат консультации: ');
curr_frime: =find_frime (f_frime);
see_vals (curr_frime,true);
MainForm. Memo_Report. Lines. Add ('Конец консультации');
end;
procedure explain_how (curr_rule: rule_ptr);
var
curr_prem: prem_ptr;
curr_con: con_ptr;
begin
MainForm. Memo_Report. Lines. Add ('');
MainForm. Memo_Report. Lines. Add ('Tак как: ');
curr_prem: =curr_rule^. prem;
while curr_prem<>nil do begin
MainForm. Memo_Report. Lines. Add (curr_prem^. frime+'='+curr_prem^. value);
curr_prem: =curr_prem^. next;
if curr_prem<>nil
then
MainForm. Memo_Report. Lines. Add (' ')
else
MainForm. Memo_Report. Lines. Add ('');
end;
MainForm. Memo_Report. Lines. Add ('Можно сделать вывод, что ');
curr_con: =curr_rule^. con;
while curr_con<>nil do begin
MainForm. Memo_Report. Lines. Add (curr_con^. frime+'='+curr_con^. value+', Кд='+IntToStr (curr_con^. cert));
curr_con: =curr_con^. next;
if curr_con<>nil
then
MainForm. Memo_Report. Lines. Add (' ')
else
MainForm. Memo_Report. Lines. Add ('');
end;
end;
procedure explain_why (f_frime: word_string);
begin
MainForm. Memo_Report. Lines. Add ('')
end;
procedure TMainForm. FormCreate (Sender: TObject);
begin
last_try: =nil;
top_fact: =nil;
LoadFormFile;
explain: =true;
end;
procedure TMainForm. B_AddFactClick (Sender: TObject);
var
s_frime,
s_value: word_string;
s_cf: integer;
begin
s_cf: =StrToInt (LE_AddFact_Cf. Text);
s_frime: =LE_AddFact_Frime. Text;
s_value: =LE_AddFact_Value. Text;
if ok_add (s_frime,s_cf)
then begin
add_frime (s_frime,s_value);
add_cf (s_frime,s_value,s_cf);
MainForm. Memo_Report. Lines. Add ('Факт добавлен');
end
else
MainForm. Memo_Report. Lines. Add ('Добавление не разрешено (Объект '+s_frime+' нe объявлен многозначным) ! ');
end;
procedure TMainForm. B_TestFactClick (Sender: TObject);
var
s_frime,
s_value: word_string;
begin
s_frime: =LE_TestFact_Frime. Text;
s_value: =LE_TestFact_Value. Text;
if test (s_frime,s_value) =nil
then
MainForm. Memo_Report. Lines. Add ('Факт неверен')
else
MainForm. Memo_Report. Lines. Add ('Факт верен');
end;
procedure TMainForm. B_SeeFactsClick (Sender: TObject);
begin
see_frimes (true);
end;
procedure TMainForm. B_MakeFrimeMultivalidClick (Sender: TObject);
begin
make_multi (LE_MakeMulti_Frime. Text);
end;
procedure TMainForm. B_MakeLegalClick (Sender: TObject);
begin
make_legals_from_form (LE_MakeLegal_Frime. Text);
end;
procedure TMainForm. B_AddQuestionClick (Sender: TObject);
var
s_frime,
s_value: word_string;
begin
s_frime: =LE_AddQuestion_Frime. Text;
s_value: =LE_AddQuestion_Value. Text;
add_question (s_frime,s_value);
end;
procedure TMainForm. B_GetQuestionClick (Sender: TObject);
var
s_frime: word_string;
begin
s_frime: =LE_Answer_Frime. Text;
LE_GetQuestion. Text: =p_question (s_frime);
end;
procedure TMainForm. B_Answer_GetNumValsClick (Sender: TObject);
begin
B_Answer_GetNumVals. Tag: =1;
end;
procedure TMainForm. B_AnswerClick (Sender: TObject);
var
s_frime,
s_value: word_string;
begin
s_frime: =LE_Answer_Frime. Text;
ask (s_frime,s_value);
add_frime (s_frime,s_value);
add_cf (s_frime,s_value,definite);
end;
procedure TMainForm. LE_OnExit (Sender: TObject);
begin
TLabeledEdit (Sender). Text: =AnsiLowerCase (trim (TLabeledEdit (Sender). Text));
end;
procedure TMainForm. M_MakeLegal_ValueExit (Sender: TObject);
var i: integer;
begin
with M_MakeLegal_Value do
If Lines. Count>0 then
for i: =Lines. Count-1 downto 0 do begin
Lines [i]: =AnsiLowerCase (trim (Lines [i]));
If Lines [i] ='' then Lines. Delete (i);
end;
end;
procedure TMainForm. B_GetTargetClick (Sender: TObject);
var
s_frime: word_string;
begin
s_frime: =LE_GetTarget. Text;
if s_frime<>''
then begin
pursue (s_frime);
q_result (s_frime);
end
else
MainForm. Memo_Report. Lines. Add ('Ошибка! Объект не указан! ');
end;
procedure TMainForm. Button1Click (Sender: TObject);
begin
SaveToFile;
end;
procedure TMainForm. Button2Click (Sender: TObject);
begin
qmport;
end;
end.
Подобные документы
Повышение эффективности системы управления информационной безопасностью в корпоративных информационных системах. Разработка структуры процесса классификации объектов защиты и составляющих его процедур; требования к архитектуре программного обеспечения.
дипломная работа [1,8 M], добавлен 19.05.2013Проектирование и организация базы данных, содержащей в себе технические характеристики трубопроводов, создание таблиц. Организация взаимодействия с пользователем. Выбор средства разработки. Настройки работы программы, ее технические характеристики.
курсовая работа [1002,9 K], добавлен 24.06.2009Неопределенности, связанные с наступлением нежелательного события, влияние нежелательного события на характеристики программного обеспечения. Концепция, функции и методология оценки и управления риском. Таксономия риска, функция консолидации рисков.
контрольная работа [136,9 K], добавлен 29.06.2010Разработка устройства управления двухконфорочной электроплитой на базе микроконтроллера, описание функциональных действий. Структурная схема аппаратной части. Проектирование программного обеспечения. Описание алгоритма работы системы и программы.
курсовая работа [709,3 K], добавлен 22.12.2010Разработка информационного и алгоритмического обеспечения системой управления базами данных Microsoft Access. Реализация и принцип работы основных компонентов подсистемы поддержки принятия решений. Особенности разработки программного модуля в Delphi.
реферат [333,9 K], добавлен 15.11.2009Разработка программы, осуществляющей контроль за своевременностью обновления программного обеспечения с помощью рассылки электронных писем. Анализ требований к системе; выбор метода решения, алгоритма, выбор языка программирования, описание программы.
дипломная работа [5,6 M], добавлен 29.06.2011Постановка задачи и математическое описание ее решения. Назначение программного обеспечения. Описание принятых идентификаторов. Выбор языка программирования и написание программы на входном языке. Методика отладки программы и проведение ее тестирования.
курсовая работа [96,1 K], добавлен 25.06.2013Понятие программного обеспечения, вопросы его разработки и использования. Общая характеристика системного программного обеспечения и работа операционной системы. Специфика процесса управления разработкой программного обеспечения и его особенности.
курсовая работа [636,2 K], добавлен 23.08.2011Концепция адаптивного управления безопасностью. Средства анализа защищенности сетевых протоколов и сервисов. Компоненты и архитектура IDS. Классификация систем обнаружения атак. Поиск уязвимостей в современных системах IDS. Методы реагирования на атаки.
курсовая работа [488,5 K], добавлен 13.12.2011Разработка программного обеспечения для реализации криптографической защиты информации. Обоснование выбора аппаратно-программных средств. Проектирование модели информационных потоков данных, алгоритмического обеспечения, структурной схемы программы.
дипломная работа [2,0 M], добавлен 10.11.2014