Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

База данных Аудитории на языке ЛИСП1

.doc
Скачиваний:
10
Добавлен:
01.05.2014
Размер:
163.33 Кб
Скачать

Министерство высшего и среднего образования РФ

Санкт-Петербургский государственный

электротехнический университет

им. В.И.Ульянова (Ленина)

Кафедра МО ЭВМ

Дисциплина: «Структурное программирование»

Отчет по лабораторной работе №3

Преподаватель:

Чебоксарова Т.Н.

Выполнили студенты группы 3341:

Худяков Я. Д.

Санкт-Петербург

2005

Исходная постановка задачи:

5. Для составления расписания в вузе необходима информация об аудиториях. Она включает номер аудитории, корпус, этаж, вместимость, принадлежность определенной кафедре, число мест, оснащенных специальным оборудованием (компьютеры, лабораторные макеты, число мест для работы с лингафонной установкой). Создать РБД со сведениями об аудиториях и реализовать функции для обработки информации.

5.1. Внести дополнительную информацию в РБД с обязательным заполнением полей с номером аудитории, сведениями о наличии в ней специального оборудования, и принадлежности определенной кафедре. Ответить на запрос о количестве специализированных рабочих мест, в аудиториях закрепленных за определенной кафедрой.

5.2. Внести изменения в запись с определенным номером аудитории (изменив ее вместимость). Выяснить, какие лекционные аудитории, рассчитанные на число студентов не меньше заданного, имеются в определенном корпусе.

Анализ задачи:

В качестве идентификатора аудитории выберем ее номер. Это уникальный идентификатор, т.к. одна и та же аудитория не может иметь несколько наборов свойств. Реализовывать РБД будем на LISP’е. Состав специального оборудования сделаем динамическим, для наибольшей достоверности в описании аудиторий с разным назначением. Реализуем все требуемые запросы.

Формальная постановка задачи:

  1. Исходные данные: Для реализации данной задачи требуются данные об аудитории: номер аудитории, корпус, этаж, вместимость, принадлежность определенной кафедре, число мест, оснащенных специальным оборудованием (компьютеры, лабораторные макеты, число мест для работы с лингафонной установкой).

  2. Ограничения на исходные данные: Ограничения вводятся на соответствие численным значениям: вместимость, число оборудованных мест.

  3. Выходные данные: В роли выходных данных может быть: количество специального оборудования на кафедре, список аудиторий в определенном корпусе вместимостью не меньше заданной, краткий список аудиторий в виде таблицы, полный список аудиторий, данные об аудитории во время ее редактирования.

  4. Связь выходных данных с исходными данными: Никаких математических вычислений в программе не осуществляется, поэтому выходные данные полностью соответствуют входным. Единственное исключение – это список аудиторий в определенном корпусе вместимостью не меньше заданной. В ответ на такой запрос, с параметрами: корпус=z, вместимость=y, мы получим данные об аудиториях (x1, x2, x3, x4, …, xn), где для .

Спецификация программы:

  1. Исходные данные: Ограничения на входные данные рассматривались в ФПЗ, поэтому в данном разделе мы рассмотрим формат представления этих входных данных. Входные данные будут храниться в списке символов номеров аудиторий. У каждого символа будет список его свойств, которые соответствуют требованиям задания. Используя понятия БД можно сделать утверждение, что совокупность символа и его свойств это картеж. Также входные данные могут быть введены из файла.

  2. Функции программы при обработке исключительных ситуаций:

Программа обрабатывает исключительные ситуации при попытке обращения к несуществующей аудитории.

  1. Выходные данные: Формат представления выходных данных будет рассмотрен далее в разборе схемы диалога. Выходные данные, это всего лишь входные данные отформатированные специальным образом. Также все данные могут быть сохранены в файл.

Разработка структур данных и алгоритмов:

Алгоритмы:

Для удобства тестирования программы, в ней присутствуют два вида ввода данных. Решение данной задачи можно разбить на этапы, которые могут быть реализованы и отлажены по отдельности, но в определенном порядке.

  1. Введение данных аудитории, вывод

  2. Изменение данных спец. оборудования

  3. Реализация запросов

  4. Вывод результатов в файл или в специально отведенное для этого поле

Дополнительные задачи:

  • также программа должна иметь удобный и доступный в освоении интерфейс

  • в программе должны быть учтены всевозможные нестандартные ситуации и крайние значения входных данных

Модель структур данных:

Модель описывалась в спецификации программы, в разделе “Исходных данных”.

Таблица параметров функций программы:

Имя функции

Назначение

Параметры

Внешние эффекты

Входные

Выходные

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))