Advertisement
Kenoo

Izbori ( uradjen )

May 26th, 2018
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.10 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. using namespace std;
  4. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  5. #pragma warning(disable:4996)
  6.  
  7. enum Opstina { Opstina1, Opstina2, Opstina3, Opstina4 };
  8. const char * OpstineChar[] = { "Opstina1", "Opstina2", "Opstina3", "Opstina4" };
  9. enum Kandidati { Kandidat1, Kandidat2, Kandidat3, Kandidat4 };
  10. const char * KandidatiChar[] = { "Kandidat1", "Kandidat2", "Kandidat3", "Kandidat4" };
  11. const char* crt= { "-------------------------------------------------" };
  12. struct Datum
  13. {
  14. int _dan, _mjesec, _godina;
  15.  
  16. void Unos(int d, int m, int g)
  17. { _dan = d; _mjesec = m; _godina = g; }
  18.  
  19. void Ispis()
  20. { cout << _dan << "/" << _mjesec << "/" << _godina << endl; }
  21.  
  22. };
  23.  
  24. struct Osoba
  25. {
  26. Datum _datumRodjenja;
  27. char * _imePrezime;
  28. char _JMBG[14];
  29. Opstina _Prebivaliste;
  30.  
  31. void unos(Datum d, const char * ip, const char jmbg[], Opstina p)
  32. {
  33. _datumRodjenja = d;
  34. _imePrezime = new char[strlen(ip) + 1];
  35. strcpy_s(_imePrezime,strlen(ip)+1, ip);
  36. strcpy(_JMBG, jmbg);
  37. _Prebivaliste = p;
  38. }
  39.  
  40. void Dealociraj()
  41. { delete[] _imePrezime; _imePrezime = nullptr; }
  42.  
  43. void Info()
  44. {
  45. cout << "Datum rodjenja: ";
  46. _datumRodjenja.Ispis();
  47. cout <<"Ime i prezime: "<< _imePrezime << "\nJMBG: " << _JMBG << "\nNaziv opstine: " <<
  48. OpstineChar[_Prebivaliste] << endl;
  49. }
  50. };
  51.  
  52. struct Glas
  53. {
  54. Osoba * _glasac;
  55. Kandidati * _glasZa;
  56.  
  57. void Unos(Osoba o, Kandidati k)
  58. {
  59. _glasac = new Osoba;
  60. _glasac->unos(o._datumRodjenja, o._imePrezime, o._JMBG, o._Prebivaliste);
  61. _glasZa = new Kandidati(k);
  62. }
  63.  
  64. void Ispis()
  65. {
  66. _glasac->Info();
  67. cout <<"Glasao za: "<< KandidatiChar[*_glasZa] << endl;
  68. cout << crt << endl;
  69. }
  70.  
  71. void Dealociraj()
  72. {
  73. _glasac->Dealociraj();
  74. delete[]_glasZa;
  75. _glasZa = nullptr;
  76. }
  77. };
  78.  
  79. bool Mladjiod18(Datum Datumrodjenja, Datum DatumIzbora)
  80. {
  81. if (DatumIzbora._godina - Datumrodjenja._godina < 18)
  82. return true;
  83. else if (DatumIzbora._godina - Datumrodjenja._godina == 18)
  84. {
  85. if (DatumIzbora._mjesec < Datumrodjenja._mjesec)
  86. return true;
  87. else
  88. return false;
  89. }
  90. else
  91. return false;
  92. }
  93. struct BrojGlasova
  94. {
  95. Kandidati _kand;
  96. int brojGlasova=0;
  97.  
  98. void Unos(Kandidati k)
  99. {
  100. _kand = k;
  101.  
  102. }
  103. };
  104. struct Izbori2016
  105. {
  106. Opstina * _glasackoMjesto;
  107. Glas * _glasovi[1000];
  108. int _doSadaGlasalo;
  109.  
  110. void Dealociraj()
  111. {
  112. delete[]_glasackoMjesto; _glasackoMjesto = nullptr;
  113. for (int i = 0; i < _doSadaGlasalo; i++)
  114. _glasovi[i]->Dealociraj();
  115.  
  116.  
  117.  
  118. }
  119. void Unos(Opstina o)
  120. {
  121. _glasackoMjesto = new Opstina(o);
  122. _doSadaGlasalo = 0;
  123. }
  124.  
  125. bool DodajGlas(Glas g, Datum datumIzbora)
  126. {
  127. if (_doSadaGlasalo >= 1000)
  128. return false;
  129. for (int i = 0; i < _doSadaGlasalo; i++)
  130. {
  131. if (strcmp(_glasovi[i]->_glasac->_JMBG, g._glasac->_JMBG) == 0)
  132. return false;
  133.  
  134. }
  135. if (*_glasackoMjesto != g._glasac->_Prebivaliste)
  136. return false;
  137. else if (Mladjiod18(g._glasac->_datumRodjenja, datumIzbora))
  138. return false;
  139.  
  140. _glasovi[_doSadaGlasalo] = new Glas;
  141. _glasovi[_doSadaGlasalo]->Unos(*g._glasac, *g._glasZa);
  142. _doSadaGlasalo++;
  143. return true;
  144.  
  145. }
  146.  
  147. bool ManjiDatum(Datum d1, Datum d2)
  148. {
  149. if (d1._godina < d2._godina)
  150. return true;
  151. else if (d1._godina == d2._godina)
  152. {
  153. if (d1._mjesec < d2._mjesec)
  154. return true;
  155. else if (d1._mjesec == d2._mjesec)
  156. {
  157. if (d1._dan < d2._dan)
  158. return true;
  159. else
  160. return false;
  161. }
  162. }
  163. else
  164. return false;
  165. }
  166. int BrojGlasacaPoRodjenju(Datum Od, Datum Do)
  167. {
  168. Datum temp;
  169. if (ManjiDatum(Do, Od))
  170. {
  171. temp = Od;
  172. Od = Do;
  173. Do = temp;
  174. }
  175. int brojac = 0;
  176. for (int i = 0; i < _doSadaGlasalo; i++)
  177. {
  178. if (ManjiDatum(Od, _glasovi[i]->_glasac->_datumRodjenja) && ManjiDatum(_glasovi[i]->_glasac->_datumRodjenja, Do))
  179. brojac++;
  180. }
  181.  
  182. return brojac;
  183. }
  184.  
  185. void Ispis()
  186. {
  187. //brojanje glasova
  188. BrojGlasova niz[4];
  189. niz[0].Unos(Kandidat1);
  190. niz[1].Unos(Kandidat2);
  191. niz[2].Unos(Kandidat3);
  192. niz[3].Unos(Kandidat4);
  193. for (int i = 0; i < _doSadaGlasalo; i++)
  194. {
  195. if (*_glasovi[i]->_glasZa == Kandidat1)
  196. niz[0].brojGlasova++;
  197. else if (*_glasovi[i]->_glasZa == Kandidat2)
  198. niz[1].brojGlasova++;
  199. else if (*_glasovi[i]->_glasZa == Kandidat3)
  200. niz[2].brojGlasova++;
  201. else if (*_glasovi[i]->_glasZa == Kandidat4)
  202. niz[3].brojGlasova++;
  203. }
  204.  
  205. //sortiranje
  206. bool promjena = true;
  207. BrojGlasova temp;
  208. while (promjena)
  209. {
  210. promjena = false;
  211. for (int i = 0; i < _doSadaGlasalo; i++)
  212. {
  213. if (niz[i + 1].brojGlasova > niz[i].brojGlasova)
  214. {
  215. temp = niz[i];
  216. niz[i] = niz[i + 1];
  217. niz[i + 1] = temp;
  218. promjena = true;
  219. }
  220. }
  221. }
  222.  
  223. //ispis
  224. cout << "Glasacko mjesto: " << OpstineChar[*_glasackoMjesto] << endl;
  225. for (int i = 0; i < _doSadaGlasalo; i++)
  226. {
  227.  
  228. cout << KandidatiChar[niz[i]._kand] << " -> broj glasova: " << niz[i].brojGlasova << " ( " << (niz[i].brojGlasova * 100)/(float)_doSadaGlasalo << " % )" << endl;
  229. }
  230. }
  231. /*
  232. 1. Unos - na osnovu vrijednosti primljenih parametara, inicijalizovati vrijednosti atributa strukture.
  233. 2. DodajGlas - funkcija treba da omoguci dodavanje informacija o novom glasu i tom prilikom onemoguciti: da ista osoba glasa vise puta,
  234. glasanje osobama mladjim od 18 godina (uzeti u obzir samo mjesec i godinu rodjenja), glasanje osobama iz drugih opstina.
  235. U zavisnosti od uspjesnosti operacije funkcija vraca true ili false
  236. 3. Ispis - u zavisnosti od postignutog uspjeha funkcija treba ispisati listu kandidata sortiranu opadajucim redoslijedom,
  237. a uz svakog kandidata je potrebno ispisati i osvojeni procenat glasova.
  238. Funkcija vraca opstinu u kojoj je pobjednicki kandidat ostvario najveci broj glasova, a ukoliko je pobjednicki kandidat ostvario podjednak
  239. broj glasova u vise opstina, funkcija vraca prvu koja se nalazi u nizu na koji pokazuje pokazivac izbornaMjesta
  240. 4. BrojGlasacaPoRodjenju - funkcija vraca broj glasaca koji su do tog momenta glasali, a koji su rodjeni u parametrima definisanom periodu
  241. (parametri su tipa datum, period OD i DO)
  242. */
  243. };
  244. /*
  245. 1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl.
  246. Naziv fajla treba biti identican nazivu opstine u kojoj se odrzavaju izbori */
  247. void UpisiUBinarniFajl(Izbori2016 &izbori)
  248. {
  249.  
  250. char *nazivFajla = new char[strlen(OpstineChar[*izbori._glasackoMjesto]) + 1];
  251. strcpy_s(nazivFajla, strlen(OpstineChar[*izbori._glasackoMjesto]) + 1, (OpstineChar[*izbori._glasackoMjesto]));
  252. ofstream fajlUpis;
  253. fajlUpis.open(nazivFajla, ios::binary);
  254. fajlUpis.write((char*)(&izbori), sizeof(izbori));
  255. fajlUpis.close();
  256.  
  257. }
  258.  
  259. /*2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla
  260. (naziv fajla je takodjer proslijedjen kao parametar)
  261. */
  262.  
  263. void UcitajIzBinarnogFajla(Izbori2016 &izbori, const char*naziv)
  264. {
  265. ifstream fajlIspis;
  266. fajlIspis.open(naziv, ios::binary);
  267. fajlIspis.read((char*)(&izbori), sizeof(izbori));
  268. fajlIspis.close();
  269. }
  270. /*
  271. 3. PretragaRekurzivno - rekurzivna funkcija koja treba da vrati broj glasova koje je na izborima ostvario odredjeni kandidat (kandidat se proslijedjuje kao parametar)
  272. */
  273. int PretragaRekurzivno(Izbori2016 izbori, Kandidati kandidat, int i=0, int brojacGlasova=0)
  274. {
  275. if (i == izbori._doSadaGlasalo)
  276. return brojacGlasova;
  277. else if (*izbori._glasovi[i]->_glasZa == kandidat)
  278. {
  279. brojacGlasova += 1;
  280. }
  281. PretragaRekurzivno(izbori, kandidat,i+1,brojacGlasova);
  282. }
  283.  
  284. void main() {
  285. /*
  286. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NECE BODOVATI
  287. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  288. 3. 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
  289. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  290. 5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI CETE KOPIRATI VAŠA RJEŠENJA)
  291. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  292. */
  293.  
  294. Datum datumGlasac1, datumGlasac2, datumGlasac3, datumGlasac4, datumIzbora;
  295. datumIzbora.Unos(14, 7, 2016);
  296. datumGlasac1.Unos(18, 5, 1990);
  297. datumGlasac2.Unos(5, 3, 1982);
  298. datumGlasac3.Unos(12, 8, 1958);
  299. datumGlasac4.Unos(22, 6, 2000);
  300.  
  301. Osoba a, b, c, d, e;
  302. a.unos(datumGlasac1, "Denis Music", "1111111111111", Opstina1);
  303. b.unos(datumGlasac2, "Jasmin Azemovic", "1111111111112", Opstina1);
  304. c.unos(datumGlasac3, "Indira Hamulic", "1111111111113", Opstina1);
  305. d.unos(datumGlasac4, "Adel Handzic", "1111111111114", Opstina2);
  306. e.unos(datumGlasac4, "Zanin Vejzovic", "1111111111115", Opstina1);
  307.  
  308.  
  309. Glas g1, g2, g3, g4, g5;
  310. g1.Unos(a, Kandidat1);
  311. g2.Unos(b, Kandidat1);
  312. g3.Unos(c, Kandidat2);
  313. g4.Unos(d, Kandidat1);
  314. g5.Unos(e, Kandidat2);
  315.  
  316. Izbori2016 izbori, izbori_FromFile;
  317. izbori.Unos(Opstina1);
  318.  
  319. izbori.DodajGlas(g1, datumIzbora);
  320. izbori.DodajGlas(g2, datumIzbora);
  321. izbori.DodajGlas(g3, datumIzbora);
  322. izbori.DodajGlas(g4, datumIzbora);
  323. izbori.DodajGlas(g5, datumIzbora);
  324. izbori.Ispis();
  325.  
  326.  
  327. Datum OD, DO;
  328. OD.Unos(17, 7, 1998);
  329. DO.Unos(17, 7, 1986);
  330. cout << "Glasaca u starost od 18 - 30 godina->" << izbori.BrojGlasacaPoRodjenju(OD, DO) << endl;
  331. // nije dobro formulisano ovo glasaca u starosti od.. jer se ovo trazi u funckiji
  332. //BrojGlasacaPoRodjenju - funkcija vraca broj glasaca koji su do tog momenta glasali, a koji su rodjeni u parametrima definisanom periodu
  333. //(parametri su tipa datum, period OD i DO)
  334. cout << "Broj glasova za Kandidat1->" << PretragaRekurzivno(izbori,Kandidat1) << endl;
  335. cout << crt << endl;
  336.  
  337. UpisiUBinarniFajl(izbori);
  338. UcitajIzBinarnogFajla(izbori_FromFile, "Opstina1");
  339.  
  340. cout << "ISPIS IZ FAJLA" << endl;
  341. cout << crt << endl;
  342. izbori_FromFile.Ispis();
  343.  
  344.  
  345. izbori.Dealociraj();
  346. a.Dealociraj();
  347. b.Dealociraj();
  348. c.Dealociraj();
  349. d.Dealociraj();
  350. e.Dealociraj();
  351. g1.Dealociraj();
  352. g2.Dealociraj();
  353. g3.Dealociraj();
  354. g4.Dealociraj();
  355. g5.Dealociraj();
  356.  
  357. system("pause");
  358. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement