Advertisement
EnsarMeskovic

[PRII] Izbori2016 - DodajPretragaBinarneOperacije

Sep 18th, 2016
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.56 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. 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 << " ]"; }
  16.     bool Punoljetan() {
  17.         int brGodina = 2016 - _godina;
  18.         if (7 > _mjesec)
  19.             brGodina++;
  20.         else if (7 == _mjesec)
  21.             if (14 >= _dan)
  22.                 brGodina++;
  23.         return brGodina >= 18;
  24.     }
  25.     int SumaDana() {
  26.         int suma = 0, brDana[]{ 31,28,31,30,31,30,31,31,30,31,30,31 };
  27.         for (int i = 1900; i < _godina; i++) {
  28.             if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
  29.                 suma += 366;
  30.             else suma += 365;
  31.         }
  32.         for (int i = 1; i < _mjesec; i++) {
  33.             if (((_godina % 4 == 0 && _godina % 100 != 0) || _godina % 400 == 0) && i == 2)
  34.                 suma += 29;
  35.             else suma += brDana[i - 1];
  36.         }
  37.         suma += _dan;
  38.         return suma;
  39.     }
  40. };
  41. struct Osoba {
  42.     Datum _datumRodjenja;
  43.     char * _imePrezime;
  44.     char _JMBG[14];
  45.     Opstina _Prebivaliste;
  46.     void unos(Datum d, char * ip, char jmbg[], Opstina p) {
  47.         _datumRodjenja.Unos(d._dan, d._mjesec, d._godina);
  48.         _imePrezime = new char[strlen(ip) + 1];
  49.         strcpy_s(_imePrezime,strlen(ip)+1, ip);
  50.         strcpy_s(_JMBG, strlen(jmbg)+1, jmbg);
  51.         _Prebivaliste = p;
  52.     }
  53.     void Dealociraj() { delete[] _imePrezime; _imePrezime = nullptr; }
  54.     void Info() {
  55.         _datumRodjenja.Ispis();
  56.         cout << _imePrezime << " " << _JMBG << " " <<
  57.             OpstineChar[_Prebivaliste] << " - > ";
  58.     }
  59. };
  60. struct Glas {
  61.     Osoba * _glasac;
  62.     Kandidati * _glasZa;
  63.     void Unos(Osoba o, Kandidati k){
  64.         _glasac = new Osoba;
  65.         _glasac->unos(o._datumRodjenja, o._imePrezime, o._JMBG, o._Prebivaliste);
  66.         _glasZa = new Kandidati(k);
  67.     }
  68.     void Ispis() {
  69.         _glasac->Info();
  70.         cout << KandidatiChar[*_glasZa] << endl;
  71.     }
  72.     void Dealociraj() { _glasac->Dealociraj(); delete _glasac; _glasac = nullptr; delete _glasZa; _glasZa = nullptr; }
  73. };
  74. bool UPerioduOdDo(Datum OD, Datum trenutno, Datum DO) {
  75.     return (trenutno.SumaDana() >= OD.SumaDana() && trenutno.SumaDana() <= DO.SumaDana()) || (trenutno.SumaDana() <= OD.SumaDana() && trenutno.SumaDana() >= DO.SumaDana());
  76. }
  77. struct Izbori2016 {
  78.     Opstina * _glasackoMjesto;
  79.     Glas * _glasovi[1000];
  80.     int _doSadaGlasalo;
  81.     //1. Unos - na osnovu vrijednosti primljenih parametara, inicijalizovati vrijednosti atributa strukture.
  82.     void Unos(Opstina mjesto) {
  83.         _glasackoMjesto = new Opstina(mjesto);
  84.         for (int i = 0; i < 1000; i++)
  85.             _glasovi[i] = nullptr;
  86.         _doSadaGlasalo = 0;
  87.     }
  88.     //2. DodajGlas - funkcija treba da omoguci dodavanje informacija o novom glasu i tom prilikom onemoguciti: da ista osoba glasa vise puta, glasanje osobama mladjim od 18 godina (uzeti u obzir samo mjesec i godinu rodjenja), glasanje osobama iz drugih opstina. U zavisnosti od uspjesnosti operacije funkcija vraca true ili false
  89.     bool DodajGlas(Glas g) {
  90.         if (!g._glasac->_datumRodjenja.Punoljetan() || g._glasac->_Prebivaliste != *_glasackoMjesto || _doSadaGlasalo >= 1000)
  91.             return false;
  92.         for (int i = 0; i < _doSadaGlasalo; i++) {
  93.             if (strcmp(_glasovi[i]->_glasac->_JMBG, g._glasac->_JMBG) == 0)
  94.                 return false;
  95.         }
  96.         _glasovi[_doSadaGlasalo] = new Glas;
  97.         _glasovi[_doSadaGlasalo]->Unos(*g._glasac, *g._glasZa);
  98.         _doSadaGlasalo++;
  99.         return true;
  100.     }
  101.     /*3. Ispis - u zavisnosti od postignutog uspjeha funkcija treba ispisati listu kandidata sortiranu opadajucim redoslijedom, a uz svakog kandidata je potrebno ispisati i osvojeni procenat glasova.
  102.     Funkcija vraca opstinu u kojoj je pobjednicki kandidat ostvario najveci broj glasova, a ukoliko je pobjednicki kandidat ostvario podjednak broj glasova u vise opstina, funkcija vraca prvu koja se nalazi u nizu na koji pokazuje pokazivac izbornaMjesta*/
  103.     void Ispis() {
  104.         int UkupnoGlasova[4]{ 0 }, Kandidat[4]{ 0,1,2,3 };
  105.         for (int i = 0; i < _doSadaGlasalo; i++) {
  106.             UkupnoGlasova[*_glasovi[i]->_glasZa]++;
  107.         }
  108.         // Bubble sort / Exchange sort
  109.         int zamjena, max = 4;
  110.         do {
  111.             zamjena = 1;
  112.             for (int i = 0; i < max; i++)
  113.                 if (UkupnoGlasova[i] < UkupnoGlasova[i+1]){
  114.                     swap(UkupnoGlasova[i],UkupnoGlasova[i+1]);
  115.                     swap(Kandidat[i], Kandidat[i+1]);
  116.                     zamjena = 0;
  117.                 }
  118.             max--;
  119.         } while (max > 1 && zamjena == 0);
  120.         cout << "Rezultati za " << OpstineChar[*_glasackoMjesto] << " : \n\n";
  121.         float procenatGlasova = 0;
  122.         for (int i = 0; i < 4; i++) {
  123.             procenatGlasova = (UkupnoGlasova[i]/ (float)_doSadaGlasalo) * (float)100;
  124.             cout << KandidatiChar[Kandidat[i]] << " | " << UkupnoGlasova[i] << " | " << procenatGlasova << " %" << endl;
  125.         }
  126.         if(UkupnoGlasova[0] > UkupnoGlasova[1])
  127.            cout << "\nPobjenicki kandidat : " << KandidatiChar[Kandidat[0]] << "\n\n";
  128.         else cout << "\nPostoji vise kandidata sa jednakim brojem glasova!\n\n";
  129.     }
  130.     //4. BrojGlasacaPoRodjenju - funkcija vraca broj glasaca koji su do tog momenta glasali, a koji su rodjeni u parametrima definisanom periodu (parametri su tipa datum, period OD i DO)
  131.     int BrojGlasacaPoRodjenju(Datum OD, Datum DO) {
  132.         int brojac = 0;
  133.         for (int i = 0; i < _doSadaGlasalo; i++)
  134.             if (UPerioduOdDo(OD, _glasovi[i]->_glasac->_datumRodjenja, DO))
  135.                 brojac++;
  136.         return brojac;
  137.     }
  138.     void Dealociraj() {
  139.         delete _glasackoMjesto; _glasackoMjesto = nullptr;
  140.         for (int i = 0; i < _doSadaGlasalo; i++) {
  141.             _glasovi[i]->Dealociraj();
  142.             delete _glasovi[i]; _glasovi[i] = nullptr;
  143.         }
  144.     }
  145. };
  146.  
  147. //1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl. Naziv fajla treba biti identican nazivu opstine u kojoj se odrzavaju izbori
  148. void UpisiUBinarniFajl(Izbori2016 izbori) {
  149.     char temp[20];
  150.     strcpy_s(temp, strlen(OpstineChar[*izbori._glasackoMjesto])+1, OpstineChar[*izbori._glasackoMjesto]);
  151.     strncat_s(temp, sizeof(temp), ".txt", sizeof(".txt"));
  152.     ofstream upis(temp, ios::binary);
  153.     if (upis.fail())
  154.         cout << "Greska pri otvaranju fajla!" << endl;
  155.     else {
  156.         upis.write(reinterpret_cast<char*>(&izbori), sizeof(izbori));
  157.         upis.close();
  158.     }
  159. }
  160. //2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla (naziv fajla je takodjer proslijedjen kao parametar)
  161. void UcitajIzBinarnogFajla(Izbori2016 &izbori, char *naziv) {
  162.     char temp[20];
  163.     strcpy_s(temp, strlen(naziv)+1, naziv);
  164.     strncat_s(temp, sizeof(temp), ".txt", sizeof(".txt"));
  165.     ifstream ispis(temp, ios::binary);
  166.     if (ispis.fail())
  167.         cout << "Greska pri otvaranju fajla!" << endl;
  168.     else {
  169.         ispis.read(reinterpret_cast<char*>(&izbori), sizeof(izbori));
  170.         ispis.close();
  171.     }
  172. }
  173. //3. PretragaRekurzivno - rekurzivna funkcija koja treba da vrati broj glasova koje je na izborima ostvario odredjeni kandidat (kandidat se proslijedjuje kao parametar)
  174. int PretragaRekurzivno(Izbori2016 izbori, int doSadaGlasalo, Kandidati k, int brojGlasova) {
  175.     if (doSadaGlasalo < 0)
  176.         return brojGlasova;
  177.     else {
  178.         if (*izbori._glasovi[doSadaGlasalo]->_glasZa == k)
  179.             brojGlasova += 1;
  180.         return PretragaRekurzivno(izbori, doSadaGlasalo-1, k, brojGlasova);
  181.     }
  182. }
  183.  
  184. void main() {
  185.     /*
  186.     1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  187.     2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  188.     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
  189.     4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  190.     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)
  191.     6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  192.     */
  193.  
  194.     Datum datumGlasac1, datumGlasac2, datumGlasac3, datumGlasac4, datumIzbora;
  195.     datumIzbora.Unos(14, 7, 2016);
  196.     datumGlasac1.Unos(18, 5, 1990);
  197.     datumGlasac2.Unos(5, 3, 1982);
  198.     datumGlasac3.Unos(12, 8, 1958);
  199.     datumGlasac4.Unos(22, 6, 2000);
  200.  
  201.     Osoba a, b, c, d, e;
  202.     a.unos(datumGlasac1, "Denis Music", "1111111111111", Opstina1);
  203.     b.unos(datumGlasac2, "Jasmin Azemovic", "1111111111112", Opstina1);
  204.     c.unos(datumGlasac3, "Indira Hamulic", "1111111111113", Opstina1);
  205.     d.unos(datumGlasac2, "Adel Handzic", "1111111111114", Opstina2);
  206.     e.unos(datumGlasac4, "Zanin Vejzovic", "1111111111115", Opstina1);
  207.  
  208.  
  209.     Glas g1, g2, g3, g4, g5;
  210.     g1.Unos(a, Kandidat1);
  211.     g2.Unos(b, Kandidat1);
  212.     g3.Unos(c, Kandidat3);
  213.     g4.Unos(d, Kandidat1);
  214.     g5.Unos(e, Kandidat2);
  215.  
  216.     Izbori2016 izbori, izbori_FromFile;
  217.     izbori.Unos(Opstina1);
  218.  
  219.     izbori.DodajGlas(g1);
  220.     izbori.DodajGlas(g2);
  221.     izbori.DodajGlas(g3);
  222.     izbori.DodajGlas(g4);
  223.     izbori.DodajGlas(g5);
  224.     izbori.Ispis();
  225.  
  226.     Datum OD, DO;
  227.     OD.Unos(17, 7, 1998);
  228.     DO.Unos(17, 7, 1986);
  229.     cout<<"\nGlasaca u starost od 18 - 30 godina -> "<<izbori.BrojGlasacaPoRodjenju(OD, DO)<<endl;
  230.     cout<<"Broj glasova za Kandidat1 -> "<<PretragaRekurzivno(izbori,izbori._doSadaGlasalo-1, Kandidat1, 0) << endl << endl;
  231.     UpisiUBinarniFajl(izbori);
  232.     UcitajIzBinarnogFajla(izbori_FromFile, "Opstina1");
  233.     cout << "\nNakon Binarnog Ucitavanja | izbori_FromFile : \n\n";
  234.     izbori_FromFile.Ispis();
  235.     //dealokacija
  236.     a.Dealociraj(); b.Dealociraj(); c.Dealociraj(); d.Dealociraj(); e.Dealociraj();
  237.     g1.Dealociraj(); g2.Dealociraj(); g3.Dealociraj(); g4.Dealociraj(); g5.Dealociraj();
  238.     izbori.Dealociraj();
  239.     getchar();
  240. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement