Реферат: Информационно-справочная система, обеспечивающая работу с базой данных Bit
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"
___