Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
- #pragma warning(disable:4996)
- enum Opstina { Opstina1, Opstina2, Opstina3, Opstina4 };
- char * OpstineChar[] = { "Opstina1", "Opstina2", "Opstina3", "Opstina4" };
- enum Kandidati { Kandidat1=1, Kandidat2, Kandidat3, Kandidat4 };
- char * KandidatiChar[] = { "Kandidat1", "Kandidat2", "Kandidat3", "Kandidat4" };
- struct Datum {
- int _dan, _mjesec, _godina;
- void Unos(int d, int m, int g) { _dan = d; _mjesec = m; _godina = g; }
- void Ispis() { cout << _dan << "/" << _mjesec << "/" << _godina << endl; }
- bool daLiJe18(Datum datum)
- {
- if ((_godina - datum._godina) < 18)
- return false;
- else if ((_godina - datum._godina) == 18 && _mjesec > datum._mjesec)
- return false;
- return true;
- }
- bool Provjera(Datum datum)
- {
- if (_godina > datum._godina)
- return false;
- else if (_godina == datum._godina && _mjesec > datum._mjesec)
- return false;
- else if (_mjesec == datum._mjesec && _dan > datum._dan)
- return false;
- return true;
- }
- };
- struct Osoba {
- Datum _datumRodjenja;
- char * _imePrezime;
- char _JMBG[14];
- Opstina _Prebivaliste;
- void unos(Datum d, char * ip, char jmbg[], Opstina p) {
- _datumRodjenja = d;
- _imePrezime = new char[strlen(ip) + 1];
- strcpy(_imePrezime, ip);
- strcpy(_JMBG, jmbg);
- _Prebivaliste = p;
- }
- void Dealociraj() { delete[] _imePrezime; _imePrezime = nullptr; }
- void Info() {
- _datumRodjenja.Ispis();
- cout << _imePrezime << " " << _JMBG << " " <<
- OpstineChar[_Prebivaliste] << endl;
- }
- };
- struct Glas {
- Osoba * _glasac;
- Kandidati * _glasZa;
- int brojacGlasovaPoKandidatu;
- void Unos(Osoba o, Kandidati k) {
- _glasac = new Osoba;
- _glasac->unos(o._datumRodjenja, o._imePrezime, o._JMBG, o._Prebivaliste);
- _glasZa = new Kandidati(k);
- brojacGlasovaPoKandidatu++;
- }
- void Ispis() {
- _glasac->Info();
- cout << KandidatiChar[*_glasZa] << endl;
- }
- void Dealociraj() { _glasac->Dealociraj(); }
- };
- float NadjiMaxClanNiza(float niz[])
- {
- int max=niz[0];
- for (int k = 0; k < 4; k++)
- {
- if (max<niz[k]) max = niz[k];
- }
- return max;
- }
- struct Izbori2016 {
- Opstina * _glasackoMjesto;
- Glas * _glasovi[1000];
- int _doSadaGlasalo;
- Datum *_datumIzbora;
- Kandidati * _glasZa;
- int brGlasova1 = 0, brGlasova2 = 0, brGlasova3 = 0, brGlasova4 = 0;
- int brGlasovaOpstina1 = 0, brGlasovaOpstina2 = 0, brGlasovaOpstina3 = 0, brGlasovaOpstina4 = 0;
- int Op1Kand1 = 0, Op1Kand2 = 0, Op1Kand3 = 0, Op1Kand4 = 0;
- int Op2Kand1 = 0, Op2Kand2 = 0, Op2Kand3 = 0, Op2Kand4 = 0;
- int Op3Kand1 = 0, Op3Kand2 = 0, Op3Kand3 = 0, Op3Kand4 = 0;
- int Op4Kand1 = 0, Op4Kand2 = 0, Op4Kand3 = 0, Op4Kand4 = 0;
- //1. Unos - na osnovu vrijednosti primljenih parametara, inicijalizovati vrijednosti atributa strukture.
- void Unos(Opstina opstina)
- {
- _glasackoMjesto = new Opstina(opstina);
- _datumIzbora = new Datum;
- _datumIzbora->Unos(_datumIzbora->_dan, _datumIzbora->_mjesec, _datumIzbora->_godina);
- _doSadaGlasalo = 0;
- switch (*_glasackoMjesto)
- {
- case 0:
- {
- brGlasovaOpstina1++;
- switch (*_glasZa)
- {
- case Kandidat1:
- {
- Op1Kand1++;
- break;
- }
- case Kandidat2:
- {
- Op1Kand2++;
- break;
- }
- case Kandidat3:
- {
- Op1Kand3++;
- break;
- }
- case Kandidat4:
- {
- Op1Kand4++;
- break;
- }
- }
- break;
- }
- case 1:
- {
- brGlasovaOpstina2++;
- switch (*_glasZa)
- {
- case Kandidat1:
- {
- Op2Kand1++;
- break;
- }
- case Kandidat2:
- {
- Op2Kand2++;
- break;
- }
- case Kandidat3:
- {
- Op2Kand3++;
- break;
- }
- case Kandidat4:
- {
- Op2Kand4++;
- break;
- }
- }
- break;
- }
- case 2:
- {
- brGlasovaOpstina3++;
- switch (*_glasZa)
- {
- case Kandidat1:
- {
- Op3Kand1++;
- break;
- }
- case Kandidat2:
- {
- Op3Kand2++;
- break;
- }
- case Kandidat3:
- {
- Op3Kand3++;
- break;
- }
- case Kandidat4:
- {
- Op3Kand4++;
- break;
- }
- }
- break;
- }
- case 3:
- {
- brGlasovaOpstina4++;
- switch (*_glasZa)
- {
- case Kandidat1:
- {
- Op4Kand1++;
- break;
- }
- case Kandidat2:
- {
- Op4Kand2++;
- break;
- }
- case Kandidat3:
- {
- Op4Kand3++;
- break;
- }
- case Kandidat4:
- {
- Op4Kand4++;
- break;
- }
- }
- break;
- }
- }
- }
- //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 --bool
- bool DodajGlas(Glas glas)
- {
- if (_datumIzbora->daLiJe18(glas._glasac->_datumRodjenja))
- {
- if (_doSadaGlasalo > 0)
- {
- for (int i = 0; i < _doSadaGlasalo; i++)
- {
- if (strcmp(_glasovi[i]->_glasac->_imePrezime, glas._glasac->_imePrezime) == 0)
- return false;
- if (*_glasackoMjesto != glas._glasac->_Prebivaliste)
- return false;
- }
- }
- }
- _glasovi[_doSadaGlasalo] = new Glas;
- _glasovi[_doSadaGlasalo]->Unos(*glas._glasac, *glas._glasZa);
- (_doSadaGlasalo++);
- switch (*glas._glasZa)
- {
- case Kandidat1:
- {
- brGlasova1++;
- break;
- }
- case Kandidat2:
- {
- brGlasova2++;
- break;
- }
- case Kandidat3:
- {
- brGlasova3++;
- break;
- }
- case Kandidat4:
- {
- brGlasova4++;
- break;
- }
- }
- return true;
- }
- int Opstina1[4] = { Op1Kand1, Op1Kand2, Op1Kand3, Op1Kand4 };
- int Opstina2[4] = { Op2Kand1, Op2Kand2, Op2Kand3, Op2Kand4 };
- int Opstina3[4] = { Op3Kand1, Op3Kand2, Op3Kand3, Op3Kand4 };
- int Opstina4[4] = { Op4Kand1, Op4Kand2, Op4Kand3, Op4Kand4 };
- //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.
- //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
- void Ispis()
- {
- //sortiranu opadajucim redoslijedom,
- float glasovi1, glasovi2, glasovi3, glasovi4;
- glasovi1 = ((float)brGlasova1 / (float)_doSadaGlasalo) * 100;
- glasovi2 = ((float)brGlasova2 / (float)_doSadaGlasalo) * 100;
- glasovi3 = ((float)brGlasova3 / (float)_doSadaGlasalo) * 100;
- glasovi4 = ((float)brGlasova4 / (float)_doSadaGlasalo) * 100;
- float nizGlasovaPoKnadidatu[4] = { glasovi1, glasovi2, glasovi3, glasovi4 };
- Kandidati _KandidatiPom[] = {Kandidat1, Kandidat2, Kandidat3, Kandidat4};
- int temp, pass, i, j;
- Kandidati temp2;
- // Sortiranje glasova
- for (pass = 0; pass < 4 ; pass++)
- {
- for (j = 0; j < 4 - pass; j++)
- {
- if (nizGlasovaPoKnadidatu[j] < nizGlasovaPoKnadidatu[j+1])
- {
- temp = nizGlasovaPoKnadidatu[j];
- temp2 = _KandidatiPom[j];
- nizGlasovaPoKnadidatu[j] = nizGlasovaPoKnadidatu[j+1];
- _KandidatiPom[j] = _KandidatiPom[j + 1];
- nizGlasovaPoKnadidatu[j+1] = temp;
- _KandidatiPom[j + 1] = temp2;
- }
- }
- }
- cout << "-----------------------" << endl;
- for (int i = 0; i < 4; i++)
- {
- cout <<"Kandidat " << _KandidatiPom[i]<<" ";
- cout << nizGlasovaPoKnadidatu[i] <<"%" <<endl;
- }
- /*int Opstina1[4] = { Op1Kand1, Op1Kand2, Op1Kand3, Op1Kand4 };
- int Opstina2[4] = { Op2Kand1, Op2Kand2, Op2Kand3, Op2Kand4 };
- int Opstina3[4] = { Op3Kand1, Op3Kand2, Op3Kand3, Op3Kand4 };
- int Opstina4[4] = { Op4Kand1, Op4Kand2, Op4Kand3, Op4Kand4 };*/
- if (NadjiMaxClanNiza(nizGlasovaPoKnadidatu))
- {
- for (int i = 0; i < 4; i++)
- {
- //Uporediti u svakoj opstini datog kandidata i ispisati najveći - tražiš maximum između opština
- // nece biti od i, nego ce biti od kandidata kojeg vrati funkcija maxClanNiza
- }
- }
- }
- void Dealociraj()
- {
- for (int i = 0; i < _doSadaGlasalo; i++)
- _glasovi[i]->Dealociraj();
- for (int i = 0; i < _doSadaGlasalo; i++)
- {
- delete _glasovi[i]; _glasovi[i] = nullptr;
- }
- delete _glasackoMjesto; _glasackoMjesto = nullptr;
- delete _datumIzbora; _datumIzbora = nullptr;
- }
- //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)
- bool BrojGlasacaPoRodjenju(Datum OD, Datum DO)
- {
- int vrati = 0;
- for (int i = 0; i < _doSadaGlasalo; i++)
- {
- if (DO.Provjera(_glasovi[i]->_glasac->_datumRodjenja))
- vrati++;
- }
- return vrati;
- }
- };
- //1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl.
- //Naziv fajla treba biti identican nazivu opstine u kojoj se odrzavaju izbori
- void UpisiUBinarniFajl(Izbori2016 izbori)
- {
- ofstream upis("Opstina1", ios::out, ios::binary);
- if (upis.is_open())
- upis.write((char*)(&izbori), sizeof(izbori));
- else
- cout << "Greska" << endl;
- }
- //2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla
- //(naziv fajla je takodjer proslijedjen kao parametar)
- void UcitajIzBinarnogFajla(Izbori2016 &izbori, char * NazivFajla)
- {
- ifstream ispis(NazivFajla, ios::in, ios::binary);
- if (ispis.is_open())
- ispis.read((char*)(&izbori), sizeof(izbori));
- else
- cout << "Grska" << endl;
- }
- //3. PretragaRekurzivno - rekurzivna funkcija koja treba da vrati broj glasova koje je na izborima ostvario odredjeni kandidat (kandidat se proslijedjuje kao parametar)
- void main() {
- /*
- 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
- 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
- 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
- 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
- 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)
- 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
- */
- Datum datumGlasac1, datumGlasac2, datumGlasac3, datumGlasac4, datumIzbora;
- datumIzbora.Unos(14, 7, 2016);
- datumGlasac1.Unos(18, 5, 1990);
- datumGlasac2.Unos(5, 3, 1982);
- datumGlasac3.Unos(12, 8, 1958);
- datumGlasac4.Unos(22, 6, 2000);
- Osoba a, b, c, d, e;
- a.unos(datumGlasac1, "Denis Music", "1111111111111", Opstina1);
- b.unos(datumGlasac2, "Jasmin Azemovic", "1111111111112", Opstina1);
- c.unos(datumGlasac3, "Indira Hamulic", "1111111111113", Opstina1);
- d.unos(datumGlasac4, "Adel Handzic", "1111111111114", Opstina2);
- e.unos(datumGlasac4, "Zanin Vejzovic", "1111111111115", Opstina1);
- Glas g1, g2, g3, g4, g5;
- g1.Unos(a, Kandidat1);
- g2.Unos(b, Kandidat1);
- g3.Unos(c, Kandidat2);
- g4.Unos(d, Kandidat1);
- g5.Unos(e, Kandidat2);
- Izbori2016 izbori, izbori_FromFile;
- izbori.Unos(Opstina1);
- izbori.DodajGlas(g1);
- izbori.DodajGlas(g2);
- izbori.DodajGlas(g3);
- izbori.DodajGlas(g4);
- izbori.DodajGlas(g5);
- izbori.Ispis();
- Datum OD, DO;
- OD.Unos(17, 7, 1998);
- DO.Unos(17, 7, 1986);
- cout << "Glasaca u starost od 18 - 30 godina->" << izbori.BrojGlasacaPoRodjenju(OD, DO) << endl;
- //cout << "Broj glasova za Kandidat1->" << PretragaRekurzivno(/*potrebni parametri*/) << endl;
- UpisiUBinarniFajl(izbori);
- UcitajIzBinarnogFajla(izbori_FromFile, "Opstina1");
- //izbori_FromFile.Ispis();
- izbori.Dealociraj();
- system("PAUSE");
- }
Add Comment
Please, Sign In to add comment