Создание динамической БД: результаты сессии данной группы студентов - Prolog
Формулировка задачи:
Задание. Динамическая база данных содержит информацию о результатах сессии данной группы студентов в виде утверждений следующих видов: математика (фамилия_и_о, оценка), физика (фамилия_и_о, оценка), химия (фамилия_и_о, оценка), информатика (фамилия_и_о,оценка). Предполагается, что в группе N студентов и все они оценки по всем предметам (5,4,3 или 2). В динамической базе данных (ДБД) для каждого студента может хранится информация об одной или нескольких оценках (т.е несколько фактов) по каждому предмету, что связано с возможными пересдачами экзаменов.
Требуется написать программу, создающую ДБД и предоставляющую возможность ее изменения в процессе работы, а также формирующую без дублирования (т.е одна и та же фамилия дважды не встречается) список студентов, удовлетворяющих следующим условиям.
1. Сдавшие сессию и имеющие три оценки отлично.
Программа работает, но выводит всех студентов, у которых есть хотя бы одна пятерка. В чем причина не могу понять.
Листинг программы
- domains
- name,predmet=string
- ocenka=integer
- l=string*
- database
- dstud(name,predmet,ocenka).
- predicates
- repeat.
- do_db.
- menu.
- print.
- output(l).
- clear_db.
- stud(name,predmet,ocenka).
- process(integer).
- zadacha.
- delete(name).
- spisok(l).
- spisok1(l,l).
- bezdubl(l,l).
- prinadl(name,l).
- spisok2(l,l).
- clauses
- repeat.
- repeat:-repeat.
- stud("Yakovlev A.A.","matematika",4).
- stud("Yakovlev A.A.","fizika",4).
- stud("Yakovlev A.A.","himia",3).
- stud("Yakovlev A.A.","informatika",5).
- stud("Ramazanov R.A.","matematika",5).
- stud("Ramazanov R.A.","fizika",5).
- stud("Ramazanov R.A.","himia",4).
- stud("Ramazanov R.A.","informatika",5).
- stud("Sakaev I.T.","matematika",5).
- stud("Sakaev I.T.","fizika",4).
- stud("Sakaev I.T.","himia",5).
- stud("Sakaev I.T.","informatika",5).
- stud("Valeev A.F.","fizika",4).
- stud("Valeev A.F.","informatika",4).
- stud("Valeev A.F.","matematika",3).
- stud("Valeev A.F.","himia",4).
- do_db:-stud(N,P,O),assertz(dstud(N,P,O)),fail.
- do_db:-!.
- clear_db:-retract(dstud(_,_,_)),fail.
- clear_db:-!.
- zadacha:-makewindow(1,7,7,"DBD",2,10,20,50),menu,clear_db,removewindow.
- menu:-makewindow(2,7,7,"Glavnoe menu",1,1,24,70),nl,repeat,clearwindow,
- write(" 0. Ochistka DBD "),nl,
- write(" 1. Sozdanie DBD "),nl,
- write(" 2. Zagruzka DBD"),nl,
- write(" 3. Prosmotr DBD"),nl,
- write(" 4. Dobavlenie "),nl,
- write(" 5. Udalenie "),nl,
- write(" 6. Sohranenie DBD "),nl,
- write(" 7. Zadanie "),nl,
- write(" 8. Vihod "),nl,nl,
- write("Vash vibor: "),
- readint(K),nl,process(K),K=8,!,removewindow.
- delete(N):-retract(dstud(N,_,_)),fail.
- delete(_):- nl, write("Operacia zavershena"),readchar(_).
- print:-dstud(N,P,O),write(N," ",P," - ",O),nl,fail.
- print.
- output([]):-!.
- output([H|L]):-write(H),nl,output(L).
- process(0):-clear_db.
- process(1):-do_db,write("DBD sozdana"),nl,readchar(_).
- process(2):-makewindow(3,7,7,"Zagruzka",2,10,15,50),nl,
- write("Imya faila: "), readln(F), consult(F),!,
- write("Fail vveden"),readchar(_),removewindow.
- process(2):-write("Oshibka. Fail ne naiden"),nl,readchar(_), removewindow.
- process(3):-makewindow(4,7,7,"Prosmotr",4,10,20,50), nl, print, readchar(_),removewindow.
- process(4):-makewindow(6,7,7,"Dobavlenie",4,10,20,50),
- write("Vvedite FIO studenta: "),readln(N),
- write("Vvedite predmet: "),readln(P),
- write("Vvedite ocenku: "),readint(O),
- assertz(dstud(N,P,O)),write("Dobavleno"), nl, readchar(_), removewindow.
- process(5):-makewindow(7,7,7,"Udalenie",4,10,20,50),
- write("Vvedite FIO studenta: "),readln(N),delete(N),removewindow.
- process(6):-write("Imya faila: "), readln(F), save(F),!,write("DBD sohranena"),readchar(_).
- process(6):-write("Oshibka!"),readchar(_).
- process(8):-write("Zavershenie raboty!"), readchar(_).
- process(7):-makewindow(8,7,7,"Zadanie",4,10,20,50),
- spisok(LL),bezdubl(LL,L),spisok2(L,L1),write("Sdali, i imeyshie tri ocenki otlichno : "), nl, output(L1),nl,readchar(_), removewindow.
- spisok(LL):-findall(N,dstud(N,_,_),L),spisok1(L,LL).
- spisok1([],[]):-!.
- spisok1([X|L],[X|L1]):-dstud(X,"matematika",O1),O1>2,
- dstud(X,"fizika",O2),O2>2,
- dstud(X,"himia",O3),O3>2,
- dstud(X,"informatika",O4),O4>2,!,
- spisok1(L,L1).
- spisok1([_|L],L1):-spisok1(L,L1).
- bezdubl([],[]).
- bezdubl([X|L],L1):-prinadl(X,L),bezdubl(L,L1).
- bezdubl([X|L],[X|L1]):-not(prinadl(X,L)),bezdubl(L,L1).
- prinadl(X,[X|_]):-!.
- prinadl(X,[_|L]):-prinadl(X,L).
- spisok2([],[]):-!.
- spisok2([X|L],[X|L1]):-dstud(X,_,O1), O1=5,
- dstud(X,_,O2), O2=5,
- dstud(X,_,O3), O3=5,!,
- spisok2(L,L1).
- spisok2([_|L],L1):-spisok2(L,L1).
Решение задачи: «Создание динамической БД: результаты сессии данной группы студентов»
textual
Листинг программы
- dstud(X,P1,O1), O1=5, dstud(X,P2,O2), O2=5, P1 <> P2, dstud(X,P3,O3), O3=5, P1 <> P3, P2 <> P3
Объяснение кода листинга программы
В данном коде происходит следующее:
- Создается факт
dstud(X,P1,O1)
, гдеX
- идентификатор группы студентов,P1
- первый проход по данной группе студентов,O1
- результаты этого прохода (возможно, оценка). - Затем факт
dstud(X,P1,O1)
используется для установления значения переменнойO1
равным 5. - Далее, создается второй проход по группе студентов
P2
и результаты этого прохода (возможно, оценка) присваиваются переменнойO2
. - Переменная
O2
устанавливается равной 5. - Проверяется условие
P1 <> P2
, что означает, что первый и второй проходы различаются. - Затем, создается третий проход по группе студентов
P3
и результаты этого прохода (возможно, оценка) присваиваются переменнойO3
. - Переменная
O3
устанавливается равной 5. - Проверяется условие
P1 <> P3
, что означает, что первый и третий проходы различаются. - Также проверяется условие
P2 <> P3
, что означает, что второй и третий проходы различаются. Таким образом, данный код создает факты о проходах по группе студентов и проверяет их на различие. Возможно, это связано с созданием динамической базы данных для хранения результатов сессии группы студентов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д