SHOW:
|
|
- or go back to the newest paste.
1 | #include <iostream> | |
2 | ||
3 | using namespace std; | |
4 | ||
5 | //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu | |
6 | #pragma warning(disable:4996) | |
7 | #pragma warning(disable:4244) | |
8 | ||
9 | ||
10 | enum enumKursevi { HtmlCSSJavaScript, SoftwareEngeneeringFundamentals, MasteringSQL, WindowsSecurity }; | |
11 | char *KurseviChar[] = { "HtmlCSSJavaScript", "SoftwareEngeneeringFundamentals", "MasteringSQL", "WindowsSecurity" }; | |
12 | char *crt = "\n--------------------------------------------\n"; | |
13 | ||
14 | struct Datum { | |
15 | int * _dan, *_mjesec, *_godina; | |
16 | void Unos(int d, int m, int g) { | |
17 | _dan = new int(d); | |
18 | _mjesec = new int(m); | |
19 | _godina = new int(g); | |
20 | } | |
21 | void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; } | |
22 | void Dealociraj() { delete _dan; delete _mjesec; delete _godina; } | |
23 | bool Period(Datum pocetak) { | |
24 | if (*_godina != *pocetak._godina) | |
25 | return true; | |
26 | else if (*_godina == *pocetak._godina && *_mjesec != *pocetak._mjesec) | |
27 | return true; | |
28 | else if (*_mjesec == *pocetak._mjesec && *_dan != *pocetak._dan) | |
29 | return true; | |
30 | return false; | |
31 | } | |
32 | bool ODDO(Datum OD, Datum DO) { | |
33 | if (*_godina < *OD._godina || *_godina > *DO._godina) | |
34 | return false; | |
35 | else if ((*_godina < *OD._godina || *_godina > *DO._godina) && (*_mjesec < *OD._mjesec || *_mjesec > *DO._mjesec)) | |
36 | return false; | |
37 | else if ((*_mjesec < *OD._mjesec || *_mjesec > *DO._mjesec) && (*_dan < *OD._dan || *_dan > *DO._dan)) | |
38 | return false; | |
39 | return true; | |
40 | } | |
41 | }; | |
42 | ||
43 | struct Kurs { | |
44 | enumKursevi _kurs; | |
45 | Datum _pocetak; | |
46 | Datum _kraj; | |
47 | char * _imePredavaca; | |
48 | bool _aktivan;//SVAKI KURS JE NA POCETKU AKTIVAN | |
49 | ||
50 | void Dealociraj() { | |
51 | _pocetak.Dealociraj(); | |
52 | _kraj.Dealociraj(); | |
53 | delete[] _imePredavaca; _imePredavaca = nullptr; | |
54 | } | |
55 | void Unos(enumKursevi KursUnos, Datum pocetak, Datum kraj, char *ime) { | |
56 | _kurs = KursUnos; | |
57 | _pocetak.Unos(*pocetak._dan, *pocetak._mjesec, *pocetak._godina); | |
58 | _kraj.Unos(*kraj._dan, *kraj._mjesec, *kraj._godina); | |
59 | int vel = strlen(ime) + 1; | |
60 | _imePredavaca = new char[vel]; | |
61 | strcpy(_imePredavaca, ime); | |
62 | _aktivan = true; | |
63 | } | |
64 | void Ispis() { | |
65 | cout << "Kurs:" << KurseviChar[_kurs] << endl; | |
66 | _pocetak.Ispis(); | |
67 | _kraj.Ispis(); | |
68 | cout << "Ime predavaca:" << _imePredavaca << endl; | |
69 | if (_aktivan) | |
70 | cout << "Kurs je jos aktivan." << endl; | |
71 | else | |
72 | cout << "Kurs nije aktivan." << endl; | |
73 | } | |
74 | }; | |
75 | struct Polaznik { | |
76 | int _polaznikID; | |
77 | char * _imePrezime; | |
78 | void Unos(int polaznikID, char * imePrezime) { | |
79 | _polaznikID = polaznikID; | |
80 | int size = strlen(imePrezime) + 1; | |
81 | _imePrezime = new char[size]; | |
82 | strcpy_s(_imePrezime, size, imePrezime); | |
83 | } | |
84 | void Ispis() { cout << _polaznikID << " " << _imePrezime << endl; } | |
85 | void Dealociraj() { | |
86 | delete[] _imePrezime; _imePrezime = nullptr; | |
87 | } | |
88 | ||
89 | }; | |
90 | struct Polaganja { | |
91 | Polaznik _polaznik; | |
92 | Kurs _kurs; | |
93 | Datum _datumPolaganja; | |
94 | float _ostvareniUspjeh; | |
95 | void Unos(Polaznik polaznikUnos, Kurs KursUnos, Datum datumPolaganja, int uspijeh) { | |
96 | _polaznik.Unos(polaznikUnos._polaznikID, polaznikUnos._imePrezime); | |
97 | _kurs = KursUnos; | |
98 | _datumPolaganja.Unos(*datumPolaganja._dan, *datumPolaganja._mjesec, *datumPolaganja._godina); | |
99 | _ostvareniUspjeh = uspijeh; | |
100 | } | |
101 | void Dealokacija() { | |
102 | _polaznik.Dealociraj(); | |
103 | _kurs.Dealociraj(); | |
104 | _datumPolaganja.Dealociraj(); | |
105 | } | |
106 | void Ispis() { | |
107 | _polaznik.Ispis(); | |
108 | _datumPolaganja.Ispis(); | |
109 | cout << "Uspijeh:" << _ostvareniUspjeh << "%" << endl; | |
110 | } | |
111 | }; | |
112 | struct SkillsCentar { | |
113 | char * _nazivCentra; | |
114 | Kurs * _kursevi[50];//JEDAN EDUKACIJSKI CENTAR MOZE NUDITI NAJVISE 50 KURSEVA | |
115 | int _trenutnoKurseva; | |
116 | Polaganja * _polaganja; | |
117 | int _trenutnoPolaganja; | |
118 | void Unos(char *imeCentra) { | |
119 | int vel = strlen(imeCentra) + 1; | |
120 | _nazivCentra = new char[vel]; | |
121 | strcpy(_nazivCentra, imeCentra); | |
122 | _trenutnoKurseva = 0; | |
123 | _trenutnoPolaganja = 0; | |
124 | } | |
125 | bool DodajKurs(Kurs k) { | |
126 | if (_trenutnoKurseva > 0) { | |
127 | for (int i = 0; i < _trenutnoKurseva; i++) | |
128 | { | |
129 | if (_kursevi[i]->_kurs == k._kurs && !_kursevi[i]->_kraj.Period(k._pocetak)) | |
130 | return false; | |
131 | } | |
132 | } | |
133 | _kursevi[_trenutnoKurseva] = new Kurs; | |
134 | _kursevi[_trenutnoKurseva]->Unos(k._kurs, k._pocetak, k._kraj, k._imePredavaca); | |
135 | _trenutnoKurseva++; | |
136 | return true; | |
137 | } | |
138 | bool DodajPolaganje(Polaganja p) { | |
139 | if (_trenutnoPolaganja > 0) { | |
140 | for (int i = 0; i < _trenutnoKurseva; i++) | |
141 | { | |
142 | if (_polaganja[i]._polaznik._polaznikID == p._polaznik._polaznikID && _polaganja[i]._ostvareniUspjeh > p._ostvareniUspjeh) | |
143 | return false; | |
144 | if (!_kursevi[i]->_aktivan) | |
145 | return false; | |
146 | if (!(_kursevi[i]->_kraj._dan + 5 > p._datumPolaganja._dan)) | |
147 | return false; | |
148 | if (_kursevi[i]->_kurs == p._kurs._kurs && !p._datumPolaganja.ODDO(_kursevi[i]->_pocetak, _kursevi[i]->_kraj)) | |
149 | return false; | |
150 | } | |
151 | } | |
152 | for (int i = 0; i < _trenutnoKurseva; i++) | |
153 | { | |
154 | if (p._kurs._kurs == _kursevi[i]->_kurs) { | |
155 | Povecaj(); | |
156 | _polaganja[_trenutnoPolaganja].Unos(p._polaznik, p._kurs, p._datumPolaganja, p._ostvareniUspjeh); | |
157 | _trenutnoPolaganja++; | |
158 | return true; | |
159 | } | |
160 | } | |
161 | return false; | |
162 | } | |
163 | void Povecaj() { | |
164 | if (_trenutnoPolaganja == 0) | |
165 | _polaganja = new Polaganja[1]; | |
166 | else { | |
167 | Polaganja *novo = new Polaganja[_trenutnoPolaganja]; | |
168 | for (int i = 0; i < _trenutnoPolaganja; i++) | |
169 | novo->Unos(_polaganja[i]._polaznik, _polaganja[i]._kurs, _polaganja[i]._datumPolaganja, _polaganja[i]._ostvareniUspjeh); | |
170 | for (int i = 0; i < _trenutnoPolaganja; i++) | |
171 | _polaganja[i].Dealokacija(); | |
172 | _polaganja = new Polaganja[_trenutnoPolaganja + 1]; | |
173 | for (int i = 0; i < _trenutnoPolaganja; i++) | |
174 | _polaganja->Unos(novo[i]._polaznik, novo[i]._kurs, novo[i]._datumPolaganja, novo[i]._ostvareniUspjeh); | |
175 | for (int i = 0; i < _trenutnoPolaganja; i++) | |
176 | novo[i].Dealokacija(); | |
177 | novo = nullptr; | |
178 | } | |
179 | } | |
180 | Polaganja *PolaganjaByDatum(Datum OD, Datum DO, int &brojPolaganja) { | |
181 | for (int i = 0; i < _trenutnoPolaganja; i++) | |
182 | { | |
183 | if (_polaganja[i]._datumPolaganja.ODDO(OD, DO)) | |
184 | brojPolaganja++; | |
185 | } | |
186 | if (brojPolaganja > 0) { | |
187 | Polaganja *vrati = new Polaganja[brojPolaganja]; | |
188 | int j = 0; | |
189 | for (int i = 0; i < _trenutnoPolaganja; i++) | |
190 | { | |
191 | if (_polaganja[i]._datumPolaganja.ODDO(OD, DO)) { | |
192 | vrati[j].Unos(_polaganja[i]._polaznik, _polaganja[i]._kurs, _polaganja[i]._datumPolaganja, _polaganja[i]._ostvareniUspjeh); | |
193 | j++; | |
194 | } | |
195 | } | |
196 | return vrati; | |
197 | } | |
198 | return NULL; | |
199 | } | |
200 | void Dealokacija() { | |
201 | delete[]_nazivCentra; _nazivCentra = nullptr; | |
202 | for (int i = 0; i < _trenutnoKurseva; i++) | |
203 | _kursevi[i]->Dealociraj(); | |
204 | for (int i = 0; i < _trenutnoPolaganja; i++) | |
205 | _polaganja[i].Dealokacija(); | |
206 | } | |
207 | void Ispis() { | |
208 | cout << crt << "KURSEVI" << crt; | |
209 | for (int i = 0; i < _trenutnoKurseva; i++){ | |
210 | cout << crt; | |
211 | _kursevi[i]->Ispis(); | |
212 | } | |
213 | cout << crt << "POLAGANJA" << crt; | |
214 | for (int i = 0; i < _trenutnoPolaganja; i++){ | |
215 | _polaganja[i].Ispis(); | |
216 | } | |
217 | } | |
218 | }; | |
219 | float PretragaRekurzivno(Polaganja *p, int brojac, float uspijeh, int broj, enumKursevi kurs) { | |
220 | if (brojac < 0) | |
221 | return uspijeh / broj; | |
222 | else { | |
223 | if (p[brojac]._kurs._kurs == kurs) { | |
224 | uspijeh += p[brojac]._ostvareniUspjeh; | |
225 | broj++; | |
226 | return PretragaRekurzivno(p, brojac - 1, uspijeh, broj, kurs); | |
227 | } | |
228 | else | |
229 | return PretragaRekurzivno(p, brojac - 1, uspijeh, broj, kurs); | |
230 | } | |
231 | } | |
232 | ||
233 | void main() { | |
234 | ||
235 | /* | |
236 | 1. BROJ I TIPOVI PARAMETARA MORAJU BITI IDENTICNI ONIMA U TESTNOM CODE-U (OSIM UKOLIKO IMATE OPRAVDANU POTREBU ZA MODIFIKACIJOM). U SUPROTNOM SE RAD NEĆE BODOVATI | |
237 | 2. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB130030.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE. TAKOĐER, UKLONITE SVE DIJELOVE CODE-A KOJI NISU IMPLEMENTIRANI | |
238 | 3. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A | |
239 | 4. 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) | |
240 | 5. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD | |
241 | */ | |
242 | ||
243 | Datum datum1, datum2, datum3, datum4, datum5, datum6; | |
244 | datum1.Unos(26, 11, 2015); | |
245 | datum2.Unos(29, 5, 2016); | |
246 | datum3.Unos(5, 6, 2016); | |
247 | datum4.Unos(15, 8, 2016); | |
248 | datum5.Unos(13, 7, 2016); | |
249 | datum6.Unos(22, 9, 2016); | |
250 | ||
251 | Kurs softverski, html, sql, security; | |
252 | softverski.Unos(SoftwareEngeneeringFundamentals, datum1, datum2, "Emina Junuz"); | |
253 | html.Unos(HtmlCSSJavaScript, datum2, datum3, "Larisa Tipura"); | |
254 | sql.Unos(MasteringSQL, datum3, datum4, "Jasmin Azemovic"); | |
255 | security.Unos(WindowsSecurity, datum3, datum4, "Adel Handzic"); | |
256 | ||
257 | Polaznik denis, zanin, indira; | |
258 | denis.Unos(1, "Denis Music"); | |
259 | zanin.Unos(2, "Zanin Vejzovic"); | |
260 | indira.Unos(3, "Indira Hamulic"); | |
261 | ||
262 | Polaganja denisHtml, zaninHtml, indiraSql; | |
263 | denisHtml.Unos(denis, html, datum5, 61); | |
264 | ////61 predstavlja ostvareni uspjeh/procenat, a uspjesno polozenim se smatra svaki kurs na kome je polaznik ostvari vise od 55% | |
265 | zaninHtml.Unos(zanin, html, datum6, 93); | |
266 | indiraSql.Unos(indira, sql, datum4, 85); | |
267 | ||
268 | SkillsCentar mostar; | |
269 | mostar.Unos("Skills Center Mostar"); | |
270 | ////jedan edukacijski centar moze nuditi vise istih kurseva (npr. MasteringSQL), ali se oni moraju realizovati u razlictim periodima (pocetak-kraj) tj. ne smiju se preklapati | |
271 | ////novi kurs istog tipa (npr. MasteringSQL) se mora realizovati nakon prethodno dodanog npr. ako prethodni kurs MasteringSQL traje 01.03.2016 - 01.04.2016, onda se | |
272 | ////novi kurs MasteringSQL moze dodati jedino ako pocinje nakon 01.04.2016 | |
273 | if (mostar.DodajKurs(softverski)) { | |
274 | cout << crt << "KURS USPJESNO REGISTROVAN" << crt; | |
275 | softverski.Ispis(); | |
276 | cout << crt; | |
277 | } | |
278 | if (mostar.DodajKurs(html)) { | |
279 | cout << crt << "KURS USPJESNO REGISTROVAN" << crt; | |
280 | html.Ispis(); | |
281 | cout << crt; | |
282 | } | |
283 | if (mostar.DodajKurs(sql)) { | |
284 | cout << crt << "KURS USPJESNO REGISTROVAN" << crt; | |
285 | sql.Ispis(); | |
286 | cout << crt; | |
287 | } | |
288 | ////nije moguce dodati polaganje onog kursa koji nije evidentiran (registrovan, ponudjen) u tom edukacijskom centru | |
289 | ////moguce je polagati samo aktivne kurseve i to najkasnije 5 dana od dana zavrsetka (kraja) posljednje dodanog (aktivnog) kursa iste vrste (npr. MasteringSQL) | |
290 | ////jedan polaznik moze vise puta polagati isti kurs, ali novi procenat mora biti veci od prethodno dodanog (na istom kursu) | |
291 | if (mostar.DodajPolaganje(denisHtml)) { | |
292 | cout << crt << "POLAGANJE EVIDENTIRANO" << crt; | |
293 | denisHtml.Ispis(); | |
294 | } | |
295 | if (mostar.DodajPolaganje(indiraSql)) { | |
296 | cout << crt << "POLAGANJE EVIDENTIRANO" << crt; | |
297 | indiraSql.Ispis(); | |
298 | } | |
299 | if (mostar.DodajPolaganje(zaninHtml)) { | |
300 | cout << crt << "POLAGANJE EVIDENTIRANO" << crt; | |
301 | zaninHtml.Ispis(); | |
302 | } | |
303 | Datum OD, DO; | |
304 | int brojPolaganja = 0; | |
305 | OD.Unos(1, 6, 2016); | |
306 | DO.Unos(1, 8, 2016); | |
307 | ////PolaganjaByDatum – vraca niz polaganja koja su uspjesno realizovana u periodu OD-DO | |
308 | Polaganja * polaganjaByDatum = mostar.PolaganjaByDatum(OD, DO, brojPolaganja); | |
309 | cout << "U periodu od "<<endl; | |
310 | OD.Ispis(); | |
311 | cout << " do "; | |
312 | DO.Ispis(); | |
313 | cout << " uspjesno je realizovano " << brojPolaganja << " polaganja--->>>"<<endl; | |
314 | for (size_t i = 0; i < brojPolaganja; i++) | |
315 | polaganjaByDatum[i].Ispis(); | |
316 | ||
317 | ////PretragaRekurzivno - rekurzivna funkcija pronalazi prosjecni uspjeh koji su polaznici tokom godine (npr.2016) ostvarili na odredjenom kursu (npr. MasteringSQL) | |
318 | cout << "Prosjecan uspjeh na kursu MasteringSQL u 2016 godini je " << PretragaRekurzivno(mostar._polaganja, mostar._trenutnoPolaganja - 1, 0, 0, MasteringSQL) << endl; | |
319 | ////Ispis - ispisuje sve informacije o edukacijskom centru. prije ispisa sortirati sve kurseve na osnovu pocetka odrzavanja kursa | |
320 | mostar.Ispis(); | |
321 | mostar.Dealokacija(); | |
322 | ||
323 | ////izvrsiti potrebne dealokacije | |
324 | system("pause"); | |
325 | ||
326 | } |