Реферат: Информационно-справочная система, обеспечивающая работу с базой данных 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
v2.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,
Otch1=Otch, List1=List, Sum=E1+E2+E3,
assertz(студент(N1, фио(Fam1,Nam1,Otch1),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(Otch1),
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(Otch1,Otch,Otch2),
skip(Pol1,Pol,Pol2),
skip1(List1,List,List2),
skip1(Ekz1,E1,E11),
skip1(Ekz2,E2,E22),
skip1(Ekz3,E3,E33),
assertz(абитурьент(X1, фио(Fam2,Nam2,Otch2),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»
___