Advertisement
limun11

Izbori - konacna

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