Создание динамической БД: результаты сессии данной группы студентов - Prolog

Узнай цену своей работы

Формулировка задачи:

Задание. Динамическая база данных содержит информацию о результатах сессии данной группы студентов в виде утверждений следующих видов: математика (фамилия_и_о, оценка), физика (фамилия_и_о, оценка), химия (фамилия_и_о, оценка), информатика (фамилия_и_о,оценка). Предполагается, что в группе N студентов и все они оценки по всем предметам (5,4,3 или 2). В динамической базе данных (ДБД) для каждого студента может хранится информация об одной или нескольких оценках (т.е несколько фактов) по каждому предмету, что связано с возможными пересдачами экзаменов. Требуется написать программу, создающую ДБД и предоставляющую возможность ее изменения в процессе работы, а также формирующую без дублирования (т.е одна и та же фамилия дважды не встречается) список студентов, удовлетворяющих следующим условиям. 1. Сдавшие сессию и имеющие три оценки отлично. Программа работает, но выводит всех студентов, у которых есть хотя бы одна пятерка. В чем причина не могу понять.
Листинг программы
  1. domains
  2. name,predmet=string
  3. ocenka=integer
  4. l=string*
  5. database
  6. dstud(name,predmet,ocenka).
  7. predicates
  8. repeat.
  9. do_db.
  10. menu.
  11. print.
  12. output(l).
  13. clear_db.
  14. stud(name,predmet,ocenka).
  15. process(integer).
  16. zadacha.
  17. delete(name).
  18. spisok(l).
  19. spisok1(l,l).
  20. bezdubl(l,l).
  21. prinadl(name,l).
  22. spisok2(l,l).
  23. clauses
  24. repeat.
  25. repeat:-repeat.
  26. stud("Yakovlev A.A.","matematika",4).
  27. stud("Yakovlev A.A.","fizika",4).
  28. stud("Yakovlev A.A.","himia",3).
  29. stud("Yakovlev A.A.","informatika",5).
  30. stud("Ramazanov R.A.","matematika",5).
  31. stud("Ramazanov R.A.","fizika",5).
  32. stud("Ramazanov R.A.","himia",4).
  33. stud("Ramazanov R.A.","informatika",5).
  34. stud("Sakaev I.T.","matematika",5).
  35. stud("Sakaev I.T.","fizika",4).
  36. stud("Sakaev I.T.","himia",5).
  37. stud("Sakaev I.T.","informatika",5).
  38. stud("Valeev A.F.","fizika",4).
  39. stud("Valeev A.F.","informatika",4).
  40. stud("Valeev A.F.","matematika",3).
  41. stud("Valeev A.F.","himia",4).
  42. do_db:-stud(N,P,O),assertz(dstud(N,P,O)),fail.
  43. do_db:-!.
  44. clear_db:-retract(dstud(_,_,_)),fail.
  45. clear_db:-!.
  46. zadacha:-makewindow(1,7,7,"DBD",2,10,20,50),menu,clear_db,removewindow.
  47. menu:-makewindow(2,7,7,"Glavnoe menu",1,1,24,70),nl,repeat,clearwindow,
  48. write(" 0. Ochistka DBD "),nl,
  49. write(" 1. Sozdanie DBD "),nl,
  50. write(" 2. Zagruzka DBD"),nl,
  51. write(" 3. Prosmotr DBD"),nl,
  52. write(" 4. Dobavlenie "),nl,
  53. write(" 5. Udalenie "),nl,
  54. write(" 6. Sohranenie DBD "),nl,
  55. write(" 7. Zadanie "),nl,
  56. write(" 8. Vihod "),nl,nl,
  57. write("Vash vibor: "),
  58. readint(K),nl,process(K),K=8,!,removewindow.
  59. delete(N):-retract(dstud(N,_,_)),fail.
  60. delete(_):- nl, write("Operacia zavershena"),readchar(_).
  61. print:-dstud(N,P,O),write(N," ",P," - ",O),nl,fail.
  62. print.
  63. output([]):-!.
  64. output([H|L]):-write(H),nl,output(L).
  65. process(0):-clear_db.
  66. process(1):-do_db,write("DBD sozdana"),nl,readchar(_).
  67. process(2):-makewindow(3,7,7,"Zagruzka",2,10,15,50),nl,
  68. write("Imya faila: "), readln(F), consult(F),!,
  69. write("Fail vveden"),readchar(_),removewindow.
  70. process(2):-write("Oshibka. Fail ne naiden"),nl,readchar(_), removewindow.
  71. process(3):-makewindow(4,7,7,"Prosmotr",4,10,20,50), nl, print, readchar(_),removewindow.
  72. process(4):-makewindow(6,7,7,"Dobavlenie",4,10,20,50),
  73. write("Vvedite FIO studenta: "),readln(N),
  74. write("Vvedite predmet: "),readln(P),
  75. write("Vvedite ocenku: "),readint(O),
  76. assertz(dstud(N,P,O)),write("Dobavleno"), nl, readchar(_), removewindow.
  77. process(5):-makewindow(7,7,7,"Udalenie",4,10,20,50),
  78. write("Vvedite FIO studenta: "),readln(N),delete(N),removewindow.
  79. process(6):-write("Imya faila: "), readln(F), save(F),!,write("DBD sohranena"),readchar(_).
  80. process(6):-write("Oshibka!"),readchar(_).
  81. process(8):-write("Zavershenie raboty!"), readchar(_).
  82. process(7):-makewindow(8,7,7,"Zadanie",4,10,20,50),
  83. spisok(LL),bezdubl(LL,L),spisok2(L,L1),write("Sdali, i imeyshie tri ocenki otlichno : "), nl, output(L1),nl,readchar(_), removewindow.
  84.  
  85. spisok(LL):-findall(N,dstud(N,_,_),L),spisok1(L,LL).
  86. spisok1([],[]):-!.
  87. spisok1([X|L],[X|L1]):-dstud(X,"matematika",O1),O1>2,
  88. dstud(X,"fizika",O2),O2>2,
  89. dstud(X,"himia",O3),O3>2,
  90. dstud(X,"informatika",O4),O4>2,!,
  91. spisok1(L,L1).
  92. spisok1([_|L],L1):-spisok1(L,L1).
  93. bezdubl([],[]).
  94. bezdubl([X|L],L1):-prinadl(X,L),bezdubl(L,L1).
  95. bezdubl([X|L],[X|L1]):-not(prinadl(X,L)),bezdubl(L,L1).
  96. prinadl(X,[X|_]):-!.
  97. prinadl(X,[_|L]):-prinadl(X,L).
  98. spisok2([],[]):-!.
  99. spisok2([X|L],[X|L1]):-dstud(X,_,O1), O1=5,
  100. dstud(X,_,O2), O2=5,
  101. dstud(X,_,O3), O3=5,!,
  102. spisok2(L,L1).
  103. spisok2([_|L],L1):-spisok2(L,L1).

Решение задачи: «Создание динамической БД: результаты сессии данной группы студентов»

textual
Листинг программы
  1. dstud(X,P1,O1), O1=5, dstud(X,P2,O2), O2=5, P1 <> P2, dstud(X,P3,O3), O3=5, P1 <> P3, P2 <> P3

Объяснение кода листинга программы

В данном коде происходит следующее:

  1. Создается факт dstud(X,P1,O1), где X - идентификатор группы студентов, P1 - первый проход по данной группе студентов, O1 - результаты этого прохода (возможно, оценка).
  2. Затем факт dstud(X,P1,O1) используется для установления значения переменной O1 равным 5.
  3. Далее, создается второй проход по группе студентов P2 и результаты этого прохода (возможно, оценка) присваиваются переменной O2.
  4. Переменная O2 устанавливается равной 5.
  5. Проверяется условие P1 <> P2, что означает, что первый и второй проходы различаются.
  6. Затем, создается третий проход по группе студентов P3 и результаты этого прохода (возможно, оценка) присваиваются переменной O3.
  7. Переменная O3 устанавливается равной 5.
  8. Проверяется условие P1 <> P3, что означает, что первый и третий проходы различаются.
  9. Также проверяется условие P2 <> P3, что означает, что второй и третий проходы различаются. Таким образом, данный код создает факты о проходах по группе студентов и проверяет их на различие. Возможно, это связано с созданием динамической базы данных для хранения результатов сессии группы студентов.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы