limun11

Opština

Jan 24th, 2017
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.80 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=1, Kandidat2, Kandidat3, Kandidat4 };
  10. char * KandidatiChar[] = { "Kandidat1", "Kandidat2", "Kandidat3", "Kandidat4" };
  11.  
  12. struct Datum {
  13.     int _dan, _mjesec, _godina;
  14.     void Unos(int d, int m, int g) { _dan = d; _mjesec = m; _godina = g; }
  15.     void Ispis() { cout << _dan << "/" << _mjesec << "/" << _godina << endl; }
  16.  
  17.     bool daLiJe18(Datum datum)
  18.     {
  19.         if ((_godina - datum._godina) < 18)
  20.             return false;
  21.         else if ((_godina - datum._godina) == 18 && _mjesec > datum._mjesec)
  22.             return false;
  23.         return true;
  24.     }
  25.     bool Provjera(Datum datum)
  26.     {
  27.         if (_godina > datum._godina)
  28.             return false;
  29.         else if (_godina == datum._godina && _mjesec > datum._mjesec)
  30.             return false;
  31.         else if (_mjesec == datum._mjesec && _dan > datum._dan)
  32.             return false;
  33.  
  34.         return true;
  35.     }
  36. };
  37. struct Osoba {
  38.     Datum _datumRodjenja;
  39.     char * _imePrezime;
  40.     char _JMBG[14];
  41.     Opstina _Prebivaliste;
  42.     void unos(Datum d, char * ip, char jmbg[], Opstina p) {
  43.         _datumRodjenja = d;
  44.         _imePrezime = new char[strlen(ip) + 1];
  45.         strcpy(_imePrezime, ip);
  46.         strcpy(_JMBG, jmbg);
  47.         _Prebivaliste = p;
  48.     }
  49.     void Dealociraj() { delete[] _imePrezime; _imePrezime = nullptr; }
  50.     void Info() {
  51.         _datumRodjenja.Ispis();
  52.         cout << _imePrezime << " " << _JMBG << " " <<
  53.             OpstineChar[_Prebivaliste] << endl;
  54.     }
  55.  
  56. };
  57. struct Glas {
  58.     Osoba * _glasac;
  59.     Kandidati * _glasZa;
  60.     int brojacGlasovaPoKandidatu;
  61.    
  62.     void Unos(Osoba o, Kandidati k) {
  63.         _glasac = new Osoba;
  64.         _glasac->unos(o._datumRodjenja, o._imePrezime, o._JMBG, o._Prebivaliste);
  65.         _glasZa = new Kandidati(k);
  66.         brojacGlasovaPoKandidatu++;
  67.        
  68.     }
  69.     void Ispis() {
  70.         _glasac->Info();
  71.         cout << KandidatiChar[*_glasZa] << endl;
  72.     }
  73.  
  74.     void Dealociraj() { _glasac->Dealociraj(); }
  75. };
  76.  
  77. float NadjiMaxClanNiza(float niz[])
  78. {
  79.     int max=niz[0];
  80.     for (int k = 0; k < 4; k++)
  81.     {
  82.         if (max<niz[k]) max = niz[k];
  83.     }
  84.     return max;
  85. }
  86.  
  87. struct Izbori2016 {
  88.     Opstina * _glasackoMjesto;
  89.     Glas * _glasovi[1000];
  90.     int _doSadaGlasalo;
  91.     Datum *_datumIzbora;
  92.     Kandidati * _glasZa;
  93.     int brGlasova1 = 0, brGlasova2 = 0, brGlasova3 = 0, brGlasova4 = 0;
  94.     int brGlasovaOpstina1 = 0, brGlasovaOpstina2 = 0, brGlasovaOpstina3 = 0, brGlasovaOpstina4 = 0;
  95.     int Op1Kand1 = 0, Op1Kand2 = 0, Op1Kand3 = 0, Op1Kand4 = 0;
  96.     int Op2Kand1 = 0, Op2Kand2 = 0, Op2Kand3 = 0, Op2Kand4 = 0;
  97.     int Op3Kand1 = 0, Op3Kand2 = 0, Op3Kand3 = 0, Op3Kand4 = 0;
  98.     int Op4Kand1 = 0, Op4Kand2 = 0, Op4Kand3 = 0, Op4Kand4 = 0;
  99.  
  100.     //1. Unos - na osnovu vrijednosti primljenih parametara, inicijalizovati vrijednosti atributa strukture.
  101.     void Unos(Opstina opstina)
  102.     {
  103.         _glasackoMjesto = new Opstina(opstina);
  104.         _datumIzbora = new Datum;
  105.         _datumIzbora->Unos(_datumIzbora->_dan, _datumIzbora->_mjesec, _datumIzbora->_godina);
  106.         _doSadaGlasalo = 0;
  107.         switch (*_glasackoMjesto)
  108.         {
  109.         case 0:
  110.             {
  111.                 brGlasovaOpstina1++;
  112.                 switch (*_glasZa)
  113.                 {
  114.                 case Kandidat1:
  115.                     {
  116.                         Op1Kand1++;
  117.                         break;
  118.                     }
  119.                 case Kandidat2:
  120.                 {
  121.                     Op1Kand2++;
  122.                     break;
  123.                 }
  124.                 case Kandidat3:
  125.                 {
  126.                     Op1Kand3++;
  127.                     break;
  128.                 }
  129.                 case Kandidat4:
  130.                 {
  131.                     Op1Kand4++;
  132.                     break;
  133.                 }
  134.                 }
  135.                 break;
  136.             }
  137.         case 1:
  138.         {
  139.             brGlasovaOpstina2++;
  140.             switch (*_glasZa)
  141.             {
  142.             case Kandidat1:
  143.             {
  144.                 Op2Kand1++;
  145.                 break;
  146.             }
  147.             case Kandidat2:
  148.             {
  149.                 Op2Kand2++;
  150.                 break;
  151.             }
  152.             case Kandidat3:
  153.             {
  154.                 Op2Kand3++;
  155.                 break;
  156.             }
  157.             case Kandidat4:
  158.             {
  159.                 Op2Kand4++;
  160.                 break;
  161.             }
  162.             }
  163.             break;
  164.         }
  165.         case 2:
  166.         {
  167.             brGlasovaOpstina3++;
  168.             switch (*_glasZa)
  169.             {
  170.             case Kandidat1:
  171.             {
  172.                 Op3Kand1++;
  173.                 break;
  174.             }
  175.             case Kandidat2:
  176.             {
  177.                 Op3Kand2++;
  178.                 break;
  179.             }
  180.             case Kandidat3:
  181.             {
  182.                 Op3Kand3++;
  183.                 break;
  184.             }
  185.             case Kandidat4:
  186.             {
  187.                 Op3Kand4++;
  188.                 break;
  189.             }
  190.             }
  191.             break;
  192.         }
  193.         case 3:
  194.         {
  195.             brGlasovaOpstina4++;
  196.             switch (*_glasZa)
  197.             {
  198.             case Kandidat1:
  199.             {
  200.                 Op4Kand1++;
  201.                 break;
  202.             }
  203.             case Kandidat2:
  204.             {
  205.                 Op4Kand2++;
  206.                 break;
  207.             }
  208.             case Kandidat3:
  209.             {
  210.                 Op4Kand3++;
  211.                 break;
  212.             }
  213.             case Kandidat4:
  214.             {
  215.                 Op4Kand4++;
  216.                 break;
  217.             }
  218.             }
  219.             break;
  220.         }
  221.         }
  222.        
  223.     }
  224.    
  225.     //2. DodajGlas - funkcija treba da omoguci dodavanje informacija o novom glasu i tom prilikom onemoguciti:
  226.     //da ista osoba glasa vise puta, glasanje osobama mladjim od 18 godina (uzeti u obzir samo mjesec i godinu rodjenja),
  227.     //glasanje osobama iz drugih opstina. U zavisnosti od uspjesnosti operacije funkcija vraca true ili false --bool
  228.     bool DodajGlas(Glas glas)
  229.     {
  230.         if (_datumIzbora->daLiJe18(glas._glasac->_datumRodjenja))
  231.         {
  232.             if (_doSadaGlasalo > 0)
  233.             {
  234.                 for (int i = 0; i < _doSadaGlasalo; i++)
  235.                 {
  236.                     if (strcmp(_glasovi[i]->_glasac->_imePrezime, glas._glasac->_imePrezime) == 0)
  237.                         return false;
  238.                     if (*_glasackoMjesto != glas._glasac->_Prebivaliste)
  239.                         return false;
  240.                 }
  241.             }
  242.         }
  243.        
  244.         _glasovi[_doSadaGlasalo] = new Glas;
  245.         _glasovi[_doSadaGlasalo]->Unos(*glas._glasac, *glas._glasZa);
  246.         (_doSadaGlasalo++);
  247.         switch (*glas._glasZa)
  248.         {
  249.             case Kandidat1:
  250.             {
  251.                 brGlasova1++;
  252.                 break;
  253.             }
  254.             case Kandidat2:
  255.             {
  256.                 brGlasova2++;
  257.                 break;
  258.             }
  259.             case Kandidat3:
  260.             {
  261.                 brGlasova3++;
  262.                 break;
  263.             }
  264.             case Kandidat4:
  265.             {
  266.                 brGlasova4++;
  267.                 break;
  268.             }
  269.         }
  270.         return true;
  271.     }
  272.  
  273.     int Opstina1[4] = { Op1Kand1, Op1Kand2, Op1Kand3, Op1Kand4 };
  274.     int Opstina2[4] = { Op2Kand1, Op2Kand2, Op2Kand3, Op2Kand4 };
  275.     int Opstina3[4] = { Op3Kand1, Op3Kand2, Op3Kand3, Op3Kand4 };
  276.     int Opstina4[4] = { Op4Kand1, Op4Kand2, Op4Kand3, Op4Kand4 };
  277.  
  278.    
  279.     //3. Ispis - u zavisnosti od postignutog uspjeha funkcija treba ispisati listu kandidata
  280.     //sortiranu opadajucim redoslijedom, a uz svakog kandidata je potrebno ispisati i osvojeni procenat glasova.
  281.  
  282.     //Funkcija vraca opstinu u kojoj je pobjednicki kandidat ostvario najveci broj glasova, a ukoliko je
  283.     //pobjednicki kandidat
  284.     //ostvario podjednak broj glasova u vise opstina, funkcija vraca prvu koja se nalazi u nizu na koji
  285.     //pokazuje pokazivac izbornaMjesta
  286.  
  287.     void Ispis()
  288.     {
  289.         //sortiranu opadajucim redoslijedom,
  290.         float glasovi1, glasovi2, glasovi3, glasovi4;
  291.  
  292.         glasovi1 = ((float)brGlasova1 / (float)_doSadaGlasalo) * 100;
  293.         glasovi2 = ((float)brGlasova2 / (float)_doSadaGlasalo) * 100;
  294.         glasovi3 = ((float)brGlasova3 / (float)_doSadaGlasalo) * 100;
  295.         glasovi4 = ((float)brGlasova4 / (float)_doSadaGlasalo) * 100;
  296.  
  297.         float nizGlasovaPoKnadidatu[4] = { glasovi1, glasovi2, glasovi3, glasovi4 };
  298.         Kandidati _KandidatiPom[] = {Kandidat1, Kandidat2, Kandidat3, Kandidat4};
  299.  
  300.         int temp, pass, i, j;
  301.         Kandidati temp2;
  302.         // Sortiranje glasova
  303.         for (pass = 0; pass < 4 ; pass++)
  304.         {
  305.             for (j = 0; j < 4 - pass; j++)
  306.             {
  307.                 if (nizGlasovaPoKnadidatu[j] < nizGlasovaPoKnadidatu[j+1])
  308.                 {
  309.                     temp = nizGlasovaPoKnadidatu[j];
  310.                     temp2 = _KandidatiPom[j];
  311.                     nizGlasovaPoKnadidatu[j] = nizGlasovaPoKnadidatu[j+1];
  312.                     _KandidatiPom[j] = _KandidatiPom[j + 1];
  313.                     nizGlasovaPoKnadidatu[j+1] = temp;
  314.                     _KandidatiPom[j + 1] = temp2;
  315.                 }
  316.             }
  317.  
  318.         }
  319.  
  320.         cout << "-----------------------" << endl;
  321.                
  322.         for (int i = 0; i < 4; i++)    
  323.         {          
  324.             cout <<"Kandidat " << _KandidatiPom[i]<<" ";
  325.                 cout << nizGlasovaPoKnadidatu[i] <<"%" <<endl;
  326.         }
  327.         /*int Opstina1[4] = { Op1Kand1, Op1Kand2, Op1Kand3, Op1Kand4 };
  328.         int Opstina2[4] = { Op2Kand1, Op2Kand2, Op2Kand3, Op2Kand4 };
  329.         int Opstina3[4] = { Op3Kand1, Op3Kand2, Op3Kand3, Op3Kand4 };
  330.         int Opstina4[4] = { Op4Kand1, Op4Kand2, Op4Kand3, Op4Kand4 };*/
  331.  
  332.  
  333.         if (NadjiMaxClanNiza(nizGlasovaPoKnadidatu))
  334.         {
  335.             for (int i = 0; i < 4; i++)
  336.             {
  337.                 //Uporediti u svakoj opstini datog kandidata i ispisati najveći - tražiš maximum između opština
  338.                 // nece biti od i, nego ce biti od kandidata kojeg vrati funkcija maxClanNiza
  339.             }
  340.         }
  341.  
  342.                            
  343.     }
  344.  
  345.     void Dealociraj()
  346.     {
  347.         for (int i = 0; i < _doSadaGlasalo; i++)
  348.             _glasovi[i]->Dealociraj();
  349.         for (int i = 0; i < _doSadaGlasalo; i++)
  350.         {
  351.             delete _glasovi[i]; _glasovi[i] = nullptr;
  352.         }
  353.         delete _glasackoMjesto; _glasackoMjesto = nullptr;
  354.         delete _datumIzbora; _datumIzbora = nullptr;
  355.     }
  356.    
  357.     //4. BrojGlasacaPoRodjenju - funkcija vraca broj glasaca koji su do tog momenta glasali,
  358.     //a koji su rodjeni u parametrima definisanom periodu (parametri su tipa datum, period OD i DO)
  359.  
  360.         bool BrojGlasacaPoRodjenju(Datum OD, Datum DO)
  361.         {
  362.             int vrati = 0;
  363.             for (int i = 0; i < _doSadaGlasalo; i++)
  364.             {
  365.                 if (DO.Provjera(_glasovi[i]->_glasac->_datumRodjenja))
  366.                     vrati++;
  367.             }
  368.             return vrati;
  369.         }
  370.    
  371. };
  372.  
  373. //1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl.
  374. //Naziv fajla treba biti identican nazivu opstine u kojoj se odrzavaju izbori
  375. void UpisiUBinarniFajl(Izbori2016 izbori)
  376. {
  377.     ofstream upis("Opstina1", ios::out, ios::binary);
  378.     if (upis.is_open())
  379.         upis.write((char*)(&izbori), sizeof(izbori));
  380.     else
  381.         cout << "Greska" << endl;
  382. }
  383. //2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla
  384. //(naziv fajla je takodjer proslijedjen kao parametar)
  385. void UcitajIzBinarnogFajla(Izbori2016 &izbori, char * NazivFajla)
  386. {
  387.     ifstream ispis(NazivFajla, ios::in, ios::binary);
  388.     if (ispis.is_open())
  389.         ispis.read((char*)(&izbori), sizeof(izbori));
  390.     else
  391.         cout << "Grska" << endl;
  392. }
  393. //3. PretragaRekurzivno - rekurzivna funkcija koja treba da vrati broj glasova koje je na izborima ostvario odredjeni kandidat (kandidat se proslijedjuje kao parametar)
  394.  
  395.  
  396. void main() {
  397.     /*
  398.     1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  399.     2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  400.     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
  401.     4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  402.     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)
  403.     6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  404.     */
  405.  
  406.     Datum datumGlasac1, datumGlasac2, datumGlasac3, datumGlasac4, datumIzbora;
  407.     datumIzbora.Unos(14, 7, 2016);
  408.     datumGlasac1.Unos(18, 5, 1990);
  409.     datumGlasac2.Unos(5, 3, 1982);
  410.     datumGlasac3.Unos(12, 8, 1958);
  411.     datumGlasac4.Unos(22, 6, 2000);
  412.  
  413.     Osoba a, b, c, d, e;
  414.     a.unos(datumGlasac1, "Denis Music", "1111111111111", Opstina1);
  415.     b.unos(datumGlasac2, "Jasmin Azemovic", "1111111111112", Opstina1);
  416.     c.unos(datumGlasac3, "Indira Hamulic", "1111111111113", Opstina1);
  417.     d.unos(datumGlasac4, "Adel Handzic", "1111111111114", Opstina2);
  418.     e.unos(datumGlasac4, "Zanin Vejzovic", "1111111111115", Opstina1);
  419.  
  420.  
  421.     Glas g1, g2, g3, g4, g5;
  422.     g1.Unos(a, Kandidat1);
  423.     g2.Unos(b, Kandidat1);
  424.     g3.Unos(c, Kandidat2);
  425.     g4.Unos(d, Kandidat1);
  426.     g5.Unos(e, Kandidat2);
  427.  
  428.     Izbori2016 izbori, izbori_FromFile;
  429.     izbori.Unos(Opstina1);
  430.  
  431.     izbori.DodajGlas(g1);
  432.     izbori.DodajGlas(g2);
  433.     izbori.DodajGlas(g3);
  434.     izbori.DodajGlas(g4);
  435.     izbori.DodajGlas(g5);
  436.     izbori.Ispis();
  437.  
  438.     Datum OD, DO;
  439.     OD.Unos(17, 7, 1998);
  440.     DO.Unos(17, 7, 1986);
  441.     cout << "Glasaca u starost od 18 - 30 godina->" << izbori.BrojGlasacaPoRodjenju(OD, DO) << endl;
  442.     //cout << "Broj glasova za Kandidat1->" << PretragaRekurzivno(/*potrebni parametri*/) << endl;
  443.     UpisiUBinarniFajl(izbori);
  444.     UcitajIzBinarnogFajla(izbori_FromFile, "Opstina1");
  445.     //izbori_FromFile.Ispis();
  446.     izbori.Dealociraj();
  447.  
  448.     system("PAUSE");
  449. }
Add Comment
Please, Sign In to add comment