close

Вход

Забыли?

вход по аккаунту

?

ПЗ (3)

код для вставкиСкачать
Белорусский национальный технический университет
Факультет информационных технологий и робототехники
Кафедра программного обеспечения вычислительной техники и автоматизированных систем
КУРСОВОЙ ПРОЕКТ по дисциплине
"Функциональное и логическое программирование"
Тема: "Справочник технической службы аэропорта"
Исполнитель: студент 3 курса ФИТР, гр. 107215
Козловский Артем Васильевич
Руководитель проекта: доцент, к.т.н.
Ковальков Александр Титович
Минск 2007
Белорусский национальный технический университет
Кафедра программного обеспечения вычислительной техники и автоматизированных систем
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту по дисциплине
"Функциональное и логическое программирование"
Тема: "Справочник технической службы аэропорта"
Исполнитель: студент 3 курса ФИТР, группа 107215
Козловский Артем Васильевич
Руководитель проекта: доцент, к.т.н.
Ковальков Александр Титович
Минск 2007
Содержание
ВВЕДЕНИЕ4
1 Постановка задачи6
2 Теоретическая часть7
3 Описание процесса проектирования пользовательского интерфейса9
4 Описание предикатов16
5 Текст программы17
6 Тестирование программы26
7 Руководство пользователя30
ВЫВОДЫ31
ЛИТЕРАТУРА32
ВВЕДЕНИЕ
Традиционно под программой понимают последовательность операторов. Этот стиль программирования принято называть императивным. Программируя в императивном стиле, программист должен объяснить компьютеру, как нужно решать задачу.
Противоположный ему стиль программирования - так называемый декларативный стиль, в котором программа представляет собой совокупность утверждений, описывающих фрагмент предметной области или сложившуюся ситуацию. Программируя в декларативном стиле, программист должен описать, что нужно решать.
Соответственно и языки программирования делят на императивные и декларативные.
Решая задачу, императивный программист вначале создает модель в некоторой формальной системе, а затем переписывает решение на императивный язык программирования в терминах компьютера. Но, во-первых, для человека рассуждать в терминах компьютера довольно неестественно. Во-вторых, переписывание решения на язык программирования по сути дела не имеет отношения к решению исходной задачи. Очень часто императивные программисты даже разделяют работу в соответствии с двумя описанными выше этапами. Одни люди, постановщики задач, придумывают решение задачи, а другие, кодировщики, переводят это решение на язык программирования.
В основе декларативных языков лежит формализованная человеческая логика. Человек лишь описывает решаемую задачу, а поиском решения занимается императивная система программирования. В итоге получаем значительно большую скорость разработки приложений, значительно меньший размер исходного кода, легкость записи знаний на декларативных языках, более понятные, по сравнению с императивными языками, программы. Известна классификация языков программирования по их близости либо к машинному языку, либо к естественному человеческому языку. Те, что ближе к компьютеру, относят к языкам низкого уровня, а те, что ближе к человеку, называют языками высокого уровня. В этом смысле декларативные языки можно назвать языками сверхвысокого или наивысшего уровня, поскольку они очень близки к человеческому языку и человеческому мышлению.
К императивным языкам относятся такие языки программирования, как Паскаль, Бейсик, Си и т. д. В отличие от них, Пролог является декларативным языком.
При программировании на Прологе усилия программиста должны быть направлены на описание логической модели фрагмента предметной области решаемой задачи в терминах объектов предметной области, их свойств и отношений между собой, а не деталей программной реализации. Фактически Пролог представляет собой не столько язык для программирования, сколько язык для описания данных и логики их обработки. Программа на Прологе не является таковой в классическом понимании, поскольку не содержит явных управляющих конструкций типа условных операторов, операторов цикла и т. д. Она представляет собой модель фрагмента предметной области, о котором идет речь в задаче. И решение задачи записывается не в терминах компьютера, а в терминах предметной области решаемой задачи.
Пролог очень хорошо подходит для описания взаимоотношений между объектами. Поэтому Пролог называют реляционным языком. Причем "реляционность" Пролога значительно более мощная и развитая, чем "реляционность" языков, используемых для обработки баз данных. Часто Пролог используется для создания систем управления базами данных, где применяются очень сложные запросы, которые довольно легко записать на Прологе.
В Прологе очень компактно, по сравнению с императивными языками, описываются многие алгоритмы. По статистике, строка исходного текста программы на языке Пролог соответствует четырнадцати строкам исходного текста программы на императивном языке, решающем ту же задачу. Пролог-программу, как правило, очень легко писать, понимать и отлаживать. Это приводит к тому, что время разработки приложения на языке Пролог во многих случаях на порядок быстрее, чем на императивных языках. В Прологе легко описывать и обрабатывать сложные структуры данных. Проверим эти утверждения на собственном опыте при изучении данного курса.
Прологу присущ ряд механизмов, которыми не обладают традиционные языки программирования: сопоставление с образцом, вывод с поиском и возвратом. Еще одно существенное отличие заключается в том, что для хранения данных в Прологе используются списки, а не массивы. В языке отсутствуют операторы присваивания и безусловного перехода, указатели. Естественным и зачастую единственным методом программирования является рекурсия. Поэтому часто оказывается, что люди, имеющие опыт работы на процедурных языках, медленней осваивают декларативные языки, чем те, кто никогда ранее программированием не занимался, так как Пролог требует иного стиля мышления, отказа от стереотипов императивного программирования.
1 Постановка задачи
В технической службе аэропорта имеется справочник, содержащий записи следующей структуры: тип самолета, год выпуска, расход горючего на 1000 км. Для определения потребности в горючем техническая служба запрашивает расписание полетов. Каждая запись расписания содержит следующую информацию: номер рейса, пункт назначения, тип самолета, дальность полетаю.
Необходимо:
* Рассчитать суммарное количество горючего, необходимое для обеспечения полетов на следующие сутки;
* Вывести на экран список рейсов до заданного пункта назначения в порядке возрастания времени вылета.
2 Теоретическая часть
Внешняя БД
Внешняя БД состоит из цепочек (chain), в которых хранятся термы. Количество термов в цепочке не ограничено, в БД может быть любое число цепочек. Каждая цепочка имеет свое имя (типа symbol) и может быть обработана как отдельная группа данных. Вся внешняя БД в целом также легко управляема как отдельный модуль.
Объявление внешней БД:
domains
db_selector=<ИмяБД1>;<ИмяБД2>...
Предикаты для работы со всей внешней БД
Создание новой (пустой) БД
db_create (ИмяБД, ИмяФайла, Место)(db_selector, string, symbol):(i,i,i)
Например: db_create (db_name, "f1.dat", in_file)
db_create (mydba, "f2.dat", in_memory)
Третий параметр предиката определяет место расположения внешней БД: in_file (для файла ДОС), in_memory (для RAM), in_EMS (для EMS-памяти).
Внешняя база данных, созданная предикатом db_create, считается открытой.
Открытие ранее созданной БД:
db_open (ИмяБД, ИмяФайла, Место):(i,i,i)
Копирование БД в другое место (напр., из файла в ОЗУ или наоборот)
db_copy (ИмяБД, ИмяФайла, Новое_место):(i,i,i)
Закрытие БД (в конце работы)
db_close (ИмяБД):(i)
Удаление БД
db_delete (ИмяФайла, Место)(string, symbol):(i,i)
Открытие БД, помеченной как ошибочная
db_openinvalid( ИмяБД, ИмяФайла, Место)(db_selector, string, symbol):(i,i,i)
Получение информации о БД
db_statistics(ИмяБД, Количество_термов, Объем_ОП_под_таблицами_БД, Объем_памяти_занятой_термами_и_указателями, Свободная_память) :(i,o,o,o,o)
Определение имен цепочек во внешней БД
db_ chains( ИмяБД, Цепь)(db_selector, symbol):(i,o)
Предикаты для работы с цепочками:
Цепочки термов запоминаются последовательно и одновременно доступна только одна цепочка. Каждая цепочка имеет свое имя, которое нигде специально не объявляется. Цепочка создается, если ее имя впервые встретилось в предикатах записи термов в БД.
Для записи термов во внешнюю БД служат следующие три предиката:
chain_inserta(ИмяБД, Цепь, Дом, Терм, Указ):(i,i,i,i,o) chain_insertz(ИмяБД, Цепь, Дом, Терм, Указ):(i,i,i,i,o) chain_insertafter(ИмяБД, Цепь, Дом, Указ, Терм, НовУказ):(i,i,i,i,i,o) ИмяБД - имя, данное внешней БД в предикате db_create;
Цепь - имя цепочки (тип symbol);
Дом - тип (домен) вставляемого терма;
Терм - вставляемый терм;
Указ - указатель на вставляемый терм (тип ref), в третьем предикате - указатель терма, после которого вставляется Терм с указателем НовУказ.
Указатели относятся к специальному, определенному в системе типу данных ref.
Предикаты chain_inserta и chain_insertz аналогичны по функциям встроенным предикатам asserta и assertz. Предикат chain_insertafter служит для вставки терма между термами, уже занесенными в БД.
Удаление цепочки: chain_delete( ИмяБД, Цепь) (db_selector, symbol):(i,i)
Предикаты
chain_first( ИмяБД, Цепь, Указ_на_первый_терм):(i,i,o)
chain_last( ИмяБД, Цепь, Ука_на_последний_терм):(i,i,o)
возвращают указатель соответственно на первый и последний термы в заданной цепочке.
Извлечение термов из внешней БД осуществляется предикатом
chain_terms( ИмяБД, Цепь, Дом, Терм, Указ):(i,i,i,o,o) (i,i,i,i,o)
Параметры предиката такие же, как и у chain_inserta и chain_insertz. Отличие в том, что четвертый параметр может быть выходным. При шаблоне (i,i,i,i,o) параметр Терм может быть задан частично, т.е. будут извлекаться из связанного списка не все термы, а только с нужными свойствами.
Предикаты
chain_next( ИмяБД, Указ, Указ_на_следующий_терм):(i,i,o)
chain_prev( ИмяБД, Указ, Указ_на_предыдущий_терм):(i,i,o)
возвращают указатель соответственно на следующий и предыдущий термы относительно заданного.
Предикаты для работы с термами:
Замена терма
term_replace( ИмяБД, Дом, Указ, Терм):(i,i,i,i)
Заменяет терм с указателем Указ новым термом Терм типа Дом.
Удаление терма
term_delete( ИмяяБД, Цепь, Указ) (db_selector, symbol, ref):(i,i,i)
Извлечение терма из внешней БД
ref_term( ИмяБД, Дом, Указ, Терм):(i,i,i,o)
В+дерево
В+дерево является структурой данных, которую можно применять для очень эффективного метода сортировки большого количества данных.
В+деревья находятся во внешней базе данных. Каждый вход в В+дерево - это пара величин: ключ (информационное поле записи, по которому построено В+дерево) и связанный с этим ключом указатель базы данных. При вводе новой записи во внешнюю БД Пролог включает ключ и указатель, соответствующие этой записи, в В+дерево.
В+дерево разбито на отдельные страницы или узлы. Каждый узел В+дерева является либо последним (лист), либо порождает два нижележащих узла. Каждый узел содержит группу ключей из заданного диапазона. По значению ключа можно быстро проверить, не находится ли искомый ключ внутри диапазона конкретного узла. Если да, то быстро находится указатель записи; если значение ключа меньше диапазона ключей узла, то поиск ведется по левой ветви В+дерева, если больше - по правой.
В+дерево создается с помощью предиката
bt_create(ИмяБД, ИмяВ+дер, ПерВ+дер, ДлКл, Пор)(db_selector, string, bt_selector, integer, integer): (i,i,o,i,i)
ИмяБД - имя внешней БД, в которой создается В+дерево;
ИмяВ+дер - имя, которое дает В+дереву пользователь;
ПерВ+дер - переключатель (ссылка), используемый другими предикатами при выполнении операций с В+деревом;
ДлКл - длина ключа, в пределах которой будет производиться упорядочивание ключей при построении дерева;
Пор - порядок дерева, определяющий, сколько ключей запоминается в каждом узле В+дерева. Для баз данных среднего размера рекомендуется Пор=4.
Для открытия, закрытия и удаления В+дерева используются предикаты:
bt_open(ИмяБД, ИмяВ+дер, ПерВ+дер)(db_selector,string,bt_selector):(i,i,o)
bt_close(ИмяБД, ПерВ+дер)(db_selector, bt_selector):(i,i)
bt_delete(ИмяБД, ИмяВ+дер)(db_selector,bt_selector):(i,i)
Ниже приведен пример правила, проверяющего, существует ли открываемое В+дерево; если его нет, то оно создается: external_open(Bt_sel):-
existfile("parts.dba"),!,
db_open(parts, "parts.dba",in_file),
bt_open(parts,"parts.tree",Bt_sel).
external_open(Bt_sel):-
db_create(parts,"parts.dba",in_file),
bt_create(parts,"parts.tree",Bt_sel,10,4).
Изменения в В+дереве относительно ключа осуществляются двумя предикатами:
1) key_insert(ИмяБД, ПерВ+дер, Ключ, Ссылка)(db_selector, bt_selector, string, ref):(i,i,i,i)
- вставляет новый ключ (информационное поле) в В+дерево. Параметр Ключ является новым ключом, а Ссылка является номером ссылки БД, принадлежащим этому ключу.
2) key_delete(ИмяБД, ПерВ+дер, Ключ, Ссылка)(db_selector, bt_selector, string, ref):(i,i,i,i)
- удаляет ключ из В+дерева.
Для осуществления поиска в В+дереве используются следующие предикаты:
key_search(ИмяБД, ПерВ+дер, Ключ, Ссылка)(db_selector,bt_selector,string,ref):(i,i,i,o)
- находит ключ в В+дереве. Если ключ найден, номер ссылки БД, принадлежащий этому ключу, будет возвращен через параметр Ссылка. Если ключ не найден, предикат будет несогласован, однако внутренний указатель В+дерева будет указывать на ключ, следующий непосредственно за тем, на который указатель указывал до поиска ключа.
key_current(ИмяБД, ПерВ+дер, Ключ, Ссылка)(db_selector,bt_selector,string,ref):(i,i,o,o)
- возвращает текущий ключ и номер ссылки БД для текущего внутреннего указателя В+дерева.
key_first(ИмяБД, ПерВ+дер, Ссылка) (db_selector, bt_selector, ref):(i,i,o)
key_last(ИмяБД, ПерВ+дер, Ссылка) (db_selector, bt_selector, ref):(i,i,o)
key_next(ИмяБД, ПерВ+дер, Ссылка) (db_selector, bt_selector, ref):(i,i,o)
key_prev(ИмяБД, ПерВ+дер, Ссылка) (db_selector, bt_selector, ref):(i,i,o)
Эти предикаты, имеющие одинаковый формат, перемещают внутренний указатель В+дерева соответственно на первый, последний, следующий и предыдущий ключи в В+дереве и возвращают номер ссылки БД, заданный для соответствующего ключа.
3 Описание процесса проектирования пользовательского интерфейса
В ОС Windows окна обмениваются сообщениями. У окна есть дескриптор - 4 байта, которые идентифицируют окно. Windows направляет сообщения в очередь сообщений, откуда их выбирает приложение в главном цикле и отправляет на обработку в оконную функцию, которая указывается при создании окна.
На все действия пользователя окну приходят сообщения. Сообщения от меню и элементов управления приходят родительскому окну.
Пролог сам за программиста создает окно и функцию обработки сообщений, которая вызывает из кода предикат вида
predicates
task_win_eh : EHANDLER %предикат типа (дескриптор окна, сообщение)
clauses
task_win_eh(_Win,e_Size(_Width,_Height),0):-!, % сообщение, которое приходит на %изменение размеров, в мы получаем новую ширину и высоту
toolbar_Resize(_Win), %изменяем размер панели инструментов
msg_Resize(_Win), % изменяем размер окна сообщений
!.
task_win_eh(_Win,e_Menu(id_help_contents,_ShiftCtlAlt),0):-!, %обрабатываем %сообщение отменю
vpi_ShowHelp("k.hlp"), %показываем помощь
!.
Инициализация графической системы:
Goal
vpi_SetAttrVal(attr_win_mdi,b_true), %устанавливает значение атрибутам
vpi_SetAttrVal(attr_win_3dcontrols,b_true), vpi_Init( % создает главное окно
task_win_Flags, % список флагов, н-р [wsf_VScroll, wsf_HScroll, %wsf_Maximized].
task_win_eh, % предикат для обработки сообщений
task_win_Menu ,% меню окна
"k", % имя приложения
task_win_Title). % заголовок
Для начала необходимо в среде Visual Prolog создать проект со следующими параметрами:
- на вкладке Target выбрать следующие параметры: Platform - Windows32, UI Strategy - VPI, Target Type - exe;
- на вкладке VPI Options установить нужные параметры окна;
- на вкладке User Info заполняется информация о программе.
Теперь создаем меню. Правое окошко появляется после двойного щелчка по "Task Menu" Новый пункт создается кнопкой New. Окно задания атрибутов вызывается нажатием кнопки Attributes. Перемещение к редактированию подпунктов и обратно - Submenu (можно просто двойной щелчок) и Back. Удаляется кнопкой Del.
Рис. 3.1 Создание меню
Окно ниже вызывается нажатием кнопки Attributes. Поле Text: & - если стоит перед буквой с, то Alt+c вызывает этот пункт при нахождении в меню, откуда его можно вызвать щелчком. \t - символ табуляции, чтоб F7 было в красивом месте.
В поле Constant вводится константа с помощью которой можно связать обработчик сообщения выбора этого пункта с самим меню.
Checked - выбрано, появляется галочка.
Disabled - заблокировано.
В блоке Accelerator настраиваются комбинации клавиш для быстрого вызова пункта меню.
Рис. 3.2 Редактирование атрибутов
Далее путем в окошке редактора проекта перейдем на вкладку Dialog, нажмем New и создастся новый диалог. Нажав кнопку Edit можно редактировать выбранный диалог.
С окошка Controls перетягиваем мышкой контролы (элементы управления(правильно) или компоненты(не совсем правильно)). C помощью окошка Layout ровно располагать относительно друг друга, делать контролам одинаковые раз меры и выравнивать.
Custom control - мы можем написать имя класса любого конnрола Windows, который не реализован в Прологе. В начале может понадобиться загрузить соответствующую DLL.
Управлять контролами можно, как и всем остальным, путем посылки соответствующих сообщений.
Рис. 3.3 Создание диалога
После создания диалога необходимо вызвать эксперт кода и нажать кнопку Default Code для генерации кода диалога по умолчанию, чтобы его можно было показывать.
Рис. 3.4 Генерация кода по умолчанию
Для того, чтобы идентифицировать компонент в программе, необходимо назначить ему соответствующую константу. Для этого дважды нажимаем по компоненту, и откроется окно атрибутов компонента, в котором можно настроить параметры компонента и указать в поле Constant его идентификатор:
Рис. 3.4 Окно атрибутов компонента
Чтобы при выборе пункта меню показывался диалог, нужно выбрать в редакторе проекта окно или диалог, которому принадлежит это меню (с сообщениями от контролов можно поступать как с меню) и нажать Code Expert..
:
Рис. 3.5 Эксперт кода
В группе Dialog or Window Selection выбираем окно или диалог, на котором расположено меню или контрол.
В группе Place Code in нужно выбрать модуль, в который добавится обработчик сообщения (или по-другому события).
В группе Event Handling указывает к чему относится данное событие (Event Type), а в Event or Item выбираем id_Vew_informational_bul (Идентификатор пункта меню).
Дальше нажимаем Add Clause. На ее месте появится Edit Clause, нажимаем ее, попадаем в редактор кода и дописываем свой код обработки.
Например:
%BEGIN Task Window, id_View_informational_bul
task_win_eh(_Win,e_Menu(id_View_informational_bul,_ShiftCtlAlt),0):-!, dlg_informational_bul_Create(_Win), %показать диалог, этот предикат создается %экспертом кода, _Win - дескриптор родительского окна.
!.
%END Task Window, id_View_informational_bul Для того, чтобы создать стандартный диалог открытия файлов, нужно написать в каком-нибудь обработчике:
%BEGIN Task Window, id_file_new
task_win_eh(_Win,e_Menu(id_file_new,_ShiftCtlAlt),0):-!, Flags = [],% Флаги для настройки внешнего вида и реакции на некоторые события
FirstFileName = dlg_GetFileName("*.db", %начальное значение фильтра
["Data Files (*.db)","*.db", "All Files (*.*)", "*.*"], %Задается фильтр показа файлов. Сначала название (которое %показывается), потом маска; * заменяет в маске любую группу символов
"New database", % Заголовок
Flags,
"", %начальный путь, "" означает по умолчанию
OutFileNames), %Список, в который запишутся имена выбранных файлов
OutFileNames = [H|_],
db_create(deputats, H, in_file),db_close(deputats), %/////DB Creation!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!.
%END Task Window, id_file_new
Флаги:
dlgfn_SaveОтображается диалог сохранения файлов. Если файл уже существует, появляется сообщение, стоит ли переписывать данный файл.
Если этого флага нет в списке, по умолчанию отображается диалог открытия файлов.
dlgfn_MultiSelРазрешает выбор нескольких файлов
The user can select more than one file using the Shift + Arrow (Up or Down) key combinations.
dlgfn_BufSize The default buffer size (30KB under 16-bit Windows) to store an obtained list of files SelectedFiles can occur not big enough. The programmer can redefine the buffer size. Specify dlgfn_BufSize flag in the list Flags and in the next element specify the required buffer size (in bytes). Under 32-bit Windows the default buffer size is 300KB. Under OS/2 the buffer size is changed dynamically and therefore dlgfn_BufSize is ignored.
По-русски Flags = [dlgfn_MultiSel ,dlgfn_BufSize, 100000] -новый размер буфера для хранения списка файлов после этого флага.
Edit control:
IEF = win_GetCtlHandle(WinHandle, idc_edit_fam), %получение дескриптора
ISF = win_GetText(IEF), %получение текста; win_SetText -для его установки
List Box:
HL = win_GetCtlHandle(_Win, show), % идентифтор контрола
lbox_Clear(HL), % очистка
lbox_Add(HL,"Value") % добавление строки
4 Описание предикатов
raschet(Ref, S, Res) (ref, real, real): (i,i,o) - возвращает суммарное количество горючего, необходимого для обеспечения полетов на следующий день.
termView_Spravochnik(Ref, HL)(ref, WINDOW)(i,i) - производит форматированный вывод содержимого базы данных "Справочник" в List Box окна.
show_key(Bt_sel, Ref, HL)(bt_selector,ref,WINDOW)(i,i,i) - производит форматированный вывод содержимого базы данных "Расписание" в List Box окна.
termView_Raspisanie(Bt_sel_V, Bt_sel_P, City, HL)
(bt_selector, bt_selector, string, WINDOW)(i,i,i,i) ) - производит вывод в List Box окна списка рейсов до заданного пункта назначения.
5 Текст программы
/*****************************************************************************
Copyright (c) Hostel 12
Project: KURSOVOJ
FileName: KURSOVOJ.PRO
Purpose: Курсовой проект
Written by: PanTobish
Comments:
******************************************************************************/
include "kursovoj.inc"
include "kursovoj.con"
include "hlptopic.con"
%BEGIN_WIN Task Window
/***************************************************************************
Event handling for Task Window
***************************************************************************/
predicates
task_win_eh : EHANDLER
nondeterm raschet(ref, real, real)
constants
%BEGIN Task Window, CreateParms, 23:39:59-25.11.2007, Code automatically updated!
task_win_Flags = [wsf_SizeBorder,wsf_TitleBar,wsf_Close,wsf_Maximize,wsf_Minimize,wsf_ClipSiblings]
task_win_Menu = res_menu(idr_task_menu)
task_win_Title = "Kursovoj"
task_win_Help = idh_contents
%END Task Window, CreateParms
clauses
raschet(Ref, S, Res):-
ref_term(db_raspisanie, dom_Raspisanie, Ref, rejs(номер_рейса(_,_), _, Тип, Дальность)),
chain_terms(db_spravochnik, "самолет", dom_Spravochnik, samolet(Тип, _, Расход), _),
S1=S+Дальность*Расход/1000,
chain_prev(db_raspisanie, Ref, Prev),
raschet(Prev, S1, Res).
raschet(_, S, Res):-
chain_last(db_raspisanie, "рейс", Ref),
ref_term(db_raspisanie, dom_Raspisanie, Ref, rejs(номер_рейса(_,_), _, Тип, Дальность)),
chain_terms(db_spravochnik, "самолет", dom_Spravochnik, samolet(Тип, _, Расход), _),
Res = S + Дальность * Расход / 1000.
%BEGIN Task Window, e_Create
task_win_eh(_Win,e_Create(_),0):-!,
%BEGIN Task Window, InitControls, 23:39:59-25.11.2007, Code automatically updated!
win_CreateControl(wc_PushButton,rct(405,327,505,377),"Расчитать",_Win,[wsf_Group,wsf_TabStop],idc_расчитать),
win_CreateControl(wc_Text,rct(311,216,599,236),"Сумарное количество горючего на завтра:",_Win,[wsf_AlignLeft],idct_сумарное_количество_горючего_на_завтра),
win_CreateControl(wc_Edit,rct(405,256,505,280),"",_Win,[wsf_AlignRight,wsf_Group,wsf_TabStop,wsf_AutoHScroll,wsf_ReadOnly],idc_edit),
%END Task Window, InitControls
%BEGIN Task Window, ToolbarCreate, 23:39:59-25.11.2007, Code automatically updated!
%END Task Window, ToolbarCreate
ifdef use_message
msg_Create(100),
enddef
!.
%END Task Window, e_Create
%MARK Task Window, new events
%BEGIN Task Window, idc_расчитать _CtlInfo
task_win_eh(WinHandle,e_Control(idc_расчитать,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
%chain_first(db_raspisanie, "рейс", Ref),
chain_last(db_raspisanie, "рейс", Ref),
raschet(Ref, 0.0, S),
HIE = win_GetCtlHandle(WinHandle, idc_edit),
str_real(S1,S),
win_SetText(HIE, S1),
!.
%END Task Window, idc_расчитать _CtlInfo
%BEGIN Task Window, id_file_Открыть_расписание
task_win_eh(_Win,e_Menu(id_file_Открыть_расписание,_ShiftCtlAlt),0):-!,
FileName = dlg_GetFileName("*.dbr",
["Data Files (*.dbr)","*.dbr",
"All Files (*.*)", "*.*"],
"Открыть расписание",[],"",
_OutListFiles),
db_open(db_raspisanie, FileName, in_file),
_Answer = dlg_MessageBox( "Информация...", "Расписание открыто...", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),!.
%END Task Window, id_file_Открыть_расписание
%BEGIN Task Window, id_file_Открыть_справочник
task_win_eh(_Win,e_Menu(id_file_Открыть_справочник,_ShiftCtlAlt),0):-!,
FileName = dlg_GetFileName("*.dbs",
["Data Files (*.dbs)","*.dbs",
"All Files (*.*)", "*.*"],
"Открыть справочник",[],"",
_OutListFiles),
db_open(db_spravochnik, FileName, in_file),
_Answer = dlg_MessageBox( "Информация...", "Справочник открыт...", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),!.
%END Task Window, id_file_Открыть_справочник
%BEGIN Task Window, id_file_Закрыть_расписание
task_win_eh(_Win,e_Menu(id_file_Закрыть_расписание,_ShiftCtlAlt),0):-!,
db_close(db_raspisanie),
_Answer = dlg_MessageBox( "Информация...", "Расписание закрыто!", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),!.
%END Task Window, id_file_Закрыть_расписание
%BEGIN Task Window, id_file_Закрыть_справочник
task_win_eh(_Win,e_Menu(id_file_Закрыть_справочник,_ShiftCtlAlt),0):-!,
db_close(db_spravochnik),
_Answer = dlg_MessageBox( "Информация...", "Справочник закрыт!", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),!.
%END Task Window, id_file_Закрыть_справочник
%BEGIN Task Window, id_file_Создать_расписание
task_win_eh(_Win,e_Menu(id_file_Создать_расписание,_ShiftCtlAlt),0):-!,
FileName = dlg_GetFileName("*.dbr",
["Data Files (*.dbr)","*.dbr",
"All Files (*.*)", "*.*"],
"Создать расписание",[],"",
_OutListFiles),
db_create(db_raspisanie, FileName, in_file),
bt_create(db_raspisanie,"Время_П", Bt_sel_V,5,4),
bt_create(db_raspisanie,"Пункт_П", Bt_sel_P,16,4),
bt_close(db_raspisanie, Bt_sel_V),
bt_close(db_raspisanie, Bt_sel_P),
db_close(db_raspisanie),
_Answer = dlg_MessageBox( "Информация...", "\tРасписание создано...\n Не забудьте открыть его для работы!", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),
!.
%END Task Window, id_file_Создать_расписание
%BEGIN Task Window, id_file_Создать_справочник
task_win_eh(_Win,e_Menu(id_file_Создать_справочник,_ShiftCtlAlt),0):-!,
FileName = dlg_GetFileName("*.dbs",
["Data Files (*.dbs)","*.dbs",
"All Files (*.*)", "*.*"],
"Создать справочник",[],"",
_OutListFiles),
db_create(db_spravochnik, FileName, in_file),
db_close(db_spravochnik),
_Answer = dlg_MessageBox( "Информация...", "\tСправочник создан...\n Не забудьте открыть его для работы!", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),
!.
%END Task Window, id_file_Создать_справочник
%BEGIN Task Window, id_поиск
task_win_eh(_Win,e_Menu(id_поиск,_ShiftCtlAlt),0):-!,
dlg_search_Create(_Win),!.
%END Task Window, id_поиск
%BEGIN Task Window, id_file_Редактировать_расписание
task_win_eh(_Win,e_Menu(id_file_Редактировать_расписание,_ShiftCtlAlt),0):-!,
dlg_edit_raspisanie_Create(_Win),!.
%END Task Window, id_file_Редактировать_расписание
%BEGIN Task Window, id_file_Редактировать_справочник
task_win_eh(_Win,e_Menu(id_file_Редактировать_справочник,_ShiftCtlAlt),0):-!,
dlg_edit_spravochnik_Create(_Win),!.
%END Task Window, id_file_Редактировать_справочник
%BEGIN Task Window, id_help_contents
task_win_eh(_Win,e_Menu(id_help_contents,_ShiftCtlAlt),0):-!,
vpi_ShowHelp("kursovoj.hlp"),
!.
%END Task Window, id_help_contents
%BEGIN Task Window, id_help_about
task_win_eh(Win,e_Menu(id_help_about,_ShiftCtlAlt),0):-!,
dlg_about_dialog_Create(Win),
!.
%END Task Window, id_help_about
%BEGIN Task Window, id_file_exit
task_win_eh(Win,e_Menu(id_file_exit,_ShiftCtlAlt),0):-!,
_Answer = dlg_MessageBox( "С благодарностью", "Спасибо за выбор нашего продукта!", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),
db_close(db_spravochnik),
db_close(db_raspisanie),
win_Destroy(Win),
!.
%END Task Window, id_file_exit
%BEGIN Task Window, e_Size
task_win_eh(_Win,e_Size(_Width,_Height),0):-!,
ifdef use_tbar
toolbar_Resize(_Win),
enddef
ifdef use_message
msg_Resize(_Win),
enddef
!.
%END Task Window, e_Size
%END_WIN Task Window
/***************************************************************************
Invoking on-line Help
***************************************************************************/
project_ShowHelpContext(HelpTopic):-
vpi_ShowHelpContext("kursovoj.hlp",HelpTopic).
/***************************************************************************
Main Goal
***************************************************************************/
goal
ifdef use_mdi
vpi_SetAttrVal(attr_win_mdi,b_true),
enddef
ifdef ws_win
ifdef use_3dctrl
vpi_SetAttrVal(attr_win_3dcontrols,b_true),
enddef
enddef vpi_Init(task_win_Flags,task_win_eh,task_win_Menu,"kursovoj",task_win_Title).
%BEGIN_DLG About dialog
/**************************************************************************
Creation and event handling for dialog: About dialog
**************************************************************************/
constants
%BEGIN About dialog, CreateParms, 03:40:19-26.11.2007, Code automatically updated!
dlg_about_dialog_ResID = idd_dlg_about
dlg_about_dialog_DlgType = wd_Modal
dlg_about_dialog_Help = idh_contents
%END About dialog, CreateParms
predicates
dlg_about_dialog_eh : EHANDLER
clauses
dlg_about_dialog_Create(Parent):-
win_CreateResDialog(Parent,dlg_about_dialog_DlgType,dlg_about_dialog_ResID,dlg_about_dialog_eh,0).
%BEGIN About dialog, idc_ok _CtlInfo
dlg_about_dialog_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtrlInfo),0):-!,
win_Destroy(_Win),
!.
%END About dialog, idc_ok _CtlInfo
%MARK About dialog, new events
dlg_about_dialog_eh(_,_,_):-!,fail.
%END_DLG About dialog
%BEGIN_DLG Edit_Spravochnik
/**************************************************************************
Creation and event handling for dialog: Edit_Spravochnik
**************************************************************************/
constants
%BEGIN Edit_Spravochnik, CreateParms, 01:05:43-26.11.2007, Code automatically updated!
dlg_edit_spravochnik_ResID = idd_edit_spravochnik
dlg_edit_spravochnik_DlgType = wd_Modal
dlg_edit_spravochnik_Help = idh_contents
%END Edit_Spravochnik, CreateParms
predicates
dlg_edit_spravochnik_eh : EHANDLER
nondeterm termView_Spravochnik(ref, WINDOW)
clauses
termView_Spravochnik(Ref, HL):-
ref_term(db_spravochnik, dom_Spravochnik, Ref,
samolet(Тип_С, Год_С, Расход_С)),
str_int(Str, Год_С),
format(OutString, "%-56.5s %-36.4s %08f",
Тип_С, Str, Расход_С),
lbox_Add(HL,OutString),
chain_next(db_spravochnik, Ref, Next),
termView_Spravochnik(Next, HL).
termView_Spravochnik(_, _).
dlg_edit_spravochnik_Create(Parent):-
win_CreateResDialog(Parent,dlg_edit_spravochnik_DlgType,dlg_edit_spravochnik_ResID,dlg_edit_spravochnik_eh,0).
%BEGIN Edit_Spravochnik, idc_ok _CtlInfo
dlg_edit_spravochnik_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtrlInfo),0):-!,
win_Destroy(_Win),
!.
%END Edit_Spravochnik, idc_ok _CtlInfo
%MARK Edit_Spravochnik, new events
%BEGIN Edit_Spravochnik, idc_просмотреть _CtlInfo
dlg_edit_spravochnik_eh(WinHandle,e_Control(idc_просмотреть,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
HL = win_GetCtlHandle(WinHandle, idc_edit_spravochnik_4), % идентифтор контрола
lbox_Clear(HL), % очистка
chain_first(db_spravochnik, "самолет", Ref),
termView_Spravochnik(Ref, HL),
!.
%END Edit_Spravochnik, idc_просмотреть _CtlInfo
%BEGIN Edit_Spravochnik, idc_удалить _CtlInfo
dlg_edit_spravochnik_eh(WinHandle,e_Control(idc_удалить,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
HL = win_GetCtlHandle(WinHandle, idc_edit_spravochnik_4),
Current = lbox_GetSelIndex(HL),
String = lbox_GetItem(HL, Current),
frontstr(4, String, Тип_С, _),
chain_terms(db_spravochnik, "самолет", dom_Spravochnik, samolet(Тип_С, _, _), Ref),
term_delete(db_spravochnik, "самолет", Ref),
_Answer = dlg_MessageBox( "Информация...", "Информация удалена...", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),
lbox_Delete(HL, Current),
!.
%END Edit_Spravochnik, idc_удалить _CtlInfo
%BEGIN Edit_Spravochnik, idc_добавить _CtlInfo
dlg_edit_spravochnik_eh(WinHandle,e_Control(idc_добавить,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
HIE_1 = win_GetCtlHandle(WinHandle, idc_edit_spravochnik_1),
HIE_2 = win_GetCtlHandle(WinHandle, idc_edit_spravochnik_2),
HIE_3 = win_GetCtlHandle(WinHandle, idc_edit_spravochnik_3),
Тип_С = win_GetText(HIE_1),
IE_2_S = win_GetText(HIE_2),
IE_3_S = win_GetText(HIE_3),
str_int(IE_2_S,Год_С),
str_real(IE_3_S,Расход_С),
chain_inserta(db_spravochnik, "самолет", dom_Spravochnik, samolet(Тип_С, Год_С, Расход_С), _),
_Answer = dlg_MessageBox( "Информация...", "Информация добавлена...", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),
!.
%END Edit_Spravochnik, idc_добавить _CtlInfo
%BEGIN Edit_Spravochnik, e_EndApplication
dlg_edit_spravochnik_eh(_Win,e_EndApplication(_ApplicationID),0):-!,
!.
%END Edit_Spravochnik, e_EndApplication
dlg_edit_spravochnik_eh(_,_,_):-!,fail.
%END_DLG Edit_Spravochnik
%BEGIN_DLG Edit_Raspisanie
/**************************************************************************
Creation and event handling for dialog: Edit_Raspisanie
**************************************************************************/
constants
%BEGIN Edit_Raspisanie, CreateParms, 00:37:27-26.11.2007, Code automatically updated!
dlg_edit_raspisanie_ResID = idd_edit_raspisanie
dlg_edit_raspisanie_DlgType = wd_Modal
dlg_edit_raspisanie_Help = idh_contents
%END Edit_Raspisanie, CreateParms
predicates
dlg_edit_raspisanie_eh : EHANDLER
nondeterm show_key(bt_selector,ref,WINDOW)
clauses
show_key(Bt_sel, Ref, HL):-
ref_term(db_raspisanie,dom_Raspisanie,Ref,
rejs(номер_рейса(Nomber_П, Время_П), Пункт_П, Самолет_П, Дальность_П)),
format(OutString, "%-28.5s %-24.5s %-28.16s %-24.8s %05f",
Nomber_П, Время_П, Пункт_П, Самолет_П, Дальность_П),
lbox_Add(HL,OutString),
key_next(db_raspisanie,Bt_sel,Ref_1),
show_key(Bt_sel,Ref_1,HL). show_key(_,_,_).
dlg_edit_raspisanie_Create(Parent):-
win_CreateResDialog(Parent,dlg_edit_raspisanie_DlgType,dlg_edit_raspisanie_ResID,dlg_edit_raspisanie_eh,0).
%BEGIN Edit_Raspisanie, idc_ok _CtlInfo
dlg_edit_raspisanie_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtrlInfo),0):-!,
win_Destroy(_Win),
!.
%END Edit_Raspisanie, idc_ok _CtlInfo
%MARK Edit_Raspisanie, new events
%BEGIN Edit_Raspisanie, idc_удалить _CtlInfo
dlg_edit_raspisanie_eh(WinHandle,e_Control(idc_удалить,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
bt_open(db_raspisanie,"Время_П",Bt_sel_V),
bt_open(db_raspisanie,"Пункт_П",Bt_sel_P),
HL = win_GetCtlHandle(WinHandle, idc_edit_raspisanie_6),
Current = lbox_GetSelIndex(HL),
String = lbox_GetItem(HL, Current),
frontstr(5, String, Nomber_П, _),
chain_terms(db_raspisanie, "рейс", dom_Raspisanie, rejs(номер_рейса(Nomber_П, Время_П), Пункт_П, _, _), Ref),
term_delete(db_raspisanie, "рейс", Ref),
key_delete(db_raspisanie,Bt_sel_V, Время_П, Ref),
key_delete(db_raspisanie,Bt_sel_P, Пункт_П, Ref),
bt_close(db_raspisanie, Bt_sel_V),
bt_close(db_raspisanie, Bt_sel_P),
_Answer = dlg_MessageBox( "Информация...", "Информация удалена...", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),
lbox_Delete(HL, Current),
!.
%END Edit_Raspisanie, idc_удалить _CtlInfo
%BEGIN Edit_Raspisanie, idc_просмотреть _CtlInfo
dlg_edit_raspisanie_eh(WinHandle,e_Control(idc_просмотреть,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
bt_open(db_raspisanie, "Пункт_П", Bt_sel_P),
key_first(db_raspisanie, Bt_sel_P, Ref),
HL = win_GetCtlHandle(WinHandle, idc_edit_raspisanie_6), % идентифтор контрола
lbox_Clear(HL), % очистка
show_key(Bt_sel_P, Ref, HL),
bt_close(db_raspisanie, Bt_sel_P),
!.
%END Edit_Raspisanie, idc_просмотреть _CtlInfo
%BEGIN Edit_Raspisanie, idc_добавить _CtlInfo
dlg_edit_raspisanie_eh(WinHandle,e_Control(idc_добавить,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
bt_open(db_raspisanie,"Время_П",Bt_sel_V),
bt_open(db_raspisanie,"Пункт_П",Bt_sel_P),
HIE_1 = win_GetCtlHandle(WinHandle, idc_edit_raspisanie_1),
HIE_2 = win_GetCtlHandle(WinHandle, idc_edit_raspisanie_2),
HIE_3 = win_GetCtlHandle(WinHandle, idc_edit_raspisanie_3),
HIE_4 = win_GetCtlHandle(WinHandle, idc_edit_raspisanie_4),
HIE_5 = win_GetCtlHandle(WinHandle, idc_edit_raspisanie_5),
Номер_П = win_GetText(HIE_1),
Время_П = win_GetText(HIE_2),
Пункт_П = win_GetText(HIE_3),
Самолет_П = win_GetText(HIE_4),
IE_3_S = win_GetText(HIE_5),
str_real(IE_3_S, Дальность_П),
chain_inserta(db_raspisanie, "рейс", dom_Raspisanie, rejs(номер_рейса(Номер_П, Время_П), Пункт_П, Самолет_П, Дальность_П), Ref),
key_insert(db_raspisanie, Bt_sel_V, Время_П, Ref),
key_insert(db_raspisanie, Bt_sel_P, Пункт_П, Ref),
bt_close(db_raspisanie, Bt_sel_V),
bt_close(db_raspisanie, Bt_sel_P),
_Answer = dlg_MessageBox( "Информация...", "Информация добавлена...", mesbox_iconquestion, mesbox_buttonsok, mesbox_defaultfirst, mesbox_suspendapplication ),
!.
%END Edit_Raspisanie, idc_добавить _CtlInfo
%BEGIN Edit_Raspisanie, e_EndApplication
dlg_edit_raspisanie_eh(_Win,e_EndApplication(_ApplicationID),0):-!,
!.
%END Edit_Raspisanie, e_EndApplication
dlg_edit_raspisanie_eh(_,_,_):-!,fail.
%END_DLG Edit_Raspisanie
%BEGIN_DLG Search
/**************************************************************************
Creation and event handling for dialog: Search
**************************************************************************/
constants
%BEGIN Search, CreateParms, 01:18:17-26.11.2007, Code automatically updated!
dlg_search_ResID = idd_search
dlg_search_DlgType = wd_Modal
dlg_search_Help = idh_contents
%END Search, CreateParms
predicates
dlg_search_eh : EHANDLER
nondeterm termView_Raspisanie(bt_selector, bt_selector, string, WINDOW)
clauses
termView_Raspisanie(Bt_sel_V, Bt_sel_P, City, HL):-
key_current(db_raspisanie, Bt_sel_P,_,Ref),
ref_term(db_raspisanie, dom_Raspisanie, Ref,
rejs(номер_рейса(_, _), Пункт_П, _, _)),
City<>Пункт_П,
key_next(db_raspisanie, Bt_sel_P, _),
termView_Raspisanie(Bt_sel_V, Bt_sel_P,City, HL),nl,fail.
termView_Raspisanie(Bt_sel_V, Bt_sel_P, City, HL):-
key_current(db_raspisanie, Bt_sel_P,_,Ref),
ref_term(db_raspisanie,dom_Raspisanie,Ref,
rejs(номер_рейса(Nomber_П, Время_П), Пункт_П, Самолет_П, Дальность_П)),
format(OutString, "%-28.5s %-24.5s %-28.16s %-24.8s %05f",
Nomber_П, Время_П, Пункт_П, Самолет_П, Дальность_П),
lbox_Add(HL,OutString),
key_next(db_raspisanie, Bt_sel_P, _),
termView_Raspisanie(Bt_sel_V, Bt_sel_P, City, HL).
dlg_search_Create(Parent):-
win_CreateResDialog(Parent,dlg_search_DlgType,dlg_search_ResID,dlg_search_eh,0).
%BEGIN Search, idc_ok _CtlInfo
dlg_search_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtrlInfo),0):-!,
win_Destroy(_Win),
!.
%END Search, idc_ok _CtlInfo
%MARK Search, new events
%BEGIN Search, idc_поиск _CtlInfo
dlg_search_eh(WinHandle,e_Control(idc_поиск,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
bt_open(db_raspisanie,"Время_П",Bt_sel_V),
bt_open(db_raspisanie,"Пункт_П",Bt_sel_P),
HIE_1 = win_GetCtlHandle(WinHandle, idc_search_1),
City = win_GetText(HIE_1),
key_first(db_raspisanie,Bt_sel_P,_),
HL = win_GetCtlHandle(WinHandle, idc_search_2), % идентифтор контрола
lbox_Clear(HL), % очистка
termView_Raspisanie(Bt_sel_V, Bt_sel_P, City, HL),
bt_close(db_raspisanie, Bt_sel_V),
bt_close(db_raspisanie, Bt_sel_P),
!.
%END Search, idc_поиск _CtlInfo
%BEGIN Search, e_EndApplication
dlg_search_eh(_Win,e_EndApplication(_ApplicationID),0):-!,
!.
%END Search, e_EndApplication
dlg_search_eh(_,_,_):-!,fail.
%END_DLG Search
6 Тестирование программы
При запуске программы отображается ее главное окно, с помощью пунктов меню которого можно получить доступ к функциям программы.
Рис. 6.1 Главное окно программы
Для последующей работы программы, необходимо открыть существующие базу данных типов "Справочник" и "Расписание" либо создать новые с помощью пункта меню "Файл".
Рис. 6.2 Открытие файла базы данных
После открытия баз в них можно производить изменения (добавление и удаление цепочек) с помощью пункта меню Файл/Редактирова/"Тип_базы".
Рис. 6.3 Редактирование базы типа "Справочник"
Рис. 6.4 Редактирование базы типа "Расписание"
Для расчета суммарного количества горючего, необходимого для обеспечения полетов на следующие сутки требуется вернуться к главному окну программы и кликнуть по кнопке "Рассчитать":
Рис. 6.5 Расчет количества топлива
При выборе пункта меню "Поиск", на экране можно после ввода пункта назначения и нажатия кнопки "Поиск" можно увидеть список рейсов до этого пункта в порядке возрастания времени вылета:
Рис. 6.6 Список Рейсов до пункта назначения
7 Руководство пользователя
Для последующей работы программы, необходимо открыть существующие базу данных типов "Справочник" и "Расписание" либо создать новые с помощью пункта меню "Файл После открытия баз в них можно производить изменения (добавление и удаление цепочек) с помощью пункта меню Файл/Редактирова/"Тип_базы" При выборе пункта меню "Поиск", на экране можно после ввода пункта назначения и нажатия кнопки "Поиск" можно увидеть список рейсов до этого пункта в порядке возрастания времени вылета.
ВЫВОДЫ
Данный курсовой проект был разработан с целью получения навыков программирования на языке Visual Prolog при работе с базами данных. В визуальной среде проектирования был разработан простой, удобный и интуитивно понятный пользовательский интерфейс, содержащий такие визуальные элементы интерфейса Windows как ListBox, Edit Control, Static Text, Push Button, Menu и Toolbar. Данная программа позволяет производить регистрацию кандидатов в депутаты в ходе предвыборной компании и выводить различную информацию о них.
ЛИТЕРАТУРА
1. Братко Иван. Алгоритмы искусственного интеллекта на языке PROLOG, 3-е издание.: Пер. с англ. - М.: Издательский дом "Вильяме", 2004. - 640 с.: ил.
2. Адаменко А.Н., Кучуков А.М. Логическое программирование и Visual Prolog. - СПб.: -"БХВ-Петербург", 2003. - 992 c.
3. Конспект лекций по курсу "Функциональное и логическое программирование".
2
Документ
Категория
Рефераты
Просмотров
65
Размер файла
452 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа