Предикаты для работы с БД в целом 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Предикаты для работы с БД в целом



 

Для записи динамической БД в файл на диск и для загрузки содержимого файла в динамическую БД применяются стандартные предикаты save и consult.

Предикат save сохраняет находящуюся в оперативной памяти базу данных в текстовом файле. Синтаксис этого предиката

save(имя_файла[,имя_БД]),

где имя_файла есть произвольное допустимое в MS DOS или PC DOS имя файла.

Пример: для того, чтобы сохранить содержимое БД tabel в файле с именем exam_03.dba, требуется предикат

save("exam_03.dba", tabel).

В результате все утверждения находящейся в оперативной памяти динамической БД tabel будут записаны в файл exam_03.dba. Cодержимое БД со стандартным именем dbasedom сохранить в файле c:\dir1\f1.db можно при помощи предиката

save("c:\\dir1\\f1.db").

Заметим, что если файл с таким именем уже существовал на диске, то этот старый файл будет затерт. Поэтому следует использовать предикат save с известной долей осторожности.

Произвольный текстовый файл, содержащий факты, совпадающие по синтаксису с предикатами описанной в программе БД, может быть считан в память (загружен) при помощи предиката consult, синтаксис которого таков:

consult(<имя_файла>[,<имя_БД>]).

Для загрузки файла exam_02.dba в БД tabel требуется выражение

consult("exam_02.dba ", tabel).

А для того, чтобы загрузить содержимое файла d:\dir2\f2.dbf в БД со стандартным именем dbasedom необходимо использовать предикат

consult("d:\\dir2\\f2.dbf").

Предикат consult неуспешен, если файл с указанным именем отсутствует на диске, или если этот файл содержит ошибки, как, например, в случае несоответствия синтаксиса предиката из файла описаниям из раздела программы database, или если содержимое файла невозможно разместить в памяти ввиду отсутствия места.

Пример работы с базой данных, располагающейся в оперативной памяти

Любая система системы управления базой данных (СУБД), ориентированная на диалог с пользователем должна содержать как минимум такие возможности, как занесение в базу новых данных; удаление данных из базы; выборка и вывод содержащихся в базе данных.

Хотелось бы реализовать достаточно логичным удобным для пользователя способом. Такие требования предполагают наличие в системе меню.

Приведем пример простейшей программы, позволяющей выполнять основные действия над динамической БД.

database

dstudent (symbol,symbol,symbol) /*Таблица с информацией о студентах */

dexam(symbol,symbol,integer) /* Таблица с информацией о сдаче экзаменов*/

predicates(char)(char)(char)(char)(char)(integer)(symbol)(symbol)(symbol,symbol,integer)(symbol,integer)(1, 10, 3, "БД ‘сессия’ ", 3, 10, 19, 60, 1, -1,

"\218\191\192\217\196\179"), menu.

clauses

/*Вывод меню на экран*/

menu:- clearwindow,("1 - создать"),nl,("2 - загрузить"),nl,

write("3 - добавить запись"),nl,

write("4 - найти запись"),nl,

write("5 - удалить запись"),nl,

write("6 - сохранить"),nl,("7 - выход"), nl, readchar(N), reaction(N).

/*Реакция программы на выбор пункта меню*/

reaction('1'):-deldb, menu.('2'):-clearwindow, write("Введите имя файла"), readln(Fname),(Fname), menu.('3'):-typerec(N), addquation3(N), dely, menu.('4'):-clearwindow, typerec(N), findquation4(N), menu.('5'):-clearwindow, typerec(N), retquation4(N), dely, menu.('6'):-write("Enter filename"), readln(Fname), save(Fname), menu.('7').(_):-write("Введите число 1-6"), dely, menu.

/*Удаление всей информации из базы*/

deldb:-retract(dstudent (_,_,_)), fail.:-retract(dexam(_,_,_)), fail..

/*Выбор типа записи (таблицы БД)*/

typerec(N):-clearwindow, write("1 - информация о студентах"), nl,

write("2 - результаты сдачи экзаменов"), nl, readchar(N).

/*Ввод и добавление новой записи*/

addquation3('1'):-clearwindow,write("Введите шифр студента"), nl, readln(Code),("Введите ФИО студента"),nl, readln(Name),("Введите факультет"),nl, readln(D),(dstudent(Code,Name,D)), write("Запись добавлена"),nl.('2'):-clearwindow, write("Введите шифр студента "),nl, readln(Code),("Enter course"), nl, readln(Course),("Enter mark"), nl, readint(Mark),(dexam(Code,Course,Mark)), write("Запись добавлена ").3(_):- write("Ошибка!").

/*Уточнение задания на поиск информации*/

findquation4('1'):-clearwindow, write("1 - искать запись по шифру"),nl,("2 - искать запись по имени"),nl, readint(N), find(N),dely.

findquation4('2'):-clearwindow, write("1 - искать запись по шифру "),nl,("2 - искать запись по наименованию дисциплины "),nl,

readint(N), N2=N+2, find(N2), dely.

/*Уточнение задания на поиск информации */

find(1):-clearwindow, write("Введите шифр "), readln(Code),(Code,Name,D), write("Студент "), write(Name), nl,("обучается на факультете "), write(D).

find(1):-write("Такой записи в базе нет").

find(2):-clearwindow, write("Введите имя студента "), readln(Name),(Name), findnameyes(Name).(2):-write("Такой записи в базе нет ").(3):-clearwindow, write("Введите шифр студента "), readln(Code),(Code,Name,D), write("Студент "), write(Name), nl,(" факультета"), write(D),nl, findexam(Code,_,_).(3):-write("Такой записи в базе нет ").

find(4):-clearwindow, write("Введите наименование дисциплины"),

readln(Course),("Введите оценку. Для поиска по всем оценкам введите 0 "),

readint(Mark), find4(Course,Mark).

/*Поиск информации о сдаче экзаменов */

find4(Course,0):-findexam(_,Course,_).(Course,Mark):-findexam(_,Course, Mark).

/*Поиск записей по имени студента*/

findname(Name):-dstudent(Code, Name, D),write("Шифр студента "),(Code),nl,("Факультет "), write(D), dely, fail.(_).

/*Результат поиска записей по имени*/

findnameyes(Name):-dstudent(_,Name,_).

/*Поиск информации о сдаче экзаменов*/

findexam(Code,Course,Mark):-dexam(Code,Course,Mark),("Шифр"), write(Code), write(" "),(Course), write(" "), write(Mark), nl, fail.(_,_,_).

/*Определение и удаление строки из БД*/

retquation4('1'):-write("Введите шифр студента"), nl, readln(Code),

write("Введите имя"), nl, readln(Name),("Введите название факультета"), nl, readln(D),

retract(dstudent(Code,Name,D)), write("Запись удалена"),nl.('2'):-write("Введите шифр студента "),nl, readln(Code),("Введите название дисциплины"), nl, readln(Course),(dexam(Code,Course,_)),("Запись удалена"),nl.4(_):-write("Такой записи в базе нет"),nl.

/*Приостановка работы программы до нажатия любой клавиши*/

dely:-nl, nl, nl, write("Нажмите любую клавишу"), nl, readchar(_).

/* Конец программы */

РАБОТА С БД НА ДИСКЕ



Поделиться:


Последнее изменение этой страницы: 2020-03-14; просмотров: 134; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.116.183 (0.009 с.)