База данных Аудитории на языке ЛИСП1
.docМинистерство высшего и среднего образования РФ
Санкт-Петербургский государственный
электротехнический университет
им. В.И.Ульянова (Ленина)
Кафедра МО ЭВМ
Дисциплина: «Структурное программирование»
Отчет по лабораторной работе №3
Преподаватель:
Чебоксарова Т.Н.
Выполнили студенты группы 3341:
Худяков Я. Д.
Санкт-Петербург
2005
Исходная постановка задачи:
5. Для составления расписания в вузе необходима информация об аудиториях. Она включает номер аудитории, корпус, этаж, вместимость, принадлежность определенной кафедре, число мест, оснащенных специальным оборудованием (компьютеры, лабораторные макеты, число мест для работы с лингафонной установкой). Создать РБД со сведениями об аудиториях и реализовать функции для обработки информации.
5.1. Внести дополнительную информацию в РБД с обязательным заполнением полей с номером аудитории, сведениями о наличии в ней специального оборудования, и принадлежности определенной кафедре. Ответить на запрос о количестве специализированных рабочих мест, в аудиториях закрепленных за определенной кафедрой.
5.2. Внести изменения в запись с определенным номером аудитории (изменив ее вместимость). Выяснить, какие лекционные аудитории, рассчитанные на число студентов не меньше заданного, имеются в определенном корпусе.
Анализ задачи:
В качестве идентификатора аудитории выберем ее номер. Это уникальный идентификатор, т.к. одна и та же аудитория не может иметь несколько наборов свойств. Реализовывать РБД будем на LISP’е. Состав специального оборудования сделаем динамическим, для наибольшей достоверности в описании аудиторий с разным назначением. Реализуем все требуемые запросы.
Формальная постановка задачи:
-
Исходные данные: Для реализации данной задачи требуются данные об аудитории: номер аудитории, корпус, этаж, вместимость, принадлежность определенной кафедре, число мест, оснащенных специальным оборудованием (компьютеры, лабораторные макеты, число мест для работы с лингафонной установкой).
-
Ограничения на исходные данные: Ограничения вводятся на соответствие численным значениям: вместимость, число оборудованных мест.
-
Выходные данные: В роли выходных данных может быть: количество специального оборудования на кафедре, список аудиторий в определенном корпусе вместимостью не меньше заданной, краткий список аудиторий в виде таблицы, полный список аудиторий, данные об аудитории во время ее редактирования.
-
Связь выходных данных с исходными данными: Никаких математических вычислений в программе не осуществляется, поэтому выходные данные полностью соответствуют входным. Единственное исключение – это список аудиторий в определенном корпусе вместимостью не меньше заданной. В ответ на такой запрос, с параметрами: корпус=z, вместимость=y, мы получим данные об аудиториях (x1, x2, x3, x4, …, xn), где для .
Спецификация программы:
-
Исходные данные: Ограничения на входные данные рассматривались в ФПЗ, поэтому в данном разделе мы рассмотрим формат представления этих входных данных. Входные данные будут храниться в списке символов номеров аудиторий. У каждого символа будет список его свойств, которые соответствуют требованиям задания. Используя понятия БД можно сделать утверждение, что совокупность символа и его свойств это картеж. Также входные данные могут быть введены из файла.
-
Функции программы при обработке исключительных ситуаций:
Программа обрабатывает исключительные ситуации при попытке обращения к несуществующей аудитории.
-
Выходные данные: Формат представления выходных данных будет рассмотрен далее в разборе схемы диалога. Выходные данные, это всего лишь входные данные отформатированные специальным образом. Также все данные могут быть сохранены в файл.
Разработка структур данных и алгоритмов:
Алгоритмы:
Для удобства тестирования программы, в ней присутствуют два вида ввода данных. Решение данной задачи можно разбить на этапы, которые могут быть реализованы и отлажены по отдельности, но в определенном порядке.
-
Введение данных аудитории, вывод
-
Изменение данных спец. оборудования
-
Реализация запросов
-
Вывод результатов в файл или в специально отведенное для этого поле
Дополнительные задачи:
-
также программа должна иметь удобный и доступный в освоении интерфейс
-
в программе должны быть учтены всевозможные нестандартные ситуации и крайние значения входных данных
Модель структур данных:
Модель описывалась в спецификации программы, в разделе “Исходных данных”.
Таблица параметров функций программы:
Имя функции |
Назначение |
Параметры |
Внешние эффекты |
|
Входные |
Выходные |
|||
edit |
Редактирование заданной аудитории |
dat num |
- |
Запрос номера аудитории для редактирования |
edit_aud |
Редактирование заданной аудитории |
sym |
- |
Меню редактирования |
list_aud |
Возвращает список аудиторий в заданном корпусе, в которых вместимость не меньше заданной |
dat kp vm |
- |
Вывод найденных по запросу аудиторий |
print_table |
Вывод таблицы с аудиториями |
dat |
- |
Вывод таблицы с аудиториями |
print_table1 |
Вывод таблицы с аудиториями без шапки |
dat |
- |
Вывод таблицы с аудиториями без шапки |
show_data |
Вывод список аудиторий со свойствами |
lst |
- |
Вывод список аудиторий со свойствами |
proper |
Вывод свойств аудитории |
sym |
- |
Вывод свойств аудитории |
show_equip |
Вывод данных об оборудовании |
lst sym |
- |
Вывод данных об оборудовании |
|
|
|
|
|
zapr |
Запрос на количество специально оборудованных мест на кафедре |
kafed dat lst |
- |
Ответ на запрос на количество специально оборудованных мест на кафедре |
kol |
Подсчет количества мест для конкретной кафедры |
kafed lst sym |
- |
- |
del_eq |
Удалить оборудование из всех аудиторий |
dat sym |
- |
- |
del |
Удалить оборудование |
lst sym |
- |
- |
add_eq |
Добавить новое оборудование |
lst |
- |
- |
equip |
Ввод оборудования |
Lst, sym |
- |
- |
add_aud |
Ввод аудитории |
- |
- |
- |
|
|
|
|
|
menu |
Вывод меню |
- |
- |
Вывод меню |
Пример заполнения БД
Номер_ |
Корпус_ |
Этаж_ |
Вместимость_ |
Принадлежность кафедре |
Число мест со специальным оборудованием |
||
Компьютеры_ |
Лабораторные макеты |
Лингафонные установки |
|||||
1234 |
1 |
2 |
34 |
МОЭВМ |
20 |
0 |
0 |
2345 |
2 |
3 |
45 |
АСУ |
0 |
5 |
0 |
3456 |
3 |
4 |
56 |
ВТ |
3 |
3 |
0 |
Системные свойства символа в muLISP
|
Package_ |
Pname_ |
Value_ |
Definition of function_ |
List of propreties_ |
Set_ |
- |
- |
SET, SETQ_ |
DEFUN |
(PUT symbol key object) |
Get_ |
- |
- |
Symbol-value |
(pname [parametrs]) |
(GET symbol key) |
If not defuned_ |
- |
Will be defined |
pname |
Undefined function pname_ |
Key: NIL Symbol: NIL |
Текст программы
;******************************************************************************
;* *
;* РБД содержащая информацию об аудиториях *
;* - номер *
;* - корпус *
;* - этаж *
;* - вместимость *
;* - принадлежность кафедре *
;* - число мест со спец оборудованием *
;* - компьютерами *
;* - лаб.макерами *
;* - лингафонной установкой *
;* *
;******************************************************************************
;================================ данные =======================================
(setq equipment '(компьютеров макетов лингафонных_установок))
(setq data '())
;============================ определение функций ============================
;-----------------------------------------------------------------------------
; приветствие и вызов меню
;-----------------------------------------------------------------------------
(defun EQLIST(l1 l2)
((null l1) (null l2))
((null l2) nil)
((eql (car l1) (car l2)) (eqlist (cdr l1) (cdr l2)))
nil)
(defun hello()
(write-string "
РБД аудитории
Выберете действие")
(clear-input)
(read-line)
(menu)
)
;-----------------------------------------------------------------------------
; вывод меню, вызов выбранного действия
;-----------------------------------------------------------------------------
(defun menu()
(SETQ RDS NIL)
(clear-screen)
(write-string "
РБД 'аудитории'
Выберите действие
1 --- Добавить данные о новой аудитории
2 --- Удалить данные об аудитории
3 --- Вывести список аудиторий
4 --- Корректировать список оборудования
5 --- Кол-во спец.оборудования на кафедре
6 --- Редактировать данные об аудитории
7 --- Список аудиторий в определенним корпусе
вместимостью не меньше заданной
8 --- Краткий список аудиторий в виде таблицы
9 --- Выгрузить базу в файл
10 --- Загрузить базу из файла
0 --- Выход
"
)
(setq choice (read))
((eql choice 0) (system) )
((eql choice 1)
(add_aud)
(menu)
)
((eql choice 2)
(clear-screen)
(write-string "
Удалить данные об аудитории № ")
(clear-input)_
(setq a (read-line))
(setq d (del data a))
( if (eqlist d data)
(write-string "
Такая аудитория в списке не найдена" )
(progn
(write-string "
Данные об аудитории удалены ")
(setq data d)
)
)
(clear-input)
(read-line)
(menu)
)
((eql choice 3)
(clear-screen)
(terpri)
(show_data data)
; (clear-input)
; (read-line)
(menu)
)
((eql choice 4)
(clear-screen)
(write-string "
1 --- Добавить новое оборудование
2 --- Удалить оборудование
")
(setq choice (read))
((eql choice 1)
(clear-screen)
(write-string "
Добавление нового оборудования
Введите название нового оборудования ---")
(clear-input)
(setq equipment (append equipment (cons (read-line))))
(write-string "
Оборудоване добавлено ")
(clear-input)
(read-line)
(menu)
)
((eql choice 2)
(clear-screen)
(write-string "
Удаление оборудования
Введите название оборудования ---")
(clear-input)
(setq r (read-line))
(setq eq (del equipment r))
( if (eqlist eq equipment)
(write-string "
Такое оборудование не найдено" )
(progn
(write-string "
Оборудоване удалено ")
(setq equipment eq)
(del_eq data r)
)
)
(clear-input)
(read-line)
(menu)
)
)
((eql choice 5)
(setq k 0)
(clear-screen)
(write-string "
Введите название кафедры ")
(clear-input)
(print (zapr (read-line) data equipment))
(clear-input)
(read-line)
(menu)
)
((eql choice 6)
(clear-screen)
(write-string "
Редактировать аудиторию № " )
(clear-input)
(edit data (read-line))
(menu)
)
((eql choice 7)
(clear-screen)
(write-string "
Введите номер корпуса: ")
(setq kr (read))
(write-string "
Введите вместимость аудиторий: ")
(setq vm (read))
(setq auds (list_aud data kr vm))
(print_table auds)
(clear-input)
(read-line)
(menu)
)
((eql choice 8)
(clear-screen)
(print_table data)
(menu)
)
((eql choice 9)
(clear-screen)
(write-string "
Введите имя файла:")
(clear-input)
(save (read-line))
(write-string "
База сохранена")
(clear-input)
(read-line)
(menu)
)
((eql choice 10)
(clear-screen)
(write-string "
Введите имя файла:")
(clear-input)
(load (read-line))
(write-string "
База загружена")
(clear-input)
(read-line)
(menu)
)
)
;+++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++
;-----------------------------------------------------------------------------
; добавление записи в базу
;-----------------------------------------------------------------------------
(defun add_aud()
(clear-screen)
(terpri)
(write-string " Номер аудитории ------- ")
(clear-input)
(setq aud (read-line))
(write-string " Принадлежит кафедре --- ")
(clear-input)
(put aud 'kaf (read-line))
; ввод специального оборудования
(equip equipment aud)
; ввод дополнительных параметров(если нужно)
(write-string "
0 ------- Закончить
1 ------- Ввести дополнительные параметры
")
(setq choice (read))
((eql choice 0)
(setq data (append data (cons aud)))
(Write-string " Данные успешно добавлены ")
(Write-string"
1 ---- ввести новую аудиторию
0 ---- выход")
(setq c (read))
((eql c 1) (add_aud))
)
((eql choice 1)
(write-string " Вместимость --- ")
(put aud 'vmest (read))
(write-string " Корпус -------- ")
(put aud 'korp (read))
(write-string " Этаж ---------- ")
(put aud 'et (read))
(setq data (append data (cons aud)))
(Write-string "
Данные успешно добавлены ")
(Write-string"
1 ---- ввести новую аудиторию
0 ---- выход
")
(setq c (read))
((eql c 1) (add_aud))
)
)
;------------------------------------------------------------------------------
; Ввод данных об оборудовании
;------------------------------------------------------------------------------
(defun equip(lst sym)
((eql lst nil) T)
(spaces 8)
(write-string (car lst))
(spaces (eval(- 25 (length (car lst)))))
(put sym (car lst) (read))
(equip (cdr lst) sym)
)
;------------------------------------------------------------------------------
; Добавить новое оборудование
;------------------------------------------------------------------------------
(defun add_eq(lst)
( cons (read-line) lst)
)
;------------------------------------------------------------------------------
; Удалить оборудование
;------------------------------------------------------------------------------
(defun del(lst sym)
((eql lst nil) nil)
((eql (car lst) sym)
(cdr lst)
)
(cons (car lst) (del (cdr lst) sym))
)
;------------------------------------------------------------------------------
; Удалить оборудование из всех аудиторий
;------------------------------------------------------------------------------
(defun del_eq(dat sym)
((eql dat nil) nil)
(put (car dat) sym nil)
(del_eq (cdr dat) sym)
)
;------------------------------------------------------------------------------
; Запрос на кол-во специально оборудованых мест на кафедре
;------------------------------------------------------------------------------
(defun zapr(kafed dat lst)
((eql lst nil) )
(write-string (car lst))
(spaces (eval(- 30 (length (car lst)))))
(setq k 0)
(print (kol kafed dat (car lst)))
(zapr kafed dat (cdr lst))
)
(defun kol(kafed lst sym)
((eql lst nil) k)
((eql (get (car lst) 'kaf) kafed)
((eql (get(car lst) sym) nil)(kol kafed (cdr lst) sym) )
(setq k (eval(+ k (get (car lst) sym))))
(kol kafed (cdr lst) sym)
)
(kol kafed (cdr lst) sym)
k
)
;++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++
;------------------------------------------------------------------------------
; Найти аудиторию с заданным номером и запустить ее редактирование
;------------------------------------------------------------------------------
(defun edit(dat num)
((eql dat nil)
(write-string " Аудитория с таким номером в базе не найдена")
(clear-input)
(read-line)
)
((eql num (car dat))
(edit_aud (car dat))
)
(edit((cdr dat) num)
)
)
;------------------------------------------------------------------------------
; Редактирование заданной аудитории
;------------------------------------------------------------------------------
(defun edit_aud(sym)
(clear-screen)
(write-string " Аудитория №")
(write-string sym)
(proper sym)
(terpri)
(write-string " Выберите:
0 --- выход
1 --- изменить кафедру
2 --- изменить данные о специальном оборудовании
3 --- изменить вместимость")
(setq choice (read))
((eql choice 1)
(clear-screen)
(write-string "
Редактирование данных об аудитории №")
(write-string sym)
(terpri)
(terpri)
(write-string " Введите название кафедры: " )'
(clear-input)
(setq tmp (read))
(put sym 'kaf tmp)
(write-string "
Данные успешно обновлены")
(clear-input)
(read-line)
(edit_aud sym)
)
((eql choice 2)
(clear-screen)
(write-string " Специальное оборудование аудитории № ")
(write-string sym)
(terpri)
(equip equipment sym)
(write-string " Данные успешно обновлены")
(clear-input)
(read-line)
(edit_aud sym)
)
((eql choice 3)
(clear-screen)
(write-string " Редактирование данных об аудитории №")
(write-string sym)
(terpri)
(terpri)
(write-string " Введите вместимость аудитории: " )'
(clear-input)
(setq tmp (read))
(put sym 'vmest tmp)
(write-string "
Данные успешно обновлены")
(clear-input)
(read-line)
(edit_aud sym)
)
)
;------------------------------------------------------------------------------
; Возвращает список аудиторий в заданном корпусе,
; в которых вместимость не меньше заданной
;------------------------------------------------------------------------------
(defun list_aud(dat kp vm)
((eql dat nil) nil)
((eql (get (car dat) 'korp) kp)
((eval( < (get (car dat) 'vmest) vm))
(list_aud (cdr dat) kp vm)
)
(cons (car dat) (list_aud (cdr dat) kp vm))
)
(list_aud (cdr dat) kp vm)
)
;++++++++++++++++++++++++++++++++++Вывод++++++++++++++++++++++++++++++++++++++
(defun print_table (dat)
(terpri)
(write-string "
||=================================================================||
|| НОМЕР | КАФЕДРА | ВМЕСТИМОСТЬ | КОРПУС | ЭТАЖ ||
||=================================================================||")
(print_table1 dat)
(clear-input)
(read-line)
)
(defun print_table1(dat)
((eql dat nil) nil)
(terpri)
(write-string" || ")
(write-string (car dat))
(spaces (eval(- 10 (length (car dat)))))
(write-string "| ")
; название кафедры
(setq temp (get (car dat) 'kaf))
(write-string temp)
(spaces (eval(- 12 (length temp))))
(write-string "| ")
; вместимость
(setq temp (get (car dat) 'vmest))
(if (eql temp nil) (spaces 14)
(progn (prin1 temp)
(spaces (eval(- 14 (print-length temp)))))
)
(write-string "| ")
; корпус
(setq temp (get (car dat) 'korp))
(if (eql temp nil) (spaces 12)
(progn (prin1 temp)
(spaces (eval(- 12 (print-length temp)))))
)
(write-string "| ")
; этаж
(setq temp (get (car dat) 'et))