Лабораторная работа №3 / Постановка задачи
.docПостановка задачи:
В библиотеке института составляется картотека имеющихся учебников и учебных пособий. Про каждую книгу нужно записать: шифр, имя автора, название, наименование дисциплины, при изучении которой можно ее использовать, тип (учебник, учебное пособие. Лабораторный практикум, методические указания по курсовому проектированию), количество имеющихся в библиотеке экземпляров.
Записать информацию в РБД.
Задание 3.1. Выяснить, какие учебные пособия есть в библиотеке по определенной дисциплине. Сколько экземпляров книг разных типов есть по указанной дисциплине. В случае. Если учебная литература по указанной дисциплине отсутствует, вывести текст служебной записки от директора библиотеки проректору по учебной работе.
Задание 3.2. Реализовать следующие функции: а) Внести изменения в информацию, хранящуюся в базе данных. В связи с утерей некоторого экземпляра книги либо заменой определенного учебного пособия на новое. б) По заданным имени автора и названию книги определить число имеющихся в библиотеке экземпляров.
Анализ задания:
Сама база хранится в файле “database.lsp”.
Для работы с базой данных реализовать следующие пункты меню:
-Загрузка базы данных из файла.
-Сохранение базы данных в файле.
-Просмотр содержимого базы данных.
-Добавление элемента в базу
-Удаление элемента из базы
-Определение количества экземпляров книг с определенным названием и именем автора.
Файл, содержащий базу данных, выбран фиксированным, для простоты работы с меню. Хотя это усложняет процесс создания резервных копий.
Сценарий диалога с пользователем:
При запуске программы, пользователь должен видеть на экране меню. Первым, что потребуется для начала работы- это загрузка базы данных. Произведя загрузку, выбрав первый пункт меню, пользователь может выбирать действия по своему усмотрению. Пользователь должен видеть полную картину результатов его запроса. В конце каждого действия программа должна возвращаться в меню, пока не будет выбран пункт меню-выход.
Разработка структур данных:
База данных представляет собой список символов. Каждый символ-элемент базы. Каждый элемент хранит данные об авторе, названии, шифре, дисциплине, типе книги, с использованием списка свойств. Таким образом базу данных можно представить в следующем виде:
Пусть база содержит три элемента: book1, book2, book3
|
Шифр |
Автор |
Название |
Дисциплина |
тип |
Book1 |
111A-44 |
Иванов И П |
Основы электротехники |
ТОЭ |
Учебник |
Book2 |
354C-82 |
Смирнов А Л |
Основы логического мышления |
Логика |
Методические указания |
Book3 |
887B-12 |
Сидоров Е В |
Физика-оптика |
Физика |
Лабораторный практикум |
(serq database ‘(book1 book2 book3))
Таблица параметров функций программы:
1. Блок функций, отвечающих за загрузку базы:
(Loadbook ) -читает из файла одну запись и формирует элемент базы.
(load) производит чтение всего файла, последовательным вызовом функции Loadbook.
(LoadDB) производит чтение заданного файла, выводит на экран сообщения пользователю.
2. Блок функций, отвечающих за сохранение базы:
(Zapis book) записывает одну запись в файл.
(Save baza) последовательным вызовом (Zapis book), сохраняет всю базу данных.
(SaveDB baza) производит запись заданного файла, выводит на экран сообщения пользователю.
3. Блок функций, отвечающих за просмотр базы:
(PrintEl book)выводит на экран отдельную запись.
(PrintAll baza) выводит на экран все записи списка baza.
(PrintDB baza)выводит на экран всю базу данных с соответствующими пояснениями.
4. Блок функций, отвечающих за вставку элемента в базу:
(InsertBook baza) производит всиавку элемента в базу. Поля записи задаются с клавиатуры.
5. Блок функций, отвечающих за удаление элемента из базы:
(delEl book) выводит на экран запись-кандидата на удаление, и удаляет выбранный.
(DelAll baza) выводит поочередно все элементы базы данных.
(delDB baza) производит удаление выбранного элемента, выводит на экран сообщения пользователю.
6. Блок функций, отвечающих за поиск записей в базе:
(Poisk baza) производит поиск по заданным полям- имени автора и названия и виводит найденную запись на экран.
(PoiskDB baza) публикует результаты поиска.
7. функция меню:
(Menu) описывает меню программы, производит вызов всех остальных функций.
Вывод:
В данной программе можно упростить процесс создания резервных копий путем изменения имени файла с базой. Например, можно просить пользователя собственноручно ввести имя файла с базой.
Кроме того в программе замена элемента производится вызовом двух функций: удаления и вставки. Их можно объединить в одну- замены.
Текст программы:
;----Zagruzka bazi dannih---------------------------------------------------
(defun LoadBook ()
(setq book (read-line))
(put book shifr (read-line))
(put book avtor (read-line))
(put book nazv (read-line))
(put book disc (read-line))
(put book type (read-line))
(setq db (cons book db))
)
(defun Load ()
(if (eql (read-line) "************************")
()(progn (LoadBook)(Load))
)
)
(defun LoadDB ()
(read-line)
(rds database.lsp)
(progn (setq db '())
(Load)
(rds)
(setq db (reverse db))
(background-color 2)
(clear-screen)
(write-string "Baza zagrugena iz \"database.lsp\". Push ENTER")
(read-line)
)
)
;----Sohranenie bazi--------------------------------------------------------
(defun Zapis (book)
(terpri 1)
(write-string book ) (terpri 1)
(write-string (get book shifr)) (terpri 1)
(write-string (get book avtor)) (terpri 1)
(write-string (get book nazv)) (terpri 1)
(write-string (get book disc)) (terpri 1)
(write-string (get book type)) (terpri 1)
)
(defun Save (baza)
(if (null baza)()(progn (Zapis (car baza))(Save (cdr baza)))
)
)
(defun SaveDB (baza)
(read-line)
(if (null baza) (progn (write-string "OshibkaBaza pusta.Push ENTER")(read-line)(return)))
(wrs database.lsp)
(Save baza)
(write-string "************************")(terpri 1)
(write-string "(RETURN)")
(wrs)
(rds)
(background-color 2)
(clear-screen)
(write-string "Baza dannin sohranena v \"database.lsp\". Push ENTER")
(read-line)
)
;----Prosmotr bazi----------------------------------------------------------
(defun PrintEl (book)
(write-string "**** Shifr: ")
(write-line (get book shifr))
(write-string "**** Avtor: ")
(write-line (get book avtor))
(write-string "**** Nazvanie: ")
(write-line (get book nazv))
(write-string "**** Disciplina: ")
(write-line (get book disc))
(write-string "**** Tip: ")
(write-line (get book type)) (terpri 2)
(read-line)
(clear-screen)
)
(defun PrintAll (baza)
(if (null baza)(progn (write-string "Konec bazi. Push ENTER") (read-line))
(progn (PrintEl (car baza))(PrintAll (cdr baza)))
)
)
(defun PrintDB (baza)
(progn (background-color 2)
(clear-screen)
(read-line)
(PrintAll baza)
(clear-screen)
(return)
)
)
;----Dobavlenie elementa v bazu----------------------------------------------
(defun InsertBook (baza)
(read-line)
(background-color 2)
(clear-screen)
(write-string "****** Dobavlenie elementa v bazu")
(terpri 2)
(write-string "Nazvanie ob'ekta: ")
(setq book (read-line))
(write-string "Avtor: ")
(put book avtor (read-line))
(write-string "Nazvanie: ")
(put book nazv (read-line))
(write-string "Shifr: ")
(put book shifr (read-line))
(write-string "Disciplina: ")
(put book disc (read)) (read-line)
(write-string "Tip: ")
(put book type (read-line))
(setq db (cons book baza))
(write-string "V bazu dobavlen element. Push ENTER")
(read-line)
)
;----Udalenie elementa iz bazi-----------------------------------------------
(setq bookbiz '())
(defun delEl (book)
(write-string "**** Shifr: ")
(write-line (get book shifr))
(write-string "**** Avtor: ")
(write-line (get book avtor))
(write-string "**** Nazvanie: ")
(write-line (get book nazv))
(write-string "**** Disciplina: ")
(write-line (get book disc))
(write-string "**** Tip: ")
(write-line (get book type))
(write-string "******Udalit etot element? Y-yez,N-no")
(setq vib (read))
(clear-screen)
(read-line)
(if (eql vib 'Y) (progn (write-string "Element udalen!") (read-line))
(progn (setq bookbiz (cons book bookbiz))))
(clear-screen)
)
(defun DelAll (baza)
(if (null baza)(progn (write-string "Konec bazi. Push ENTER") (read-line))
(progn (DelEl (car baza))(DelAll (cdr baza)))
)
)
(defun delDB (baza)
(progn (background-color 2)
(clear-screen)
(read-line)
(DelAll baza)
(clear-screen)
(setq db (reverse bookbiz))
(setq bookbiz '())
(return)
)
)
;----Opredelenie kolichestva ekzemplarov-------------------------------------
(defun Poisk (baza)
(background-color 2)
(clear-screen)
(if (null baza) (progn (Write-line "Baza pusta! Push ENTER.")(return)))
(write-string "*************Poisk")(terpri 2)
(read-line)
(write-string "**Vvedite nujnogo avtora: ")
(setq Navt (read-line))
(write-string "**Vvedite nujne nazvanie: ")
(setq Nnaz (read-line))
(setq baz baza)
(setq kol 0)
(loop
(cond ((null baz) (return nil)) )
(if (and (eq (get (car baz) avtor) Navt)
(eq (get (car baz) nazv) Nnaz))
(progn (PrintEl (car baz)) (setq kol (+ kol 1))))
(SETQ baz (CDR baz))
)
)
(defun PoiskDB (baza)
(Poisk baza)
(write-line "Kol-vo ekzemplarov: ")
(princ kol)
(read-line)
)
;----Vivod menu na ekran-----------------------------------------------------
(defun Menu ()
(background-color 1)
(clear-screen)
(rds)
(write-string "*******************Menu*******************") (terpri 1)
(write-string "*** 1 Zagruzit' bazu dannih ***") (terpri 1)
(write-string "*** 2 Sohranit' bazu dannih ***") (terpri 1)
(write-string "*** 3 Prosmotret' bazu dannih ***") (terpri 1)
(write-string "*** 4 Dobavit' element v bazu ***") (terpri 1)
(write-string "*** 5 Udalit' element iz bazi ***") (terpri 1)
(write-string "*** 6 Opredelenie kol-va ekzemplarov ***") (terpri 1)
(write-string "*** 0 Vihod ***") (terpri 1)
(write-string "******************************************") (terpri 2)
(write-string " Vash vibor: ")
(setq otv (read))
(cond ((eql otv 1) (progn (clear-screen) (LoadDB) (clear-screen) (Menu) (return)))
((eql otv 2) (progn (clear-screen) (SaveDB db) (clear-screen) (Menu) (return)))
((eql otv 3) (progn (clear-screen) (PrintDB db) (clear-screen) (Menu) (return)))
((eql otv 4) (progn (clear-screen) (InsertBook db) (clear-screen) (Menu) (return)))
((eql otv 5) (progn (clear-screen) (DelDB db) (clear-screen) (Menu) (return)))
((eql otv 6) (progn (clear-screen) (PoiskDB db) (clear-screen) (Menu) (return)))
((eql otv 0) (system))
)
(clear-screen)
(Menu)
(return)
)
(read-line)
(clear-screen)
(write-string "Mityagin S.A. gr 3342")
(terpri 5)
(clear-screen)
(Menu)
(return)