Advertisement
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, 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 << " ]"; }
- bool Punoljetan() {
- int brGodina = 2016 - _godina;
- if (7 > _mjesec)
- brGodina++;
- else if (7 == _mjesec)
- if (14 >= _dan)
- brGodina++;
- return brGodina >= 18;
- }
- int SumaDana() {
- int suma = 0, brDana[]{ 31,28,31,30,31,30,31,31,30,31,30,31 };
- for (int i = 1900; i < _godina; i++) {
- if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
- suma += 366;
- else suma += 365;
- }
- for (int i = 1; i < _mjesec; i++) {
- if (((_godina % 4 == 0 && _godina % 100 != 0) || _godina % 400 == 0) && i == 2)
- suma += 29;
- else suma += brDana[i - 1];
- }
- suma += _dan;
- return suma;
- }
- };
- struct Osoba {
- Datum _datumRodjenja;
- char * _imePrezime;
- char _JMBG[14];
- Opstina _Prebivaliste;
- void unos(Datum d, char * ip, char jmbg[], Opstina p) {
- _datumRodjenja.Unos(d._dan, d._mjesec, d._godina);
- _imePrezime = new char[strlen(ip) + 1];
- strcpy_s(_imePrezime,strlen(ip)+1, ip);
- strcpy_s(_JMBG, strlen(jmbg)+1, jmbg);
- _Prebivaliste = p;
- }
- void Dealociraj() { delete[] _imePrezime; _imePrezime = nullptr; }
- void Info() {
- _datumRodjenja.Ispis();
- cout << _imePrezime << " " << _JMBG << " " <<
- OpstineChar[_Prebivaliste] << " - > ";
- }
- };
- struct Glas {
- Osoba * _glasac;
- Kandidati * _glasZa;
- void Unos(Osoba o, Kandidati k){
- _glasac = new Osoba;
- _glasac->unos(o._datumRodjenja, o._imePrezime, o._JMBG, o._Prebivaliste);
- _glasZa = new Kandidati(k);
- }
- void Ispis() {
- _glasac->Info();
- cout << KandidatiChar[*_glasZa] << endl;
- }
- void Dealociraj() { _glasac->Dealociraj(); delete _glasac; _glasac = nullptr; delete _glasZa; _glasZa = nullptr; }
- };
- bool UPerioduOdDo(Datum OD, Datum trenutno, Datum DO) {
- return (trenutno.SumaDana() >= OD.SumaDana() && trenutno.SumaDana() <= DO.SumaDana()) || (trenutno.SumaDana() <= OD.SumaDana() && trenutno.SumaDana() >= DO.SumaDana());
- }
- struct Izbori2016 {
- Opstina * _glasackoMjesto;
- Glas * _glasovi[1000];
- int _doSadaGlasalo;
- //1. Unos - na osnovu vrijednosti primljenih parametara, inicijalizovati vrijednosti atributa strukture.
- void Unos(Opstina mjesto) {
- _glasackoMjesto = new Opstina(mjesto);
- for (int i = 0; i < 1000; i++)
- _glasovi[i] = nullptr;
- _doSadaGlasalo = 0;
- }
- //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 DodajGlas(Glas g) {
- if (!g._glasac->_datumRodjenja.Punoljetan() || g._glasac->_Prebivaliste != *_glasackoMjesto || _doSadaGlasalo >= 1000)
- return false;
- for (int i = 0; i < _doSadaGlasalo; i++) {
- if (strcmp(_glasovi[i]->_glasac->_JMBG, g._glasac->_JMBG) == 0)
- return false;
- }
- _glasovi[_doSadaGlasalo] = new Glas;
- _glasovi[_doSadaGlasalo]->Unos(*g._glasac, *g._glasZa);
- _doSadaGlasalo++;
- return true;
- }
- /*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() {
- int UkupnoGlasova[4]{ 0 }, Kandidat[4]{ 0,1,2,3 };
- for (int i = 0; i < _doSadaGlasalo; i++) {
- UkupnoGlasova[*_glasovi[i]->_glasZa]++;
- }
- // Bubble sort / Exchange sort
- int zamjena, max = 4;
- do {
- zamjena = 1;
- for (int i = 0; i < max; i++)
- if (UkupnoGlasova[i] < UkupnoGlasova[i+1]){
- swap(UkupnoGlasova[i],UkupnoGlasova[i+1]);
- swap(Kandidat[i], Kandidat[i+1]);
- zamjena = 0;
- }
- max--;
- } while (max > 1 && zamjena == 0);
- cout << "Rezultati za " << OpstineChar[*_glasackoMjesto] << " : \n\n";
- float procenatGlasova = 0;
- for (int i = 0; i < 4; i++) {
- procenatGlasova = (UkupnoGlasova[i]/ (float)_doSadaGlasalo) * (float)100;
- cout << KandidatiChar[Kandidat[i]] << " | " << UkupnoGlasova[i] << " | " << procenatGlasova << " %" << endl;
- }
- if(UkupnoGlasova[0] > UkupnoGlasova[1])
- cout << "\nPobjenicki kandidat : " << KandidatiChar[Kandidat[0]] << "\n\n";
- else cout << "\nPostoji vise kandidata sa jednakim brojem glasova!\n\n";
- }
- //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)
- int BrojGlasacaPoRodjenju(Datum OD, Datum DO) {
- int brojac = 0;
- for (int i = 0; i < _doSadaGlasalo; i++)
- if (UPerioduOdDo(OD, _glasovi[i]->_glasac->_datumRodjenja, DO))
- brojac++;
- return brojac;
- }
- void Dealociraj() {
- delete _glasackoMjesto; _glasackoMjesto = nullptr;
- for (int i = 0; i < _doSadaGlasalo; i++) {
- _glasovi[i]->Dealociraj();
- delete _glasovi[i]; _glasovi[i] = nullptr;
- }
- }
- };
- //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) {
- char temp[20];
- strcpy_s(temp, strlen(OpstineChar[*izbori._glasackoMjesto])+1, OpstineChar[*izbori._glasackoMjesto]);
- strncat_s(temp, sizeof(temp), ".txt", sizeof(".txt"));
- ofstream upis(temp, ios::binary);
- if (upis.fail())
- cout << "Greska pri otvaranju fajla!" << endl;
- else {
- upis.write(reinterpret_cast<char*>(&izbori), sizeof(izbori));
- upis.close();
- }
- }
- //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 *naziv) {
- char temp[20];
- strcpy_s(temp, strlen(naziv)+1, naziv);
- strncat_s(temp, sizeof(temp), ".txt", sizeof(".txt"));
- ifstream ispis(temp, ios::binary);
- if (ispis.fail())
- cout << "Greska pri otvaranju fajla!" << endl;
- else {
- ispis.read(reinterpret_cast<char*>(&izbori), sizeof(izbori));
- ispis.close();
- }
- }
- //3. PretragaRekurzivno - rekurzivna funkcija koja treba da vrati broj glasova koje je na izborima ostvario odredjeni kandidat (kandidat se proslijedjuje kao parametar)
- int PretragaRekurzivno(Izbori2016 izbori, int doSadaGlasalo, Kandidati k, int brojGlasova) {
- if (doSadaGlasalo < 0)
- return brojGlasova;
- else {
- if (*izbori._glasovi[doSadaGlasalo]->_glasZa == k)
- brojGlasova += 1;
- return PretragaRekurzivno(izbori, doSadaGlasalo-1, k, brojGlasova);
- }
- }
- 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(datumGlasac2, "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, Kandidat3);
- 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<<"\nGlasaca u starost od 18 - 30 godina -> "<<izbori.BrojGlasacaPoRodjenju(OD, DO)<<endl;
- cout<<"Broj glasova za Kandidat1 -> "<<PretragaRekurzivno(izbori,izbori._doSadaGlasalo-1, Kandidat1, 0) << endl << endl;
- UpisiUBinarniFajl(izbori);
- UcitajIzBinarnogFajla(izbori_FromFile, "Opstina1");
- cout << "\nNakon Binarnog Ucitavanja | izbori_FromFile : \n\n";
- izbori_FromFile.Ispis();
- //dealokacija
- a.Dealociraj(); b.Dealociraj(); c.Dealociraj(); d.Dealociraj(); e.Dealociraj();
- g1.Dealociraj(); g2.Dealociraj(); g3.Dealociraj(); g4.Dealociraj(); g5.Dealociraj();
- izbori.Dealociraj();
- getchar();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement