Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.76 KB | None | 0 0
  1. // Aktivnost_Student.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. //
  3.  
  4. #include "pch.h"
  5. #include<iostream>
  6. #include<exception>
  7. #include<string>
  8. #include<vector>
  9. #include<memory>
  10.  
  11. using namespace std;
  12.  
  13. /****************************************************************************
  14. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  15. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
  16. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URAÐENOG ZADATKA
  17. 4. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTICNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUCAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOCNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
  18. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNACENO.
  19. ****************************************************************************/
  20.  
  21. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  22. const char* not_set = "NOT_SET";
  23.  
  24. enum Sortiranje { ASC, DESC };
  25. const char*SortArray[] = { "ASC","DESC" };
  26. enum Predmet { MATEMATIKA, FIZIKA, HEMIJA, GEOGRAFIJA, NOT_SET };
  27. const char*PredmetArray[] = { "MATEMATIKA", "FIZIKA", "HEMIJA", "GEOGRAFIJA", "NOT_SET" };
  28. enum Razred { I = 1, II, III, IV };
  29.  
  30. char * AlocirajNizKaraktera(const char * sadrzaj) {
  31. if (sadrzaj == nullptr)
  32. return nullptr;
  33. int vel = strlen(sadrzaj) + 1;
  34. char * temp = new char[vel];
  35. strcpy_s(temp, vel, sadrzaj);
  36. return temp;
  37. }
  38.  
  39. template <class T1, class T2, int max>
  40. class Kolekcija {
  41. T1 * _elementi1[max] = { nullptr };
  42. T2 * _elementi2[max] = { nullptr };
  43. int _trenutnoElemenata;
  44. bool _dozvoliDupliranje;
  45. Sortiranje _sortiranje;
  46. public:
  47. Kolekcija(Sortiranje sortiranje = ASC, bool dozvoliDupliranje = true)
  48. {
  49. _trenutnoElemenata = 0;
  50. _sortiranje = sortiranje;
  51. _dozvoliDupliranje = dozvoliDupliranje;
  52. }
  53.  
  54. Kolekcija(const Kolekcija&original) :_dozvoliDupliranje(original._dozvoliDupliranje), _sortiranje(original._sortiranje)
  55. {
  56. for (int i = 0; i < original._trenutnoElemenata; i++)
  57. {
  58. _elementi1[i] = new T1(*original._elementi1[i]);
  59. _elementi2[i] = new T2(*original._elementi2[i]);
  60. }
  61. _trenutnoElemenata = original._trenutnoElemenata;
  62. }
  63.  
  64. ~Kolekcija()
  65. {
  66. for (int i = 0; i < _trenutnoElemenata; i++) {
  67. delete _elementi1[i]; _elementi1[i] = nullptr;
  68. delete _elementi2[i]; _elementi2[i] = nullptr;
  69. }
  70. }
  71.  
  72. bool AddElement(const T1&element1, const T2&element2)
  73. {
  74. if (_trenutnoElemenata == max)
  75. {
  76. throw exception(nedozvoljena_operacija);
  77. }
  78.  
  79. if (_dozvoliDupliranje == false)
  80. {
  81. for (int i = 0; i < _trenutnoElemenata; i++)
  82. {
  83. if ((*_elementi1[i] == element1) && (*_elementi2[i] == element2))
  84. {
  85. throw exception(nedozvoljena_operacija);
  86. }
  87. }
  88. }
  89.  
  90. _elementi1[_trenutnoElemenata] = new T1(element1);//konstruktor kopije
  91. _elementi2[_trenutnoElemenata] = new T2(element2);
  92. _trenutnoElemenata++;
  93. return true;
  94. }
  95.  
  96. int GetTrenutno() const { return _trenutnoElemenata; }
  97. int GetMax() const { return max; }
  98.  
  99. T1& GetElement1(int lokacija) const {
  100. if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  101. throw exception(nedozvoljena_operacija);
  102. return *_elementi1[lokacija];
  103. }
  104. T2& GetElement2(int lokacija) const {
  105. if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  106. throw exception(nedozvoljena_operacija);
  107. return *_elementi2[lokacija];
  108. }
  109. void SetElement2(int lokacija, T2 ele2) {
  110. _elementi2[lokacija] = ele2;
  111. }
  112. friend ostream &operator<<(ostream &COUT, const Kolekcija &obj) {
  113. for (int i = 0; i < obj.GetTrenutno(); i++)
  114. COUT << obj.GetElement1(i) << " " << obj.GetElement2(i) << endl;
  115. return COUT;
  116. }
  117. };
  118.  
  119. class Aktivnost {
  120. shared_ptr<Razred> _razred;
  121. string _opis;
  122. int _ocjena;//1-5
  123. public:
  124. Aktivnost(Razred razred = I, int ocjena = 0, string opis = not_set) {
  125. _ocjena = ocjena;
  126. _opis = opis;
  127. _razred = make_shared<Razred>(razred);
  128. }
  129. Aktivnost(const Aktivnost&original)
  130. {
  131. _razred = make_shared<Razred>(*original._razred);
  132. _opis = original._opis;
  133. _ocjena = original._ocjena;
  134. }
  135. int GetOcjenu() const { return _ocjena; }
  136. string GetOpis() const { return _opis; }
  137. Razred GetRazred() const { return *_razred; }
  138.  
  139. friend bool operator==(const Aktivnost&postojeca, const Aktivnost&nova)
  140. {
  141. if ((postojeca._razred == nova._razred) && (postojeca._opis == nova._opis))
  142. {
  143. return true;
  144. }
  145. return false;
  146. }
  147. friend ostream &operator<<(ostream &COUT, const Aktivnost &obj) {
  148. COUT << *obj._razred << " " << obj._ocjena << " " << obj._opis << endl;
  149. return COUT;
  150. }
  151. };
  152.  
  153. class Polaznik {
  154. protected:
  155. char * _imePrezime;
  156. string _brojTelefona;
  157. public:
  158. Polaznik(string imePrezime, string brojTelefona) : _imePrezime(AlocirajNizKaraktera(imePrezime.c_str())) {
  159. _brojTelefona = brojTelefona;
  160. }
  161. ~Polaznik() { delete[] _imePrezime; _imePrezime = nullptr; }
  162. char * GetImePrezime() { return _imePrezime; }
  163. string GetTelefon() { return _brojTelefona; }
  164. virtual void PredstaviSe() = 0;
  165. };
  166.  
  167. class Ucenik : protected Polaznik {
  168. Kolekcija<Predmet, Aktivnost, 16> * _aktivnosti;
  169. public:
  170.  
  171. Ucenik(string imePrezime, string brojTelefona) :Polaznik(imePrezime, brojTelefona) {}
  172.  
  173. Ucenik(const Ucenik&original)
  174. :_aktivnosti(original._aktivnosti),
  175. Polaznik(original._imePrezime, original._brojTelefona)
  176. {}
  177.  
  178. ~Ucenik() { delete[] _aktivnosti; _aktivnosti = nullptr; }
  179. Kolekcija<Predmet, Aktivnost, 16> & GetAktivnosti() { return *_aktivnosti; }
  180.  
  181. void PredstaviSe()
  182. {
  183. cout << Ucenik::_imePrezime << "(" << Ucenik::_brojTelefona << endl;
  184. }
  185.  
  186. friend ostream& operator<<(ostream& COUT, Ucenik & n)
  187. {
  188. n.PredstaviSe();
  189. for (int i = 0; i < n._aktivnosti->GetTrenutno(); i++)
  190. {
  191. COUT << n._aktivnosti->GetElement1(i) << endl;
  192. COUT << n._aktivnosti->GetElement2(i) << endl;
  193. }
  194. return COUT;
  195. }
  196.  
  197. bool IstaAktivnost(const Predmet&noviPredmet, const Aktivnost&nova)
  198. {
  199. if (_aktivnosti->GetTrenutno() > 0)
  200. {
  201. for (int i = 0; i < _aktivnosti->GetTrenutno(); i++)
  202. {
  203. if (_aktivnosti->GetElement1(i) == noviPredmet)
  204. {
  205. if (_aktivnosti->GetElement2(i).GetRazred() == nova.GetRazred())
  206. {
  207. return true;
  208. }
  209. }
  210. }
  211. }
  212.  
  213. return false;
  214. }
  215.  
  216. friend bool operator==(const Ucenik &ucenik, string imePrezimeiliBrojTelefona)
  217. {
  218. if ((ucenik._brojTelefona == imePrezimeiliBrojTelefona) || strcmp(imePrezimeiliBrojTelefona.c_str(), ucenik._imePrezime) == 0)
  219. {
  220. return true;
  221. }
  222. return false;
  223. }
  224. };
  225.  
  226. class Skola {
  227. char* _naziv;
  228. vector<Ucenik> _ucenici;
  229. public:
  230. Skola(const char * naziv = nullptr) {
  231. _naziv = AlocirajNizKaraktera(naziv);
  232. }
  233. ~Skola() {
  234. if (_naziv != nullptr)
  235. {
  236. delete[] _naziv; _naziv = nullptr;
  237. }
  238. }
  239.  
  240. char* GetNaziv()const { return _naziv; }
  241. vector<Ucenik> & GetUcenici() { return _ucenici; };
  242.  
  243. //"Jasmin Azemovic", "+387(61)111-222"
  244. void operator()(string imePrezime, string brojTelefona)
  245. {
  246. for (int i = 0; i < _ucenici.size(); i++)
  247. {
  248. if ((_ucenici[i] == imePrezime) || (_ucenici[i] == brojTelefona))
  249. {
  250. throw exception(nedozvoljena_operacija);
  251. }
  252. }
  253. Ucenik*noviUcenik = new Ucenik(imePrezime, brojTelefona);
  254. _ucenici.push_back(*noviUcenik);
  255. }
  256.  
  257. bool DodajAktivnost(string imePrezime, Predmet predmet, const Aktivnost&aktivnost)
  258. {
  259. for (int i = 0; i < _ucenici.size(); i++)
  260. {
  261. if (_ucenici[i].IstaAktivnost(predmet, aktivnost))
  262. {
  263. return false;
  264. }
  265. _ucenici[i].GetAktivnosti().AddElement(predmet, aktivnost);
  266. return true;
  267. }
  268. }
  269.  
  270. friend ostream& operator<<(ostream& COUT, Skola& obj) {
  271. if (obj._naziv != nullptr)
  272. {
  273. COUT << "Skola: " << obj._naziv << endl;
  274. }
  275. COUT << "Ucenici: " << endl;
  276. for (size_t i = 0; i < obj._ucenici.size(); i++)
  277. COUT << obj._ucenici[i] << endl;
  278. return COUT;
  279. }
  280. };
  281.  
  282. int main() {
  283. Kolekcija<int, int, 10> kolekcija1(DESC, false);
  284. try {
  285. kolekcija1.AddElement(1, 2);
  286. //dupliranje elemenata nije dozvoljeno
  287. kolekcija1.AddElement(1, 2);
  288. }
  289. catch (exception & ex) {
  290. cout << ex.what();
  291. }
  292.  
  293. /*nakon svakog dodavanja, elemente sortirati prema T1 i vrijednosti atributa _sortiranje*/
  294. for (size_t i = 1; i < kolekcija1.GetMax() - 1; i++)
  295. kolekcija1.AddElement(rand(), rand());
  296.  
  297. cout << kolekcija1 << endl;
  298.  
  299. try {
  300. //prekoracen maksimalan broj elemenata
  301. kolekcija1.AddElement(rand(), rand());
  302. }
  303. catch (exception & ex) {
  304. cout << ex.what();
  305. }
  306. cout << kolekcija1 << endl;
  307.  
  308. Kolekcija<int, int, 10> kolekcija2(kolekcija1);
  309. cout << kolekcija2 << endl;
  310.  
  311. Skola gimnazijaMostar("GIMNAZIJA MOSTAR");
  312. //dodaje novog ucenika u skolu
  313. gimnazijaMostar("Jasmin Azemovic", "+387(61)111-222"); //operator()
  314. gimnazijaMostar("Adel Handzic", "+387(61)333-444");
  315. cout << "Broj elemenata " << gimnazijaMostar.GetUcenici().size() << endl;
  316.  
  317. // /*
  318. // koristeci regex, osigurati sljedeci format za broj telefona: +387(6X)XXX-XXX ili +387 6X XXX-XXX
  319. // onemoguciti pojavljivanje samo jedne zagrade, a ukoliko format nije adekvatna koristiti vrijednost not_set
  320. // */
  321. // gimnazijaMostar("Telefon NotValidFormat", "387 61)333-444");
  322. //
  323. try
  324. {
  325. /*onemoguciti dodavanje ucenika sa istim imenom i prezimenom ili brojem telefona*/
  326. gimnazijaMostar("Adel Handzic", "+387(61)333-444");
  327. }
  328. catch (exception & ex)
  329. {
  330. cout << ex.what() << endl;
  331. }
  332.  
  333. //Aktivnost a1(I, 4, "Priprema za takmicenje iz Matematije koje se odrzava u Konjicu 07.02.2019");
  334.  
  335. if (gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", MATEMATIKA, Aktivnost(I, 4, "Priprema za takmicenje iz Matematije koje se odrzava u Konjicu 07.02.2019")))
  336. cout << "Aktivnost uspjesno dodana" << endl;
  337. /*
  338. na nivou svakog razreda se mogu evidentirati maksimalno 4 aktivnosti, a takodjer, na nivou razreda se ne smiju ponavljati
  339. aktivnosti iz istog predmeta
  340. */
  341. //if (!gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", MATEMATIKA, Aktivnost(I, 4, "Aktivnosti iz matematike")))
  342. // cout << "Aktivnost nije uspjesno dodana" << endl;
  343. //if (gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", HEMIJA, Aktivnost(I, 5, "Priprema otopina za vjezbe iz predmeta Hemija")))
  344. // cout << "Aktivnost uspjesno dodana" << endl;
  345. //if (gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", FIZIKA, Aktivnost(I, 4, "Analiza stepena apsorpcije materijala ")))
  346. // cout << "Aktivnost uspjesno dodana" << endl;
  347. ///*
  348. //u slucaju da je ucenik uspjesno (ocjenom vecom od 1) realizovao aktivnosti na nivou odredjenog razreda, te posjeduje validan
  349. //broj telefona, u okviru zasebnog thread-a se salje SMS sa sadrzajem "Uspjesno ste okoncali aktivnosti u okviru X razreda sa
  350. //prosjecnom ocjenom X.X"
  351. //*/
  352. //
  353. //if (gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", GEOGRAFIJA, Aktivnost(I, 4, "Izrada 5 reljefa Mostara")))
  354. // cout << "Aktivnost uspjesno dodana" << endl;
  355. //if (gimnazijaMostar.DodajAktivnost("Adel Handzic", MATEMATIKA, Aktivnost(I, 5, "Izrada skripte na temu integralni racun")))
  356. // cout << "Aktivnost uspjesno dodana" << endl;
  357.  
  358. // //ispisuje sve ucenike i njihove aktivnosti
  359. // cout << gimnazijaMostar << endl;
  360. //
  361. //
  362. // pair<Polaznik *, float> par = gimnazijaMostar.GetNajboljegUcenika();
  363. // cout << "Najbolji ucenik je " << par.first->GetImePrezime() << " sa prosjekom " << par.second << endl;
  364. //
  365. // /*U fajl (npr. Gimnazija.txt) upisati podatke (podatke upisati kao obicni tekst) o skoli i svim ucenicima.
  366. // Nakon upisa, potrebno je ispisati sadrzaj fajla. Parametar tipa bool oznacava da li ce ranije dodani sadrzaj fajla prethodno biti pobrisan*/
  367. //
  368. // if (gimnazijaMostar.SpasiUFajl("Gimnazija.txt"))
  369. // cout << "Podaci o ucenicima uspjesno pohranjeni u fajl" << endl;
  370. // if (gimnazijaMostar.SpasiUFajl("Gimnazija.txt", true))
  371. // cout << "Podaci o ucenicima uspjesno pohranjeni u fajl" << endl;
  372. //
  373. // cin.get();
  374. // system("pause>0");
  375. return 0;
  376. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement