Информационно-справочная система, обеспечивающая работу с базой данных Bit

1. Тема:

разработка информационно-справочной системы.

2. Исходные данные:

Разработать информационно-справочную систему, обеспечиваю-

щую работу с базой данных Bit включающей записи вида:

╔════════════════════════════════════════════════════════╗

║ СПИСОК АБИТУРЬЕНТОВ ║

╠═══╦════════════════════╦════╦═════╦════════════════════╣

║ ║ ФИО ║ ║ No ║ оценки за экзамены ║

║No ╠═══════╦═══╦════════╣Пол ║ экз.╠══════╦══════╦══════╣

║ ║Фамилия║Имя║Отчество║ ║листа║ 1 экз║ 2 экз║ 3 экз║

╠═══╬═══════╬═══╬════════╬════╬═════╬══════╬══════╬══════╣

Из базы Bit создать базу Вstud с записями вида:

╔════════════════════════════════════════════════════════╗

║ СПИСОК СТУДЕНТОВ ║

╠════╦═════════════════════════════════════╦═════╦═══════╣

║ ║ ФИО ║ No ║ сумма ║

║ No ╠════════════╦═══════════╦════════════╣ экз.║ балов ║

║ ║ Фамилия ║ Имя ║ Отчество ║листа║ ║

╠════╬════════════╬═══════════╬════════════╬═════╬═══════╣

Меню системы должно включать режимы корректировки, уничтоже-

ния просмотра, загрузки, сохранения.

Язык программирования Пролог.

3. Перечень вопросов, подлежащих разработке:

3.1 Разработка меню, обеспечивающее взаимодействие пользо-

вателя с системой, в соответствии с заданием, предус-

мотрев режимы:

- корректировки данных,

- уничтожения данных,

- просмотра базы,

- загрузки базы,

- сохранения базы,

- создания новой базы.

3.2 Разработка процедур:

- корректировки данных,

- уничтожения данных,

- просмотра базы,

- загрузки базы,

- сохранения базы,

- создания новой базы.

4. Перечень графических материалов:

4.1 структурная схема меню

4.2 структурная схема программы.

5. Календарный план-график работы над курсовой работой:

1. Получение задания

4.10.96

2. Анализ задания, постановка задачи, подбор и изучение

литературы

18.10.96

3. Разработка меню и структуры программы

25.10.96

4. Разработка процедур информационно-справочной системы

15.11.96

5. Отладка программы

29.11.96

6. Оформление пояснительной записки и сдача работы на про-

верку

24.12.96

7. Защита курсовой работы

25.12.96

Руководитель /Холкин И.И./

Студент /Данченков А.В., ИИ-1-95/

Введение .................................... 4

1. Понятие об информационных системах и их

программной реализации ................... 4

2. База данных и способы ее представления ... 4

3. Разработка системного меню ............... 5

4. Разработка структуры программы ........... 7

5. Разработка процедур:

5.1 Основной процедуры Begin ............. 8

5.2 Вывода главного меню Main_menu ....... 8

5.3 Автоматической загрузки БД Autoload .. 9

5.4 Вывода информации о системе

Working(0) ........................... 9

5.5 Вывода меню корректировки Working(1) . 9

5.6 Удаления записей Working(2) .......... 9

5.7 Вывода меню просмотра Working(3) ..... 9

5.8 Вывода меню загрузки Working(4) ..... 10

5.9 Вывода меню сохранения Working(5) ... 10

5.10 Создания новой БД Working(6) ....... 10

5.11 Выхода из программы Working(7) ..... 10

5.12 Обработки ошибки пользователя

Working(_) ......................... 10

5.13 Корректировки данных Correct(1) .... 10

5.14 Добавления новых записей Correct(2). 11

5.15 Просмотра БД View .................. 11

5.16 Вспомагательной Accept ............. 11

5.17 Вспомагательных Skip и Skip1 ....... 11

5.18 Загрузки БД с диска Bd_load ........ 12

5.19 Сохранения БД на диске Bd_save ..... 12

5.20 Вспомагательной Ask ................ 12

5.21 Mesage ............................. 12

5.22 Error и Io_error ................... 12

5.23 Ok ................................. 12

6. Листинг программы ....................... 13

7. Отладка программы ....................... 24

8. Инструкция пользователя и решение

контрольных примеров: ................... 25

Заключение ................................. 28

Список литературы .......................... 29

Данная курсовая написана на языке Пролог в среде Turbo Prolog

v 2.0 (русифицированная версия). В структуре языка заложены воз-

можности простой и черезвычайно эффективной работы с базами дан-

ных, что позволяет на его основе создавать различного рода инфор-

мационно - справочные системы. Структура языка Пролог соответ-

ствует структуре реляционных баз данных. Так отношению в РБД

соответствует предикат в Прологе, элементу - факт, атрибуту отно-

шения - аргумент предиката и т.д. Встроенные в Пролог предикаты

работы с окнами позволяют создать дружественный интерфейс для ра-

боты пользователя с информационно - справочной системой.

Информационно-справочные системы - это программы-оболочки,

служащие для управления массивами и базами данных. В наш век

всеобщей компьютеризации информационно-справочные системы значи-

тельно облегчают труд человека во всех отраслях народного хозяй-

ства. Значительно упростилась работа московской милиции по обна-

ружению угнаного транспорта после создания в Москве компьютерных

баз данных по угнаным автомобилям. Бухгалтерам предприятий и фирм

теперь не нужно перебирать горы бумаг, чтобы получить все данные

о сотруднике: достаточно загрузить информационно-справочную сис-

тему и она в удобной форме выдаст всю необходимую информацию.

Области применения информационно-справочных систем воистину

безграничны: это ведение статистики удоя скота на ферме, состав-

ление каталогов книг в библиотеках и произведений искусства в му-

зеях, сбор данных о наличии рабочих вакансий в данном регеоне и

многие другие.

Одним из способов програмной реализации информационно-спра-

вочной системы является использование для ее создания языка логи-

ческого программирования Пролог. В данной реализации языка содер-

жится множество встроенных предикатов, существенно облегчающих

написание таких систем.

База данных в простейшем случае - упорядоченная структура

данных в виде таблицы, каждая запись которой может объединять

разнотипные данные, причем все записи одной базы имеют одинако-

вую структуру. Существуют три модели представления баз данных:

иерархическая, сетевая и реляционная. В силу особенностей языка

Пролог, с его помощью реализуется реляционная модель. Каждая

строка в базе данных называется элементом отношения, каждая ко-

лонка - атрибутом отношения, колличество колонок - арностью, а

колличество строк - мощностью. В языке программирования Пролог

атрибуту отношения соответствует аргумент предиката, арности -

колличество аргументов в предикате, отношению - предикат, элемен-

ту - факт, и мощности - число фактов. Исходя из вышеперечислен-

ных соответствий Пролог является прекрасным средством для реали-

зации реляционных баз данных.

Все режимы программы активизируются с помощью меню, которое

реализовано с помощью процедуры main_menu. Для активизации како-

го либо режима пользователю следует нажать цифровую клавишу,

соответствующую выбранному пункту меню.

Меню данной программы состоит из семи пунктов:

0 - О системе... - вывод данных о системе

1 - Корректировка данных - режим корректировки данных

2 - Уничтожение данных - режим удаления данных

3 - Просмотр базы - режим просмотра базы

4 - Загрузка базы - режим загрузки базы

5 - Сохранение базы - режим сохранения базы

6 - Создание новой базы - режим создания новой базы

7 - Выход из программы - выход из программы

На следующей странице представлена графическая структура меню.

╔═══════════════════╗

║ begin ║

║───────────────────║

║основная процедура║

╚═════════╦═════════╝

╔════════════════╩═══════════════╗

╔═══════╩═════════╗ ╔══════╩═══════╗

║ autoload ║ ║ main_manu ║

║─────────────────║ ║──────────────║

║ автозагрузка БД ║ ║ главное меню ║

╚═════════════════╝ ╚══════╦═══════╝

╔════════╦════════╦════════╦═══════╦══════╬═══════╗

║ ║ ║ ║ ║ ║ ║

╔═══╩══════╗ ║ ╔══════╩══════╗ ║ ╔═════╩════╗ ║ ╔═════╩════╗

║working(0)║ ║ ║ working(1) ║ ║ ║working(2)║ ║ ║working(3)║

║──────────║ ║ ║─────────────║ ║ ║──────────║ ║ ║──────────║

║Информация║ ║ ║Корректировка║ ║ ║ Удаление ║ ║ ║ Просмотр ║

║о системе║ ║ ║ данных ║ ║ ║ данных ║ ║ ║ базы ║

╚══════════╝ ║ ╚══════╦══════╝ ║ ╚═════╦════╝ ║ ╚═════╦════╝

╔═════════════╣ ╔╝ ║ ╚╗ ║ ╚═════╗

║ ║ ║ ║ ║ ╚═╗ ║

║ ╔═════╩═════╗ ║ ╔══════╩══════╗ ║ ╔═════╩════╗ ║

║ ║ working(4)║ ║ ║ working(5) ║ ║ ║working(6)║ ║

║ ║───────────║ ║ ║─────────────║ ║ ║──────────║ ║

║ ║ Процедура ║ ║ ║ Процедура ║ ║ ║ Создание ║ ║

║ ║загрузки БД║ ║ ║сохранения БД║ ║ ║ новой БД ║ ║

║ ╚═════╦═════╝ ║ ╚══════╦══════╝ ║ ╚══════════╝ ║

║ ║ ║ ╚══════╗ ║ ║

║ ╚╗ ╠═══════╦══════╗ ║ ╚═══════════╗ ║

║ ╔══════════╗ ║ ║ ║ ║ ╚═════╗ ║ ║

║ ║working(7)║ ║ ╔════╩═════╗ ║ ╔════╩═════╗ ║ ╔═════╩═════╗ ║

╠═╣──────────║ ║ ║correct(1)║ ║ ║correct(2)║ ║ ║ accept(N) ║ ║

║ ║ Выход ║ ║ ║──────────║ ║ ║──────────║ ║ ║───────────║ ║

║ ╚══════════╝ ║ ║Изменение ║ ║ ║Ввод новых║ ║ ║Определение║ ║

║ ╔══════════╗ ║ ║ данных ║ ║ ║ данных ║ ║ ║ удаляемой ║ ║

║ ║working(_)║ ║ ╚══════════╝ ║ ╚══════════╝ ║ ║ записи ║ ║

╚═╣──────────║ ║ ╔═══════╩════════╗ ║ ╚═══════════╝ ║

║ Обработка║ ║ ║ correct(_) ║ ║ ║

║ ошибки ║ ║ ║────────────────║ ║ ║

╚══════════╝ ║ ║ выход в главное║ ║ ╔═══╝

║ ║ меню ║ ║ ║

║ ╚════════════════╝ ║ ║

║ ║ ║

║ ║ ║

(1) (2) (3)

(1) (2) (3)

║ ║ ║

║ ║ ╚══╗

║ ╚═══════════╗ ║

╔═══════╩═══════╦════════════╦══════════════╗ ║ ║

╔═════╩══════╗ ╔══════╩════╗ ╔═════╩══════╗ ╔═════╩════╗ ║ ║

║ load_bd(1) ║ ║ load_bd(2)║ ║ load_bd(3) ║ ║load_bd(4)║ ║ ║

║────────────║ ║───────────║ ║────────────║ ║──────────║ ║ ║

║ Загрузка ║ ║ Загрузка ║ ║ Загрузка ║ ║ Загрузка ║ ║ ║

║основной БД ║ ║основной БД║ ║ новой БД ║ ║ новой БД ║ ║ ║

║ из файла ║ ║ из файла ║ ║ из файла ║ ║ из файла ║ ║ ║

║пользователя║ ║ bit.dat ║ ║пользователя║ ║ bstud.dat║ ║ ║

╚════════════╝ ╚═══════════╝ ╚════════════╝ ╚══════════╝ ║ ║

║ ║

╔═══════════════╦════════════╦══════════════╦══════╝ ║

╔═════╩══════╗ ╔══════╩════╗ ╔═════╩══════╗ ╔═════╩════╗ ║

║ save_bd(1) ║ ║ save_bd(2)║ ║ save_bd(3) ║ ║save_bd(4)║ ║

║────────────║ ║───────────║ ║────────────║ ║──────────║ ║

║ Сохранение ║ ║ Сохранение║ ║ Сохранение ║ ║Сохранение║ ║

║основной БД ║ ║основной БД║ ║ новой БД ║ ║ новой БД ║ ║

║ в файле ║ ║ в файле ║ ║ в файле ║ ║ в файле ║ ║

║пользователя║ ║ bit.dat ║ ║пользователя║ ║ bstud.dat║ ║

╚════════════╝ ╚═══════════╝ ╚════════════╝ ╚══════════╝ ║

╔═══════════════════╦═══════════════════╦═════════╝

╔══════╩══════╗ ╔══════╩══════╗ ╔══════╩══════╗

║ view(1) ║ ║ view(2) ║ ║ view(_) ║

║─────────────║ ║─────────────║ ║─────────────║

║ Просмотр ║ ║ Просмотр ║ ║ Выход ║

║ основной БД ║ ║ новой БД ║ ║ в меню ║

╚═════════════╝ ╚═════════════╝ ╚═════════════╝

Процедуры создавались на основе требований, изложенных в за-

дании к курсовой работе.

С помощью процедуры Begin в разделе GOAL инициируется нача-

ло выполнения программы. Эта процедура запускает процедуру на-

чальной загрузки базы данных Autoload, после чего передает управ-

ление процедуре вывода главного меню Main_menu.

Эта процедура выводит список пунктов главного меню и ожи-

дает от пользователя ввода числа, которое будет занесено в пере-

менную C. После этого вызывается процедура обработки основных ре-

жимов Working, в которую переменная C передается в качестве аргу-

мента. В процедуре использован предикат Repeat, в связи с этим

после возврата из процедуры Working в случае, если C не равно 7

происходит повторный вывод пунктов меню и ожидание ввода числа.

Процедура Autoload предназначена для автоматической загруз-

ки основной базы данных при запуске программы. Это значительно

облегчает работу с системой, так как не требуется при запуске

программы подгружать основную БД из режима "Загрузка". Процедура

Autoload проверяет существование на диске файла bit.dat с по-

мощью встроенного предиката existfile и подгружает БД в память с

помощью предиката consult. В случае отсутствия файла выдается

сообщение об ошибке.

Данная процедура выводит информацию о языке, на котором на-

писана система и данные о создателе.

Процедура Working(1) служит для вывода меню режима коррек-

ции данных, находящихся в БД, и внесения новых записей. После ак-

тивизации процедура выводит меню в котором имеются режимы: "Изме-

нение данных", "Добавление данных" и "Выход в меню". Активизация

режимов происходит аналогично главному меню с помощью нажатия

соответствующей цифровой клавиши. Считанное с клавиатуры число

заносится в переменную X, после чего вызывается процедура

Correct, аргументом которой служит X. С помощью процедур

Correct(1) и Correct(2), описанных ниже, собственно и реализует-

ся режимы коррекции и добавления. В процедуре Working(1) также

применен предикат Repeat, с помощью которого реализован повтор-

ный вывод меню в случае ошибки ввода.

Данная процедура предназначена для удаления записей из базы

данных. В программе предусмотрена возможность задания либо номе-

ра удаляемой записи, либо фамилии абитурьента, содержащейся в

данной записи. Эта возможность реализуется процедурой Accept,

описанной ниже. Процедура Accept возвращает номер выбранной запи-

си и с помощью встроенного предиката retract запись удаляется из

базы данных. В случае ошибки (отсутствия записи, выбранной

пользователем для удаления) выводится соответствующее сообщение

(процедура Error).

Процедура Working(3) выводит меню, содержащее пункты: "Прос-

мотр основной базы", "Просмотр базы BSTUD" и "Выход в главное ме-

ню". Собственно просмотр содержимого БД осуществляют процедуры

View(1) и View(2), рассмотренные ниже. Процедура Working(3) реа-

лизована в стиле процедур Main_menu и Working(1) с применением

процедуры Repeat.

Данная процедура выводит меню, содержащее следующие пункты:

"Загрузить основную базу из выбранного файла", " Загрузить основ-

ную базу из файла bit.dat", " Загрузить базу BSTUD из выбранного

файла"," Загрузить базу BSTUD из файла bstud.dat" и "Выход в

главное меню". Собственно загрузка баз данных осуществляется про-

цедурой Load_bd, аргументом которой служит переменная C, считан-

ная с клавиатуры при вводе пользователем номера желаемого пункта

меню. В процедуре Working(4) также применена процедура Repeat.

Процедура Working(5) аналогична Working(4). Для сохранения

баз данных применяется процедура Save_bd, рассмотренная ниже, ар-

гументом которой является переменная I.

Данная процедура служит для создания новой базы данных. Про-

цедура работает следующим образом: из базы, имеющей метку "аби-

турьент" , извлекаются нужные данные, производится суммирование

оценок за экзамены и новая запись с помощью предиката assertz до-

бавляется к базе с меткой "студент". Для того, чтобы были обрабо-

таны все записи, используется fail. После создания новой БД вы-

дается соответствующее сообщение и предупреждение о том, чтобы

пользователь не забыл сохранить вновь созданую БД.

Данная процедура состоит из отсечения, которое запрещает

дальнейший перебор. Процедура оканчивается успехом и происходит

возврат в процедуру Main_menu, в которой выполняется условие C=7,

благодаря чему происходит выход из программы.

Процедура Working(_) выводит сообщение об ошибке ввода циф-

ры и подсказку о том, что следует ввести число от 0 до 7. Вывод

сообщения сопровождается подачей звукового сигнала, реализован-

ной с помощью встроенного предиката sound. После нажатия клавиши

происходит возврат в главное меню.

Данная процедура производит коррекцию данных в записи.

Имеется возможность выбрать запись для корректировки либо по но-

меру, либо по фамилии абитурьента. Данную возможность предостав-

ляет процедура Accept, описанная ниже, которая вызывается после

создания окна "Изменение данных". Процедура Accept передает но-

мер выбранной записи в переменную N, после чего содержимое запи-

си распечатывается на экране. После этого пользователю предостав-

ляется возможность ввести измененные данные; если нет необходи-

мости изменять какой-либо элемент, можно нажать клавишу <Enter>.

Все данные, в том числе и числа, считываются в формате строк. Это

необходимо для осуществления возможности отказа от изменения эле-

мента нажатием клавиши <Enter>. Все считанные данные передаются

процедурам Skip (для строковых выходных данных) и Skip1 (для це-

лочисленных выходных данных). Эти процедуры в зависимости от то-

го, была ли нажата клавиша <Enter> возвращают в процедуру

Correct(1) либо старое значение, либо новое, при чем процедура

Skip1 преобразует с помощь встроенного предиката str_int строко-

вые данные в целочисленные. Старая запись удаляется из базы дан-

ных предикатом retract, а новая добавляется предикатом assertz.

По окончании выводится предупреждение о том, что следует сохра-

нить вновь введенные данные(процедура Mesage).

Процедура Correct(2) служит для добавления записей к БД.

Пользователь поочередно вводит каждый элемент записи, отвечая на

запросы системы. С помощью предиката assertz данные добавляются в

БД, после чего вызывается предикат Ask, формирующий запрос на

продолжение процесса ввода новых записей. Если от пользователя

будет получен утвердительный ответ, то благодаря процедуре Repeat

цикл ввода данных повторится, при получении отрицательного отве-

та система выдаст предупреждение о необходимости сохранения вновь

введенных данных (процедура Mesage) и произойдет возврат из про-

цедуры Correct(2).

Данная процедура служит для вывода на экран содержимого ос-

новной ( View(1) ) и вновь созданной ( View(2) ) баз данных. Каж-

дая из процедур выводит заголовочную таблицу, после чего распеча-

тывает содержимое каждой записи. Для перебора всей БД применен

предикат fail. После вывода всех записей выводится просьба на-

жать любую клавишу для продолжения.

Данная процедура является вспомагательной к процедурам

Correct(1) и Working(2). Она в паре со вспомагательной процеду-

рой Acp определяет номер желаемой записи после ввода пользовате-

лем либо собственно номера этой записи, либо после ввода фамилии

абитурьента (данные пункты присутствуют в меню, выводимом проце-

дурой Accept) и возвращает этот номер в вызывавшую процедуру.

Процедуры Skip и Skip1 являются вспомагательными к процеду-

ре Correct(1). Они позволяют определить, следует ли замещать

имеющийся элемент записи на новый или нет (если была нажата кла-

виша <Enter>). В процедурах проверяется, является ли первый аргу-

мент пустой строкой. Если это так, то третьему аргумент присваи-

вается второй. Если же первый аргумент не является пустой стро-

кой, то он присваивается третьему аргументу (в Skip1 происходит

предварительное преобразование строковой переменной в целочислен-

ную).

Данная процедура осуществляет загрузку баз данных из фай-

лов на диске по признакам, зависящим от аргумента процедуры:

Bd_load(1) загружает основную БД из файла, заданного пользовате-

лем, Bd_load(2) - из файла bit.dat, Bd_load(3) - базу BSTUD из

файла, заданного пользователем и BD_load(4) - базу BSTUD из фай-

ла bstud.dat. В данных процедурах проверяется наличие файла на

диске с помощью предиката existfile и загрузка БД в память с по-

мощью предиката consult. В случае отсутствия файла на диске, вы-

дается соответствующее сообщение (процедура Io_error).

Данная процедура осуществляет сохранение баз данных в фай-

лах на диске по признакам, зависящим от аргумента процедуры:

Bd_save(1) сохраняет основную БД в файле, заданном пользователем,

Bd_save(2) - в файле bit.dat, Bd_save(3) - базу BSTUD в файле,

заданном пользователем и BD_save(4) - базу BSTUD в файле

bstud.dat. Сохранение БД осуществляется с помощью встроенного

предиката save. В случае ошибки выдается соответствующее сообще-

ние (процедура Error).

Процедура Ask является вспомагательной к процедуре

Correct(2). Она запрашивает пользователя, желает ли он продол-

жить ввод данных.

Данная процедура выводит предупреждение о необходимости

сохранения вновь введенных данных.

Эти процедуры выводят сообщения об ошибках.

Данная процедура выводит сообщение об успешном выполнении

операции.

domains

Str=string

Int=integer

ФИО=фио(Str,Str,Str)

ОЦЕН=оцен(Int,Int,Int)

database - студент

студент(Int,ФИО,Int,Int),

database - абитурьент

абитурьент(Int,ФИО,Str,Int,ОЦЕН)

predicates

begin

main_menu

autoload

accept(Int)

acp(Int,Int)

working(Int)

correct(Int)

view(Int)

skip(Str,Str,Str)

skip1(Str,Int,Int)

ask

mesage

error

io_error

ok

save_bd(Int)

load_bd(Int)

repeat

goal

begin.

clauses

/* Основная процедура, стр.8 */

begin:-

makewindow(1,26,94,"СПИСОК АБИТУРЬЕНТОВ",0,0,25,80),

clearwindow,

autoload,

main_menu.

/* Главное меню, стр.8 */

main_menu:-

repeat,

cursor(7,0),

write(" 0 - О системе... "),nl,

write(" 1 - Корректировка данных"),nl,

write(" 2 - Уничтожение записей"),nl,

write(" 3 - Просмотр базы"),nl,

write(" 4 - Загрузка базы"),nl,

write(" 5 - Сохранение базы"),nl,

write(" 6 - Создание новой базы"),nl,

write(" 7 - Выход из программы"),nl,

write(" =>"),

readint(C),

clearwindow,

working(C),

clearwindow,

C = 7,

retractall(_),

removewindow.

/* Процедура автоматической загрузки базы данных, стр.9 */

autoload:-

retractall(_,абитурьент),

existfile("bit.dat"),

consult("bit.dat",абитурьент),

cursor(21,30),

write("*База загружена*").

autoload:-

makewindow(2,74,79,"ОШИБКА",6,18,8,40),

cursor(2,10),

write("Нет базы на диске"),

sound(70,294),

removewindow,

!.

/* Вывод данных о создателе программы, стр.9 */

working(0):-

makewindow(3,27,30,"О системе...",0,0,25,80),

nl,nl,

write(" Инфоpмационно-спpавочная система"),

nl,nl,

write(" Список абитурьентов "),

nl,nl,nl,nl,

write(" Программа составлена в среде "),

nl,

write(" TURBO-PROLOG v.2.0."),

nl,nl,nl,

write(" автоp: Данченков А.В."),

nl,nl,

write(" МГИРЭА, гp.ИИ-1-95 (с) 1996 г. "),

nl,

sound(5,220),

cursor(22,26),

write("Нажмите на любую клавишу"),

readchar(_),

removewindow,!.

/* Процедура вывода меню корректировки данных, стр.9 */

working(1):-

makewindow(4,26,48,"Коppектировка данных",0,0,25,80),

sound(5,220),

repeat,

nl,

nl,

cursor(9,0),

write(" 1 - Изменение данных"),nl,

write(" 2 - Добавление данных"),nl,

write(" 3 - Выход в главное меню" ),nl,

write(" =>"),

readint(X),

clearwindow,

X>0,X<=3,

correct(X),

clearwindow,

X=3,!,

removewindow.

/* Процедура уничтожения данных, стр.9 */

working(2):-

makewindow(5,48,107,"Уничтожение записей",0,0,25,80),

sound(5,220),

nl,

accept(N),

X=N,

абитурьент(X,фио(Fm,Nm,Ot),Pl,Ls,оцен(E1,E2,E3)),

retract(абитурьент(X,фио(Fm,Nm,Ot),Pl,Ls,оцен(E1,E2,E3))),

ok,

!,

removewindow.

working(2):-

error,

removewindow,!.

/* Процедура вывода меню просмотра базы данных, стр.9 */

working(3):-

makewindow(6,30,26,"Просмотp базы",0,0,25,80),

sound(5,220),

repeat,

nl,

nl,

cursor(10,0),

write(" 1 - Просмотр основной базы"),nl,

write(" 2 - Просмотр базы BSTUD"),nl,

write(" 3 - Выход в главное меню" ),nl,

write(" =>"),

readint(X),

clearwindow,

X>0,X<=3,

view(X),

clearwindow,

X=3,!,

removewindow.

/* Процедура загрузки базы данных, стр.10 */

working(4):-

makewindow(7,62,120,"Загрузка",5,10,15,60),

sound(5,220),

repeat,

nl,nl,

write("1 - Загрузить основную базу из выбранного файла"),nl,

write("2 - Загрузить основную базу из файла bit.dat"),nl,

write("3 - Загрузить базу BSTUD из выбранного файла"),nl,

write("4 - Загрузить базу BSTUD из файла bstud.dat"),nl,

write("5 - Выход в основное меню"),nl,

write("=>"),

readint(C),

clearwindow,

C>0,C<=5,

load_bd(C),

clearwindow,

C = 5,!,

removewindow.

/* Процедура сохранения базы данных, стр.10 */

working(5):-

makewindow(8,62,120,"Сохранение",5,10,15,60),

sound(5,220),

repeat,

nl,nl,

write("1 - Сохранить основную базу в указанном файле"),nl,

write("2 - Сохранить основную базу в файле bit.dat"),nl,

write("3 - Сохранить базу BSTUD в указанном файле"),nl,

write("4 - Сохранить базу BSTUD в файле bstud.dat"),nl,

write("5 - Выход в основное меню"),nl,

write("=>"),

readint(I),

clearwindow,

I>0,I<=5,

save_bd(I),

clearwindow,!,

removewindow.

/* Процедура создания новой базы данных, стр.10 */

working(6):-

makewindow(10,43,120,"Создание базы данных BSTUD",6,18,8,40),

sound(5,220),

nl,

retractall(_,студент),

абитурьент(N,фио(Fam,Nam,Otch),Pol,List,оцен(E1,E2,E3)),

N=N1, Fam1=Fam, Nam1=Nam,

OtcH2=Otch, List1=List, Sum=E1+E2+E3,

assertz(студент(N1,фио(Fam1,Nam1,OtcH2),List,Sum)),

fail.

working(6):-

write(" База BSTUD создана."),

nl,

write(" Не забудьте сохранить ее!"),

nl,nl,

write(" Нажмите на любую клавишу"),

readchar(_),

removewindow,!.

/* Процедура выхода, стр.10 */

working(7):-!.

/* Обработка ошибки пользователя, стр.10 */

working(_):-

makewindow(16,74,79,"ОШИБКА ВВОДА",6,18,8,40),

nl,

write(" Введите число от 0 до 7,"),nl,

write(" соответствующее выбранному пункту"),nl,nl,nl,

write(" Нажмите на любую клавишу"),

sound(20,494),

sound(30,392),

readchar(_),

removewindow.

/* Процедура коррекции данных в базе, стр.10 */

correct(1):-

makewindow(4,26,48,"Изменение данных",0,0,25,80),

nl,

accept(N),

X=N,

абитурьент(X,фио(Fam,Nam,Otch),Pol,List,оцен(E1,E2,E3)),

clearwindow,nl,

write("Порядковый номер абитурьента : "),write(N),nl,

write("Фамилия : "),write(Fam),nl,

write("Имя : "),write(Nam),nl,

write("Отчество : "),write(Otch),nl,

write("Пол : "),write(Pol),nl,

write("Номер экзаменационного листа : "),write(List),nl,nl,

write("Оценки за экзамены - "),nl,nl,

write("За первый: "),write(E1),write(" "),

write("За второй: "),write(E2),write(" "),

write("За третий: "),write(E3),

nl,nl,nl,

write("Введите фамилию : "),readln(Fam1),

write("Введите имя : "),readln(Nam1),

write("Введите отчество : "),readln(OtcH2),

write("Введите пол : "),readln(Pol1),

write("Введите номер экзаменационного листа: "),readln(List1),

write("Введите оценки за экзамены - "),nl,

write("За первый : "),readln(Ekz1),

write("За второй : "),readln(Ekz2),

write("За третий : "),readln(Ekz3),nl,

X1=X,

retract(абитурьент(X,фио(Fam,Nam,Otch),Pol,List,оцен(E1,E2,E3))),

skip(Fam1,Fam,Fam2),

skip(Nam1,Nam,Nam2),

skip(OtcH2,Otch,OtcH3),

skip(Pol1,Pol,Pol2),

skip1(List1,List,List2),

skip1(Ekz1,E1,E11),

skip1(Ekz2,E2,E22),

skip1(Ekz3,E3,E33),

assertz(абитурьент(X1,фио(Fam2,Nam2,OtcH3),Pol2,List2,оцен(E11,E22,E33))),

!,

mesage,

removewindow.

/* Процедура добавления новых записей, стр.11 */

correct(2):-

makewindow(9,26,48,"Ввод новых данных",0,0,25,80),

repeat,

nl,

write("Введите порядковый номер абитурьента: "),readint(K),nl,

write("Введите фамилию : "),readln(F),nl,

write("Введите имя : "),readln(N),nl,

write("Введите отчество : "),readln(O),nl,

write("Введите пол : "),readln(P),nl,

write("Введите номер экзаменационного листа: "), readint(L),nl,

write("Введите оценки за экзамены -"),nl,nl,

write(" За первый : "),readint(E1),nl,

write(" За второй : "),readint(E2),nl,

write(" За третий : "),readint(E3),nl,

N1=K,

Fam=F,Nam=N,Otch=O,

Pol=P,List=L,

Ekz1=E1,Ekz2=E2,Ekz3=E3,

assertz(абитурьент(N1,фио(Fam,Nam,Otch),Pol,List,оцен(Ekz1,Ekz2,Ekz3))),

ask,!,

mesage,

removewindow.

correct(_).

/* Процедура просмотра базы, стр.11 */

view(1):-

makewindow(16,31,26,"Просмотp основной базы",0,0,25,80),

nl,nl,

write("╔═══════════════════════════════════════════════════════╗"),nl,

write("║ СПИСОК АБИТУРЬЕНТОВ ║"),nl,

write("╠════╦═════════════════════╦═══╦═════╦══════════════════╣"),nl,

write("║ ║ ФИО ║ ║ No ║оценки за экзамены║"),nl,

write("║ No ╠═══════╦════╦════════╣Пол║ экз.╠═════╦══════╦═════╣"),nl,

write("║ ║Фамилия║Имя ║Отчество║ ║листа║1 экз║ 2 экз║3 экз║"),nl,

write("╠════╬═══════╬════╬════════╬═══╬═════╬═════╬══════╬═════╣"),nl,

абитурьент(N,фио(Fam,Nam,Otch),Pol,List,оцен(E1,E2,E3)),

cursor(Z,_),

cursor(Z,2),write(N),

cursor(Z,5),write("║",Fam),

cursor(Z,18),write("║",Nam),

cursor(Z,30),write("║",Otch),

cursor(Z,43),write("║ ",Pol),

cursor(Z,49),write("║ ",List),

cursor(Z,55),write("║ ",E1),

cursor(Z,62),write("║ ",E2),

cursor(Z,69),write("║ ",E3),

cursor(Z,0),write("║"),

cursor(Z,76),write("║"),

nl,

fail.

view(1):-

write("╚════╩═══════╩════╩════════╩═══╩═════╩═════╩══════╩═════╝"),

nl,

cursor(22,26),

write("Нажмите на любую клавишу"),

readchar(_),

removewindow.

view(2):-

nl,

makewindow(13,31,26,"Просмотр новой базы данных",0,0,25,80),

write("╔═══════════════════════════════════════════════════════╗"),nl,

write("║ СПИСОК СТУДЕНТОВ ║"),nl,

write("╠════╦════════════════════════════════════╦═════╦═══════╣"),nl,

write("║ ║ ФИО ║ No ║ сумма ║"),nl,

write("║ No ╠════════════╦═══════════╦═══════════╣ экз.║ балов ║"),nl,

write("║ ║ Фамилия ║ Имя ║ Отчество ║листа║ ║"),nl,

write("╠════╬════════════╬═══════════╬═══════════╬═════╬═══════╣"),nl,

студент(N,фио(Fam,Nam,Otch),List,Sum),

cursor(Z,_),

cursor(Z,11),write(N),

cursor(Z,14),write("║",Fam),

cursor(Z,27),write("║",Nam),

cursor(Z,39),write("║",Otch),

cursor(Z,52),write("║ ",List),

cursor(Z,58),write("║ ",Sum),

cursor(Z,9),write("║"),

cursor(Z,66),write("║"),

nl,

fail.

view(2):-

write("╚════╩════════════╩═══════════╩═══════════╩═════╩═══════╝"),

nl,

cursor(22,26),

write("Нажмите на любую клавишу"),

readchar(_),

removewindow.

view(_).

/* Вспомагательная процедура к процедуре */

/* correct(1) и working(2), стр.11 */

accept(N):-

nl,

cursor(10,0),

write(" 1 - известен номер абитурьента"),nl,

write(" 2 - известна фамилия"),nl,

write(" =>"),

readint(X),

acp(X,N).

acp(1,N):-

nl,

write(" Введите номер абитурьента: "),nl,

write(" >"),

readint(N),

абитурьент(P,_,_,_,_),

P=N.

acp(1,N):-

N=0.

acp(2,N):-

nl,

write(" Введите фамилию абитурьента: "),nl,

write(" >"),

readln(L),

абитурьент(Y,фио(L,_,_),_,_,_),

N=Y.

acp(2,N):-

N=0.

/* Вспомагательная процедура к correct(1), стр.11 */

skip("",Fam,Fam2):-

Fam2=Fam,

!.

skip(Fam1,_,Fam2):-

Fam2=Fam1,

!.

skip1("",Fam,Fam2):-

Fam2=Fam,

!.

skip1(Fam1,_,Fam2):-

str_int(Fam1,Fam3),

Fam2=Fam3,

!.

/* Процедура чтения с диска, стр.12 */

load_bd(1):-

retractall(_,абитурьент),nl,nl,

write(" Введите имя файла :"),

readln(N),

existfile(N),

consult(N,абитурьент),

ok,

!.

load_bd(1):-

io_error,

!.

load_bd(2):-

retractall(_,абитурьент),

existfile("bit.dat"),

consult("bit.dat",абитурьент),

ok,

!.

load_bd(2):-

io_error,

!.

load_bd(3):-

retractall(_,студент),nl,nl,

write(" Введите имя файла :"),

readln(N),

existfile(N),

consult(N,студент),

ok,

!.

load_bd(3):-

io_error,

!.

load_bd(4):-

retractall(_,студент),

existfile("bstud.dat"),

consult("bstud.dat",студент),

ok,

!.

load_bd(4):-

io_error,

!.

load_bd(_).

/* Процедура записи на диск, стр.12 */

save_bd(1):-

nl,nl,

write(" Введите имя файла : "),

readln(N),

save(N,абитурьент),nl,

ok,

!.

save_bd(1):-

error.

save_bd(2):-

save("bit.dat",абитурьент),

ok,

!.

save_bd(2):-

error.

save_bd(3):-

nl,nl,

write(" Введите имя файла : "),

readln(N),

save(N,студент),nl,

ok,

!.

save_bd(3):-

error.

save_bd(4):-

save("bstud.dat",студент),

ok,

!.

save_bd(4):-

error.

save_bd(_).

/* Процедура запроса на окончание ввода в correct(2), стр.12 */

ask:-

makewindow(10,43,120,"Вопрос",6,18,8,40),nl,nl,

write(" Продолжить процесс ввода данных? "),nl,nl,

write(" [Д]а/[Н]ет"),

readchar(Ch),

removewindow,

clearwindow,

Ch='Н',!.

/* Вывод предупреждения о необходимости сохранения данных, стр.12 */

mesage:-

makewindow(17,74,79,"Предупреждение",6,18,8,40),nl,

write(" Не забудьте сохранить "),nl,

write(" вновь введенные данные!"),nl,nl,

write(" Нажмите на любую клавишу"),

readchar(Ch),

removewindow.

/* Процедуры вывода сообщения об ошибке, стр.12 */

error:-

makewindow(15,74,79,"ОШИБКА",6,18,8,40),

cursor(2,16),

write("ОШИБКА"),nl,nl,

write(" Нажмите на любую клавишу"),

sound(70,294),

readchar(_),

removewindow,

!.

io_error:-

makewindow(16,74,79,"ОШИБКА",6,18,8,40),

cursor(2,7),

write("Данного файла нет на диске"),nl,nl,

write(" Нажмите на любую клавишу"),

sound(70,294),

readchar(_),

removewindow.

/* Процедура вывода сообщения об успешном завершении */

/* данной операции, стр.12 */

ok:-

makewindow(17,27,90,"ОК",6,18,8,40),

cursor(2,7),

write(" ОПЕРАЦИЯ ВЫПОЛНЕНА"),nl,nl,

write(" Нажмите на любую клавишу"),

readchar(_),

removewindow.

/* Процедура repeat */

repeat.

repeat:- repeat.

При отладке программы ошибки устранялись в три этапа. На

первом этапе интерпритатор языка Пролог сам указывал на синтакси-

ческие ошибки. Такие ошибки возникали при неправильном написании

имен встроенных предикатов, когда я забывал описать новые преди-

каты в разделе predicates и т.д. Если компиляция прошла успешно,

но программа работала некорректно, приходилось переходить ко вто-

рому этапу - просмотру текста программы и логическому осмыслению

ошибки. На этом этапе были устранены такие ошибки, как вывод все-

го одной записи базы данных в режиме просмотра БД. Причиной это-

му было отсутствие в конце процедуры предиката fail. Ошибка была

устранена. Если не помогал второй этап, приходилось переходить к

третьему - трассировке. Так была установлена следующая ошибка:

при выходе из процедуры Working(4) главное меню выводилось не в

окне "Список абитурьентов", а в окне "Загрузка" (т.е. не удаля-

лось это окно "Загрузка"). После трассировки было выяснено, что в

процедуре не в том месте стоит предикат Repeat ( он стоял в нача-

ле процедуры, а его следовало поставить после предиката

makewindow), из-за чего происходило многократное создание окна

"Загрузка" и только однократное его удаление. Ошибка была исправ-

лена. В процессе конечной отладки и решения контрольных примеров

ошибок в программе обнаружено не было.

Программа "Список абитурьентов" представляет собой инфор-

мационно-справочную систему. В данной программе имеется возмож-

ность создания новой базы данных, являющейся списком зачисленных

студентов. В основной БД присутствуют данные о фамилии, имени и

отчестве абитурьента, его поле, номере экзаменационного листа и

оценках за три экзамена. В дочерней БД имеются те же данные за

исключением пола и того, что оценки за экзамены заменены их сум-

мой.

При запуске программы на экран выводится главное меню:

0 - О системе...

1 - Корректировка данных

2 - Уничтожение данных

3 - Просмотр базы

4 - Загрузка базы

5 - Сохранение базы

6 - Создание новой базы

7 - Выход из программы

Для выбора какого-либо пункта следует нажать соответ-

ствующую цифровую клавишу. Вход в каждый пункт сопровождается ко-

ротким звуковым сигналом. При нажатии неверной клавиши на экран

выводится окно с сообщением об ошибке и подсказкой, в каком ин-

тервале следует вводить число. Ниже приводится описание каждого

из пунктов.

При выборе данного пункта на экран выводятся данные о

системе и ее авторе. После нажатия на любую клавишу происходит

выход в главное меню.

При входе в этот пункт на экран выводится подменю:

1 - Изменение данных

2 - Добавление данных

3 - Выход в главное меню

Пункт 1 предназначен для изменения данных в записях. При

входе в него так же появляется подменю:

1 - Известен номер абитурьента

2 - Известна фамилия

Если известен номер абитурьента, то следует ввести цифру

1, если известна фамилия - цифру 2. После этого система запросит

соответственно номер или фамилию. Фамилию следует вводить в том

же виде (сочетание заглавных и строчных букв) в каком она имеет-

ся в базе данных. После определения корректируемой записи систе-

ма выводит на экран все данные об этом абитурьенте и позволяет их

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

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

клавишу <Enter>. После корректировки всех полей система предупре-

дит о необходимости сохранить вновь введенные данные и после на-

жатия любой клавиши выйдет в меню "Корректировка данных".

Пункт 2 меню "Корректировка данных" предназначен для до-

бавления новых записей. После входа в этот режим система последо-

вательно запрашивает данные о новом абитурьенте. По окончании

ввода выводится запрос, хочет ли пользователь продолжить процесс

ввода новых записей. При утвердительном ответе (нажатии клавиши Д

в верхнем регистре) программа предоставляет возможность ввести

данные еще об одном абитурьенте, после чего процесс повторится.

При отрицательном ответе (нажатии клавиши Н (рус.) на верхнем ре-

гистре) будет выдано предупреждение о необходимости сохранить

вновь введенные данные и после нажатия любой клавиши выйдет в ме-

ню "Корректировка данных".

Пункт 3 служит для выхода в основное меню.

Данный режим служит для удаления записей из базы данных.

Как и в подпункте "Изменение данных" режима "Корректировка дан-

ных" пользователю предоставляется возможность ввести либо номер,

либо фамилию удаляемого абитурьента. После ввода этих данных

произойдет удаление выбранной записи и вывод сообщения, подтвер-

ждающего выполнение данной операции. В случае невозможности уда-

ления записи (например запись с данным номером не существует),

выдается соответствующее сообщение об ошибке.

Данный режим предназначен для просмотра содержимого имею-

щихся баз данных. При входе в этот режим выводится следующее под-

меню:

1 - Просмотр основной базы

2 - Просмотр базы BSTUD

3 - Выход в главное меню

Пункт 1 предназначен для просмотра основной базы данных,

содержимое которой подгружается автоматически (при наличии на

диске файла bit.dat) при запуске информационно-справочной систе-

мы. После выбора этого пункта, на экран выводятся записи основ-

ной БД в виде таблицы. Для возвращения в меню следует нажать лю-

бую клавишу.

Пункт 2 предназначен для просмотра дочерней базы данных

BSTUD. В отличии от основной БД сразу после загрузки она пуста, и

чтобы ее просмотреть следует создать эту БД с помощью пункта 6

или загрузить ее с диска с помощью пункта 4 основного меню. Дан-

ные дочерней базы представляются также в виде таблицы.

Пункт 3 служит для выхода в главное меню.

Данный режим предназначен для загрузки баз данных из фай-

лов. При входе в этот пункт выводится меню:

1 - Загрузить основную базу из выбранного файла

2 - Загрузить основную базу из файла bit.dat

3 - Загрузить базу BSTUD из выбранного файла

4 - Загрузить базу BSTUD из файла bstud.dat

5 - Выход в основное меню

При выборе пунктов 2 и 4 произойдет загрузка соответствен-

но основной и дочерней БД из стандартных файлов bit.dat или

bstud.dat, в случае удачной загрузки будет выдано соответствую-

щее сообщение. После нажатия на любую клавишу произойдет выход в

главное меню.

При выборе пунктов 1 и 3 система запросит имя файла, в ко-

тором содержится соответствующая БД. При успешной загрузке поя-

вится соответствующее сообщение, при сбое появится сообщение об

ошибке.

Пункт 5 предназначен для выхода в главное меню.

Данный режим предназначен для сохранения баз данных. При

входе в данный режим выводится следующее меню:

1 - Сохранить основную базу в указанном файле

2 - Сохранить основную базу в файле bit.dat

3 - Сохранить базу BSTUD в указанном файле

4 - Сохранить базу BSTUD в файле bstud.dat

5 - Выход в основное меню

Работа с его пунктами полностью аналогична работе с подме-

ню режима "Загрузка базы".

Данный режим предназначен для создания дочерней базы дан-

ных. При запуске этого режима дочерняя БД создается автоматичес-

ки, о чем выводится соответствующее сообщение и предупреждение о

необходимости сохранения дочерней БД. После нажатия любой клави-

ши происходит выход в главное меню.

Этот пункт меню предназначен для выхода из информацион-

но-справочной системы в ДОС.

В целях конечной отладки программы и устранения скрытых

ошибок было решено несколько контрольных примеров по работе с

системой во всех режимах. Была создана и отредактирована основ-

ная база данных. с ее помощью были опробованы режимы удаления,

корректировки, создания новой БД, загрузки и сохранения БД. При

решении контрольных примеров ошибок в программе не обнаружено.

В данной курсовой работе были исследованы возможности

языка программирования Пролог для создания информационно-справоч-

ных систем. Можно сделать вывод, что Пролог представляет богатые

возможности для реализации таких систем и написания дружественно-

го интерфейса для общения пользователя с программой.

И.Братко "Программирование на языке Пролог для

искусственного интеллекта"

Дж.Доорс "Пролог - язык программирования будущего"

Ю.Тихонов "МПролог - язык логического

программирования. Версия 2.3"

___