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

Шумихин / Шумихин / Отчёт_Лаб#6

.pdf
Скачиваний:
11
Добавлен:
20.05.2015
Размер:
454.22 Кб
Скачать

Одесский национальный университет им. И.И.Мечникова Министерство науки и образования Украины

Лабораторная работа №6

по курсу «Специализированные языки программирования»

выполнил студент III курса гр. МОКС

Свиридов Артём

Одесса 2012

Цель работы: Цель работы – создание справочной системы «Расписание занятий преподавателей кафедры». Программа разрабатывается на РЕАЛЬНЫХ данных ВАШЕЙ кафедры.

Работа должна содержать:

описание предметной области. Рекомендуется использовать табличный способ описания формализма.

описание и назначение используемых доменов. Рекомендуется использовать в том числе и составные домены.

описание отношений между объектами предметной области. Описание правил и фактов, описывающих эти отношения.

система должна позволять давать пользователю ответы на следующие вопросы:

+педагогический состав кафедры;

+перечень предметов, занятия по которым проводятся на кафедре;

+в какие дни недели и кем проводятся занятия по указанному курсу;

+кто из преподавателей кафедры проводит занятия в указанный день

недели;

+расписание указанного преподавателя;

+когда, кто и по каким курсам проводит занятия в указанной студенческой группе;

запросы к системе, результаты работы системы.

исходный текст программы в отдельном файле.

Код программы на Visual Prolog 7.3:

implement main

open core, console, string, file

constants

className = "main". classVersion = "".

clauses

classInfo(className, classVersion).

domains tutor=string. subject=string.

where=where(string Day, integer Para, integer Classroom). group=string*.

stringlist=string*.

class facts - timetable

lesson: (tutor,subject,where,group).

class predicates

findbytutor : () procedure(). findbygroup : () procedure(). load : () procedure(). findtutors : () procedure(). findsubjects : () procedure(). whoday : () procedure(). whoteaches : () procedure().

whoteaches2 : (stringlist,subject) procedure(i,i). add : (stringlist,stringlist,string) procedure(i,o,i).

no_repeat : (stringlist, stringlist, stringlist) procedure(i,i,o). writelist : (stringlist) procedure(i).

writelist_line : (stringlist) procedure(i). menu : () procedure().

do_it : (string) procedure(i). isMember : (string, group) determ(i,i).

clauses

findbytutor():- T = readline(), lesson(T,B,where(C,D,E),F), write(B,", ",C,", ",D," пара, ауд. ",E,", "), writelist_line(F), nl,fail.

findbytutor().

load():-consult("timetable.dba",timetable),fail. load().

findtutors() :- findall(X,lesson(X,_,_,_),K), no_repeat(K,[],Q), writelist(Q).

findsubjects() :- findall(X,lesson(_,X,_,_),K), no_repeat(K,[],Q), writelist(Q).

whoteaches() :- A = readline(), findall(X,lesson(X,A,_,_),K), no_repeat(K,[],Q), whoteaches2(Q,A).

whoteaches2([],_) :- !.

whoteaches2([H|T],A) :- findall(X,lesson(H,A,where(X,_,_),_),K), no_repeat(K,[],Q), write(H,": "),nl,writelist(Q),whoteaches2(T,A).

whoday() :- A = readline(), findall(X,lesson(X,_,where(A,_,_),_),K), no_repeat(K,[],Q), writelist(Q).

findbygroup():- T = readline(), lesson(A,B,where(C,D,E),F), isMember(T,F), write(A,": ",B,", ",C,", ",D," пара, ауд. ",E),nl,fail.

findbygroup().

add([],[E],E) :- !. add([H|T],[H|T],E) :- H=E, !. add([H|T],[H|T1],E) :- add(T,T1,E).

no_repeat([],RES,RES):-!.

no_repeat([H|T],L,RES) :- add(L,L1,H), no_repeat(T,L1,RES).

writelist_line([]) :- !. writelist_line([H]) :- write(H), !.

writelist_line([H|T]) :- write(H,"+"), writelist_line(T).

writelist([]) :- !.

writelist([H|T]) :- write(H), nl, writelist(T).

isMember(H, [H|_]) :- !. isMember(H, [_|T]) :- isMember(H,T).

menu() :- nl,write("Введите опцию (1-6): "),K=readLine(), do_it(K).

do_it("1") :- findtutors(), menu(), !. do_it("2") :- findsubjects(), menu(), !.

do_it("3") :- write("Введите предмет: "),nl,whoteaches(), menu(), !. do_it("4") :- write("Введите день недели: "),nl,whoday(), menu(), !.

do_it("5") :- write("Введите фамилию преподавателя: "),nl,findbytutor(), menu(), !. do_it("6") :- write("Введите группу: "),nl,findbygroup(), menu(), !.

do_it(_).

clauses run():-

console::init(),

load(), menu().

end implement main

goal mainExe::run(main::run).

Для программы взято расписание третьего курса «прикладной математики», а не требуемой кафедры, так как в расписании кафедры МОКС отсутствовали названия предметов, которые ведут преподаватели.

База данных содержится в файле timetable.bda, по адресу “L6\Exe\timetable.bda”. Содержимое файла можно посмотреть с помощью Блокнота.

Для описания базы данных мы используем факты вида lesson(tutor, subject, where, group), где tutor – фамилия преподавателя, subject – название предмета, group – список групп (список – потому что на одной паре может присутствовать несколько групп студентов); where – факт вида where(string Day, integer Para, integer Classroom), где Day – название дня недели, Para – номер пары, Classroom –

номер аудитории.

Пример: lesson("Процеров", "Теория вероятности", where("понедельник", 3, 97), ["ОУЭК", "ММФ"]).

В программе вызываются следующие главные функции:

load() – функция, загружающая данные из файла timetable.bda в программу, с помощью функции consult.

menu() – меню для взаимодействия с программой.

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

Вспомогательные функции:

no_repeat, add – функции, удаляющие из списка строк повторяющиеся строки.

do_it(A) – вспомогательная функция для menu, позволяет выполнить действие под номером А.

writelist(A) – вывод списка А, по элементу в строке.

writelist_line(A) – вывод списка А, в строчку, вставляя символ «+» между элементами.

isMember(A,H) – входит ли элемент А в список Н.

Функции, соответствующие задачам:

1) findtutors() – создаёт список преподавателей, удаляет повторяющиеся фамилии с помощью no_repeat, выводит результат.

2) findsubjects() – аналогично первому заданию, создаёт список предметов на курсе.

3) whoteaches(A) – по введённому предмету находит список преподавателей, которые его ведут; затем по каждому преподавателю находит список дней недели, по которым он ведёт, удаляет повторяющиеся дни недели.

4) whoday(A) – по заданному дню недели находит список преподавателей, которые в этот день ведут, удаляет повторяющиеся фамилии.

5) findbytutor(A) – по фамилии преподавателя находит факты, в которых он ведёт пары, они выводятся соответствующим образом.

6) findbygroup(A) – по названию группы находит факты, в которых эта группа принадлежит соответствующему списку, факты выводятся соответствующим образом.

Вывод

Вданной лабораторной работе были получены необходимые навыки работы

сдинамической базой данных в Visual Prolog 7.3.

Соседние файлы в папке Шумихин