Разработка алгоритмического и программного обеспечения ситуационного управления безопасностью магистральных газопроводов

Аварийные ситуации на магистральных газопроводах, их классификация. Характеристики аварий, причины их возникновения на объектах нефтегазового профиля. Методика анализа риска. Описание программы управления безопасностью магистральных газопроводов.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.