Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- char * crt = "\n----------------------------------------------------\n";
- struct Datum {
- int * _dan, *_mjesec, *_godina;
- void Unos(int d, int m, int g) {
- _dan = new int(d);
- _mjesec = new int(m);
- _godina = new int(g);
- }
- void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
- void Dealociraj() {
- delete _dan; delete _mjesec; delete _godina;
- _dan = _mjesec = _godina = nullptr;
- }
- bool DaLiSuIsti(Datum * d)
- {
- return *d->_dan == *_dan && *d->_mjesec == *_mjesec && *d->_godina == *_godina;
- }
- int sumaDana()
- {
- int brDana[] = { 31,28,31,30,31,30,31,30,30,31,30,31 };
- int s = 0;
- for (int i = 0; i < *_godina; i++)
- {
- if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
- s += 366;
- else
- s += 365;
- }
- for (int i = 1; i < *_mjesec; i++)
- {
- if (((*_godina % 4 == 0 && *_godina % 100 != 0) || *_godina % 400 == 0) && i == 2)
- s += 29;
- else
- s += brDana[i - 1];
- }
- return s;
- }
- };
- struct Izostanak {
- char * _razlogIzostanka;
- Datum _datumIzostanka;
- int _brojSati;
- bool _opravdano;//pravdanje zahtijeva da se evidentira i razlog izostanka
- void Unos(Datum datumIzostanka, int brojSati) {
- _datumIzostanka.Unos(*datumIzostanka._dan, *datumIzostanka._mjesec, *datumIzostanka._godina);
- _brojSati = brojSati;
- _opravdano = false;
- _razlogIzostanka = new char;
- _razlogIzostanka[0] = '\0';
- }
- void Dealociraj() { delete[]_razlogIzostanka; _razlogIzostanka = nullptr; }
- void Ispis() { _datumIzostanka.Ispis(); cout << _brojSati << " " << _razlogIzostanka; }
- void Opravdaj(char * razlogIzostanka) {
- if (_razlogIzostanka != nullptr)
- delete _razlogIzostanka;
- int vel = strlen(razlogIzostanka) + 1;
- _razlogIzostanka = new char[vel];
- strcpy_s(_razlogIzostanka, vel, razlogIzostanka);
- _opravdano = true;
- _brojSati = 0;
- }
- };
- struct Student {
- //format broja indeksa: IB150051
- //osigurati automatsko generisanje broja indeksa pocevsi od IB150001
- char _brojIndeksa[9];
- char * _imePrezime;
- Izostanak * _izostanci;
- int _brojIzostanaka;
- //Potpisi funkcija trebaju odgovarati onima u main-u
- //1. Unos
- //2. Dealociraj
- /*3. DodajIzostanak - dodaje novi izostanak u listu izostanaka. Onemoguciti ponavljanje izostanaka na
- nacin da se uvecava samo broj sati ukoliko
- korisnik (profesor) vise puta pokusa dodati izostanak na isti dan.*/
- //4. Ispis - ispisuje izostanke u formatu prikazanom na slici (nije obavezno da ispis bude identican,
- //ali je svakako pozeljno). Prilikom svakog ispisa, izostanke je potrebno spasiti u tekstualni fajl sa
- //istim nazivom kao i broj indeksa.
- //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu datuma, pronalazi i vraca pokazivac na
- //izostanak. Ukoliko trazeni izostanak ne postoji funkcija vraca nullptr.
- void Unos(char * i, char * ip)
- {
- strcpy_s(_brojIndeksa, strlen(i) + 1, i);
- _imePrezime = new char[strlen(ip) + 1];
- strcpy_s(_imePrezime, strlen(ip) + 1, ip);
- _brojIzostanaka = 0;
- }
- void DodajIzostanak(Izostanak novi)
- {
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- if (_izostanci[i]._datumIzostanka.DaLiSuIsti(&novi._datumIzostanka))
- {
- _izostanci[i]._brojSati += novi._brojSati;
- return;
- }
- }
- if (_brojIzostanaka == 0)
- {
- _izostanci = new Izostanak(novi);
- _brojIzostanaka++;
- }
- if (_brojIzostanaka > 0)
- {
- Izostanak * pom = new Izostanak[_brojIzostanaka + 1];
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- pom[i] = _izostanci[i];
- }
- pom[_brojIzostanaka].Unos(novi._datumIzostanka, novi._brojSati);
- _brojIzostanaka++;
- delete[] _izostanci;
- _izostanci = nullptr;
- _izostanci = new Izostanak[_brojIzostanaka];
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- _izostanci[i] = pom[i];
- }
- delete[]pom;
- pom = nullptr;
- }
- }
- void Ispis()
- {
- cout << crt << endl;
- cout << "Ime i prezime --> " << _imePrezime << endl;
- cout << "Broj indexa --> " << _brojIndeksa << endl;
- cout << crt << endl;
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- _izostanci[i].Ispis();
- cout << endl;
- }
- cout << crt << endl;
- char temp[30];
- strcpy_s(temp, strlen(_brojIndeksa) + 1, _brojIndeksa);
- strcat_s(temp, ".txt");
- char * Naziv = new char[strlen(temp) + 1];
- strcpy_s(Naziv, strlen(temp) + 1, temp);
- ofstream Upis(Naziv);
- if (!Upis.fail())
- {
- Upis << crt << endl;
- Upis << "Ime i prezime --> " << _imePrezime << endl;
- Upis << "Broj indeksa --> " << _brojIndeksa << endl;
- Upis << crt << endl;
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- Upis << *_izostanci[i]._datumIzostanka._dan << "/" << *_izostanci[i]._datumIzostanka._mjesec << "/" << *_izostanci[i]._datumIzostanka._godina;
- Upis << " " << _izostanci[i]._brojSati << " " << _izostanci[i]._razlogIzostanka << endl;
- }
- Upis << crt << endl;
- Upis.close();
- }
- else
- cout << "Poruka o grešci" << endl;
- }
- void Dealociraj()
- {
- delete[]_imePrezime;
- _imePrezime = nullptr;
- delete[]_izostanci;
- _izostanci = nullptr;
- }
- void sortDatum()
- {
- int vel = _brojIzostanaka;
- bool zamjena = false;;
- do
- {
- zamjena = false;
- for (int i = 0; i < vel-1; i++)
- {
- if (_izostanci[i]._datumIzostanka.sumaDana() > _izostanci[i + 1]._datumIzostanka.sumaDana())
- {
- Izostanak temp;
- temp.Unos(_izostanci[i]._datumIzostanka, _izostanci[i]._brojSati);
- delete[i]_izostanci; _izostanci = new Izostanak;
- _izostanci[i].Unos(_izostanci[i + 1]._datumIzostanka, _izostanci[i+1]._brojSati);
- delete[i+1]_izostanci; _izostanci = new Izostanak;
- _izostanci[i + 1].Unos(temp._datumIzostanka, temp._brojSati);
- temp.Dealociraj();
- zamjena = true;
- }
- }
- vel--;
- } while (vel > 1 && zamjena == true);
- }
- Izostanak * BinarnaPretraga(Datum trazeni)
- {
- sortDatum();
- int prvi=0, zadnji = _brojIzostanaka - 1, srednji;
- while (prvi<=zadnji)
- {
- srednji = (prvi + zadnji) / 2;
- if (trazeni.sumaDana() < _izostanci[srednji]._datumIzostanka.sumaDana())
- zadnji = srednji - 1;
- if (trazeni.sumaDana() > _izostanci[srednji]._datumIzostanka.sumaDana())
- prvi = srednji + 1;
- if (trazeni.sumaDana() == _izostanci[srednji]._datumIzostanka.sumaDana())
- return &_izostanci[srednji];
- }
- return nullptr;
- }
- };
- //1. PronadjiNajveciNeopravdaniIzostanak - rekurzivna funkcija koja vraca pokazivac na neopravdani
- //izostanak koji ima najveci broj sati
- //2. GenerisiSljedeciBrojIndeksa - generise i vraca naredni broj indeksa
- Izostanak * PronadjiNajveciNeopravdaniIzostanak(Student d, int bi, int s, int p)
- {
- if (bi < 0)
- return &d._izostanci[p];
- if (d._izostanci[bi]._brojSati > s)
- {
- s = d._izostanci[bi]._brojSati;
- p = bi;
- }
- return PronadjiNajveciNeopravdaniIzostanak(d, bi - 1, s, p);
- }
- int i = 150001;
- char * GenerisiSljedeciBrojIndeksa()
- {
- char * brojindexa = new char[9];
- char t[7];
- strcpy_s(brojindexa, strlen("IB") + 1, "IB");
- _itoa_s(i, t, 10);
- strcat_s(brojindexa, 9, t);
- return brojindexa;
- i++;
- }
- void main() {
- Datum jucer, prije5Dana, prije10Dana;
- jucer.Unos(12, 6, 2016);
- prije5Dana.Unos(8, 6, 2016);
- prije10Dana.Unos(3, 6, 2016);
- Student denis;
- denis.Unos(GenerisiSljedeciBrojIndeksa(), "Denis Music");
- Izostanak izostanakJucer, izostanakPrije5Dana, izostanakPrije10Dana;
- izostanakJucer.Unos(jucer, 5);
- denis.DodajIzostanak(izostanakJucer);
- izostanakPrije5Dana.Unos(prije5Dana, 3);
- izostanakPrije5Dana.Opravdaj("Odsutan zbog bolesti - gripa");
- denis.DodajIzostanak(izostanakPrije5Dana);
- izostanakPrije5Dana.Unos(prije5Dana, 8);
- denis.DodajIzostanak(izostanakPrije5Dana);
- izostanakPrije10Dana.Unos(prije10Dana, 1);
- denis.DodajIzostanak(izostanakPrije10Dana);
- izostanakPrije10Dana.Unos(prije10Dana, 6);
- denis.DodajIzostanak(izostanakPrije10Dana);
- denis.Ispis();
- Izostanak * p = denis.BinarnaPretraga(prije5Dana);
- cout << "Binarnom pretragom pronadjen izostanak -> ";
- p->Ispis();
- cout << endl;
- //denis.Ispis();
- Izostanak * p2 = PronadjiNajveciNeopravdaniIzostanak(denis, denis._brojIzostanaka - 1, 0, 0);
- cout << "Rekurzivno pronadjen najveci neopravdani izostanak -> ";
- p2->Ispis();
- cout << endl;
- //dealocirati zauzetu memoriju
- denis.Dealociraj();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement