aaa213

Zadnji_ispit

Mar 17th, 2016
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <regex>
  3. #include <vector>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. bool ProvjeriValidnostBrojaTelefona(string telefon){//globalna funkcija
  9.  
  10. //broj telefona treba biti u formatu: +387(61)-222-333
  11.  
  12. string pravilo = "(\\+)?(\\d{3})([-.])?(\\()?(\\d{2})(\\))?([-.])?(\\d{3})([-.]?)(\\d{3})";
  13.  
  14. return regex_match(telefon, regex(pravilo));
  15.  
  16. }
  17.  
  18. enum Predmeti { Matematika, Historija, Geografia, Hemija, Biologija, Engleski, Muzicko, Fizicko };
  19. enum Razredi { I1, I2, I3, II1, II2, II3, III1, III2, III3, IV1, IV2, IV3 };
  20. char * ispisPredmeti[] = { "Matematika", "Historija", "Geografia", "Hemija", "Biologija", "Engleski", "Muzicko", "Fizicko" };
  21. char * ispisRazredi[] = { "I1", "I2", "I3", "II1", "II2", "II3", "III1", "III2", "III3", "IV1", "IV2", "IV3" };
  22.  
  23. ostream & operator << (ostream & C, Predmeti predmet) {
  24.  
  25. C << "Predmet: " << ispisPredmeti[(int)predmet];
  26.  
  27. return C;
  28.  
  29. }
  30.  
  31. ostream & operator << (ostream & C, Razredi razred) {
  32.  
  33. C << "Razred: " << ispisRazredi[(int)razred];
  34.  
  35. return C;
  36.  
  37. }
  38.  
  39. char * crt = "\n------------\n\n";
  40.  
  41. template<class T1, class T2>
  42. class Kolekcija {
  43. T1 * _elementi1;
  44. T2 * _elementi2;
  45. int _trenutno;
  46. public:
  47. Kolekcija()
  48. {
  49. _elementi1 = nullptr;
  50. _elementi2 = nullptr;
  51. _trenutno = 0;
  52. }
  53. ~Kolekcija()
  54. {
  55. delete[]_elementi1;
  56. delete[]_elementi2;
  57. }
  58.  
  59. Kolekcija(Kolekcija & obj) {
  60.  
  61. _elementi1 = new T1[obj._trenutno];
  62. _elementi2 = new T2[obj._trenutno];
  63.  
  64. _trenutno = obj._trenutno;
  65.  
  66. for (int i = 0; i < obj._trenutno; i++) {
  67.  
  68. _elementi1[i] = obj._elementi1[i];
  69. _elementi2[i] = obj._elementi2[i];
  70.  
  71. }
  72.  
  73. }
  74.  
  75. bool AddElement(T1 element1, T2 element2) {
  76.  
  77. T1 * temp1 = new T1[_trenutno + 1];
  78. T2 * temp2 = new T2[_trenutno + 1];
  79.  
  80. for (int i = 0; i < _trenutno; i++) {
  81.  
  82. temp1[i] = _elementi1[i];
  83. temp2[i] = _elementi2[i];
  84.  
  85. }
  86.  
  87. if (_trenutno != 0) {
  88. delete[] _elementi1;
  89. delete[] _elementi2;
  90. }
  91.  
  92. _elementi1 = temp1;
  93. _elementi2 = temp2;
  94.  
  95. _elementi1[_trenutno] = element1;
  96. _elementi2[_trenutno] = element2;
  97.  
  98. _trenutno++;
  99.  
  100. return true;
  101.  
  102. }
  103.  
  104. bool RemoveElement(int lokacija) {
  105.  
  106. if (_trenutno == 0)
  107. return false;
  108.  
  109. T1 * temp1 = new T1[_trenutno];
  110. T2 * temp2 = new T2[_trenutno];
  111.  
  112. for (int i = 0, g = 0; i < _trenutno; i++, g++) {
  113.  
  114. if (i == lokacija)
  115. g++;
  116.  
  117. temp1[i] = _elementi1[g];
  118. temp2[i] = _elementi2[g];
  119.  
  120. }
  121.  
  122. delete[] _elementi1;
  123. delete[] _elementi2;
  124.  
  125. _elementi1 = temp1;
  126. _elementi2 = temp2;
  127.  
  128. _trenutno--;
  129.  
  130. return true;
  131.  
  132. }
  133.  
  134. T1 GetElement1(int lokacija) { return _elementi1[lokacija]; }
  135. T2 GetElement2(int lokacija) { return _elementi2[lokacija]; }
  136.  
  137. void operator = (Kolekcija & obj) {
  138.  
  139. if (_trenutno != 0) {
  140.  
  141. delete[] _elementi1;
  142. delete[] _elementi2;
  143.  
  144. }
  145.  
  146. for (int i = 0; i < obj._trenutno; i++) {
  147.  
  148. AddElement(obj.GetElement1(i), obj.GetElement2(i));
  149.  
  150. }
  151.  
  152. }
  153.  
  154. int GetTrenutno() { return _trenutno; }
  155.  
  156. friend ostream & operator << <> (ostream & C, Kolekcija<T1, T2> & obj);
  157.  
  158. };
  159.  
  160. template<class T1, class T2>
  161. ostream & operator << <> (ostream & C, Kolekcija<T1, T2> & obj) {
  162.  
  163. C << "Trenutno: " << obj._trenutno << endl;
  164.  
  165. for (int i = 0; i < obj._trenutno; i++) {
  166.  
  167. C << "Element1, lokacija: " << i << " je ";
  168. C << obj._elementi1[i];
  169. C << endl;
  170. C << "Element2, lokacija " << i << " je ";
  171. C << obj._elementi2[i];
  172. C << endl;
  173.  
  174. }
  175.  
  176. return C;
  177.  
  178. }
  179.  
  180. class Datum {
  181. int *_dan, *_mjesec, *_godina;
  182. public:
  183. Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
  184. _dan = new int(dan);
  185. _mjesec = new int(mjesec);
  186. _godina = new int(godina);
  187. }
  188.  
  189. Datum(const Datum&obj) {
  190. _dan = new int(*obj._dan);
  191. _mjesec = new int(*obj._mjesec);
  192. _godina = new int(*obj._godina);
  193. }
  194.  
  195. ~Datum() {
  196. delete _dan; _dan = nullptr;
  197. delete _mjesec; _mjesec = nullptr;
  198. delete _godina; _godina = nullptr;
  199. }
  200.  
  201. Datum & operator = (Datum & obj) {
  202.  
  203. *_dan = *obj._dan;
  204. *_mjesec = *obj._mjesec;
  205. *_godina = *obj._godina;
  206.  
  207. return *this;
  208.  
  209. }
  210.  
  211.  
  212. friend ostream& operator<< (ostream &COUT, const Datum &obj) {
  213. COUT << *obj._dan << " " << *obj._mjesec << " " << *obj._godina;
  214. return COUT;
  215. }
  216. };
  217. class Osoba {
  218. protected:
  219. char * _imePrezime;
  220. Datum * _datumRodjenja;
  221. string _brojTelefona;
  222. public:
  223. Osoba(char * imePrezime, Datum datum) {
  224. _imePrezime = new char[strlen(imePrezime) + 1];
  225. strcpy_s(_imePrezime, strlen(imePrezime) + 1, imePrezime);
  226. _datumRodjenja = new Datum(datum);
  227. _brojTelefona = "";
  228.  
  229. }
  230. Osoba(const Osoba & obj) :_brojTelefona(obj._brojTelefona) {
  231. _imePrezime = new char[strlen(obj._imePrezime) + 1];
  232. strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
  233. _datumRodjenja = new Datum(*obj._datumRodjenja);
  234. }
  235. virtual ~Osoba() { delete[]_imePrezime; delete _datumRodjenja; }
  236.  
  237. bool setBrojTelefona(string brojTelefona){
  238. if (ProvjeriValidnostBrojaTelefona(brojTelefona)){
  239. _brojTelefona = brojTelefona;
  240. return true;
  241. }
  242. return false;
  243. }
  244.  
  245. };
  246.  
  247. class Nastavnik :public Osoba {
  248. Kolekcija<Predmeti, Razredi> * _predmetiRazredi;
  249.  
  250. public:
  251.  
  252. Nastavnik(char * imeprezime, Datum dat): Osoba(imeprezime, dat) {
  253.  
  254. _predmetiRazredi = new Kolekcija < Predmeti, Razredi > ;
  255.  
  256. }
  257.  
  258. virtual ~Nastavnik() { delete _predmetiRazredi; _predmetiRazredi = nullptr; }
  259.  
  260. Nastavnik(Nastavnik & obj): Osoba(obj) {
  261.  
  262. _predmetiRazredi = new Kolekcija < Predmeti, Razredi >(*obj._predmetiRazredi);
  263.  
  264. }
  265.  
  266. bool AddPredmetRazred(Predmeti predmet, Razredi razred) {
  267.  
  268. _predmetiRazredi->AddElement(predmet, razred);
  269.  
  270. return true;
  271.  
  272. }
  273.  
  274. bool RemovePredmetRazred(Predmeti predmet) {
  275.  
  276. bool removanbaremjedan = 0;
  277.  
  278. for (int i = 0; i < _predmetiRazredi->GetTrenutno(); i++) {
  279.  
  280. if (_predmetiRazredi->GetElement1(i) == predmet) {
  281. _predmetiRazredi->RemoveElement(i);
  282. removanbaremjedan = true;
  283. }
  284.  
  285. }
  286.  
  287. return removanbaremjedan;
  288.  
  289. }
  290.  
  291. Nastavnik & operator = (Nastavnik & obj) {
  292.  
  293. _brojTelefona = obj._brojTelefona;
  294. _imePrezime = new char[strlen(obj._imePrezime) + 1];
  295. strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
  296. _datumRodjenja = new Datum(*obj._datumRodjenja);
  297.  
  298. delete _predmetiRazredi;
  299.  
  300. _predmetiRazredi = new Kolekcija<Predmeti, Razredi>(*obj._predmetiRazredi);
  301.  
  302. return *this;
  303.  
  304. }
  305.  
  306. bool operator == (Nastavnik & obj) {
  307.  
  308. if (strcmp(_imePrezime, obj._imePrezime) == 0)
  309. return true;
  310.  
  311. return false;
  312.  
  313. }
  314.  
  315. bool JelImaRazred(Razredi razred) {
  316.  
  317. for (int i = 0; i < _predmetiRazredi->GetTrenutno(); i++) {
  318.  
  319. if (_predmetiRazredi->GetElement2(i) == razred)
  320. return true;
  321.  
  322. }
  323.  
  324. return false;
  325.  
  326. }
  327.  
  328. bool JelImaPredmet(Predmeti predmet) {
  329.  
  330. for (int i = 0; i < _predmetiRazredi->GetTrenutno(); i++) {
  331.  
  332. if (_predmetiRazredi->GetElement1(i) == predmet)
  333. return true;
  334.  
  335. }
  336.  
  337. return false;
  338.  
  339. }
  340.  
  341. Kolekcija<Predmeti,Razredi> & getPredmetiRazredi() { return *_predmetiRazredi; }
  342.  
  343. friend ostream & operator << (ostream & C, Nastavnik & obj) {
  344.  
  345. C << "Ime prezime nastavnika: " << obj._imePrezime << endl;
  346. C << "Datum rodjenja: " << *obj._datumRodjenja << endl;
  347. C << "Broj telefona: " << obj._brojTelefona << endl;
  348.  
  349. C << "Predmeti koje predaje i razredi kojima predaje: " << endl;
  350.  
  351. C << *obj._predmetiRazredi << endl;
  352.  
  353. return C;
  354.  
  355. }
  356.  
  357. };
  358.  
  359. class Ucenik : public Osoba {
  360. int _brojUDnevniku;
  361. Razredi _razred;
  362. vector<Nastavnik *> _nastavnici;
  363. Kolekcija<Predmeti, int> _predmetiOcjene;
  364.  
  365. public:
  366.  
  367. Ucenik(char * imeprezime, Datum dat, int dnevnik, Razredi razred) : Osoba(imeprezime, dat), _razred(razred){
  368.  
  369. _brojUDnevniku = dnevnik;
  370.  
  371. }
  372.  
  373. //Ucenik(Ucenik & obj) : Osoba(obj) {}
  374.  
  375. Ucenik & operator = (Ucenik & obj) {
  376.  
  377. _brojTelefona = obj._brojTelefona;
  378. _imePrezime = new char[strlen(obj._imePrezime) + 1];
  379. strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
  380. _datumRodjenja = new Datum(*obj._datumRodjenja);
  381.  
  382. _brojUDnevniku = obj._brojUDnevniku;
  383. _razred = obj._razred;
  384.  
  385. _nastavnici = obj._nastavnici;
  386.  
  387. _predmetiOcjene = obj._predmetiOcjene;
  388.  
  389. return *this;
  390.  
  391. }
  392.  
  393. bool AddNastavnik(Nastavnik & obj) {
  394.  
  395. for (int i = 0; i < _nastavnici.size(); i++) {
  396.  
  397. if (*_nastavnici[i] == obj)
  398. return false;
  399.  
  400. }
  401.  
  402. if (obj.JelImaRazred(_razred)){ return false; }
  403.  
  404.  
  405.  
  406. _nastavnici.push_back(&obj);
  407.  
  408. return true;
  409.  
  410. }
  411.  
  412. bool AddPredmetOcjenu(Predmeti predmet, int ocjena) {
  413.  
  414. for (int i = 0; i < _nastavnici.size(); i++){
  415.  
  416. if (_nastavnici[i]->JelImaPredmet(predmet)) {
  417.  
  418. _predmetiOcjene.AddElement(predmet, ocjena);
  419.  
  420. return true;
  421.  
  422. }
  423.  
  424. }
  425.  
  426. return false;
  427.  
  428.  
  429. }
  430.  
  431. vector<Nastavnik *> & getNastavnici() { return _nastavnici; }
  432.  
  433. Kolekcija<Predmeti, int> & getPredmetiOcjene() { return _predmetiOcjene; }
  434.  
  435. float GetProsjekByNastavnik(char * imeprezime) {
  436.  
  437. float prosjek = 0;
  438. int brojocjena = 0;
  439. bool pronadjen = false;
  440.  
  441. Datum tempdat(10, 11, 12);
  442.  
  443. Nastavnik temp(imeprezime, tempdat);
  444.  
  445. for (int i = 0; i < _nastavnici.size(); i++) {
  446.  
  447. if (temp == *_nastavnici[i]) {
  448.  
  449. pronadjen = true;
  450.  
  451. temp = *_nastavnici[i];
  452.  
  453. }
  454.  
  455. }
  456.  
  457. if (!pronadjen)
  458. return prosjek;
  459.  
  460. for (int i = 0; i < _predmetiOcjene.GetTrenutno(); i++) {
  461.  
  462. for (int j = 0; j < temp.getPredmetiRazredi().GetTrenutno(); j++) {
  463.  
  464. if (_predmetiOcjene.GetElement1(i) == temp.getPredmetiRazredi().GetElement1(j)) {
  465. prosjek += _predmetiOcjene.GetElement2(i);
  466. brojocjena++;
  467. }
  468.  
  469. }
  470.  
  471. }
  472.  
  473. if (brojocjena == 0)
  474. return prosjek;
  475.  
  476. return prosjek / brojocjena;
  477.  
  478. }
  479.  
  480. friend ostream & operator << (ostream & C, Ucenik & obj) {
  481.  
  482. C << crt;
  483. C << "Ime prezime ucenika: " << obj._imePrezime << endl;
  484. C << "Datum rodjenja: " << *obj._datumRodjenja << endl;
  485. C << "Broj telefona: " << obj._brojTelefona << endl;
  486. C << "Broj u dnevniku: " << obj._brojUDnevniku << endl;
  487.  
  488. C << obj._razred << endl;
  489.  
  490. C << "\n***Nastavnici koji predaju uceniku: \n" << endl;
  491.  
  492. for (int i = 0; i < obj._nastavnici.size(); i++) {
  493.  
  494. C << *obj._nastavnici[i];
  495.  
  496. }
  497.  
  498. C << "***Predmeti koje ucenik slusa: " << endl;
  499.  
  500. for (int i = 0; i < obj._predmetiOcjene.GetTrenutno(); i++){
  501.  
  502. C << obj._predmetiOcjene.GetElement1(i) << endl;
  503.  
  504. }
  505.  
  506. return C;
  507.  
  508.  
  509. }
  510.  
  511. };
  512.  
  513.  
  514.  
  515. void main(){
  516.  
  517. /****************************************************************************
  518. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  519. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
  520. 3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA
  521. 4. PROGRAMSKI CODE SE TAKODJER NALAZI U FAJLU CODE_.TXT
  522. 5. NAZIV I LISTA PARAMETARA FUNKCIJA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U.
  523. 6. NIJE POTREBNO BACATI IZUZETKE. SVE FUNKCIJE VRACAJU TRUE ILI FALSE
  524. ****************************************************************************/
  525.  
  526. //TestiranjeDatuma
  527. Datum danas(26, 11, 2015);
  528. Datum sutra(danas);
  529. Datum prekosutra;
  530. prekosutra = danas;
  531. cout << danas << endl << sutra << endl << prekosutra << crt;
  532.  
  533. //TestiranjeKolekcije
  534. Kolekcija<int, int> kolekcija1;
  535. int brojElemenata = 15;
  536. for (size_t i = 0; i < brojElemenata; i++)
  537. kolekcija1.AddElement(i, i);
  538. kolekcija1.RemoveElement(0);//uklanja element na osnovu lokacije
  539. cout << kolekcija1.GetElement1(0) << " " << kolekcija1.GetElement2(0) << endl;
  540. cout << kolekcija1 << endl;
  541. Kolekcija<int, int> kolekcija2;
  542. kolekcija2 = kolekcija1;
  543. cout << kolekcija2 << crt;
  544. if (kolekcija1.GetTrenutno() == kolekcija2.GetTrenutno())
  545. cout << "ISTI BROJ ELEMENATA" << endl;
  546. Kolekcija<int, int> kolekcija3(kolekcija2);
  547. cout << kolekcija3 << crt;
  548.  
  549. //TestiranjeNastavnika
  550. Nastavnik jasmin("Jasmin Azemovic", Datum(15, 2, 1980));
  551. Nastavnik adel("Adel Handzic", Datum(15, 10, 1981));
  552. //NASTAVNIK MOZE PREDAVATI ISTI PREDMET, ALI TO MORA BITI U RAZLICITIM ODJELJENJIMA I NAJVISE U DVA RAZREDA (NA DVIJE RAZLICITE GODINE)
  553. if (jasmin.AddPredmetRazred(Matematika, I1))
  554. cout << "Predmeti dodan" << endl;
  555. if (jasmin.AddPredmetRazred(Historija, I1))
  556. cout << "Predmeti dodan" << endl;
  557.  
  558. if (jasmin.AddPredmetRazred(Geografia, I1))
  559. cout << "Predmeti dodan" << endl;
  560.  
  561. if (jasmin.AddPredmetRazred(Geografia, I2))
  562. cout << "Predmeti dodan" << endl;
  563.  
  564. if (adel.AddPredmetRazred(Historija, III1))
  565. cout << "Predmeti dodan" << endl;
  566.  
  567. if (adel.RemovePredmetRazred(Historija))
  568. cout << "Predmet uklonjen!" << endl;
  569.  
  570. Nastavnik goran(adel);
  571. if (goran == adel)
  572. cout << "Nastavnici identicni" << endl;
  573. goran = jasmin;
  574. if (goran == jasmin)
  575. cout << "Nastavnici identicni" << endl;
  576.  
  577. Kolekcija<Predmeti, Razredi> & predmetiRazredi = jasmin.getPredmetiRazredi();
  578.  
  579. if (!jasmin.setBrojTelefona("+38761111222"))
  580. cout << "Broj telefona nije dodan!" << endl;
  581. if (!jasmin.setBrojTelefona("+387-61-111-222"))
  582. cout << "Broj telefona nije dodan!" << endl;
  583. if (jasmin.setBrojTelefona("+387(61)-111-222"))
  584. cout << "Broj telefona uspjesno dodan!" << endl;
  585.  
  586.  
  587. //TestiranjeUcenika
  588. Ucenik denis("Denis Music", Datum(8, 10, 1990), 3, III1);
  589. Ucenik elmin("Elmin Sudic", Datum(15, 6, 1993), 1, I1);
  590. Ucenik adil("Adil Joldic", Datum(13, 8, 1992), 2, II1);
  591. //VODITI RACUNA DA SE DODAJU REFERENCE NA NASTAVNIKE KAKO BI SVI UCENICI DIJELILI ISTE INFORMACIJE O NASTAVNICIMA U SLUCAJU DA SE NASTAVNIKU DODA NEKI PREDMET
  592. //ZA USPJESNO DODAVANJE, NASTAVNIK MORA POSJEDOVATI (PREDAVATI) NAJMANJE JEDAN PREDMET U TOM RAZREDU
  593. if (denis.AddNastavnik(jasmin))
  594. cout << "Nastavnik uspjesno dodan" << endl;
  595. //ONEMOGUCITI DODAVANJE ISTIH NASTAVNIKA; POJAM ISTI PODRAZUMIJEVA IDENTICNE VRIJEDNOSTI SVIH ATRIBUTA
  596. if (denis.AddNastavnik(adel))
  597. cout << "Nastavnik uspjesno dodan" << endl;
  598. //DA BI SE DODALA OCJENA ZA ODREDJENI PREDMET UCENIK MORA POSJEDOVATI NASTAVNIKA KOJI PREDAJE TAJ PREDMET
  599. if (denis.AddPredmetOcjenu(Matematika, 3))
  600. cout << "Ocjena uspjesno dodana" << endl;
  601. if (denis.AddPredmetOcjenu(Historija, 4))
  602. cout << "Ocjena uspjesno dodana" << endl;
  603.  
  604. vector<Nastavnik*> & nastavnici = denis.getNastavnici();
  605. cout << "Ucenik Denis ima dodijeljena " << nastavnici.size() << " nastavnika" << endl;
  606.  
  607. Kolekcija<Predmeti, int> & uspjeh = denis.getPredmetiOcjene();
  608. cout << "Denis ima " << uspjeh.GetTrenutno() << " polozenih predmeta" << endl;
  609. cout << "Prosjecna ocjena kod nastavnika Jasmin Azemovic je " << denis.GetProsjekByNastavnik("Jasmin Azemovic") << endl;
  610.  
  611. Ucenik denis2(denis);
  612. cout << denis2 << endl;
  613.  
  614.  
  615. system("pause>0");
  616.  
  617. }
Advertisement
Add Comment
Please, Sign In to add comment