0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 5
1

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

14.12.2014, 14:56. Показов 2628. Ответов 7
Метки нет (Все метки)

Задание. Динамическая база данных содержит информацию о результатах сессии данной группы студентов в виде утверждений следующих видов: математика (фамилия_и_о, оценка), физика (фамилия_и_о, оценка), химия (фамилия_и_о, оценка), информатика (фамилия_и_о,оценка). Предполагается, что в группе N студентов и все они оценки по всем предметам (5,4,3 или 2). В динамической базе данных (ДБД) для каждого студента может хранится информация об одной или нескольких оценках (т.е несколько фактов) по каждому предмету, что связано с возможными пересдачами экзаменов.
Требуется написать программу, создающую ДБД и предоставляющую возможность ее изменения в процессе работы, а также формирующую без дублирования (т.е одна и та же фамилия дважды не встречается) список студентов, удовлетворяющих следующим условиям.
1. Сдавшие сессию и имеющие три оценки отлично.

Программа работает, но выводит всех студентов, у которых есть хотя бы одна пятерка. В чем причина не могу понять.
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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).
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2014, 14:56
Ответы с готовыми решениями:

Найти фамилии студентов данной группы, которые получили максимальный балл (программа не запускается)
дана инф ввиде:ФИО,группа,балл. найти фамилии студентов данной группы,которые получили максимальный...

Сессия. Результаты сессии, состоящей из трех экзаменов, для группы из n студентов представлены матрицей K(n,3).
Сессия. Результаты сессии, состоящей из трех экзаменов, для группы из n студентов представлены...

Результаты сессии студентов
Здравствуйте, мне нужно написать программу "Результаты сессии студентов" с использованием ООП. В...

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

7
785 / 589 / 156
Регистрация: 07.10.2013
Сообщений: 1,313
15.12.2014, 13:36 2
Лучший ответ Сообщение было отмечено esko943 как решение

Решение

Цитата Сообщение от esko943 Посмотреть сообщение
но выводит всех студентов, у которых есть хотя бы одна пятерка
как написали так и выводит надо что-то типа этого
Prolog
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
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 5
15.12.2014, 17:34  [ТС] 3
Спасибо
0
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 17
15.12.2014, 18:58 4
arlat, Можете помочь? У меня тоже задание но условие - сдавшие сессию и имеющие только две тройки
0
785 / 589 / 156
Регистрация: 07.10.2013
Сообщений: 1,313
15.12.2014, 19:48 5
Цитата Сообщение от Psixozzzz Посмотреть сообщение
но условие - сдавшие сессию и имеющие только две тройки
и что, по аналогии никак, именно помочь? ребята, это Пролог, мыслите в декларативном и логическом направлении... пишите предикаты и переменные, что-ли нормально, почти как на естественном языке, может мысль прободает
и в отладчике пройдите... хотя если PDC, то может не помочь...
Prolog
1
dstud(X,P1,O1), O1=3, dstud(X,P2,O2), O2=3, P1 <> P2
а именно, студент X имеет по предмету P1 оценку O1=3, он же по предмету P2 ту же, и это разные предметы, а вообще-то так
Prolog
1
dstud(X,P1,3), dstud(X,P2,3), not(P1=P2)
0
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 17
15.12.2014, 20:18 6
arlat, Выводит всех у кого больше двух троек! а надо именно 2 тройки
0
785 / 589 / 156
Регистрация: 07.10.2013
Сообщений: 1,313
15.12.2014, 22:22 7
Цитата Сообщение от Psixozzzz Посмотреть сообщение
Выводит всех у кого больше двух троек!
ну, должно, как минимум две 3, не больше...

Добавлено через 7 минут
Цитата Сообщение от Psixozzzz Посмотреть сообщение
а надо именно 2 тройки
ну, тогда findall

Добавлено через 4 минуты
а то и setof, вобщем тут уже сложно завернуто, сомневаюсь, что в простых лабах это реально нужно, постарайтесь привести максимально полную постановку задачи...
0
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 2
15.11.2015, 11:38 8
Ребят, помогите, третьи сутки с этим парюсь! Условие аналогичное предыдущему:
Динамическая база данных содержит информацию о результатах сессии данной группы студентов в виде утверждений следующих видов: математика (фамилия_и_о, оценка), физика (фамилия_и_о, оценка), химия (фамилия_и_о, оценка), информатика (фамилия_и_о,оценка). Предполагается, что в группе N студентов и все они оценки по всем предметам (5,4,3 или 2). В динамической базе данных (ДБД) для каждого студента может хранится информация об одной или нескольких оценках (т.е несколько фактов) по каждому предмету, что связано с возможными пересдачами экзаменов.
Требуется написать программу, создающую ДБД и предоставляющую возможность ее изменения в процессе работы, а также формирующую без дублирования (т.е одна и та же фамилия дважды не встречается) список студентов, удовлетворяющих следующим условиям.

Задание
Сдавшие сессию и имеющие пересдачи экзаменов в порядке убывания количества пересдач с указанием этого количества.
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
 domains
        name,predmet=string
                f=integer
        ocenka=integer
        l=string*
        li=integer*
database
        dstud(name,predmet,ocenka,ocenka,ocenka).
predicates
        repeat.
        do_db.      
        menu.       
        print.
        output(l,f).
        clear_db.
        stud(name,predmet,ocenka,ocenka,ocenka).
        process(integer).
        zadacha.
        delete(name).
        poisk(name).
        spisok(l).
        spisok1(l,l,f).
        bezdubl(l,l).
        prinadl(name,f,l).
        spisok2(l,l).
clauses
        repeat.
        repeat:-repeat.
          
        stud("Ivanov I.I.","matematika",2,4,0). 
        stud("Ivanov I.I.","fizika",2,4,0).
        stud("Ivanov I.I.","himia",2,3,0).
        stud("Ivanov I.I.","informatika",2,5,0).
        stud("Sidorov P.I.","matematika",3,0,0).    
        stud("Sidorov P.I.","fizika",3,0,0).
        stud("Sidorov P.I.","himia",3,0,0).
        stud("Sidorov P.I.","informatika",5,0,0).
        stud("Gavrilov V.V.","matematika",2,2,3).   
        stud("Gavrilov V.V.","fizika",2,2,4).
        stud("Gavrilov V.V.","himia",2,2,3).
        stud("Gavrilov V.V.","informatika",2,2,3).
        stud("Stepanov K.K.","fizika",2,2,2).
        stud("Stepanov K.K.","informatika",2,2,2).
        stud("Stepanov K.K.","matematika",2,2,2).
        stud("Stepanov K.K.","himia",2,2,2).        
 
do_db:-stud(N,P,O,D,T),assertz(dstud(N,P,O,D,T)),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. Poisk po FIO "),nl,
        write("  5. Dobavlenie "),nl,
        write("  6. Udalenie "),nl,
        write("  7. Sohranenie DBD "),nl, 
        write("  8. Zadanie "),nl,   
        write("  9. Vihod  "),nl,nl,
        write("Vash vibor: "),
        readint(K),nl,process(K),K=9,!,removewindow.
 
        delete(N):-retract(dstud(N,_,_,_,_)),fail.
        delete(N):- nl, write("Operacia zavershena"),readchar(_).
        
        print:-dstud(N,P,O,D,T),write(N," ",P," - ",O," - ",D," - ",T),nl,fail.
        print.
        poisk(N):-dstud(N,P,O,D,T),write(P," - ",O,D,T),nl,fail.
        poisk(_):-write("Poisk zavershen"), readchar(_).
        
        output([],_):-!.
        output([H|L],P):-write(H,P), output(L,P).
        
        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(5,7,7,"Poisk po FIO",4,10,20,50),write("Vvedite FIO studenta: "),
            readln(N),poisk(N),removewindow.
        process(5):-makewindow(6,7,7,"Dobavlenie",4,10,20,50),
            write("Vvedite FIO studenta: "),readln(N),
            write("Vvedite predmet: "),readln(P),
            write("Vvedite ocenku na examine: "),readint(O), write("Vvedite ocenku na pervoi peresdache: "),readint(D), write("Vvedite ocenku na vtoroi peresdache: "),readint(T),
            assertz(dstud(N,P,O,D,T)),write("Dobavleno"), nl, readchar(_), removewindow.
        process(6):-makewindow(7,7,7,"Udalenie",4,10,20,50),
            write("Vvedite FIO studenta: "),readln(N),delete(N),removewindow.
        process(7):-write("Imya faila: "), readln(F), save(F),!,write("DBD sohranena"),readchar(_).
        process(7):-write("Oshibka!"),readchar(_).
        process(9):-write("Zavershenie raboty!"), readchar(_).
        
        process(8):-makewindow(8,7,7,"Zadanie",4,10,20,50),
            spisok(LL),bezdubl(LL,L),spisok1(L,L1,P),write("Sdali s 4 i 5 : "), nl, output(L1,P), nl,readchar(_), removewindow.
        
        spisok(LL):-findall(N,dstud(N,_,_,_,_),L),spisok1(L,LL,P).
        
        spisok1([],[],_):-!.
        spisok1([X|L],[X|L1],P):-dstud(X,"matematika",O1,OO1,OOO1),O1>2,
            dstud(X,"fizika",O2,OO2,OOO2),O2>2,
            dstud(X,"himia",O3,OO3,OOO3),O3>2,
            dstud(X,"informatika",O4,OO4,OOO4),O4>2,P=0,!,
                    spisok1(L,L1,P).
               spisok1([X|L],[X|L1],P):-dstud(X,"matematika",O1,OO1,OOO1),OO1>2,
            dstud(X,"fizika",O2,OO2,OOO2),OO2>2,
            dstud(X,"himia",O3,OO3,OOO3),OO3>2,
            dstud(X,"informatika",O4,OO4,OOO4),OO4>2,P=4,!,
                    spisok1(L,L1,P).
           
               spisok1([X|L],[X|L1],P):-dstud(X,"matematika",O1,OO1,OOO1),OOO1>2,
            dstud(X,"fizika",O2,OO2,OOO2),OOO2>2,
            dstud(X,"himia",O3,OO3,OOO3),OOO3>2,
            dstud(X,"informatika",O4,OO4,OOO4),OOO4>2,P=8,!,
                    spisok1(L,L1,P).
           
        spisok1([X|L],L1,_):-spisok1(L,L1,P).
        
        bezdubl([],[]).
        bezdubl([X|L],L1):-prinadl(X,P,L),bezdubl(L,L1).
        bezdubl([X|L],[X|L1]):-not(prinadl(X,_,L)),bezdubl(L,L1).
        
        prinadl(X,P,[X|_]):-!.
        prinadl(X,P,[_|L]):-prinadl(X,P,L).
        
        spisok2([],[]):-!.
        spisok2([X|L],[X|L1]):-dstud(X,_,O5,OO5,OOO5),O5>3,!, spisok2(L,L1).
        spisok2([X|L],L1):-spisok2(L,L1).
Добавлено через 7 минут
Код работает некорректно, ибо вообще не представляю как делать.
Как, например, написать условие, что оценка на пересдаче больше 2, либо равна нулю (если студент сдал предмет с первого раза)?
И если никак значит ли это что нужно прописывать для каждой комбинации отдельное определение?
Например, физика - 5 - 0 -0
информатика - 2- 3 - 0
математика -2 - 2 - 3
химия - 3 - 0 - 0

Ну то сеть проверять оценку на каждой пересдаче для каждого предмета...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2015, 11:38
Помогаю со студенческими работами здесь

Составить список? в котором сохраняются результаты сессии группы (структуры)
Помогите пожалуйста запутался в программе задача Составить список в котором сохраняются...

На основе результатов экзаменационной сессии анализировать успеваемость группы студентов
Привет,помогите написать прогу Разработать проект, с помощью которого на основе результатов...

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

Создать файл с фамилиями студентов группы; используя его сформировать ведомость результатов сессии
Составить алгоритм программу, в которой необходимо: создать файл с фамилиями студентов группы и,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru