
База данных Аудитории на языке ЛИСП
.docЛабораторная работа № 3
Системные свойства символа.
Задание:
Задача 5
Описание предметной области
Для составления расписания в вузе необходима информация об аудиториях. Она включает номер аудитории, корпус. Этаж, вместимость, принадлежность определенной кафедре, число мест, оснащенных специальным оборудованием (компьютеры, лабораторные макеты, число мест для работы с лингафонной установкой). Создать РБД со сведениями об аудиториях и реализовать функции для обработки информации.
Задание 5.1. Внести дополнительную информацию в РБД с обязательным заполнением полей с номером аудитории, сведениями о наличии в ней специального оборудования и принадлежности определенной кафедре. Ответить на запрос о количестве специализированных рабочих мест в аудиториях, закрепленных за определенной кафедрой.
Задание 5.2. Внести изменения в запись с определенным номером аудитории (изменив ее вместимость). Выяснить, какие лекционные аудитории, рассчитанные на число студентов не меньше заданного, имеются в определенном корпусе.
Печатное имя символа -- уникальная последовательность знаков в
коде ASCII, которая используется интерпретатором для идентификации
символа при вводе информации и при выводе значения символа. Печатное
имя символа не может быть изменено.
Текущим значением символа может быть любой объект muLISPа,
включая и сам этот символ. По умолчанию значением символа является сам
этот символ.
Список свойств представляет собой множество пар вида:
<индикатор_свойства значение_свойства>
По умолчанию список свойств символа представляет собой пустой список.
Если к символу обращаются, как к функции (то есть он стоит на
первом месте в списке), то определение функции, ассоциированной с этим
символом, применяется к аргументам вызова. Если с символом не было ас-
социировано определение функции, то происходит прерывание и выдается
сообщение об ошибке:
Undefined Function <печатное_имя_символа>
Назначение |
Печатное имя символа |
Текущее значение |
Список свойств |
Определение функции |
Распечатать меню |
prmenu |
prmenu |
nil |
|
Проверка принадлежит ли элемент списку |
member |
member |
List El |
Function-value |
Добавление ряда свойств |
newart |
newart |
NewEl |
Function-value |
Добавление нового ряда(вызов newart ) |
newartEl |
newartEl |
|
|
Распечатка ряда |
pr |
pr |
pa |
|
Распечатка заглавия данных и вызов pr |
prdata |
prdata |
|
|
Меню для изменения данных |
wrmenuch |
wrmenuch |
nil |
|
Поск по номеру в списке |
find |
find |
List Num |
Function-value |
Изменение данных выбранного в меню свойства |
changedata |
changedata |
num Choice Newdata |
Function-value |
Ввод значений(которое надо изменить и на которое надо изменить) |
chrat |
chrat |
nil |
|
Вывод по аудитории количесва в неей спецоборудования |
find1 |
find1 |
List Cath |
Function-value |
Ввод пользователем данных для выполнения поиска и вывод результата на экран |
search1 |
search1 |
nil |
|
Поиск по номеру корпуса и минимально нужному количеству мест удовлеворяющих условиямя вместительности аудиторий. |
find2 |
find2 |
List bu mi |
Function-value |
Вывод списа аудиторий |
printaudlist |
printaudlist |
List |
|
Ввод\вывод данных для поиска вместительных аудиторий по номеру корпуса и минимально нужному количеству мест |
search2 |
search2 |
Nil |
|
Выполнение необходимых действий |
action |
action |
X |
|
Вывод меню |
menu |
menu |
Nil |
|
Вид базы данных:
Имя атрибутов |
номер аудитории |
корпус |
Этаж |
вместимость |
принадлежность определенной кафедре |
число мест, оснащенных специальным оборудованием |
Pr1 |
1 |
1 |
1 |
10 |
Math |
10 |
. . .
|
||||||
PrN |
N |
N |
1 |
10 |
Math |
0 |
Вывод:
Построенная программа реализует задачу 5 в полном объеме.
Приложения:
Исходный файл.
(defun prmenu (lambda (Nil)
(wrs)
(clear-screen)
(eql (print '#1_save_to_file)
(print '#2_new_article)
(print '#3_view_the_table)
(print '#4_change_data)
(print '#5_the_first_search)
(print '#6_the_second_search)
(print '#7_exit)
)
(set-cursor 10 0)
(eql (print 'Enter_your_choice: ))
(terpri)
)
)
(defun member (lambda (List El)
(cond ((Null List) Nil )
((Eql (car List) El) T )
(T (member (cdr List) El) )
)
)
)
(defun newart (lambda (NewEl)
(eql (print 'Input_an_aud_number:))
(put NewEl 'number (read N))
(eql (print 'Input_an_building_number:))
(put NewEl 'building (read B))
(eql (print 'Input_an_floor_number:))
(put NewEl 'floor (read F))
(eql (print 'Input_a_volume:))
(put NewEl 'volume (read V))
(eql (print 'Input_a_cathedra:))
(put NewEl 'cathedra (read C))
(eql (print 'Input_a_devices_number:))
(put NewEl 'devices (read D))
(SetQ p (cons NewEl p))
)
)
(defun newartEl (lambda
(clear-screen)
(eql (print 'Input_a_row_name:))
(setq nname (read Name))
(cond ( (eql T (member p nname)) (newartEl))
(T (newart nName))
)
)
)
(defun pr(lambda (pa)
(cond ( (not (NULL pa) )
(eql (prin1 (car pa))
(prin1 '-----)
(prin1 (get (car pa) 'number))
(prin1 '-------)
(prin1 (get (car pa) 'building))
(prin1 '--------)
(prin1 (get (car pa) 'Floor))
(prin1 '------)
(prin1 (get (car pa) 'Volume))
(prin1 '-------)
(prin1 (get (car pa) 'cathedra))
(prin1 '--------)
(print (get (car pa) 'devices))
)
(pr (cdr pa))
)
)
)
)
(defun prdata(lambda
(clear-screen)
(eql (print 'Name__Number__Building__Floor__Volume__cathedra__devices))
(eql (print '------------------------------------------------------------))
(pr p)
(read)
)
)
(defun wrmenuch(lambda (NIL)
(wrs)
(clear-screen)
(eql (print '#1_change_the_building_number)
(print '#2_change_the_floor_number)
(print '#3_change_the_volume)
(print '#4_change_the_cathedra_name)
(print '#5_change_the_devices_number)
)
(set-cursor 10 0)
(eql (print 'Enter_your_choice: ))
(terpri)
)
)
(defun find (lambda (List Num)
(cond ((Null List) Nil)
((eql (get (car List) 'Number) Num) (car List))
(T (find (cdr List) Num))
)
)
)
(defun changedata(lambda (num Choice Newdata)
(cond ( (not (eql (setq pn (find P Num)) Nil))
(cond ((eql Choice 1) (put pn 'building Newdata))
((eql Choice 2) (put pn 'floor Newdata))
((eql Choice 3) (put pn 'volume Newdata))
((eql Choice 4) (put pn 'cathedra Newdata))
((eql Choice 5) (put pn 'devices Newdata))
))
)
)
)
(defun chrat(lambda (NIL)
(wrmenuch)
(setq Choice (read))
(eql (print 'Input_an_aud_number:))
(setq Num (read))
(eql (print 'Input_a_new_meaning:))
(setq Newdata (read))
(changedata Num Choice Newdata)
(read)
)
)
(defun find1(lambda (List Cath)
(cond ((Null List) 0)
((eql (get (car list) 'cathedra) Cath) (+ (get (car list) 'devices) (find1 (cdr List) cath)))
(T (find1 (cdr list) cath))
)
)
)
(defun search1(lambda (nil)
(eql (print 'Input_a_cathedra_name:))
(setq Cath (read))
(eql (print 'The_devices_quantity_is:))
(eql (print (find1 P Cath)))
(read)
)
)
(defun find2(lambda (List bu mi)
(cond ((Null List) '())
((and (eql (get (car list) 'building) bu) (> (get (car list) 'volume) (- mi 1))) (cons (car list) (find2 (cdr List) bu mi)))
(T (find2 (cdr list) bu mi))
)
)
)
(defun printaudlist(lambda (List)
(cond (( not (Null List))
(eql (print (get (car List) 'Number)))
(printaudlist (cdr List))
))
)
)
(defun search2(lambda (Nil)
(eql (print 'Input_a_building_number:))
(setq Building (read))
(eql (print 'Input_a_min_volume:))
(setq MinQ (read))
(eql (print 'The_sizeble_auditoriums_are:))
(printaudlist (find2 P Building MinQ))
(read)
)
)
(defun action (lambda (X)
(cond ( (eql X 1) (save X3) )
( (eql X 2) (newartel) )
( (eql X 3) (prdata) )
( (eql X 4) (chrat) )
( (eql X 5) (search1) )
( (eql X 6) (search2) )
)
(cond ((< X 7) (menu))
(T (system))
)
)
)
(defun menu (lambda (Nil)
(prmenu)
(rds)
(action (read X))
)
)
(menu)
(load X3)