forked from emir97/PR-II
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRjesenje zadatka.cpp
300 lines (269 loc) · 11.3 KB
/
Rjesenje zadatka.cpp
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
#include <iostream>
#include <memory>
using namespace std;
/*
1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB160061.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI ĆETE KOPIRATI VAŠA RJEŠENJA)
6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
*/
//narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
#pragma warning(disable:4996)
const char *crt = "\n-------------------------------------------\n";
enum eNacinStudiranja { REDOVAN, DL };
enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
struct DatumVrijeme {
int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
void Unos(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
_dan = new int(dan);
_mjesec = new int(mjesec);
_godina = new int(godina);
_sati = new int(sati);
_minuti = new int(minuti);
}
void Dealociraj() {
delete _dan; _dan = nullptr;
delete _mjesec; _mjesec = nullptr;
delete _godina; _godina = nullptr;
delete _sati; _sati = nullptr;
delete _minuti; _minuti = nullptr;
}
void Ispis() {
cout << *_dan << "." << *_mjesec << "." << *_godina << " " << *_sati << ":" << *_minuti << endl;
}
char *GetDatumKaoNizKaraktera() {
char dan[3], mjesec[3], godina[5], sati[3], minuti[3];
_itoa(*_dan, dan, 10);
_itoa(*_mjesec, mjesec, 10);
_itoa(*_godina, godina, 10);
_itoa(*_sati, sati, 10);
_itoa(*_minuti, minuti, 10);
int size = strlen(dan) + strlen(mjesec) + strlen(godina) + strlen(sati) + strlen(minuti) + 6;
char *char_datum = new char[size];
strcpy_s(char_datum, size, dan);
strcat_s(char_datum, size, ".");
strcat_s(char_datum, size, mjesec);
strcat_s(char_datum, size, ".");
strcat_s(char_datum, size, godina);
strcat_s(char_datum, size, " ");
strcat_s(char_datum, size, sati);
strcat_s(char_datum, size, ":");
strcat_s(char_datum, size, minuti);
return char_datum;
}
};
const DatumVrijeme rokZaPrijavu = { new int(5), new int(7), new int(2017), new int(12), new int(30) };
struct Predmet {
char * _naziv;
int _ocjena;
DatumVrijeme * _datumUnosa;
void Unos(const char * naziv, int ocjena, DatumVrijeme datumUnosa) {
int vel = strlen(naziv) + 1;
_naziv = new char[vel];
strcpy_s(_naziv, vel, naziv);
_ocjena = ocjena;
_datumUnosa = new DatumVrijeme;
_datumUnosa->Unos(*datumUnosa._dan, *datumUnosa._mjesec, *datumUnosa._godina, *datumUnosa._sati, *datumUnosa._minuti);
}
void Dealociraj() {
delete[] _naziv; _naziv = nullptr;
_datumUnosa->Dealociraj(); delete _datumUnosa;
}
void Ispis() {
//kreirati funkciju GetDatumKaoNizKaraktera() koja vraca vrijednosti atributa strukture datum kao niz karaktera
cout << _naziv << " (" << _ocjena << ") " << _datumUnosa->GetDatumKaoNizKaraktera() << endl;
}
};
struct Uspjeh {
eRazred _razred;
Predmet * _predmeti;
int _brojPredmeta;
void Unos(eRazred razred) {
_razred = razred;
_predmeti = nullptr;
_brojPredmeta = 0;
}
void Dealociraj() {
for (size_t i = 0; i < _brojPredmeta; i++)
_predmeti[i].Dealociraj();
delete[] _predmeti; _predmeti = nullptr;
}
void Ispis() {
cout << crt << "Razred -> " << _razred << crt;
for (size_t i = 0; i < _brojPredmeta; i++)
_predmeti[i].Ispis();
}
void DodajPredmet(Predmet p) {
Predmet *temp = new Predmet[_brojPredmeta + 1];
for (size_t i = 0; i < _brojPredmeta; i++)
{
temp[i].Unos(_predmeti[i]._naziv, _predmeti[i]._ocjena, *_predmeti[i]._datumUnosa);
_predmeti[i].Dealociraj();
}
if (_predmeti != nullptr)
delete[] _predmeti;
temp[_brojPredmeta].Unos(p._naziv, p._ocjena, *p._datumUnosa);
_predmeti = temp;
_brojPredmeta++;
}
};
int PretvoriUDane(DatumVrijeme d) {
return *d._dan + *d._mjesec * 30 + *d._godina * 365;
}
struct Kandidat {
eNacinStudiranja _nacinStudiranja;
char * _imePrezime;
shared_ptr<Uspjeh> _uspjeh[4];
void Unos(eNacinStudiranja nacinStudiranja, const char * imePrezime) {
int vel = strlen(imePrezime) + 1;
_imePrezime = new char[vel];
strcpy_s(_imePrezime, vel, imePrezime);
_nacinStudiranja = nacinStudiranja;
for (size_t i = 0; i < 4; i++)
_uspjeh[i] = nullptr;
}
void Dealociraj() {
delete[] _imePrezime; _imePrezime = nullptr;
for (size_t i = 0; i < 4; i++)
if (_uspjeh[i] != nullptr)
_uspjeh[i]->Dealociraj();
}
void Ispis() {
cout << crt << _imePrezime << " " << _nacinStudiranja;
for (size_t i = 0; i < 4; i++)
if (_uspjeh[i] != nullptr)
_uspjeh[i]->Ispis();
}
bool DodajPredmet(eRazred razred, Predmet p) {
if (razred != PRVI && razred != DRUGI && razred != TRECI && razred != CETVRTI)
return false;
for (size_t i = 0; i < 4; i++)
{
if (_uspjeh[i] != nullptr) {
for (size_t j = 0; j < _uspjeh[i]->_brojPredmeta; j++)
{
if (strcmp(_uspjeh[i]->_predmeti[j]._naziv, p._naziv) == 0)
return false;
}
}
}
if (PretvoriUDane(rokZaPrijavu) <= PretvoriUDane(*p._datumUnosa))
return false;
if (_uspjeh[(int)razred - 1] == nullptr) {
_uspjeh[(int)razred - 1] = make_shared<Uspjeh>();
_uspjeh[(int)razred - 1]->Unos(razred);
}
_uspjeh[(int)razred - 1]->DodajPredmet(p);
return true;
}
};
Kandidat *rekNajboljaOcjena(Kandidat *kandidati, int broj_kandidata, const char *predmet, Kandidat *najbolja_ocjena = nullptr, int ocjena = 0, DatumVrijeme datumEvidentiranja = { new int(0), new int(0), new int(0), new int(0), new int(0) }) {
if (broj_kandidata <= 0)
return najbolja_ocjena;
if (najbolja_ocjena == nullptr)
return rekNajboljaOcjena(kandidati, broj_kandidata, predmet, &kandidati[broj_kandidata - 1]);
for (size_t i = 0; i < 4; i++)
{
if (kandidati[broj_kandidata - 1]._uspjeh[i] != nullptr) {
for (size_t j = 0; j < kandidati[broj_kandidata - 1]._uspjeh[i]->_brojPredmeta; j++)
{
if (strcmp(kandidati[broj_kandidata - 1]._uspjeh[i]->_predmeti[j]._naziv, predmet) == 0 && kandidati[broj_kandidata - 1]._uspjeh[i]->_predmeti[j]._ocjena > ocjena) {
return rekNajboljaOcjena(kandidati, broj_kandidata - 1, predmet, &kandidati[broj_kandidata - 1], kandidati[broj_kandidata - 1]._uspjeh[i]->_predmeti[j]._ocjena, *kandidati[broj_kandidata - 1]._uspjeh[i]->_predmeti[j]._datumUnosa);
}
if (strcmp(kandidati[broj_kandidata - 1]._uspjeh[i]->_predmeti[j]._naziv, predmet) == 0 && kandidati[broj_kandidata - 1]._uspjeh[i]->_predmeti[j]._ocjena == ocjena && PretvoriUDane(datumEvidentiranja) > PretvoriUDane(*kandidati[broj_kandidata - 1]._uspjeh[i]->_predmeti[j]._datumUnosa)) {
return rekNajboljaOcjena(kandidati, broj_kandidata - 1, predmet, &kandidati[broj_kandidata - 1], kandidati[broj_kandidata - 1]._uspjeh[i]->_predmeti[j]._ocjena, *kandidati[broj_kandidata - 1]._uspjeh[i]->_predmeti[j]._datumUnosa);
}
}
}
}
return rekNajboljaOcjena(kandidati, broj_kandidata - 1, predmet, najbolja_ocjena, ocjena, datumEvidentiranja);
}
void main()
{
DatumVrijeme datum19062017_1015, datum20062017_1115, datum30062017_1215, datum05072017_1231;
datum19062017_1015.Unos(19, 6, 2017, 10, 15);
datum20062017_1115.Unos(20, 6, 2017, 11, 15);
datum30062017_1215.Unos(30, 6, 2017, 12, 15);
datum05072017_1231.Unos(5, 7, 2017, 12, 31);
cout << datum19062017_1015.GetDatumKaoNizKaraktera() << endl;//9.6.2017 10:15
Predmet Matematika, Fizika, Hemija, Engleski;
//2 - ocjena na predmetu; datum - datum evidentiranja uspjeha na predmetu jer postoji krajnji rok za evidentiranje
Matematika.Unos("Matematika", 2, datum19062017_1015);
Fizika.Unos("Fizika", 5, datum20062017_1115);
Hemija.Unos("Hemija", 2, datum20062017_1115);
Engleski.Unos("Engleski", 5, datum05072017_1231);
int brojKandidata = 2;
Kandidat * prijave2017 = new Kandidat[brojKandidata];
prijave2017[0].Unos(DL, "Jasmin Azemovic");
prijave2017[1].Unos(REDOVAN, "Indira Hamulic");
/*
uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
prilikom dodavanja onemoguciti:
- dodavanje predmeta za razrede koji nisu definisani enumeracijom,
- dodavanje istoimenih predmeta na nivou jednog razreda,
- dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu).
razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.). Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
*/
if (prijave2017[0].DodajPredmet(DRUGI, Engleski))//ne bi trebao dodati jer je prosao postavljeni rok za dodavanje predmeta
cout << "Predmet uspjesno dodan!" << crt;
if (prijave2017[0].DodajPredmet(DRUGI, Matematika))
cout << "Predmet uspjesno dodan!" << crt;
if (prijave2017[0].DodajPredmet(PRVI, Fizika))
cout << "Predmet uspjesno dodan!" << crt;
if (prijave2017[0].DodajPredmet(PRVI, Hemija))
cout << "Predmet uspjesno dodan!" << crt;
Matematika._ocjena = 5;
Hemija._ocjena = 3;
if (prijave2017[1].DodajPredmet(PRVI, Matematika))
cout << "Predmet uspjesno dodan!" << crt;
if (prijave2017[1].DodajPredmet(PRVI, Matematika))//ne bi trebalo ponovo dodati Matematiku!
cout << "Predmet uspjesno dodan!" << crt;
if (prijave2017[1].DodajPredmet(TRECI, Hemija))
cout << "Predmet uspjesno dodan!" << crt;
if (prijave2017[1].DodajPredmet(DRUGI, Engleski))
cout << "Predmet uspjesno dodan!" << crt;
/*
koristeci Lambda izraz kreirati funkciju koja ce vratiti uspjeh kandidata koji je ostvario najveci prosjek (na nivou razreda, a ne ukupni prosjek). ukoliko vise kandidata ima isti prosjek funkcija vraca uspjeh (najboljeg razreda) prvog pronadjenog kandidata
*/
auto najboljiUspjeh = [prijave2017, brojKandidata]()-> shared_ptr<Uspjeh> {
float prosjek1 = 0;
float prosjek2 = 0;
shared_ptr<Uspjeh> pok = nullptr;
for (size_t i = 0; i < brojKandidata; i++)
{
for (size_t j = 0; j < 4; j++)
{
if (prijave2017[i]._uspjeh[j] != nullptr) {
for (size_t k = 0; k < prijave2017[i]._uspjeh[j]->_brojPredmeta; k++)
{
prosjek1 = prosjek1 + prijave2017[i]._uspjeh[j]->_predmeti[k]._ocjena;
}
prosjek1 = prosjek1 / prijave2017[i]._uspjeh[j]->_brojPredmeta;
if (prosjek1 > prosjek2) {
prosjek2 = prosjek1;
pok = prijave2017[i]._uspjeh[j];
}
}
}
}
return pok;
};
shared_ptr<Uspjeh> najbolji = najboljiUspjeh();
najbolji->Ispis();
/*
napisati rekurzivnu funkciju koja ce vratiti pokazivac na kandidata sa najvecom ocjenom na predmetu koji je proslijedjen kao parametar. ukoliko je vise kandidata ostvarilo istu ocjenu, funkcija treba da vrati onog kandidata koji je prvi evidentirao tu ocjenu (ako je isto vrijeme evidentiranja, onda funkcija vraca kandidata koji je prvi u nizu). u slucaju da niti jedan kandidat nije evidentirao trazeni predmet funkcija vraca nullptr. u nastavku je prikazan primjer poziva rekurzivne funkcije, a ostale parametre dodajte po potrebi.
*/
Kandidat * kandidatSaNajboljomOcjenom = rekNajboljaOcjena(prijave2017, brojKandidata, "Matematika");
cout << "Kandidat -> ";
kandidatSaNajboljomOcjenom->Ispis();
for (size_t i = 0; i < brojKandidata; i++)
{
prijave2017[i].Ispis();
prijave2017[i].Dealociraj();
}
delete[] prijave2017;
prijave2017 = nullptr;
system("pause>0");
}